mxready 1.0.0__py3-none-any.whl

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.
Files changed (71) hide show
  1. mxready/__init__.py +1 -0
  2. mxready/api/__init__.py +4 -0
  3. mxready/api/middleware.py +149 -0
  4. mxready/api/rules.py +10 -0
  5. mxready/api/scans.py +164 -0
  6. mxready/api/workspace.py +156 -0
  7. mxready/app.py +179 -0
  8. mxready/cli/__init__.py +1 -0
  9. mxready/cli/build_verification_bundle.py +45 -0
  10. mxready/cli/generate_public_report.py +140 -0
  11. mxready/cli/scan_batch.py +368 -0
  12. mxready/cli/scan_repository.py +212 -0
  13. mxready/cli/serve.py +55 -0
  14. mxready/config.py +117 -0
  15. mxready/errors.py +11 -0
  16. mxready/logging_setup.py +88 -0
  17. mxready/mcp/__init__.py +5 -0
  18. mxready/mcp/server.py +433 -0
  19. mxready/models.py +382 -0
  20. mxready/persistence/__init__.py +1 -0
  21. mxready/persistence/sqlite.py +581 -0
  22. mxready/py.typed +0 -0
  23. mxready/reporting/__init__.py +4 -0
  24. mxready/reporting/badge.py +40 -0
  25. mxready/reporting/comparison.py +33 -0
  26. mxready/reporting/markdown.py +157 -0
  27. mxready/reporting/sarif.py +94 -0
  28. mxready/reporting/terminal.py +75 -0
  29. mxready/repository/__init__.py +14 -0
  30. mxready/repository/git_client.py +275 -0
  31. mxready/repository/github_archive.py +566 -0
  32. mxready/repository/identity.py +140 -0
  33. mxready/resources/__init__.py +19 -0
  34. mxready/resources/frontend/assets/index-BxJEwNUm.css +1 -0
  35. mxready/resources/frontend/assets/index-lzTCdWAt.js +9 -0
  36. mxready/resources/frontend/assets/mx-chip-C0HgFQyE.webp +0 -0
  37. mxready/resources/frontend/index.html +17 -0
  38. mxready/resources/rules/v1/core.yml +634 -0
  39. mxready/resources/rules/v1/manifest.yml +4 -0
  40. mxready/resources/schemas/verification-result-v1.json +259 -0
  41. mxready/scanning/__init__.py +17 -0
  42. mxready/scanning/analyzer.py +183 -0
  43. mxready/scanning/facts.py +596 -0
  44. mxready/scanning/indexer.py +299 -0
  45. mxready/scanning/path_context.py +174 -0
  46. mxready/scanning/python_source.py +67 -0
  47. mxready/scanning/rule_engine.py +595 -0
  48. mxready/scanning/rule_loader.py +282 -0
  49. mxready/scanning/toolchain.py +100 -0
  50. mxready/services/__init__.py +3 -0
  51. mxready/services/scans.py +239 -0
  52. mxready/services/worker.py +38 -0
  53. mxready/verification/__init__.py +11 -0
  54. mxready/verification/bundle.py +137 -0
  55. mxready/verification/validation.py +101 -0
  56. mxready-1.0.0.dist-info/METADATA +526 -0
  57. mxready-1.0.0.dist-info/RECORD +71 -0
  58. mxready-1.0.0.dist-info/WHEEL +5 -0
  59. mxready-1.0.0.dist-info/entry_points.txt +8 -0
  60. mxready-1.0.0.dist-info/licenses/LICENSE +201 -0
  61. mxready-1.0.0.dist-info/top_level.txt +2 -0
  62. mxready_runner/__init__.py +1 -0
  63. mxready_runner/__main__.py +3 -0
  64. mxready_runner/cli.py +88 -0
  65. mxready_runner/contracts.py +26 -0
  66. mxready_runner/execute.py +185 -0
  67. mxready_runner/inspect.py +79 -0
  68. mxready_runner/process.py +103 -0
  69. mxready_runner/py.typed +0 -0
  70. mxready_runner/redact.py +36 -0
  71. mxready_runner/schema.py +326 -0
