@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,126 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { mkdtempSync, rmSync, writeFileSync, mkdirSync, readFileSync, existsSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { buildDeclinedProfile, buildProfile, hasProfileDecision, isValidEmail, persistProfile, postEmailToWorker, profilePath, readProfile, shouldPromptForEmail, syncPendingEmail, workerEmailEndpoint, } from "../email-prompt.js";
|
|
6
|
+
let tmpHome;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
tmpHome = mkdtempSync(join(tmpdir(), "lyse-email-prompt-"));
|
|
9
|
+
});
|
|
10
|
+
afterEach(() => {
|
|
11
|
+
rmSync(tmpHome, { recursive: true, force: true });
|
|
12
|
+
vi.restoreAllMocks();
|
|
13
|
+
});
|
|
14
|
+
describe("isValidEmail", () => {
|
|
15
|
+
it("accepts ordinary addresses", () => {
|
|
16
|
+
expect(isValidEmail("thomas@getlyse.com")).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
it("rejects garbage", () => {
|
|
19
|
+
expect(isValidEmail("nope")).toBe(false);
|
|
20
|
+
expect(isValidEmail("a@b")).toBe(false);
|
|
21
|
+
expect(isValidEmail("")).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe("workerEmailEndpoint", () => {
|
|
25
|
+
it("defaults to api.getlyse.com", () => {
|
|
26
|
+
expect(workerEmailEndpoint({})).toBe("https://api.getlyse.com/v1/profile/email");
|
|
27
|
+
});
|
|
28
|
+
it("respects LYSE_EMAIL_ENDPOINT override", () => {
|
|
29
|
+
expect(workerEmailEndpoint({ LYSE_EMAIL_ENDPOINT: "http://x" })).toBe("http://x");
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe("shouldPromptForEmail", () => {
|
|
33
|
+
it("returns false on --yes / CI / non-TTY / LYSE_NO_EMAIL_PROMPT=1", () => {
|
|
34
|
+
expect(shouldPromptForEmail({ yes: true }, {}, true, tmpHome)).toBe(false);
|
|
35
|
+
expect(shouldPromptForEmail({}, { LYSE_NO_EMAIL_PROMPT: "1" }, true, tmpHome)).toBe(false);
|
|
36
|
+
expect(shouldPromptForEmail({}, { CI: "true" }, true, tmpHome)).toBe(false);
|
|
37
|
+
expect(shouldPromptForEmail({}, {}, false, tmpHome)).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
it("returns true on a fresh interactive machine", () => {
|
|
40
|
+
expect(shouldPromptForEmail({}, {}, true, tmpHome)).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
it("returns false once a profile decision is on disk", () => {
|
|
43
|
+
mkdirSync(join(tmpHome, ".lyse"), { recursive: true });
|
|
44
|
+
writeFileSync(profilePath(tmpHome), JSON.stringify({ email: "x@y.z", createdAt: "now", lyseVersion: "0" }));
|
|
45
|
+
expect(shouldPromptForEmail({}, {}, true, tmpHome)).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe("readProfile", () => {
|
|
49
|
+
it("returns null when no profile exists", () => {
|
|
50
|
+
expect(readProfile(tmpHome)).toBeNull();
|
|
51
|
+
});
|
|
52
|
+
it("parses an email profile", () => {
|
|
53
|
+
mkdirSync(join(tmpHome, ".lyse"), { recursive: true });
|
|
54
|
+
writeFileSync(profilePath(tmpHome), JSON.stringify({ email: "a@b.co", createdAt: "2026-01-01T00:00:00Z", lyseVersion: "0.1.0" }));
|
|
55
|
+
expect(readProfile(tmpHome)).toMatchObject({ email: "a@b.co" });
|
|
56
|
+
});
|
|
57
|
+
it("parses a declined profile", () => {
|
|
58
|
+
mkdirSync(join(tmpHome, ".lyse"), { recursive: true });
|
|
59
|
+
writeFileSync(profilePath(tmpHome), JSON.stringify({ declined: true, declinedAt: "now", lyseVersion: "0.1.0" }));
|
|
60
|
+
expect(readProfile(tmpHome)).toMatchObject({ declined: true });
|
|
61
|
+
});
|
|
62
|
+
it("returns null for malformed JSON", () => {
|
|
63
|
+
mkdirSync(join(tmpHome, ".lyse"), { recursive: true });
|
|
64
|
+
writeFileSync(profilePath(tmpHome), "not json");
|
|
65
|
+
expect(readProfile(tmpHome)).toBeNull();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe("persistProfile", () => {
|
|
69
|
+
it("writes ~/.lyse/profile.json", async () => {
|
|
70
|
+
const path = await persistProfile(buildProfile("a@b.co"), tmpHome);
|
|
71
|
+
expect(path).toBe(profilePath(tmpHome));
|
|
72
|
+
expect(existsSync(path)).toBe(true);
|
|
73
|
+
expect(JSON.parse(readFileSync(path, "utf8"))).toMatchObject({ email: "a@b.co" });
|
|
74
|
+
});
|
|
75
|
+
it("declined marker suppresses future prompts", async () => {
|
|
76
|
+
await persistProfile(buildDeclinedProfile(), tmpHome);
|
|
77
|
+
expect(hasProfileDecision(tmpHome)).toBe(true);
|
|
78
|
+
expect(shouldPromptForEmail({}, {}, true, tmpHome)).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe("postEmailToWorker", () => {
|
|
82
|
+
it("POSTs and returns true on 2xx", async () => {
|
|
83
|
+
const fetchSpy = vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(null, { status: 200 }));
|
|
84
|
+
const ok = await postEmailToWorker("a@b.co", { endpoint: "http://x", timeoutMs: 500 });
|
|
85
|
+
expect(ok).toBe(true);
|
|
86
|
+
const [url, init] = fetchSpy.mock.calls[0];
|
|
87
|
+
expect(url).toBe("http://x");
|
|
88
|
+
const body = JSON.parse(init.body);
|
|
89
|
+
expect(body.email).toBe("a@b.co");
|
|
90
|
+
expect(typeof body.capturedAt).toBe("string");
|
|
91
|
+
expect(typeof body.lyseVersion).toBe("string");
|
|
92
|
+
});
|
|
93
|
+
it("returns false on non-2xx and network error", async () => {
|
|
94
|
+
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(null, { status: 500 }));
|
|
95
|
+
expect(await postEmailToWorker("a@b.co", { endpoint: "http://x", timeoutMs: 500 })).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it("skips when LYSE_NO_EMAIL_POST=1", async () => {
|
|
98
|
+
const fetchSpy = vi.spyOn(globalThis, "fetch");
|
|
99
|
+
expect(await postEmailToWorker("a@b.co", { env: { LYSE_NO_EMAIL_POST: "1" } })).toBe(false);
|
|
100
|
+
expect(fetchSpy).not.toHaveBeenCalled();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe("syncPendingEmail", () => {
|
|
104
|
+
it("is a no-op when nothing pending", async () => {
|
|
105
|
+
const fetchSpy = vi.spyOn(globalThis, "fetch");
|
|
106
|
+
expect(await syncPendingEmail(tmpHome)).toBe("skipped");
|
|
107
|
+
await persistProfile(buildDeclinedProfile(), tmpHome);
|
|
108
|
+
expect(await syncPendingEmail(tmpHome)).toBe("skipped");
|
|
109
|
+
await persistProfile({ ...buildProfile("a@b.co"), sentAt: "2026-01-01T00:00:00Z" }, tmpHome);
|
|
110
|
+
expect(await syncPendingEmail(tmpHome)).toBe("skipped");
|
|
111
|
+
expect(fetchSpy).not.toHaveBeenCalled();
|
|
112
|
+
});
|
|
113
|
+
it("POSTs pending email and stamps sentAt on success", async () => {
|
|
114
|
+
await persistProfile(buildProfile("a@b.co"), tmpHome);
|
|
115
|
+
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(null, { status: 200 }));
|
|
116
|
+
expect(await syncPendingEmail(tmpHome)).toBe("sent");
|
|
117
|
+
expect(readProfile(tmpHome).sentAt).toBeTypeOf("string");
|
|
118
|
+
});
|
|
119
|
+
it("returns failed and keeps email for next retry on failure", async () => {
|
|
120
|
+
await persistProfile(buildProfile("a@b.co"), tmpHome);
|
|
121
|
+
vi.spyOn(globalThis, "fetch").mockRejectedValue(new Error("offline"));
|
|
122
|
+
expect(await syncPendingEmail(tmpHome)).toBe("failed");
|
|
123
|
+
expect(readProfile(tmpHome).sentAt).toBeUndefined();
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=email-prompt.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-prompt.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/email-prompt.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { formatExplainScore } from "../explain-score.js";
|
|
3
|
+
const F = (overrides) => ({
|
|
4
|
+
ruleId: "tokens/no-hardcoded-color",
|
|
5
|
+
subAxisId: "tokens.color",
|
|
6
|
+
severity: "error",
|
|
7
|
+
confidence: "high",
|
|
8
|
+
message: "literal #fff",
|
|
9
|
+
file: "Button.tsx",
|
|
10
|
+
line: 1,
|
|
11
|
+
column: 1,
|
|
12
|
+
...overrides,
|
|
13
|
+
});
|
|
14
|
+
describe("formatExplainScore", () => {
|
|
15
|
+
it("reports 100 / 100 and 'No findings' when the finding list is empty", () => {
|
|
16
|
+
const r = formatExplainScore({ findings: [], stableSubAxes: new Set(), confidenceByAxis: {} });
|
|
17
|
+
expect(r.score).toBe(100);
|
|
18
|
+
expect(r.version).toBe("scoring-v1");
|
|
19
|
+
expect(r.rawText).toContain("Health Score: 100 / 100");
|
|
20
|
+
expect(r.rawText).toContain("No findings");
|
|
21
|
+
});
|
|
22
|
+
it("includes the pinned scoring-v1 version string", () => {
|
|
23
|
+
const r = formatExplainScore({ findings: [], stableSubAxes: new Set(), confidenceByAxis: {} });
|
|
24
|
+
expect(r.rawText).toContain("scoring-v1");
|
|
25
|
+
});
|
|
26
|
+
it("describes the formula (penalty × 1.5, clamped 0-100)", () => {
|
|
27
|
+
const r = formatExplainScore({ findings: [], stableSubAxes: new Set(), confidenceByAxis: {} });
|
|
28
|
+
expect(r.rawText).toContain("100 - penalty");
|
|
29
|
+
expect(r.rawText).toContain("× 1.5");
|
|
30
|
+
});
|
|
31
|
+
it("buckets findings by sub-axis with name, count, confidence weight, and penalty", () => {
|
|
32
|
+
const findings = [F({}), F({ severity: "warning" })];
|
|
33
|
+
const r = formatExplainScore({
|
|
34
|
+
findings,
|
|
35
|
+
stableSubAxes: new Set(["tokens.color"]),
|
|
36
|
+
confidenceByAxis: { "tokens.color": 1.0 },
|
|
37
|
+
});
|
|
38
|
+
expect(r.score).toBeLessThan(100);
|
|
39
|
+
expect(r.buckets).toHaveLength(1);
|
|
40
|
+
expect(r.buckets[0].subAxisId).toBe("tokens.color");
|
|
41
|
+
expect(r.buckets[0].countedFindings).toBe(2);
|
|
42
|
+
expect(r.buckets[0].confidence).toBe(1.0);
|
|
43
|
+
expect(r.buckets[0].penalty).toBe(6);
|
|
44
|
+
expect(r.rawText).toContain("Color tokens");
|
|
45
|
+
expect(r.rawText).toContain("2 findings");
|
|
46
|
+
expect(r.rawText).toContain("confidence 1.00");
|
|
47
|
+
});
|
|
48
|
+
it("lists experimental sub-axes in a 'reported only' section (not counted in score)", () => {
|
|
49
|
+
const findings = [F({ subAxisId: "components.duplication", ruleId: "components.duplication" })];
|
|
50
|
+
const r = formatExplainScore({
|
|
51
|
+
findings,
|
|
52
|
+
stableSubAxes: new Set(),
|
|
53
|
+
confidenceByAxis: {},
|
|
54
|
+
});
|
|
55
|
+
expect(r.score).toBe(100);
|
|
56
|
+
expect(r.countedTotal).toBe(0);
|
|
57
|
+
expect(r.reportedOnlyTotal).toBe(1);
|
|
58
|
+
expect(r.rawText).toContain("Reported only");
|
|
59
|
+
expect(r.rawText).toContain("experimental");
|
|
60
|
+
});
|
|
61
|
+
it("sorts stable buckets before experimental, then by penalty desc", () => {
|
|
62
|
+
const findings = [
|
|
63
|
+
F({ subAxisId: "components.duplication" }),
|
|
64
|
+
F({ subAxisId: "tokens.color", severity: "warning" }),
|
|
65
|
+
F({ subAxisId: "a11y.essentials", severity: "error" }),
|
|
66
|
+
];
|
|
67
|
+
const r = formatExplainScore({
|
|
68
|
+
findings,
|
|
69
|
+
stableSubAxes: new Set(["tokens.color", "a11y.essentials"]),
|
|
70
|
+
confidenceByAxis: { "tokens.color": 1.0, "a11y.essentials": 1.0 },
|
|
71
|
+
});
|
|
72
|
+
expect(r.buckets[0].status).toBe("stable");
|
|
73
|
+
expect(r.buckets[1].status).toBe("stable");
|
|
74
|
+
expect(r.buckets[2].status).not.toBe("stable");
|
|
75
|
+
expect(r.buckets[0].subAxisId).toBe("a11y.essentials");
|
|
76
|
+
expect(r.buckets[1].subAxisId).toBe("tokens.color");
|
|
77
|
+
});
|
|
78
|
+
it("clamps the score at 0 when penalties are massive", () => {
|
|
79
|
+
const findings = Array.from({ length: 100 }, () => F({}));
|
|
80
|
+
const r = formatExplainScore({
|
|
81
|
+
findings,
|
|
82
|
+
stableSubAxes: new Set(["tokens.color"]),
|
|
83
|
+
confidenceByAxis: { "tokens.color": 1.0 },
|
|
84
|
+
});
|
|
85
|
+
expect(r.score).toBe(0);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=explain-score.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain-score.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/explain-score.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { feedbackMissed, parseMissedSpec, extractSnippet, getMissedEndpoint, } from "../feedback.js";
|
|
6
|
+
import { __setCacheForTest, resetConsentCache } from "../../telemetry/consent.js";
|
|
7
|
+
function enableConsent() {
|
|
8
|
+
__setCacheForTest({ accepted: true, initialised: true });
|
|
9
|
+
}
|
|
10
|
+
describe("parseMissedSpec", () => {
|
|
11
|
+
it("parses simple <file>:<line>", () => {
|
|
12
|
+
expect(parseMissedSpec("Card.tsx:42")).toEqual({ file: "Card.tsx", line: 42 });
|
|
13
|
+
});
|
|
14
|
+
it("supports nested paths", () => {
|
|
15
|
+
expect(parseMissedSpec("src/widgets/Card.tsx:7")).toEqual({
|
|
16
|
+
file: "src/widgets/Card.tsx",
|
|
17
|
+
line: 7,
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
it("returns null for missing line", () => {
|
|
21
|
+
expect(parseMissedSpec("Card.tsx")).toBeNull();
|
|
22
|
+
});
|
|
23
|
+
it("returns null for non-integer line", () => {
|
|
24
|
+
expect(parseMissedSpec("Card.tsx:abc")).toBeNull();
|
|
25
|
+
});
|
|
26
|
+
it("returns null for zero or negative line", () => {
|
|
27
|
+
expect(parseMissedSpec("Card.tsx:0")).toBeNull();
|
|
28
|
+
expect(parseMissedSpec("Card.tsx:-1")).toBeNull();
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe("extractSnippet", () => {
|
|
32
|
+
it("returns the requested 1-based line", () => {
|
|
33
|
+
expect(extractSnippet("a\nb\nc", 2)).toBe("b");
|
|
34
|
+
});
|
|
35
|
+
it("returns the empty string when out of range", () => {
|
|
36
|
+
expect(extractSnippet("a\nb\nc", 99)).toBe("");
|
|
37
|
+
});
|
|
38
|
+
it("truncates lines longer than ~120 chars", () => {
|
|
39
|
+
const long = "x".repeat(500);
|
|
40
|
+
const r = extractSnippet(long, 1);
|
|
41
|
+
expect(r.length).toBeLessThanOrEqual(121);
|
|
42
|
+
expect(r.endsWith("…")).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe("getMissedEndpoint", () => {
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
delete process.env["LYSE_MISSED_ENDPOINT"];
|
|
48
|
+
});
|
|
49
|
+
it("defaults to api.getlyse.com", () => {
|
|
50
|
+
expect(getMissedEndpoint()).toContain("api.getlyse.com");
|
|
51
|
+
expect(getMissedEndpoint()).toContain("/v1/missed-finding");
|
|
52
|
+
});
|
|
53
|
+
it("honors the LYSE_MISSED_ENDPOINT env override", () => {
|
|
54
|
+
process.env["LYSE_MISSED_ENDPOINT"] = "https://example.test/v1/x";
|
|
55
|
+
expect(getMissedEndpoint()).toBe("https://example.test/v1/x");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe("feedbackMissed", () => {
|
|
59
|
+
let tmp;
|
|
60
|
+
let stderr = [];
|
|
61
|
+
let stdout = [];
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
tmp = mkdtempSync(join(tmpdir(), "lyse-fbk-"));
|
|
64
|
+
stderr = [];
|
|
65
|
+
stdout = [];
|
|
66
|
+
vi.spyOn(process.stderr, "write").mockImplementation((s) => {
|
|
67
|
+
stderr.push(String(s));
|
|
68
|
+
return true;
|
|
69
|
+
});
|
|
70
|
+
vi.spyOn(process.stdout, "write").mockImplementation((s) => {
|
|
71
|
+
stdout.push(String(s));
|
|
72
|
+
return true;
|
|
73
|
+
});
|
|
74
|
+
enableConsent();
|
|
75
|
+
});
|
|
76
|
+
afterEach(() => {
|
|
77
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
78
|
+
vi.restoreAllMocks();
|
|
79
|
+
resetConsentCache();
|
|
80
|
+
});
|
|
81
|
+
it("refuses without telemetry consent (privacy gate)", async () => {
|
|
82
|
+
__setCacheForTest({ accepted: false, initialised: true });
|
|
83
|
+
const r = await feedbackMissed({ cwd: tmp, missed: "x.tsx:1", autoConfirm: true });
|
|
84
|
+
expect(r.ok).toBe(false);
|
|
85
|
+
expect(r.reason).toBe("telemetry-disabled");
|
|
86
|
+
expect(stderr.join("")).toContain("lyse telemetry on");
|
|
87
|
+
});
|
|
88
|
+
it("returns invalid-spec for malformed input", async () => {
|
|
89
|
+
const r = await feedbackMissed({ cwd: tmp, missed: "no-line-here", autoConfirm: true });
|
|
90
|
+
expect(r.ok).toBe(false);
|
|
91
|
+
expect(r.reason).toBe("invalid-spec");
|
|
92
|
+
});
|
|
93
|
+
it("returns file-not-found when the path does not exist", async () => {
|
|
94
|
+
const r = await feedbackMissed({ cwd: tmp, missed: "missing.tsx:1", autoConfirm: true });
|
|
95
|
+
expect(r.ok).toBe(false);
|
|
96
|
+
expect(r.reason).toBe("file-not-found");
|
|
97
|
+
});
|
|
98
|
+
it("posts a privacy-clean payload with snippet + repoBucket(HMAC)", async () => {
|
|
99
|
+
writeFileSync(join(tmp, "Card.tsx"), "line-one\nconst BG = '#1A1A1A';\nline-three\n");
|
|
100
|
+
const calls = [];
|
|
101
|
+
const fetcher = (async (input, init) => {
|
|
102
|
+
calls.push([String(input), init ?? {}]);
|
|
103
|
+
return { ok: true, status: 204 };
|
|
104
|
+
});
|
|
105
|
+
const r = await feedbackMissed({
|
|
106
|
+
cwd: tmp,
|
|
107
|
+
missed: "Card.tsx:2",
|
|
108
|
+
autoConfirm: true,
|
|
109
|
+
saltOverride: "test-salt",
|
|
110
|
+
remoteUrlOverride: "https://github.com/example/repo.git",
|
|
111
|
+
fetcher,
|
|
112
|
+
});
|
|
113
|
+
expect(r.ok).toBe(true);
|
|
114
|
+
expect(calls).toHaveLength(1);
|
|
115
|
+
const body = JSON.parse(calls[0][1].body);
|
|
116
|
+
expect(body.file).toBe("Card.tsx");
|
|
117
|
+
expect(body.line).toBe(2);
|
|
118
|
+
expect(body.snippet).toBe("const BG = '#1A1A1A';");
|
|
119
|
+
expect(body.subAxisId).toBe("unmapped");
|
|
120
|
+
expect(typeof body.repoBucket).toBe("string");
|
|
121
|
+
expect(body.repoBucket).toMatch(/^[a-f0-9]{16}$/);
|
|
122
|
+
expect(typeof body.ts).toBe("number");
|
|
123
|
+
// Privacy: payload must NOT contain the raw remote URL.
|
|
124
|
+
expect(JSON.stringify(body)).not.toContain("github.com");
|
|
125
|
+
});
|
|
126
|
+
it("accepts an explicit --subAxisId", async () => {
|
|
127
|
+
writeFileSync(join(tmp, "Card.tsx"), " background: #1A1A1A;\n");
|
|
128
|
+
const calls = [];
|
|
129
|
+
const fetcher = (async (input, init) => {
|
|
130
|
+
calls.push([String(input), init ?? {}]);
|
|
131
|
+
return { ok: true, status: 204 };
|
|
132
|
+
});
|
|
133
|
+
const r = await feedbackMissed({
|
|
134
|
+
cwd: tmp,
|
|
135
|
+
missed: "Card.tsx:1",
|
|
136
|
+
subAxisId: "tokens.color",
|
|
137
|
+
autoConfirm: true,
|
|
138
|
+
saltOverride: "s",
|
|
139
|
+
remoteUrlOverride: "https://github.com/example/repo",
|
|
140
|
+
fetcher,
|
|
141
|
+
});
|
|
142
|
+
expect(r.ok).toBe(true);
|
|
143
|
+
const body = JSON.parse(calls[0][1].body);
|
|
144
|
+
expect(body.subAxisId).toBe("tokens.color");
|
|
145
|
+
});
|
|
146
|
+
it("propagates HTTP failure from the server", async () => {
|
|
147
|
+
writeFileSync(join(tmp, "x.tsx"), "foo\n");
|
|
148
|
+
const fetcher = (async () => ({ ok: false, status: 500 }));
|
|
149
|
+
const r = await feedbackMissed({
|
|
150
|
+
cwd: tmp,
|
|
151
|
+
missed: "x.tsx:1",
|
|
152
|
+
autoConfirm: true,
|
|
153
|
+
saltOverride: "s",
|
|
154
|
+
remoteUrlOverride: "https://github.com/example/repo",
|
|
155
|
+
fetcher,
|
|
156
|
+
});
|
|
157
|
+
expect(r.ok).toBe(false);
|
|
158
|
+
expect(r.reason).toBe("http-500");
|
|
159
|
+
});
|
|
160
|
+
it("returns bucket-unavailable when no remote URL or salt is reachable", async () => {
|
|
161
|
+
writeFileSync(join(tmp, "x.tsx"), "foo\n");
|
|
162
|
+
const r = await feedbackMissed({
|
|
163
|
+
cwd: tmp,
|
|
164
|
+
missed: "x.tsx:1",
|
|
165
|
+
autoConfirm: true,
|
|
166
|
+
// No saltOverride, no remoteUrlOverride — and tmp isn't a git repo so getRemoteOriginUrl returns null.
|
|
167
|
+
// Skip the salt fetch by overriding to an unreachable URL — defensive.
|
|
168
|
+
saltUrl: "http://127.0.0.1:1",
|
|
169
|
+
});
|
|
170
|
+
expect(r.ok).toBe(false);
|
|
171
|
+
expect(r.reason).toBe("bucket-unavailable");
|
|
172
|
+
});
|
|
173
|
+
it("rejects empty source lines", async () => {
|
|
174
|
+
writeFileSync(join(tmp, "x.tsx"), "\n\n\n");
|
|
175
|
+
const r = await feedbackMissed({
|
|
176
|
+
cwd: tmp,
|
|
177
|
+
missed: "x.tsx:1",
|
|
178
|
+
autoConfirm: true,
|
|
179
|
+
saltOverride: "s",
|
|
180
|
+
remoteUrlOverride: "https://github.com/example/repo",
|
|
181
|
+
});
|
|
182
|
+
expect(r.ok).toBe(false);
|
|
183
|
+
expect(r.reason).toBe("empty-line");
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
//# sourceMappingURL=feedback.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/feedback.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared flags and error types for the audit pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from audit-pipeline.ts into its own module to break the circular
|
|
5
|
+
* import that would otherwise occur between audit-pipeline.ts and
|
|
6
|
+
* llm/layer4-stage.ts (both would need to reference these types).
|
|
7
|
+
*
|
|
8
|
+
* audit-pipeline.ts re-exports everything from here for backward compatibility.
|
|
9
|
+
*/
|
|
10
|
+
import type { Spinner } from "../util/spinner.js";
|
|
11
|
+
/**
|
|
12
|
+
* Thrown when no LLM connector is configured and --static-only is not set.
|
|
13
|
+
* The CLI layer catches this error and exits with code 1.
|
|
14
|
+
*/
|
|
15
|
+
export declare class RefuseToRunError extends Error {
|
|
16
|
+
name: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* CLI-level flags that override config-file values for a single audit run.
|
|
20
|
+
* All fields are optional; omitting a field means "use the config/env value".
|
|
21
|
+
*/
|
|
22
|
+
export interface AuditFlags {
|
|
23
|
+
/** Skip Layer 4 LLM augmentation; report Layers 1+2 score only (~30% coverage). */
|
|
24
|
+
staticOnly?: boolean;
|
|
25
|
+
/** Override the LLM cost cap for this run (USD). */
|
|
26
|
+
costCapUsd?: number;
|
|
27
|
+
/** If true, bypass the cache and force a fresh LLM call. */
|
|
28
|
+
noCache?: boolean;
|
|
29
|
+
/** Override the LLM provider (e.g. "anthropic" | "openai" | "ollama"). */
|
|
30
|
+
llmProvider?: string;
|
|
31
|
+
/** Override the LLM model identifier. */
|
|
32
|
+
llmModel?: string;
|
|
33
|
+
/**
|
|
34
|
+
* When set, only this single dimension is audited by the LLM (focused mode).
|
|
35
|
+
* ~9x cost reduction by sending only that dimension's prompt section.
|
|
36
|
+
* Valid values: tokens | components | a11y | stories | themes | motion | patterns | naming | documentation
|
|
37
|
+
*/
|
|
38
|
+
llmDimension?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Optional progress reporter. When provided, the pipeline calls
|
|
41
|
+
* `update()` at phase boundaries (file discovery, parsing, loading, rules,
|
|
42
|
+
* scoring). Issuing `start()` / `succeed()` / `fail()` is the CLI's job —
|
|
43
|
+
* the pipeline never owns the outcome label.
|
|
44
|
+
*
|
|
45
|
+
* Pass `undefined` (or a no-op spinner) from non-interactive callers
|
|
46
|
+
* (fix.ts, MCP, share) to keep stderr quiet.
|
|
47
|
+
*/
|
|
48
|
+
progress?: Spinner;
|
|
49
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared flags and error types for the audit pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from audit-pipeline.ts into its own module to break the circular
|
|
5
|
+
* import that would otherwise occur between audit-pipeline.ts and
|
|
6
|
+
* llm/layer4-stage.ts (both would need to reference these types).
|
|
7
|
+
*
|
|
8
|
+
* audit-pipeline.ts re-exports everything from here for backward compatibility.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Thrown when no LLM connector is configured and --static-only is not set.
|
|
12
|
+
* The CLI layer catches this error and exits with code 1.
|
|
13
|
+
*/
|
|
14
|
+
export class RefuseToRunError extends Error {
|
|
15
|
+
name = "RefuseToRunError";
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=audit-flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-flags.js","sourceRoot":"","sources":["../../src/commands/audit-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,GAAG,kBAAkB,CAAC;CACpC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared audit pipeline — extracted so both the CLI and the fix orchestrator
|
|
3
|
+
* can run a full audit without going through the CLI entry point.
|
|
4
|
+
*
|
|
5
|
+
* Returns AuditResult plus auxiliary data (tokens, config) needed by the fix
|
|
6
|
+
* orchestrator to build a ClassifyContext.
|
|
7
|
+
*/
|
|
8
|
+
import type { AuditResult, LyseConfig, TokenMap, ComponentInventoryEntry } from "../types.js";
|
|
9
|
+
import { RefuseToRunError, type AuditFlags } from "./audit-flags.js";
|
|
10
|
+
export { RefuseToRunError, type AuditFlags };
|
|
11
|
+
export interface AuditPipelineResult {
|
|
12
|
+
/** Full AuditResult as produced by the audit subcommand. */
|
|
13
|
+
result: AuditResult;
|
|
14
|
+
/** Loaded token map (null when no token source was found). */
|
|
15
|
+
tokens: TokenMap | null;
|
|
16
|
+
/** Parsed .lyse.yaml config. */
|
|
17
|
+
config: LyseConfig;
|
|
18
|
+
/** Component inventory for the configured DS module. */
|
|
19
|
+
componentInventory: ComponentInventoryEntry[];
|
|
20
|
+
/** Number of source files scanned. */
|
|
21
|
+
fileCount: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Run a full audit on a repository root.
|
|
25
|
+
* This is the same pipeline as the `lyse audit` CLI command, extracted for
|
|
26
|
+
* programmatic use by the fix orchestrator and future commands.
|
|
27
|
+
*
|
|
28
|
+
* @param repoRoot - Absolute path to the repository root.
|
|
29
|
+
* @param flags - Optional CLI-level overrides (e.g. --static-only).
|
|
30
|
+
*/
|
|
31
|
+
export declare function auditDirectory(repoRoot: string, flags?: AuditFlags): Promise<AuditPipelineResult>;
|