@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,342 @@
|
|
|
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 { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
|
|
9
|
+
import { join, resolve } from "node:path";
|
|
10
|
+
import { parse as parseYaml } from "yaml";
|
|
11
|
+
import { loadConfig, resolveConfigPath } from "../config/schema.js";
|
|
12
|
+
import { hashDeps } from "../util/hash-deps.js";
|
|
13
|
+
import { detectFromPackageJson } from "../detection/from-package-json.js";
|
|
14
|
+
import { walk, DEFAULT_EXCLUDE_PATHS } from "../walker.js";
|
|
15
|
+
import { parseTs } from "../parsers/ts.js";
|
|
16
|
+
import { parseCss } from "../parsers/css.js";
|
|
17
|
+
import { extractCssInJs } from "../parsers/css-in-js.js";
|
|
18
|
+
import { loadTokens } from "../loaders/tokens.js";
|
|
19
|
+
import { loadStories } from "../loaders/stories.js";
|
|
20
|
+
import { buildComponentInventory } from "../loaders/components.js";
|
|
21
|
+
import { ruleObjects } from "../rules/registry.js";
|
|
22
|
+
import { loadGeneratedPack } from "../rules/pack-loader.js";
|
|
23
|
+
import { runRules } from "../rule-runner.js";
|
|
24
|
+
import { scoreFromFindings } from "../scorer.js";
|
|
25
|
+
import { VERSION } from "../index.js";
|
|
26
|
+
import { RULES_VERSION } from "../rules/manifest.js";
|
|
27
|
+
import { runLayer4Stage } from "../llm/layer4-stage.js";
|
|
28
|
+
import { isSuppressed } from "../suppression/inline.js";
|
|
29
|
+
import { loadLyseIgnore } from "../suppression/lyseignore.js";
|
|
30
|
+
// Import for local use within this module (function signatures).
|
|
31
|
+
import { RefuseToRunError } from "./audit-flags.js";
|
|
32
|
+
// Re-export AuditFlags + RefuseToRunError for backward compatibility.
|
|
33
|
+
// External callers (cli.ts, fix.ts, tests) import these from audit-pipeline.
|
|
34
|
+
export { RefuseToRunError };
|
|
35
|
+
function maybePrintRefreshHint(repoRoot) {
|
|
36
|
+
const metaPath = join(repoRoot, ".lyse", "init-meta.json");
|
|
37
|
+
if (!existsSync(metaPath))
|
|
38
|
+
return;
|
|
39
|
+
try {
|
|
40
|
+
const meta = JSON.parse(readFileSync(metaPath, "utf8"));
|
|
41
|
+
const daysSince = (Date.now() - meta.generated_at_ms) / 86_400_000;
|
|
42
|
+
const currentHash = hashDeps(repoRoot, meta.selected_deps);
|
|
43
|
+
const depsChanged = currentHash !== meta.deps_hash;
|
|
44
|
+
if (depsChanged) {
|
|
45
|
+
process.stderr.write(`[hint] Major dependency change detected since last init. Run 'lyse init --refresh' to update your rule pack.\n`);
|
|
46
|
+
}
|
|
47
|
+
else if (daysSince > 90) {
|
|
48
|
+
process.stderr.write(`[hint] Your rule pack was generated ${Math.floor(daysSince)} days ago. Consider 'lyse init --refresh' to regenerate it.\n`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
/* ignore malformed meta */
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function readPackageJson(path) {
|
|
56
|
+
try {
|
|
57
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function collectAllDeps(pkg) {
|
|
64
|
+
return { ...pkg.dependencies, ...pkg.devDependencies };
|
|
65
|
+
}
|
|
66
|
+
function readWorkspaceGlobs(repoRoot, rootPkg) {
|
|
67
|
+
if (rootPkg.workspaces) {
|
|
68
|
+
if (Array.isArray(rootPkg.workspaces))
|
|
69
|
+
return rootPkg.workspaces;
|
|
70
|
+
if (rootPkg.workspaces.packages)
|
|
71
|
+
return rootPkg.workspaces.packages;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const raw = readFileSync(join(repoRoot, "pnpm-workspace.yaml"), "utf8");
|
|
75
|
+
const parsed = parseYaml(raw);
|
|
76
|
+
if (parsed?.packages && Array.isArray(parsed.packages))
|
|
77
|
+
return parsed.packages;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// no pnpm-workspace.yaml — fine
|
|
81
|
+
}
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
// Workspace globs like "apps/*" — we only resolve the first wildcard level
|
|
85
|
+
// (no recursive ** support) which is enough for the stack-detection signal we
|
|
86
|
+
// need without pulling fast-glob into the audit hot path.
|
|
87
|
+
function resolveWorkspaceGlob(repoRoot, glob) {
|
|
88
|
+
const segments = glob.split("/");
|
|
89
|
+
let candidates = [repoRoot];
|
|
90
|
+
for (const seg of segments) {
|
|
91
|
+
const next = [];
|
|
92
|
+
for (const base of candidates) {
|
|
93
|
+
if (seg === "*") {
|
|
94
|
+
try {
|
|
95
|
+
for (const child of readdirSync(base)) {
|
|
96
|
+
const full = join(base, child);
|
|
97
|
+
try {
|
|
98
|
+
if (statSync(full).isDirectory() && child !== "node_modules")
|
|
99
|
+
next.push(full);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// skip unreadable entries
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// skip unreadable directories
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
next.push(join(base, seg));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
candidates = next;
|
|
115
|
+
}
|
|
116
|
+
return candidates;
|
|
117
|
+
}
|
|
118
|
+
function detectStack(repoRoot) {
|
|
119
|
+
const rootPkg = readPackageJson(join(repoRoot, "package.json"));
|
|
120
|
+
if (!rootPkg)
|
|
121
|
+
return [];
|
|
122
|
+
const aggregate = collectAllDeps(rootPkg);
|
|
123
|
+
// Monorepo support: if the root package.json declares workspaces, merge sub-
|
|
124
|
+
// package deps so stack detection works for cal.com-style repos where react/
|
|
125
|
+
// tailwind/storybook live in `apps/web/package.json` not the root.
|
|
126
|
+
const globs = readWorkspaceGlobs(repoRoot, rootPkg);
|
|
127
|
+
if (globs.length > 0) {
|
|
128
|
+
const seen = new Set();
|
|
129
|
+
for (const glob of globs) {
|
|
130
|
+
for (const dir of resolveWorkspaceGlob(repoRoot, glob)) {
|
|
131
|
+
if (seen.has(dir))
|
|
132
|
+
continue;
|
|
133
|
+
seen.add(dir);
|
|
134
|
+
const subPkg = readPackageJson(join(dir, "package.json"));
|
|
135
|
+
if (!subPkg)
|
|
136
|
+
continue;
|
|
137
|
+
Object.assign(aggregate, collectAllDeps(subPkg));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const has = (k) => Object.prototype.hasOwnProperty.call(aggregate, k);
|
|
142
|
+
const stack = [];
|
|
143
|
+
if (has("react"))
|
|
144
|
+
stack.push("react");
|
|
145
|
+
if (has("tailwindcss"))
|
|
146
|
+
stack.push("tailwind");
|
|
147
|
+
if (has("@storybook/react") || has("storybook"))
|
|
148
|
+
stack.push("storybook");
|
|
149
|
+
if (has("styled-components"))
|
|
150
|
+
stack.push("styled-components");
|
|
151
|
+
return stack;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Run a full audit on a repository root.
|
|
155
|
+
* This is the same pipeline as the `lyse audit` CLI command, extracted for
|
|
156
|
+
* programmatic use by the fix orchestrator and future commands.
|
|
157
|
+
*
|
|
158
|
+
* @param repoRoot - Absolute path to the repository root.
|
|
159
|
+
* @param flags - Optional CLI-level overrides (e.g. --static-only).
|
|
160
|
+
*/
|
|
161
|
+
export async function auditDirectory(repoRoot, flags) {
|
|
162
|
+
const absoluteRoot = resolve(repoRoot);
|
|
163
|
+
const t0 = Date.now();
|
|
164
|
+
const config = loadConfig(absoluteRoot);
|
|
165
|
+
// Resolve componentsModule: prefer explicit config, fall back to auto-detection
|
|
166
|
+
// so DS monorepos (workspace-walk branch) get scored without needing lyse init.
|
|
167
|
+
let componentsModule = config.designSystem?.componentsModule ?? null;
|
|
168
|
+
let dsSelfMode = false;
|
|
169
|
+
if (!componentsModule) {
|
|
170
|
+
const detected = await detectFromPackageJson(absoluteRoot);
|
|
171
|
+
componentsModule = detected.componentsModule.value ?? null;
|
|
172
|
+
// When detection source is "workspace DS export", the repo IS the DS itself.
|
|
173
|
+
// Rules like no-native-shadows and stories/coverage have consumer-of-DS semantics
|
|
174
|
+
// and must skip — v0.2 will add DS-self-aware rule variants.
|
|
175
|
+
if (detected.componentsModule.source.startsWith("workspace DS export")) {
|
|
176
|
+
dsSelfMode = true;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const userExcludePaths = config.designSystem?.excludePaths ?? [];
|
|
180
|
+
// `.lyseignore` patterns (loaded once at repo root) — same gitignore-style
|
|
181
|
+
// syntax as user `excludePaths`. Threaded to the walker and respected at
|
|
182
|
+
// the file-walk layer (no work done on these files at all).
|
|
183
|
+
const lyseIgnorePatterns = loadLyseIgnore(absoluteRoot);
|
|
184
|
+
// Combine DEFAULT_EXCLUDE_PATHS with user-provided excludePaths.
|
|
185
|
+
// User paths EXTEND the defaults (they never replace them).
|
|
186
|
+
// The walker already applies DEFAULT_EXCLUDE_PATHS internally; extraIgnores
|
|
187
|
+
// carries the user's additions so they are also respected at the walker layer.
|
|
188
|
+
const excludePaths = [...DEFAULT_EXCLUDE_PATHS, ...userExcludePaths, ...lyseIgnorePatterns];
|
|
189
|
+
flags?.progress?.update("Discovering files…");
|
|
190
|
+
const files = await walk(absoluteRoot, { extraIgnores: [...userExcludePaths, ...lyseIgnorePatterns] });
|
|
191
|
+
flags?.progress?.update(`Parsing source (${files.length} files)…`);
|
|
192
|
+
const parsed = { ts: [], css: [], cssInJs: [] };
|
|
193
|
+
// Keep the raw source per relative file path so we can apply inline
|
|
194
|
+
// suppression directives (`// lyse-disable-next-line <ruleId>`) AFTER
|
|
195
|
+
// runRules emits findings. Without this map, the directives — promised in
|
|
196
|
+
// docs/configuration.md — would silently no-op.
|
|
197
|
+
const fileContents = new Map();
|
|
198
|
+
let parseErrorCount = 0;
|
|
199
|
+
const fileResults = await Promise.all(files.map(async (path) => {
|
|
200
|
+
const source = readFileSync(path, "utf8");
|
|
201
|
+
const rel = path.startsWith(absoluteRoot + "/") ? path.slice(absoluteRoot.length + 1) : path;
|
|
202
|
+
if (/\.(tsx?|jsx?|mjs|cjs)$/.test(path)) {
|
|
203
|
+
const ts = await parseTs(rel, source);
|
|
204
|
+
const cssInJs = ts.ast !== null ? extractCssInJs(rel, source) : [];
|
|
205
|
+
return { kind: "ts", ts, cssInJs, rel, source };
|
|
206
|
+
}
|
|
207
|
+
if (/\.(s?css)$/.test(path)) {
|
|
208
|
+
const css = await parseCss(rel, source);
|
|
209
|
+
return { kind: "css", css, path, rel, source };
|
|
210
|
+
}
|
|
211
|
+
return null;
|
|
212
|
+
}));
|
|
213
|
+
for (const r of fileResults) {
|
|
214
|
+
if (r)
|
|
215
|
+
fileContents.set(r.rel, r.source);
|
|
216
|
+
}
|
|
217
|
+
for (const r of fileResults) {
|
|
218
|
+
if (r?.kind === "ts") {
|
|
219
|
+
parsed.ts.push(r.ts);
|
|
220
|
+
if (r.ts.ast === null)
|
|
221
|
+
parseErrorCount++;
|
|
222
|
+
else
|
|
223
|
+
parsed.cssInJs.push(...r.cssInJs);
|
|
224
|
+
}
|
|
225
|
+
else if (r?.kind === "css") {
|
|
226
|
+
if (r.css.skipped) {
|
|
227
|
+
// The walker only globs `.css` / `.scss` and the SCSS transform either
|
|
228
|
+
// succeeds or falls back to `skipped: true` — both reach this branch
|
|
229
|
+
// as a generic parse error.
|
|
230
|
+
parseErrorCount++;
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
parsed.css.push(r.css);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (parseErrorCount > 0) {
|
|
238
|
+
process.stderr.write(`[lyse] Warning: skipped ${parseErrorCount} file${parseErrorCount !== 1 ? "s" : ""} due to parse errors ` +
|
|
239
|
+
`(malformed source — file is excluded from audit results)\n`);
|
|
240
|
+
}
|
|
241
|
+
flags?.progress?.update("Loading tokens + components + stories…");
|
|
242
|
+
const tokens = await loadTokens(absoluteRoot);
|
|
243
|
+
const storyIndex = await loadStories(absoluteRoot);
|
|
244
|
+
const componentInventory = componentsModule
|
|
245
|
+
? buildComponentInventory(componentsModule, parsed.ts)
|
|
246
|
+
: [];
|
|
247
|
+
const ctx = {
|
|
248
|
+
repoRoot: absoluteRoot,
|
|
249
|
+
tokens,
|
|
250
|
+
componentsModule,
|
|
251
|
+
componentInventory,
|
|
252
|
+
storyIndex,
|
|
253
|
+
excludePaths,
|
|
254
|
+
dsSelfMode,
|
|
255
|
+
};
|
|
256
|
+
const generated = loadGeneratedPack(absoluteRoot);
|
|
257
|
+
for (const w of generated.warnings)
|
|
258
|
+
process.stderr.write(`[lyse] ${w}\n`);
|
|
259
|
+
const allRules = [...ruleObjects, ...generated.rules];
|
|
260
|
+
flags?.progress?.update(`Running ${allRules.length} rules…`);
|
|
261
|
+
const runResult = await runRules(allRules, ctx, parsed);
|
|
262
|
+
// Apply inline suppression directives — `// lyse-disable-next-line <ruleId>`
|
|
263
|
+
// and `/* lyse-disable <ruleId> */` — to drop findings the user has
|
|
264
|
+
// explicitly approved. Filter happens AFTER the rule engine so rules don't
|
|
265
|
+
// need to be suppression-aware. Per `packages/core/src/suppression/inline.ts`.
|
|
266
|
+
const suppressedCount = { value: 0 };
|
|
267
|
+
runResult.findings = runResult.findings.filter((f) => {
|
|
268
|
+
const source = fileContents.get(f.location.file);
|
|
269
|
+
if (!source)
|
|
270
|
+
return true;
|
|
271
|
+
if (isSuppressed(source, f.ruleId, f.location.line)) {
|
|
272
|
+
suppressedCount.value++;
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
return true;
|
|
276
|
+
});
|
|
277
|
+
// Re-tally findingsByAxis after suppression to keep score math accurate.
|
|
278
|
+
for (const axis of Object.keys(runResult.findingsByAxis)) {
|
|
279
|
+
runResult.findingsByAxis[axis] = runResult.findings.filter((f) => f.axis === axis).length;
|
|
280
|
+
}
|
|
281
|
+
// -----------------------------------------------------------------------
|
|
282
|
+
// Layer 4: LLM augmentation (ADR-0015) — delegated to llm/layer4-stage.ts.
|
|
283
|
+
// -----------------------------------------------------------------------
|
|
284
|
+
const layer4 = await runLayer4Stage({
|
|
285
|
+
repoRoot: absoluteRoot,
|
|
286
|
+
config,
|
|
287
|
+
flags,
|
|
288
|
+
staticFindings: runResult.findings,
|
|
289
|
+
});
|
|
290
|
+
// Merge augmented findings into static findings BEFORE scoring so the
|
|
291
|
+
// final score reflects both Layers 1+2 and Layer 4.
|
|
292
|
+
if (layer4.augmentedFindings.length > 0) {
|
|
293
|
+
runResult.findings.push(...layer4.augmentedFindings);
|
|
294
|
+
// Keep findingsByAxis counts in sync so score() reflects the new findings.
|
|
295
|
+
for (const f of layer4.augmentedFindings) {
|
|
296
|
+
const ax = f.axis;
|
|
297
|
+
if (ax in runResult.findingsByAxis) {
|
|
298
|
+
runResult.findingsByAxis[ax]++;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Re-sort by severity (error < warn < info)
|
|
302
|
+
const severityOrder = { error: 0, warn: 1, info: 2 };
|
|
303
|
+
runResult.findings.sort((a, b) => (severityOrder[a.severity] ?? 9) - (severityOrder[b.severity] ?? 9));
|
|
304
|
+
}
|
|
305
|
+
const layer4Meta = layer4.meta;
|
|
306
|
+
// -----------------------------------------------------------------------
|
|
307
|
+
// Phase 4.1 — v2 scorer: severity-weighted rate + log-scaled absolute cap.
|
|
308
|
+
// We pass the flat findings list (post-suppression, post-Layer-4) directly;
|
|
309
|
+
// the adapter aggregates into per-axis severity buckets internally.
|
|
310
|
+
flags?.progress?.update("Scoring…");
|
|
311
|
+
const scoring = scoreFromFindings(runResult.findings, runResult.opportunitiesByAxis);
|
|
312
|
+
const result = {
|
|
313
|
+
schemaVersion: 2,
|
|
314
|
+
rulesVersion: RULES_VERSION,
|
|
315
|
+
toolVersion: VERSION,
|
|
316
|
+
// "scoring-v1" = pinned axis-weighted formula in `scorer.ts` (the v0.1.0
|
|
317
|
+
// active path). The sub-axis-aware variant (`computeScoreV1` in
|
|
318
|
+
// `reliability/score/formula-v1.ts`) is read-only at v0.1.0 — powers
|
|
319
|
+
// `lyse explain --score` and goes live as the actual scorer once gold-set
|
|
320
|
+
// promotion of sub-axes to `stable` lands (v0.2+). Same semver bump.
|
|
321
|
+
scoringVersion: "scoring-v1",
|
|
322
|
+
repoRoot: absoluteRoot,
|
|
323
|
+
timestamp: new Date().toISOString(),
|
|
324
|
+
stack: detectStack(absoluteRoot),
|
|
325
|
+
finalScore: scoring.finalScore,
|
|
326
|
+
tier: scoring.tier,
|
|
327
|
+
axes: scoring.axes,
|
|
328
|
+
findings: runResult.findings,
|
|
329
|
+
meta: {
|
|
330
|
+
...(layer4Meta ? { layer4: layer4Meta } : {}),
|
|
331
|
+
coverage: {
|
|
332
|
+
scannedFiles: files.length,
|
|
333
|
+
durationMs: Date.now() - t0,
|
|
334
|
+
configPath: resolveConfigPath(absoluteRoot),
|
|
335
|
+
...(runResult.parseErrors.length > 0 ? { parseErrors: runResult.parseErrors } : {}),
|
|
336
|
+
},
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
maybePrintRefreshHint(absoluteRoot);
|
|
340
|
+
return { result, tokens, config, componentInventory, fileCount: files.length };
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=audit-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-pipeline.js","sourceRoot":"","sources":["../../src/commands/audit-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { writeFile, mkdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, basename, join, resolve } from "node:path";
|
|
3
|
+
import { execFileSync } from "node:child_process";
|
|
4
|
+
import { buildEvidencePack } from "../bench/evidence-pack/builder.js";
|
|
5
|
+
import { VERSION } from "../index.js";
|
|
6
|
+
function resolveHeadSha(repoRoot) {
|
|
7
|
+
try {
|
|
8
|
+
return execFileSync("git", ["rev-parse", "HEAD"], { cwd: repoRoot, encoding: "utf8" }).trim();
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return "unknown";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async function readPackageJsonName(repoRoot) {
|
|
15
|
+
try {
|
|
16
|
+
const raw = await readFile(join(repoRoot, "package.json"), "utf8");
|
|
17
|
+
const parsed = JSON.parse(raw);
|
|
18
|
+
if (typeof parsed.name === "string" && parsed.name.length > 0)
|
|
19
|
+
return parsed.name;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// ignore
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
async function resolveOwnerName(repoRoot) {
|
|
27
|
+
// package.json `name` is the most reliable identifier when the bench pack is
|
|
28
|
+
// produced from a non-git fixture or a subdirectory whose parent git repo is
|
|
29
|
+
// not the package under audit. When present, it wins over the parsed remote.
|
|
30
|
+
const pkgName = await readPackageJsonName(repoRoot);
|
|
31
|
+
try {
|
|
32
|
+
const remote = execFileSync("git", ["config", "--get", "remote.origin.url"], { cwd: repoRoot, encoding: "utf8" }).trim();
|
|
33
|
+
const match = remote.match(/[:/]([^/]+)\/([^/.]+?)(\.git)?$/);
|
|
34
|
+
if (match) {
|
|
35
|
+
return { owner: match[1] ?? "unknown", name: pkgName ?? match[2] ?? "unknown" };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// fallthrough
|
|
40
|
+
}
|
|
41
|
+
if (pkgName !== null)
|
|
42
|
+
return { owner: "unknown", name: pkgName };
|
|
43
|
+
return { owner: "unknown", name: basename(repoRoot) };
|
|
44
|
+
}
|
|
45
|
+
export async function runBenchPack(opts) {
|
|
46
|
+
const repoRoot = resolve(opts.cwd);
|
|
47
|
+
const headSha = resolveHeadSha(repoRoot);
|
|
48
|
+
const ownerName = await resolveOwnerName(repoRoot);
|
|
49
|
+
const pack = await buildEvidencePack({
|
|
50
|
+
repoRoot,
|
|
51
|
+
owner: ownerName.owner,
|
|
52
|
+
name: ownerName.name,
|
|
53
|
+
headSha,
|
|
54
|
+
lyseCliVersion: VERSION,
|
|
55
|
+
extractedAt: new Date().toISOString(),
|
|
56
|
+
});
|
|
57
|
+
await mkdir(dirname(resolve(opts.output)), { recursive: true });
|
|
58
|
+
await writeFile(resolve(opts.output), JSON.stringify(pack), "utf8");
|
|
59
|
+
console.log(`bench-pack: wrote ${opts.output}`);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=bench-pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bench-pack.js","sourceRoot":"","sources":["../../src/commands/bench-pack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir, access } from "node:fs/promises";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { detectFromGit } from "../detection/from-git.js";
|
|
5
|
+
import { confirm } from "../menu/prompts.js";
|
|
6
|
+
import { appendCiSetupCompletedEvent } from "../history/ndjson-store.js";
|
|
7
|
+
export async function runCiSetup(opt) {
|
|
8
|
+
const git = await detectFromGit(opt.cwd);
|
|
9
|
+
if (!git.github.value) {
|
|
10
|
+
throw new Error("No GitHub remote detected. `lyse ci setup` requires a GitHub repo.");
|
|
11
|
+
}
|
|
12
|
+
const wfPath = join(opt.cwd, ".github/workflows/lyse.yml");
|
|
13
|
+
try {
|
|
14
|
+
await access(wfPath);
|
|
15
|
+
if (!opt.autoApprove) {
|
|
16
|
+
const overwrite = await confirm(`.github/workflows/lyse.yml exists. Overwrite?`, false);
|
|
17
|
+
if (!overwrite) {
|
|
18
|
+
console.log("Aborted (existing file preserved).");
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// File does not exist — proceed to create
|
|
25
|
+
}
|
|
26
|
+
// Read template — file is co-located via package.json files[]
|
|
27
|
+
const templatePath = join(dirname(fileURLToPath(import.meta.url)), "templates/lyse-workflow.yml.template");
|
|
28
|
+
const template = await readFile(templatePath, "utf8");
|
|
29
|
+
const rendered = template
|
|
30
|
+
.replaceAll("{{ default_branch }}", git.git.value?.defaultBranch ?? "main")
|
|
31
|
+
.replaceAll("{{ threshold }}", String(opt.threshold ?? 70))
|
|
32
|
+
.replaceAll("{{ post_pr_comment }}", String(opt.postPrComment ?? true))
|
|
33
|
+
.replaceAll("{{ upload_sarif }}", String(opt.uploadSarif ?? true))
|
|
34
|
+
.replaceAll("{{ publish_bench }}", String(opt.publishBench ?? false));
|
|
35
|
+
await mkdir(join(opt.cwd, ".github/workflows"), { recursive: true });
|
|
36
|
+
await writeFile(wfPath, rendered);
|
|
37
|
+
console.log(`✓ Created ${wfPath}`);
|
|
38
|
+
console.log(` Don't forget: git add .github/workflows/lyse.yml && commit && push`);
|
|
39
|
+
// Emit telemetry event (opt-in only)
|
|
40
|
+
await appendCiSetupCompletedEvent(opt.cwd, opt.threshold ?? 70);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=ci-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-setup.js","sourceRoot":"","sources":["../../src/commands/ci-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAWzE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAmB;IAClD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,4BAA4B,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;YACxF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IAED,8DAA8D;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAC;IAC3G,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAG,QAAQ;SACtB,UAAU,CAAC,sBAAsB,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,IAAI,MAAM,CAAC;SAC1E,UAAU,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;SAC1D,UAAU,CAAC,uBAAuB,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;SACtE,UAAU,CAAC,oBAAoB,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;SACjE,UAAU,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC;IAExE,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IAEpF,qCAAqC;IACrC,MAAM,2BAA2B,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `~/.lyse/profile.json` records the once-per-machine opt-in decision so we
|
|
3
|
+
* never re-prompt. After a 2xx from the Worker the email itself is dropped
|
|
4
|
+
* locally (only `sentAt` survives); if delivery failed we keep the email
|
|
5
|
+
* locally so the next audit can retry.
|
|
6
|
+
*/
|
|
7
|
+
export type ProfileFile = {
|
|
8
|
+
email: string;
|
|
9
|
+
createdAt: string;
|
|
10
|
+
lyseVersion: string;
|
|
11
|
+
sentAt?: string;
|
|
12
|
+
} | {
|
|
13
|
+
declined: true;
|
|
14
|
+
declinedAt: string;
|
|
15
|
+
lyseVersion: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function workerEmailEndpoint(env?: NodeJS.ProcessEnv): string;
|
|
18
|
+
export declare function isValidEmail(input: string): boolean;
|
|
19
|
+
export declare function profilePath(homeDir?: string): string;
|
|
20
|
+
export declare function hasProfileDecision(homeDir?: string): boolean;
|
|
21
|
+
export declare function readProfile(homeDir?: string): ProfileFile | null;
|
|
22
|
+
export declare function shouldPromptForEmail(opt: {
|
|
23
|
+
yes?: boolean;
|
|
24
|
+
}, env?: NodeJS.ProcessEnv, isTTY?: boolean, homeDir?: string): boolean;
|
|
25
|
+
export declare function buildProfile(email: string, now?: Date): ProfileFile;
|
|
26
|
+
export declare function buildDeclinedProfile(now?: Date): ProfileFile;
|
|
27
|
+
export declare function persistProfile(profile: ProfileFile, homeDir?: string): Promise<string>;
|
|
28
|
+
export declare function postEmailToWorker(email: string, opt?: {
|
|
29
|
+
endpoint?: string;
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
env?: NodeJS.ProcessEnv;
|
|
32
|
+
}): Promise<boolean>;
|
|
33
|
+
export declare function syncPendingEmail(homeDir?: string): Promise<"sent" | "skipped" | "failed">;
|
|
34
|
+
export declare function maybePromptForEmail(opt: {
|
|
35
|
+
yes?: boolean;
|
|
36
|
+
}): Promise<void>;
|