@@ -0,0 +1,19 @@
1
+ """Versioned resources distributed with MXReady."""
2
+
3
+ from importlib.resources import files
4
+ from pathlib import Path
5
+
6
+
7
+ def default_rules_directory() -> Path:
8
+ """Installed wheels and source checkouts share the same packaged rules."""
9
+ return Path(str(files(__package__).joinpath("rules", "v1")))
10
+
11
+
12
+ def verification_schema_bytes() -> bytes:
13
+ return files(__package__).joinpath("schemas", "verification-result-v1.json").read_bytes()
14
+
15
+
16
+ def default_frontend_directory() -> Path:
17
+ """Release wheels include the UI; source checkouts use Vite's build directory."""
18
+ packaged = Path(str(files(__package__).joinpath("frontend")))
19
+ return packaged if (packaged / "index.html").is_file() else Path("frontend/dist")
@@ -0,0 +1 @@
1
+ :root{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;color:#182b27;background:#f7f8f5;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;--canvas: #f7f8f5;--surface: #fff;--ink: #182b27;--muted: #596c65;--accent: #16745b;--accent-dark: #105d49;--tint: #edf4ef;--line: #dce4de;--control-line: #82968b;--danger: #ad3434;--warning: #8b5a0b;--info: #375e81;--radius: 16px;--mono: "Cascadia Code", "SFMono-Regular", Consolas, monospace}*{box-sizing:border-box}body{margin:0;min-width:320px}button,input{font:inherit}button,a,summary,input{-webkit-tap-highlight-color:transparent}button,summary{cursor:pointer}button{min-height:44px}button:disabled{cursor:not-allowed}a{color:var(--accent);text-underline-offset:4px}a:hover{color:var(--accent-dark)}h1,h2,h3,p{margin:0}h1{font-size:clamp(30px,3vw,40px);line-height:1.25;letter-spacing:-.04em;font-weight:700}h2{font-size:19px;line-height:1.5;font-weight:650}h3{font-size:16px}p{line-height:1.8}code,pre{font-family:var(--mono)}svg{display:block}.icon{width:22px;height:22px;flex:0 0 auto}button,a,input,summary{transition:background-color .15s,border-color .15s,color .15s}:where(button,a,input,summary,[tabindex]):focus-visible{outline:3px solid var(--accent);outline-offset:4px}::selection{background:#cce6d8;color:var(--ink)}.app-shell{min-height:100vh}.skip-link{position:fixed;top:12px;left:16px;z-index:10;padding:12px 20px;background:var(--ink);color:#fff;border-radius:8px;transform:translateY(-180%)}.skip-link:focus{transform:translateY(0);color:#fff}.workspace-sidebar{position:fixed;inset:0 auto 0 0;width:216px;display:flex;flex-direction:column;gap:38px;padding:34px 20px 24px;background:var(--surface);border-right:1px solid var(--line)}.brand{display:inline-flex;align-items:center;gap:11px;color:var(--ink);text-decoration:none}.brand strong{font-size:24px;letter-spacing:-.7px}.brand-mark{width:34px;height:34px;color:var(--accent);flex-shrink:0}.workspace-current{display:flex;align-items:center;gap:14px;min-height:52px;padding:12px 14px;color:var(--accent-dark);background:var(--tint);border-radius:10px;font-size:15px;font-weight:650}.sidebar-caption{margin-top:auto;padding-top:24px;border-top:1px solid var(--line);color:var(--muted);font-size:12px;letter-spacing:.05em}.workspace{margin-left:216px}.workspace-header{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:84px;padding:20px clamp(24px,3.5vw,56px);font-size:13px}.breadcrumb{display:flex;gap:16px;color:var(--muted)}.breadcrumb span:last-child{color:var(--ink)}.header-meta{color:var(--muted);white-space:nowrap;font-size:12px}main{max-width:1560px;margin:0 auto;padding:30px clamp(24px,3.5vw,56px) 24px}main>*,.workspace,.scan-workspace,.report-main,.report-tools{min-width:0}.page-heading{margin-bottom:32px}.page-heading p{margin-top:12px;color:var(--muted);font-size:16px;letter-spacing:.02em}.scan-card{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);overflow:hidden;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 8px 30px #182b2705}.scan-form{padding:clamp(24px,3vw,44px);min-width:0}.form-heading{display:flex;align-items:center;gap:16px;margin-bottom:38px}.step-number{display:grid;place-items:center;width:42px;height:42px;background:var(--tint);color:var(--accent-dark);border-radius:9px;font-family:var(--mono);font-size:15px}.field{display:grid;gap:10px;margin-bottom:26px}.field label{font-size:14px;font-weight:550}.field input{min-width:0;width:100%;height:50px;padding:0 14px;color:var(--ink);background:#fff;border:1px solid var(--control-line);border-radius:8px;font-size:14px}.field input:hover{border-color:var(--accent)}.field input::placeholder{color:#65776f;opacity:1}.field small{color:var(--muted);font-size:12px;line-height:1.6}.primary-button,.secondary-button,.bundle-link,.upload-button,.text-button{display:inline-flex;align-items:center;justify-content:center;gap:14px;min-height:48px;padding:12px 20px;border-radius:8px;font-size:14px;font-weight:600;text-decoration:none;line-height:1.5}.primary-button,.bundle-link,.upload-button{color:#fff;background:var(--accent);border:1px solid var(--accent)}.primary-button:hover:not(:disabled),.bundle-link:hover,.upload-button:hover:not(:disabled){color:#fff;background:var(--accent-dark);border-color:var(--accent-dark)}.primary-button:disabled,.upload-button:disabled{background:#e8ece9;color:#596c65;border-color:#e8ece9}.scan-form>.primary-button{width:100%;margin-top:6px}.secondary-button{color:var(--ink);background:var(--surface);border:1px solid var(--control-line)}.secondary-button:hover{background:var(--tint);border-color:var(--accent)}.text-button{color:var(--accent);background:transparent;border:0}.text-button:hover{background:var(--tint)}.form-safety{display:flex;align-items:center;gap:10px;margin-top:28px;padding-top:22px;border-top:1px solid var(--line);color:var(--muted);font-size:12px}.form-error{margin:0 0 16px;padding:14px;border-radius:8px;color:var(--danger);background:#fff1ef;overflow-wrap:anywhere}.form-error span{font-family:var(--mono);font-size:12px}.form-error p{font-size:14px;margin-top:6px}.chip-art{position:relative;background:#f3f5ef;min-width:0}.chip-art img{display:block;position:absolute;width:100%;height:100%;object-fit:cover}.chip-art>span{position:absolute;z-index:1;left:28px;top:30px;font-family:var(--mono);letter-spacing:.17em;font-size:12px;color:#284e3f}.workflow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px;list-style:none;margin:24px 0 0;padding:24px 32px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius)}.workflow li{display:flex;align-items:center;gap:18px;position:relative}.workflow li+li{border-left:1px solid var(--line);padding-left:24px}.workflow-icon{display:grid;place-items:center;width:52px;height:52px;flex:0 0 auto;border:1px solid var(--line);color:var(--accent-dark);border-radius:10px}.workflow li div{display:grid;gap:7px}.workflow small{font-family:var(--mono);color:var(--muted);font-size:12px}.workflow strong{font-size:15px;font-weight:600}.workspace-footer{display:flex;gap:8px;align-items:center;margin-top:24px;color:var(--muted);font-size:12px}.workspace-footer .icon{width:16px;height:16px}.report-view{display:grid;gap:24px}.report-heading{display:flex;justify-content:space-between;align-items:flex-start;gap:24px}.report-heading>div{min-width:0}#report-title{width:fit-content}.report-heading>button{flex-shrink:0}.repository-identity{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;margin-top:16px;font-size:14px}.repository-identity a{color:var(--ink);text-decoration:none;overflow-wrap:anywhere}.repository-identity a:hover{text-decoration:underline}.provider-label{font-family:var(--mono);color:var(--muted);font-size:12px;text-transform:uppercase}.repository-identity code{padding:4px 8px;border:1px solid var(--line);border-radius:5px;font-size:12px}.status-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.status-card{display:flex;align-items:flex-start;gap:18px;padding:24px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius)}.panel-icon{display:inline-grid;place-items:center;width:48px;height:48px;flex:0 0 auto;background:var(--tint);color:var(--accent-dark);border-radius:12px}.panel-icon .icon{width:26px;height:26px}.status-card h2{display:inline;font-size:16px;margin-right:12px}.status-label{display:inline-block;padding:4px 9px;border-radius:6px;font-size:12px;font-weight:550;color:var(--muted);background:#eff2f0}.status-card p{margin-top:9px;font-size:12px;color:var(--muted)}.report-status-passed .status-label,.hardware-status-verified .status-label{background:#e6f3e9;color:#21643b}.report-status-blocked .status-label,.report-status-failed .status-label,.hardware-status-failed .status-label{background:#fff0ee;color:var(--danger)}.report-status-warnings .status-label,.hardware-status-stale .status-label{background:#fff1d5;color:var(--warning)}.report-summary{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius)}.summary-counts{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin:0;padding:24px 0}.summary-counts>div{padding:0 28px}.summary-counts>div+div{border-left:1px solid var(--line)}.summary-counts dt{font-size:12px;color:var(--muted)}.summary-counts dd{margin:6px 0 0;font-size:28px;font-weight:650;font-variant-numeric:tabular-nums}.summary-blocker dd{color:var(--danger)}.summary-warning dd{color:var(--warning)}.summary-info dd{color:var(--info)}.summary-meta{display:flex;flex-wrap:wrap;gap:8px 32px;margin:0;padding:14px 28px;border-top:1px solid var(--line);color:var(--muted);font-size:12px}.summary-meta>div{display:flex;flex-wrap:wrap;gap:8px}.summary-meta dd{margin:0;color:var(--ink)}.report-layout{display:grid;grid-template-columns:minmax(0,1.65fr) minmax(300px,1fr);align-items:start;gap:20px}.report-main,.report-tools{display:grid;gap:20px}.report-section,.verification-panel{padding:24px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius)}.section-heading{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;margin-bottom:20px}.finding-filters{display:flex;flex-wrap:wrap;padding:3px;background:var(--canvas);border:1px solid var(--line);border-radius:8px}.finding-filters button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:7px 12px;color:var(--muted);border:0;border-radius:5px;background:transparent;font-size:12px}.finding-filters button:hover{background:#e2ede5;color:var(--ink)}.finding-filters button[aria-pressed=true]{color:#fff;background:var(--accent)}.finding-filters button span{font-family:var(--mono);font-size:12px}.finding-list{display:grid;gap:12px}.finding-card{min-width:0;border:1px solid var(--line);border-radius:9px}.finding-header{padding:14px 16px}.finding-toggle{display:grid;grid-template-columns:minmax(0,1fr) 20px;gap:10px;width:100%;padding:0;color:var(--ink);text-align:left;border:0;background:transparent}.finding-badges{display:flex;flex-wrap:wrap;align-items:center;gap:10px;min-width:0}.finding-severity{padding:3px 8px;color:var(--info);background:#edf3fa;border-radius:5px;font-size:12px;font-weight:600}.finding-blocker .finding-severity{color:var(--danger);background:#fff0ee}.finding-warning .finding-severity{color:var(--warning);background:#fff1d5}.finding-rule{font-family:var(--mono);color:var(--muted);font-size:12px;overflow-wrap:anywhere}.finding-title{grid-row:2;font-size:15px;font-weight:600;line-height:1.6}.finding-location{grid-row:3;color:var(--muted);font-size:12px;overflow-wrap:anywhere;line-height:1.6}.finding-chevron{grid-column:2;grid-row:1;color:var(--muted);transition:transform .15s}.finding-chevron .icon{width:18px;height:18px}.finding-chevron-open{transform:rotate(180deg)}.finding-body{padding:0 16px 16px;min-width:0}.finding-message{color:var(--muted);font-size:13px;overflow-wrap:anywhere}.evidence-block{margin:14px 0;padding:16px;overflow-x:auto;background:#f3f6f4;border:1px solid #e8ede9;border-radius:6px;font-size:12px;line-height:1.8;tab-size:4}.recommendation{display:grid;gap:6px;font-size:13px}.recommendation>span{font-size:12px;font-weight:650}.recommendation p{color:var(--muted);overflow-wrap:anywhere}.finding-references{display:flex;flex-wrap:wrap;align-items:center;gap:4px 14px;margin-top:12px;font-size:12px}.finding-references>span{color:var(--muted)}.finding-references a{display:inline-flex;align-items:center;gap:8px;min-height:44px;overflow-wrap:anywhere}.empty-findings{display:grid;justify-items:center;gap:14px;text-align:center;padding:44px 16px}.empty-findings strong{font-size:15px}.empty-findings p,.section-empty{font-size:13px;color:var(--muted)}.checklist{margin:0;padding:0;list-style:none}.checklist li{display:grid;grid-template-columns:32px minmax(0,1fr);gap:14px;padding:18px 0;border-top:1px solid var(--line)}.checklist li:first-child{padding-top:0;border-top:0}.checklist li:last-child{padding-bottom:0}.checklist li>span{display:grid;place-items:center;align-self:start;height:32px;background:var(--tint);border-radius:6px;font-size:12px;font-family:var(--mono)}.checklist strong{font-size:14px}.checklist p{margin:6px 0;color:var(--muted);font-size:13px;overflow-wrap:anywhere}.checklist small{color:var(--muted);font-family:var(--mono);font-size:12px;overflow-wrap:anywhere}.download-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.download-grid a{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;min-height:78px;border:1px solid var(--control-line);border-radius:8px;color:var(--ink);text-decoration:none;font-size:12px}.download-grid a:hover{background:var(--tint);border-color:var(--accent)}.export-section>p{margin-top:16px;color:var(--muted);font-size:12px}.analysis-warnings{padding:20px 24px;background:#fff8e9;border:1px solid #e4d2aa;border-radius:var(--radius)}.analysis-warnings h2{display:flex;align-items:center;gap:10px;color:var(--warning);font-size:15px}.analysis-warnings ul{margin:12px 0 0;padding:0;list-style:none}.analysis-warnings li{display:flex;flex-wrap:wrap;gap:6px 12px;padding:12px 0;font-size:12px;overflow-wrap:anywhere}.analysis-warnings li+li{border-top:1px solid #e4d2aa}.analysis-warnings code{color:var(--warning)}.analysis-warnings span{color:var(--muted)}.analysis-warnings p{width:100%}.verification-panel{display:flex;flex-direction:column;align-items:stretch}.verification-heading{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:12px}.verification-heading h2{font-size:18px}.verification-state{display:inline-block;padding:4px 8px;border-radius:5px;font-size:12px;background:#eff2f0;color:var(--muted)}.state-verified{color:#21643b;background:#e6f3e9}.state-stale{color:var(--warning);background:#fff1d5}.state-failed{color:var(--danger);background:#fff0ee}.verification-detail{color:var(--muted);font-size:12px;margin-bottom:12px}.verification-reminder{font-size:13px;margin-bottom:18px}.verification-actions{display:grid;gap:20px}.bundle-link{width:100%}.upload-form{display:grid;gap:10px;min-width:0}.upload-form>label{font-size:12px;font-weight:600}.file-control{position:relative;display:flex;align-items:center;gap:8px;min-height:48px;padding:12px;border:1px solid var(--control-line);border-radius:8px;min-width:0;color:var(--muted);font-size:12px}.file-control:focus-within{outline:3px solid var(--accent);outline-offset:4px}.file-control input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}.file-control span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-control:after{content:"浏览";margin-left:auto;flex-shrink:0;color:var(--accent)}.upload-form>small{color:var(--muted);font-size:12px}.upload-form>p[role=alert]{color:var(--danger);font-size:13px;overflow-wrap:anywhere}.verification-instructions{margin-top:20px;border-top:1px solid var(--line)}.verification-instructions summary{min-height:52px;display:flex;justify-content:space-between;align-items:center;gap:10px;padding-top:8px;font-size:13px;font-weight:600;list-style:none}.verification-instructions summary::-webkit-details-marker{display:none}.verification-instructions[open] summary .icon{transform:rotate(180deg)}.verification-truth{font-size:12px;color:var(--muted);padding:12px 0}.verification-steps{display:grid;gap:18px;margin:12px 0 0;padding:0;list-style:none}.verification-steps li{display:grid;grid-template-columns:24px minmax(0,1fr);gap:8px}.verification-steps li>span{color:var(--accent);font-family:var(--mono);font-size:12px}.verification-steps strong{font-size:13px}.verification-steps p,.verification-steps code{margin-top:6px;display:block;color:var(--muted);font-size:12px;line-height:1.8;overflow-wrap:anywhere}.report-reset{display:flex;justify-content:center}.progress-panel,.error-panel{width:min(100%,720px);margin:32px auto 64px;padding:clamp(24px,4vw,48px);background:var(--surface);border:1px solid var(--line);border-radius:var(--radius)}.eyebrow{margin:20px 0 8px;font-size:12px;color:var(--muted)}.progress-panel h2{font-size:clamp(22px,3vw,30px);overflow-wrap:anywhere}.stage-message{margin:12px 0 28px;font-size:14px;color:var(--accent)}.stage-list{padding:0;margin:0;list-style:none}.stage{display:grid;grid-template-columns:16px minmax(0,1fr) auto;gap:14px;align-items:center;min-height:58px;border-top:1px solid var(--line);font-size:14px;color:var(--muted)}.stage-dot{width:8px;height:8px;border:1px solid var(--control-line);border-radius:50%}.stage-done .stage-dot{background:var(--accent);border-color:var(--accent)}.stage-active{color:var(--accent-dark);font-weight:600}.stage-active .stage-dot{background:var(--accent);border-color:var(--accent);box-shadow:0 0 0 4px #e0efe5}.stage small{font-size:12px}.progress-note{margin-top:24px;color:var(--muted);font-size:12px}.error-panel{text-align:center}.error-panel h1{margin-bottom:20px;font-size:clamp(24px,3vw,32px)}.error-code{display:inline-block;max-width:100%;padding:6px 10px;color:var(--danger);background:#fff0ee;font-size:12px;border-radius:6px;overflow-wrap:anywhere}.error-panel>p:not(.eyebrow){margin:20px 0 28px;color:var(--muted);font-size:14px;overflow-wrap:anywhere}.error-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:12px}.report-skeleton{display:grid;gap:20px}.skeleton-block{padding:28px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius)}.skeleton-line{height:12px;margin:14px 0;background:#e7eee9;border-radius:4px;animation:skeleton-pulse 1.5s ease-in-out infinite alternate}.skeleton-line-lg{width:45%;height:28px}.skeleton-line-md{width:65%}.skeleton-line-sm{width:30%}.skeleton-summary{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}.skeleton-card{padding:16px;margin-top:18px;border:1px solid var(--line);border-radius:8px}.button-spinner{width:18px;height:18px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin .9s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@keyframes skeleton-pulse{to{opacity:.45}}@media(max-width:1199px){.workspace-sidebar{position:static;width:100%;flex-direction:row;align-items:center;padding:16px 28px;gap:28px;border-right:0;border-bottom:1px solid var(--line)}.brand strong{font-size:22px}.workspace-current{min-height:44px;padding:8px 14px;font-size:13px}.workspace-current .icon{width:18px;height:18px}.sidebar-caption{margin-top:0;margin-left:auto;padding:0;border:0}.workspace{margin-left:0}.workspace-header{min-height:64px}main{padding-top:20px}}@media(max-width:959px){.report-layout{grid-template-columns:minmax(0,1fr)}.report-tools{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start}.status-card{padding:20px;gap:12px}.status-card .panel-icon{display:none}.scan-form{padding:28px}.workflow{padding:24px;gap:16px}.workflow-icon{width:40px;height:40px}}@media(max-width:767px){.workspace-sidebar{padding:18px 16px}.workspace-current,.sidebar-caption{display:none}.brand strong{font-size:22px}.brand-mark{width:28px;height:28px}.workspace-header{padding:16px;min-height:58px}.breadcrumb{gap:10px;font-size:12px}.header-meta{font-size:12px}main{padding:16px}.page-heading{margin-bottom:24px}.page-heading p{font-size:14px}.scan-card{grid-template-columns:minmax(0,1fr)}.chip-art{display:none}.scan-form{padding:24px 20px}.form-heading{margin-bottom:28px;gap:12px}.form-heading h2{font-size:18px}.field{margin-bottom:24px}.form-safety{gap:8px;font-size:12px}.workflow{padding:20px 14px;gap:12px}.workflow li{flex-direction:column;align-items:flex-start;gap:12px}.workflow li+li{padding-left:12px}.workflow li div{gap:6px}.workflow strong{font-size:13px}.workflow-icon{width:36px;height:36px}.workflow-icon .icon{width:19px;height:19px}.report-view{gap:20px}.report-heading{flex-wrap:wrap;gap:16px}.report-heading>button{min-height:44px;padding:8px 14px}.repository-identity{font-size:13px;gap:10px}.status-grid{grid-template-columns:minmax(0,1fr);gap:12px}.summary-counts{grid-template-columns:repeat(2,minmax(0,1fr));padding:0}.summary-counts>div{padding:20px}.summary-counts>div:nth-child(3){border-left:0}.summary-counts>div:nth-child(n+3){border-top:1px solid var(--line)}.summary-meta{padding:16px 20px;gap:10px;flex-direction:column}.report-tools{grid-template-columns:minmax(0,1fr)}.report-section,.verification-panel,.analysis-warnings{padding:20px 16px}.section-heading{align-items:stretch;flex-direction:column}.finding-filters{width:100%}.finding-filters button{flex:1;min-height:44px;padding:7px 8px;gap:6px}.finding-header{padding:14px 12px}.finding-body{padding:0 12px 14px}.finding-title{font-size:14px}.evidence-block{padding:12px}.progress-panel,.error-panel{margin:12px auto 32px}.skeleton-block{padding:20px}.skeleton-summary{gap:16px}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}