@getcodesentinel/codesentinel 1.20.0 → 1.22.0
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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,sans-serif;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body{color:#2d3338;background:#f9f9fb;font-family:Inter,sans-serif}.material-symbols-outlined{font-variation-settings:"FILL" 0, "wght" 300, "GRAD" 0, "opsz" 24}#root{min-height:100vh}.ds-label-sm{text-transform:uppercase;letter-spacing:.05em;--tw-text-opacity:1;color:rgb(89 96 101/var(--tw-text-opacity,1));font-size:.6875rem;font-weight:700}.ds-headline-sm{letter-spacing:-.01em;--tw-text-opacity:1;color:rgb(45 51 56/var(--tw-text-opacity,1));font-size:1.5rem;font-weight:500}.ds-section-heading{letter-spacing:-.01em;--tw-text-opacity:1;color:rgb(45 51 56/var(--tw-text-opacity,1));font-size:1rem;font-weight:400}.ds-title-md{--tw-text-opacity:1;color:rgb(45 51 56/var(--tw-text-opacity,1));font-size:1.125rem;font-weight:600}.ds-nav-text{letter-spacing:-.025em;--tw-text-opacity:1;color:rgb(89 96 101/var(--tw-text-opacity,1));font-size:.875rem}.ds-meta-label{text-transform:uppercase;letter-spacing:.1em;--tw-text-opacity:1;color:rgb(89 96 101/var(--tw-text-opacity,1));font-size:.6875rem;font-weight:700}.ds-body-md{--tw-text-opacity:1;color:rgb(89 96 101/var(--tw-text-opacity,1));font-size:.875rem;line-height:1.625}.ds-body-sm{--tw-text-opacity:1;color:rgb(89 96 101/var(--tw-text-opacity,1));font-size:.8125rem;line-height:1.625}.ds-metric-value{letter-spacing:-.025em;--tw-text-opacity:1;color:rgb(45 51 56/var(--tw-text-opacity,1));font-weight:600}.ds-metric-unit{--tw-text-opacity:1;color:rgb(89 96 101/var(--tw-text-opacity,1));font-weight:500}.ds-surface-card{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-shadow:0 12px 40px #2d33380a;--tw-shadow-colored:0 12px 40px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow);border-radius:.5rem}.ds-surface-panel{--tw-bg-opacity:1;background-color:rgb(242 244 246/var(--tw-bg-opacity,1));border-width:1px;border-color:#acb3b81a;border-radius:.5rem}.ds-surface-inset{--tw-bg-opacity:1;background-color:rgb(235 238 242/var(--tw-bg-opacity,1));border-radius:.5rem}.ds-button-primary{--tw-bg-opacity:1;background-color:rgb(95 94 96/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(250 247 249/var(--tw-text-opacity,1));border-radius:.25rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;line-height:1.25rem;transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ds-button-primary:hover{opacity:.9}.ds-button-primary:active{--tw-scale-x:.99;--tw-scale-y:.99;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ds-icon-button{--tw-text-opacity:1;color:rgb(95 94 96/var(--tw-text-opacity,1));border-radius:.25rem;padding:.5rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ds-icon-button:hover{--tw-text-opacity:1;color:rgb(45 51 56/var(--tw-text-opacity,1))}.ds-quiet-action{--tw-text-opacity:1;color:rgb(0 93 187/var(--tw-text-opacity,1));font-size:.875rem;font-weight:700;line-height:1.25rem}.ds-quiet-action:hover{text-decoration-line:underline}.ds-issue-card{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow);border-color:#9f403d80;border-left-width:4px;border-radius:.5rem;padding:1.25rem;transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ds-issue-card:hover{--tw-shadow:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.ds-chip-risk{--tw-text-opacity:1;color:rgb(117 33 33/var(--tw-text-opacity,1));background-color:#fe898333;border-radius:.75rem;align-items:center;padding:.125rem .625rem;font-size:.75rem;font-weight:700;line-height:1rem;display:inline-flex}.ds-chip-health{--tw-text-opacity:1;color:rgb(0 93 187/var(--tw-text-opacity,1));background-color:#5095fe33;border-radius:.75rem;align-items:center;padding:.125rem .625rem;font-size:.75rem;font-weight:700;line-height:1rem;display:inline-flex}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.left-0{left:0}.top-0{top:0}.z-40{z-index:40}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-24{height:6rem}.h-4{height:1rem}.h-48{height:12rem}.h-8{height:2rem}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-4{width:1rem}.w-64{width:16rem}.w-8{width:2rem}.w-\[1px\]{width:1px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0}.min-w-\[2rem\]{min-width:2rem}.max-w-2xl{max-width:42rem}.max-w-7xl{max-width:80rem}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.-translate-x-full{--tw-translate-x:-100%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-help{cursor:help}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;user-select:none}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.125rem}.rounded-2xl{border-radius:1rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:.75rem}.rounded-lg{border-radius:.25rem}.rounded-xl{border-radius:.5rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-4{border-left-width:4px}.border-r-2{border-right-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-\[\#5f5e60\]{--tw-border-opacity:1;border-color:rgb(95 94 96/var(--tw-border-opacity,1))}.border-amber-500\/20{border-color:#f59e0b33}.border-emerald-500\/20{border-color:#10b98133}.border-error{--tw-border-opacity:1;border-color:rgb(159 64 61/var(--tw-border-opacity,1))}.border-outline-variant\/10{border-color:#acb3b81a}.border-outline-variant\/20{border-color:#acb3b833}.border-outline-variant\/50{border-color:#acb3b880}.border-primary{--tw-border-opacity:1;border-color:rgb(95 94 96/var(--tw-border-opacity,1))}.border-rose-500\/20{border-color:#f43f5e33}.border-surface-container-high{--tw-border-opacity:1;border-color:rgb(228 233 238/var(--tw-border-opacity,1))}.border-surface-container-low{--tw-border-opacity:1;border-color:rgb(242 244 246/var(--tw-border-opacity,1))}.border-tertiary{--tw-border-opacity:1;border-color:rgb(0 93 187/var(--tw-border-opacity,1))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-l-transparent{border-left-color:#0000}.border-t-transparent{border-top-color:#0000}.bg-\[\#f2f4f6\]{--tw-bg-opacity:1;background-color:rgb(242 244 246/var(--tw-bg-opacity,1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-black\/50{background-color:#00000080}.bg-emerald-500\/10{background-color:#10b9811a}.bg-error{--tw-bg-opacity:1;background-color:rgb(159 64 61/var(--tw-bg-opacity,1))}.bg-error-container\/10{background-color:#fe89831a}.bg-error-container\/20{background-color:#fe898333}.bg-error\/10{background-color:#9f403d1a}.bg-outline-variant\/30{background-color:#acb3b84d}.bg-primary{--tw-bg-opacity:1;background-color:rgb(95 94 96/var(--tw-bg-opacity,1))}.bg-primary-container{--tw-bg-opacity:1;background-color:rgb(228 226 228/var(--tw-bg-opacity,1))}.bg-primary\/35{background-color:#5f5e6059}.bg-rose-500\/10{background-color:#f43f5e1a}.bg-secondary{--tw-bg-opacity:1;background-color:rgb(95 95 98/var(--tw-bg-opacity,1))}.bg-surface{--tw-bg-opacity:1;background-color:rgb(249 249 251/var(--tw-bg-opacity,1))}.bg-surface-container{--tw-bg-opacity:1;background-color:rgb(235 238 242/var(--tw-bg-opacity,1))}.bg-surface-container-high{--tw-bg-opacity:1;background-color:rgb(228 233 238/var(--tw-bg-opacity,1))}.bg-surface-container-high\/30{background-color:#e4e9ee4d}.bg-surface-container-high\/50{background-color:#e4e9ee80}.bg-surface-container-low{--tw-bg-opacity:1;background-color:rgb(242 244 246/var(--tw-bg-opacity,1))}.bg-surface-container-lowest{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-tertiary{--tw-bg-opacity:1;background-color:rgb(0 93 187/var(--tw-bg-opacity,1))}.bg-transparent{background-color:#0000}.bg-white\/50{background-color:#ffffff80}.bg-white\/80{background-color:#fffc}.bg-gradient-to-t{background-image:linear-gradient(to top, var(--tw-gradient-stops))}.from-surface-container\/90{--tw-gradient-from:#ebeef2e6 var(--tw-gradient-from-position);--tw-gradient-to:#ebeef200 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0\.5{padding:.125rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-12{padding-bottom:3rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pl-4{padding-left:1rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pt-16{padding-top:4rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-6xl{font-size:3.75rem;line-height:1}.text-\[0\.6875rem\]{font-size:.6875rem}.text-\[0\.875rem\]{font-size:.875rem}.text-\[0\.95rem\]{font-size:.95rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[16px\]{font-size:16px}.text-\[18px\]{font-size:18px}.text-\[20px\]{font-size:20px}.text-\[3\.5rem\]{font-size:3.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-none{line-height:1}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.16em\]{letter-spacing:.16em}.tracking-\[0\.18em\]{letter-spacing:.18em}.tracking-\[0\.1em\]{letter-spacing:.1em}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[\#2d3338\]{--tw-text-opacity:1;color:rgb(45 51 56/var(--tw-text-opacity,1))}.text-\[\#596065\]{--tw-text-opacity:1;color:rgb(89 96 101/var(--tw-text-opacity,1))}.text-\[\#5f5e60\]{--tw-text-opacity:1;color:rgb(95 94 96/var(--tw-text-opacity,1))}.text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.text-error{--tw-text-opacity:1;color:rgb(159 64 61/var(--tw-text-opacity,1))}.text-error-container{--tw-text-opacity:1;color:rgb(254 137 131/var(--tw-text-opacity,1))}.text-inherit{color:inherit}.text-on-error-container{--tw-text-opacity:1;color:rgb(117 33 33/var(--tw-text-opacity,1))}.text-on-primary{--tw-text-opacity:1;color:rgb(250 247 249/var(--tw-text-opacity,1))}.text-on-surface{--tw-text-opacity:1;color:rgb(45 51 56/var(--tw-text-opacity,1))}.text-on-surface-variant{--tw-text-opacity:1;color:rgb(89 96 101/var(--tw-text-opacity,1))}.text-primary{--tw-text-opacity:1;color:rgb(95 94 96/var(--tw-text-opacity,1))}.text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity,1))}.text-tertiary{--tw-text-opacity:1;color:rgb(0 93 187/var(--tw-text-opacity,1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-30{opacity:.3}.mix-blend-overlay{mix-blend-mode:overlay}.shadow-\[0_12px_40px_rgba\(45\,51\,56\,0\.04\)\]{--tw-shadow:0 12px 40px #2d33380a;--tw-shadow-colored:0 12px 40px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-\[0_12px_40px_rgba\(45\,51\,56\,0\.06\)\]{--tw-shadow:0 12px 40px #2d33380f;--tw-shadow-colored:0 12px 40px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.outline-none{outline-offset:2px;outline:2px solid #0000}.outline{outline-style:solid}.ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-surface{--tw-ring-opacity:1;--tw-ring-color:rgb(249 249 251/var(--tw-ring-opacity,1))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-property:transform;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.hover\:bg-surface-container:hover{--tw-bg-opacity:1;background-color:rgb(235 238 242/var(--tw-bg-opacity,1))}.hover\:bg-surface-container-high:hover{--tw-bg-opacity:1;background-color:rgb(228 233 238/var(--tw-bg-opacity,1))}.hover\:bg-surface-container-low:hover{--tw-bg-opacity:1;background-color:rgb(242 244 246/var(--tw-bg-opacity,1))}.hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.hover\:bg-white\/30:hover{background-color:#ffffff4d}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.group:hover .group-hover\:translate-x-1{--tw-translate-x:.25rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=active\]\:bg-background[data-state=active]{--tw-bg-opacity:1;background-color:rgb(249 249 251/var(--tw-bg-opacity,1))}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}@media not all and (width>=1024px){.max-lg\:p-8{padding:2rem}}@media not all and (width>=768px){.max-md\:w-full{width:100%}.max-md\:flex-col{flex-direction:column}.max-md\:items-start{align-items:flex-start}.max-md\:gap-6{gap:1.5rem}.max-md\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem * var(--tw-space-y-reverse))}.max-md\:p-4{padding:1rem}.max-md\:text-lg{font-size:1.125rem;line-height:1.75rem}}@media not all and (width>=640px){.max-sm\:hidden{display:none}}@media (width>=640px){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:hidden{display:none}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}}@media (width>=768px){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-8{grid-column:span 8/span 8}.md\:ml-\[4\.5rem\]{margin-left:4.5rem}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-\[4\.5rem\]{width:4.5rem}.md\:translate-x-0{--tw-translate-x:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:gap-4{gap:1rem}.md\:gap-6{gap:1.5rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (width>=1024px){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:ml-64{margin-left:16rem}.lg\:block{display:block}.lg\:inline{display:inline}.lg\:w-64{width:16rem}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:items-start{align-items:flex-start}.lg\:justify-start{justify-content:flex-start}.lg\:p-4{padding:1rem}.lg\:px-3{padding-left:.75rem;padding-right:.75rem}.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{--tw-rotate:180deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>CodeSentinel Report</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
8
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
9
|
+
<link
|
|
10
|
+
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
|
|
11
|
+
rel="stylesheet"
|
|
12
|
+
/>
|
|
13
|
+
<link
|
|
14
|
+
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap"
|
|
15
|
+
rel="stylesheet"
|
|
16
|
+
/>
|
|
17
|
+
<script type="module" crossorigin src="./assets/index-Cy8GTWA7.js"></script>
|
|
18
|
+
<link rel="stylesheet" crossorigin href="./assets/index-DBUTjR5j.css">
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
<div id="root"></div>
|
|
22
|
+
</body>
|
|
23
|
+
</html>
|
package/dist/index.js
CHANGED
|
@@ -1753,6 +1753,7 @@ var analyzeDependencyCandidateFromRegistry = async (input) => {
|
|
|
1753
1753
|
};
|
|
1754
1754
|
|
|
1755
1755
|
// ../reporter/dist/index.js
|
|
1756
|
+
import { basename, posix } from "path";
|
|
1756
1757
|
var SNAPSHOT_SCHEMA_VERSION = "codesentinel.snapshot.v1";
|
|
1757
1758
|
var REPORT_SCHEMA_VERSION = "codesentinel.report.v1";
|
|
1758
1759
|
var RISK_MODEL_VERSION = "deterministic-v1";
|
|
@@ -1914,6 +1915,11 @@ var compareSnapshots = (current, baseline) => {
|
|
|
1914
1915
|
}
|
|
1915
1916
|
};
|
|
1916
1917
|
};
|
|
1918
|
+
var toPosixDirname = (value) => {
|
|
1919
|
+
const normalized = value.replaceAll("\\", "/");
|
|
1920
|
+
const directory = posix.dirname(normalized);
|
|
1921
|
+
return directory === "." ? "root" : directory;
|
|
1922
|
+
};
|
|
1917
1923
|
var findTraceTarget = (snapshot, targetType, targetId) => snapshot.trace?.targets.find(
|
|
1918
1924
|
(target) => target.targetType === targetType && target.targetId === targetId
|
|
1919
1925
|
);
|
|
@@ -1959,14 +1965,27 @@ var suggestedActions = (target) => {
|
|
|
1959
1965
|
}
|
|
1960
1966
|
return [...new Set(actions)].slice(0, 3);
|
|
1961
1967
|
};
|
|
1962
|
-
var
|
|
1968
|
+
var hotspotReason = (factors) => {
|
|
1969
|
+
if (factors.length === 0) {
|
|
1970
|
+
return "Limited trace data available for this hotspot.";
|
|
1971
|
+
}
|
|
1972
|
+
return factors.slice(0, 2).map((factor) => `${factor.label} (${factor.contribution})`).join(" + ");
|
|
1973
|
+
};
|
|
1974
|
+
var hotspotItems = (snapshot) => snapshot.analysis.risk.hotspots.slice(0, 10).map((hotspot, index) => {
|
|
1963
1975
|
const fileScore = snapshot.analysis.risk.fileScores.find((item) => item.file === hotspot.file);
|
|
1976
|
+
const evolutionMetrics = snapshot.analysis.evolution.available ? snapshot.analysis.evolution.files.find((item) => item.filePath === hotspot.file) : void 0;
|
|
1964
1977
|
const traceTarget = findTraceTarget(snapshot, "file", hotspot.file);
|
|
1965
1978
|
const factors = toRenderedFactors(traceTarget);
|
|
1966
1979
|
return {
|
|
1980
|
+
rank: index + 1,
|
|
1967
1981
|
target: hotspot.file,
|
|
1982
|
+
module: toPosixDirname(hotspot.file),
|
|
1968
1983
|
score: hotspot.score,
|
|
1969
1984
|
normalizedScore: fileScore?.normalizedScore ?? round43(hotspot.score / 100),
|
|
1985
|
+
commitCount: evolutionMetrics?.commitCount ?? null,
|
|
1986
|
+
churnTotal: evolutionMetrics?.churnTotal ?? null,
|
|
1987
|
+
riskContributions: hotspot.factors,
|
|
1988
|
+
reason: hotspotReason(factors),
|
|
1970
1989
|
topFactors: factors,
|
|
1971
1990
|
suggestedActions: suggestedActions(traceTarget),
|
|
1972
1991
|
biggestLevers: (traceTarget?.reductionLevers ?? []).slice(0, 3).map((lever) => `${factorLabel(lever.factorId)} (${lever.estimatedImpact})`)
|
|
@@ -1987,6 +2006,51 @@ var repositoryConfidence = (snapshot) => {
|
|
|
1987
2006
|
);
|
|
1988
2007
|
return round43(weighted / weight);
|
|
1989
2008
|
};
|
|
2009
|
+
var normalizeDependencyScope = (scope) => {
|
|
2010
|
+
switch (scope) {
|
|
2011
|
+
case "prod":
|
|
2012
|
+
case "dev":
|
|
2013
|
+
return scope;
|
|
2014
|
+
default:
|
|
2015
|
+
return "unknown";
|
|
2016
|
+
}
|
|
2017
|
+
};
|
|
2018
|
+
var topStructuralFiles = (snapshot, selector) => [...snapshot.analysis.structural.files].sort((a, b) => selector(b) - selector(a) || a.relativePath.localeCompare(b.relativePath)).slice(0, 5).map((file) => ({
|
|
2019
|
+
file: file.relativePath,
|
|
2020
|
+
module: toPosixDirname(file.relativePath),
|
|
2021
|
+
value: selector(file)
|
|
2022
|
+
}));
|
|
2023
|
+
var cycleDetails = (snapshot) => snapshot.analysis.structural.cycles.map((cycle, index) => {
|
|
2024
|
+
const nodes = [...cycle.nodes].sort((a, b) => a.localeCompare(b));
|
|
2025
|
+
return {
|
|
2026
|
+
id: `cycle-${index + 1}`,
|
|
2027
|
+
size: nodes.length,
|
|
2028
|
+
nodes,
|
|
2029
|
+
path: nodes.join(" -> ")
|
|
2030
|
+
};
|
|
2031
|
+
});
|
|
2032
|
+
var riskyDependencies = (snapshot) => {
|
|
2033
|
+
if (!snapshot.analysis.external.available) {
|
|
2034
|
+
return [];
|
|
2035
|
+
}
|
|
2036
|
+
const dependencyByName = new Map(
|
|
2037
|
+
snapshot.analysis.external.dependencies.map((dependency) => [dependency.name, dependency])
|
|
2038
|
+
);
|
|
2039
|
+
return snapshot.analysis.risk.dependencyScores.map((score) => {
|
|
2040
|
+
const dependency = dependencyByName.get(score.dependency);
|
|
2041
|
+
const riskSignals = [.../* @__PURE__ */ new Set([...score.ownRiskSignals, ...score.inheritedRiskSignals])];
|
|
2042
|
+
return {
|
|
2043
|
+
name: score.dependency,
|
|
2044
|
+
score: score.score,
|
|
2045
|
+
normalizedScore: score.normalizedScore,
|
|
2046
|
+
dependencyScope: normalizeDependencyScope(dependency?.dependencyScope),
|
|
2047
|
+
direct: dependency?.direct ?? false,
|
|
2048
|
+
resolvedVersion: dependency?.resolvedVersion ?? null,
|
|
2049
|
+
riskSignals,
|
|
2050
|
+
reason: riskSignals.length === 0 ? "Derived from aggregate dependency risk signals." : riskSignals.join(", ")
|
|
2051
|
+
};
|
|
2052
|
+
}).filter((dependency) => dependency.score > 0).sort((a, b) => b.score - a.score || a.name.localeCompare(b.name)).slice(0, 20);
|
|
2053
|
+
};
|
|
1990
2054
|
var repositoryDimensionScores = (snapshot) => {
|
|
1991
2055
|
const target = findTraceTarget(snapshot, "repository", snapshot.analysis.structural.targetPath);
|
|
1992
2056
|
if (target === void 0) {
|
|
@@ -2019,6 +2083,7 @@ var createReport = (snapshot, diff) => {
|
|
|
2019
2083
|
schemaVersion: REPORT_SCHEMA_VERSION,
|
|
2020
2084
|
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2021
2085
|
repository: {
|
|
2086
|
+
name: basename(snapshot.analysis.structural.targetPath) || snapshot.analysis.structural.targetPath,
|
|
2022
2087
|
targetPath: snapshot.analysis.structural.targetPath,
|
|
2023
2088
|
riskScore: snapshot.analysis.risk.riskScore,
|
|
2024
2089
|
normalizedScore: snapshot.analysis.risk.normalizedScore,
|
|
@@ -2034,6 +2099,12 @@ var createReport = (snapshot, diff) => {
|
|
|
2034
2099
|
cycles: snapshot.analysis.structural.cycles.map(
|
|
2035
2100
|
(cycle) => [...cycle.nodes].sort((a, b) => a.localeCompare(b)).join(" -> ")
|
|
2036
2101
|
),
|
|
2102
|
+
cycleDetails: cycleDetails(snapshot),
|
|
2103
|
+
fanInOutExtremes: {
|
|
2104
|
+
highestFanIn: topStructuralFiles(snapshot, (file) => file.fanIn),
|
|
2105
|
+
highestFanOut: topStructuralFiles(snapshot, (file) => file.fanOut),
|
|
2106
|
+
deepestFiles: topStructuralFiles(snapshot, (file) => file.depth)
|
|
2107
|
+
},
|
|
2037
2108
|
fragileClusters: snapshot.analysis.risk.fragileClusters.map((cluster) => ({
|
|
2038
2109
|
id: cluster.id,
|
|
2039
2110
|
kind: cluster.kind,
|
|
@@ -2057,7 +2128,8 @@ var createReport = (snapshot, diff) => {
|
|
|
2057
2128
|
),
|
|
2058
2129
|
abandonedDependencies: [...external.abandonedDependencies].sort(
|
|
2059
2130
|
(a, b) => a.localeCompare(b)
|
|
2060
|
-
)
|
|
2131
|
+
),
|
|
2132
|
+
riskyDependencies: riskyDependencies(snapshot)
|
|
2061
2133
|
},
|
|
2062
2134
|
appendix: {
|
|
2063
2135
|
snapshotSchemaVersion: snapshot.schemaVersion,
|
|
@@ -2298,7 +2370,7 @@ var formatReport = (report, format) => {
|
|
|
2298
2370
|
|
|
2299
2371
|
// ../governance/dist/index.js
|
|
2300
2372
|
import { mkdirSync, rmSync } from "fs";
|
|
2301
|
-
import { basename, join as join5, resolve } from "path";
|
|
2373
|
+
import { basename as basename2, join as join5, resolve } from "path";
|
|
2302
2374
|
import { execFile } from "child_process";
|
|
2303
2375
|
import { promisify } from "util";
|
|
2304
2376
|
var EXIT_CODES = {
|
|
@@ -2911,9 +2983,9 @@ var resolveAutoBaselineRef = async (input) => {
|
|
|
2911
2983
|
|
|
2912
2984
|
// src/index.ts
|
|
2913
2985
|
import { readFileSync as readFileSync2 } from "fs";
|
|
2914
|
-
import { readFile as
|
|
2915
|
-
import { dirname as
|
|
2916
|
-
import { fileURLToPath } from "url";
|
|
2986
|
+
import { readFile as readFile7, writeFile as writeFile7 } from "fs/promises";
|
|
2987
|
+
import { dirname as dirname3, resolve as resolve6 } from "path";
|
|
2988
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
2917
2989
|
|
|
2918
2990
|
// src/application/format-analyze-output.ts
|
|
2919
2991
|
var toHealthTier2 = (score) => {
|
|
@@ -3558,7 +3630,7 @@ var promptInstall = async (packageName, latestVersion, currentVersion) => {
|
|
|
3558
3630
|
);
|
|
3559
3631
|
return "skip";
|
|
3560
3632
|
}
|
|
3561
|
-
return await new Promise((
|
|
3633
|
+
return await new Promise((resolve7) => {
|
|
3562
3634
|
emitKeypressEvents(stdin);
|
|
3563
3635
|
let selectedIndex = 0;
|
|
3564
3636
|
const previousRawMode = stdin.isRaw;
|
|
@@ -3583,7 +3655,7 @@ var promptInstall = async (packageName, latestVersion, currentVersion) => {
|
|
|
3583
3655
|
} else {
|
|
3584
3656
|
stderr.write("\n");
|
|
3585
3657
|
}
|
|
3586
|
-
|
|
3658
|
+
resolve7(choice);
|
|
3587
3659
|
};
|
|
3588
3660
|
const onKeypress = (_str, key) => {
|
|
3589
3661
|
if (key.ctrl === true && key.name === "c") {
|
|
@@ -3777,7 +3849,7 @@ var promptSelection = async (currentVersion, actions) => {
|
|
|
3777
3849
|
if (!stdin2.isTTY || !stderr2.isTTY || typeof stdin2.setRawMode !== "function") {
|
|
3778
3850
|
return "exit";
|
|
3779
3851
|
}
|
|
3780
|
-
return await new Promise((
|
|
3852
|
+
return await new Promise((resolve7) => {
|
|
3781
3853
|
emitKeypressEvents2(stdin2);
|
|
3782
3854
|
let selectedIndex = 0;
|
|
3783
3855
|
const previousRawMode = stdin2.isRaw;
|
|
@@ -3792,7 +3864,7 @@ var promptSelection = async (currentVersion, actions) => {
|
|
|
3792
3864
|
stdin2.setRawMode(previousRawMode);
|
|
3793
3865
|
clearTerminal();
|
|
3794
3866
|
showCursor2();
|
|
3795
|
-
|
|
3867
|
+
resolve7(selection);
|
|
3796
3868
|
};
|
|
3797
3869
|
const onKeypress = (_str, key) => {
|
|
3798
3870
|
if (key.ctrl === true && key.name === "c") {
|
|
@@ -3885,7 +3957,7 @@ var waitForReturnToMenu = async () => {
|
|
|
3885
3957
|
}
|
|
3886
3958
|
stderr2.write(`
|
|
3887
3959
|
${PROMPT_PADDING}Press enter to return to the menu...`);
|
|
3888
|
-
await new Promise((
|
|
3960
|
+
await new Promise((resolve7) => {
|
|
3889
3961
|
emitKeypressEvents2(stdin2);
|
|
3890
3962
|
const previousRawMode = stdin2.isRaw;
|
|
3891
3963
|
const cleanup = () => {
|
|
@@ -3894,7 +3966,7 @@ ${PROMPT_PADDING}Press enter to return to the menu...`);
|
|
|
3894
3966
|
stdin2.setRawMode(previousRawMode);
|
|
3895
3967
|
showCursor2();
|
|
3896
3968
|
stderr2.write("\n");
|
|
3897
|
-
|
|
3969
|
+
resolve7();
|
|
3898
3970
|
};
|
|
3899
3971
|
const onKeypress = (_str, key) => {
|
|
3900
3972
|
if (key.ctrl === true && key.name === "c") {
|
|
@@ -3912,7 +3984,7 @@ ${PROMPT_PADDING}Press enter to return to the menu...`);
|
|
|
3912
3984
|
});
|
|
3913
3985
|
};
|
|
3914
3986
|
var runCliCommand = async (scriptPath2, args) => {
|
|
3915
|
-
return await new Promise((
|
|
3987
|
+
return await new Promise((resolve7, reject) => {
|
|
3916
3988
|
const child = spawn2(process.execPath, [...process.execArgv, scriptPath2, ...args], {
|
|
3917
3989
|
stdio: ["inherit", "pipe", "pipe"],
|
|
3918
3990
|
env: {
|
|
@@ -3926,7 +3998,7 @@ var runCliCommand = async (scriptPath2, args) => {
|
|
|
3926
3998
|
reject(error);
|
|
3927
3999
|
});
|
|
3928
4000
|
child.on("close", (code) => {
|
|
3929
|
-
|
|
4001
|
+
resolve7(code ?? 1);
|
|
3930
4002
|
});
|
|
3931
4003
|
});
|
|
3932
4004
|
};
|
|
@@ -7640,7 +7712,124 @@ ${ciMarkdown}`;
|
|
|
7640
7712
|
};
|
|
7641
7713
|
|
|
7642
7714
|
// src/application/run-report-command.ts
|
|
7643
|
-
import {
|
|
7715
|
+
import { join as join8 } from "path";
|
|
7716
|
+
import { readFile as readFile6, writeFile as writeFile6 } from "fs/promises";
|
|
7717
|
+
|
|
7718
|
+
// src/application/html-report.ts
|
|
7719
|
+
import { mkdir as mkdir3, readFile as readFile5, rm, stat as stat2, writeFile as writeFile5 } from "fs/promises";
|
|
7720
|
+
import { dirname as dirname2, join as join7, resolve as resolve5 } from "path";
|
|
7721
|
+
import { fileURLToPath } from "url";
|
|
7722
|
+
var HTML_REPORT_DIR = ".codesentinel/report";
|
|
7723
|
+
var getBundledHtmlAppPath = () => resolve5(dirname2(fileURLToPath(import.meta.url)), "html-report-app");
|
|
7724
|
+
var serializeReportBootstrap = (report) => `window.__CODESENTINEL_REPORT__ = ${JSON.stringify(report).replaceAll("</", "<\\/")};
|
|
7725
|
+
`;
|
|
7726
|
+
var escapeInlineScript = (script) => script.replaceAll("</script", "<\\/script").replaceAll("<script", "\\x3Cscript").replaceAll("<!--", "\\x3C!--").replaceAll("\u2028", "\\u2028").replaceAll("\u2029", "\\u2029");
|
|
7727
|
+
var ensureDirectory = async (directoryPath) => {
|
|
7728
|
+
await mkdir3(directoryPath, { recursive: true });
|
|
7729
|
+
};
|
|
7730
|
+
var readReferencedAssets = async (appPath, indexHtml) => {
|
|
7731
|
+
const stylesheetPaths = [
|
|
7732
|
+
...indexHtml.matchAll(/<link[^>]+rel=["']stylesheet["'][^>]+href=["']([^"']+)["'][^>]*>/g)
|
|
7733
|
+
].map((match) => match[1]).filter(
|
|
7734
|
+
(value) => value !== void 0 && !/^https?:\/\//.test(value) && !value.startsWith("//")
|
|
7735
|
+
);
|
|
7736
|
+
const styles = await Promise.all(
|
|
7737
|
+
stylesheetPaths.map(async (href) => readFile5(resolve5(appPath, href), "utf8"))
|
|
7738
|
+
);
|
|
7739
|
+
const scriptPaths = [...indexHtml.matchAll(/<script[^>]+src=["']([^"']+)["'][^>]*><\/script>/g)].map((match) => match[1]).filter(
|
|
7740
|
+
(value) => value !== void 0 && !/^https?:\/\//.test(value) && !value.startsWith("//")
|
|
7741
|
+
);
|
|
7742
|
+
const scripts = await Promise.all(
|
|
7743
|
+
scriptPaths.map(async (src) => readFile5(resolve5(appPath, src), "utf8"))
|
|
7744
|
+
);
|
|
7745
|
+
return { styles, scripts };
|
|
7746
|
+
};
|
|
7747
|
+
var inlineBuiltHtml = async (appPath, report) => {
|
|
7748
|
+
const indexHtml = await readFile5(resolve5(appPath, "index.html"), "utf8");
|
|
7749
|
+
const { styles, scripts } = await readReferencedAssets(appPath, indexHtml);
|
|
7750
|
+
const htmlWithoutExternalAssets = indexHtml.replace(
|
|
7751
|
+
/\s*<link[^>]+rel=["']stylesheet["'][^>]*>\s*/g,
|
|
7752
|
+
(tag) => /href=["'](https?:)?\/\//.test(tag) ? tag : ""
|
|
7753
|
+
).replace(
|
|
7754
|
+
/\s*<script[^>]+src=["'][^"']+["'][^>]*><\/script>\s*/g,
|
|
7755
|
+
(tag) => /src=["'](https?:)?\/\//.test(tag) ? tag : ""
|
|
7756
|
+
);
|
|
7757
|
+
const inlineStyles = styles.map((style) => `<style>
|
|
7758
|
+
${style}
|
|
7759
|
+
</style>`).join("\n");
|
|
7760
|
+
const bootstrapScript = `<script>
|
|
7761
|
+
${serializeReportBootstrap(report)}</script>`;
|
|
7762
|
+
const inlineScripts = scripts.map((script) => `<script>
|
|
7763
|
+
${escapeInlineScript(script)}
|
|
7764
|
+
</script>`).join("\n");
|
|
7765
|
+
return htmlWithoutExternalAssets.replace("</head>", () => `${inlineStyles === "" ? "" : `${inlineStyles}
|
|
7766
|
+
`}</head>`).replace(
|
|
7767
|
+
"</body>",
|
|
7768
|
+
() => `${bootstrapScript}
|
|
7769
|
+
${inlineScripts === "" ? "" : `${inlineScripts}
|
|
7770
|
+
`}</body>`
|
|
7771
|
+
);
|
|
7772
|
+
};
|
|
7773
|
+
var assertHtmlAppAssets = async (assetPath) => {
|
|
7774
|
+
const assetStats = await stat2(assetPath).catch(() => void 0);
|
|
7775
|
+
if (assetStats === void 0 || !assetStats.isDirectory()) {
|
|
7776
|
+
throw new Error(
|
|
7777
|
+
`html_report_assets_missing: expected built app at ${assetPath}. Run the workspace build first.`
|
|
7778
|
+
);
|
|
7779
|
+
}
|
|
7780
|
+
};
|
|
7781
|
+
var resolveHtmlReportOutputPath = (repositoryPath, outputPath) => {
|
|
7782
|
+
const invocationCwd = process.env["INIT_CWD"] ?? process.cwd();
|
|
7783
|
+
return resolve5(invocationCwd, outputPath ?? join7(repositoryPath, HTML_REPORT_DIR));
|
|
7784
|
+
};
|
|
7785
|
+
var writeHtmlReportBundle = async (report, options) => {
|
|
7786
|
+
const bundledAppPath = options.bundledAppPath ?? getBundledHtmlAppPath();
|
|
7787
|
+
await assertHtmlAppAssets(bundledAppPath);
|
|
7788
|
+
const outputPath = resolveHtmlReportOutputPath(options.repositoryPath, options.outputPath);
|
|
7789
|
+
await rm(outputPath, { recursive: true, force: true });
|
|
7790
|
+
await ensureDirectory(outputPath);
|
|
7791
|
+
await writeFile5(
|
|
7792
|
+
resolve5(outputPath, "index.html"),
|
|
7793
|
+
await inlineBuiltHtml(bundledAppPath, report),
|
|
7794
|
+
"utf8"
|
|
7795
|
+
);
|
|
7796
|
+
return outputPath;
|
|
7797
|
+
};
|
|
7798
|
+
|
|
7799
|
+
// src/application/open-path.ts
|
|
7800
|
+
import { spawn as spawn3 } from "child_process";
|
|
7801
|
+
import { platform } from "os";
|
|
7802
|
+
var openCommandForPlatform = (targetPath) => {
|
|
7803
|
+
switch (platform()) {
|
|
7804
|
+
case "darwin":
|
|
7805
|
+
return { command: "open", args: [targetPath] };
|
|
7806
|
+
case "win32":
|
|
7807
|
+
return { command: "cmd", args: ["/c", "start", "", targetPath] };
|
|
7808
|
+
case "linux":
|
|
7809
|
+
return { command: "xdg-open", args: [targetPath] };
|
|
7810
|
+
default:
|
|
7811
|
+
return void 0;
|
|
7812
|
+
}
|
|
7813
|
+
};
|
|
7814
|
+
var openPath = async (targetPath) => {
|
|
7815
|
+
const command = openCommandForPlatform(targetPath);
|
|
7816
|
+
if (command === void 0) {
|
|
7817
|
+
return false;
|
|
7818
|
+
}
|
|
7819
|
+
return new Promise((resolve7) => {
|
|
7820
|
+
const child = spawn3(command.command, command.args, {
|
|
7821
|
+
detached: true,
|
|
7822
|
+
stdio: "ignore"
|
|
7823
|
+
});
|
|
7824
|
+
child.once("error", () => resolve7(false));
|
|
7825
|
+
child.once("spawn", () => {
|
|
7826
|
+
child.unref();
|
|
7827
|
+
resolve7(true);
|
|
7828
|
+
});
|
|
7829
|
+
});
|
|
7830
|
+
};
|
|
7831
|
+
|
|
7832
|
+
// src/application/run-report-command.ts
|
|
7644
7833
|
var runReportCommand = async (inputPath, authorIdentityMode, options, logger = createSilentLogger()) => {
|
|
7645
7834
|
logger.info("building analysis snapshot");
|
|
7646
7835
|
const current = await buildAnalysisSnapshot(
|
|
@@ -7654,7 +7843,7 @@ var runReportCommand = async (inputPath, authorIdentityMode, options, logger = c
|
|
|
7654
7843
|
logger
|
|
7655
7844
|
);
|
|
7656
7845
|
if (options.snapshotPath !== void 0) {
|
|
7657
|
-
await
|
|
7846
|
+
await writeFile6(options.snapshotPath, JSON.stringify(current, null, 2), "utf8");
|
|
7658
7847
|
logger.info(`snapshot written: ${options.snapshotPath}`);
|
|
7659
7848
|
}
|
|
7660
7849
|
let report;
|
|
@@ -7662,17 +7851,39 @@ var runReportCommand = async (inputPath, authorIdentityMode, options, logger = c
|
|
|
7662
7851
|
report = createReport(current);
|
|
7663
7852
|
} else {
|
|
7664
7853
|
logger.info(`loading baseline snapshot: ${options.comparePath}`);
|
|
7665
|
-
const baselineRaw = await
|
|
7854
|
+
const baselineRaw = await readFile6(options.comparePath, "utf8");
|
|
7666
7855
|
const baseline = parseSnapshot(baselineRaw);
|
|
7667
7856
|
const diff = compareSnapshots(current, baseline);
|
|
7668
7857
|
report = createReport(current, diff);
|
|
7669
7858
|
}
|
|
7859
|
+
if (options.format === "html") {
|
|
7860
|
+
const bundlePath = await writeHtmlReportBundle(report, {
|
|
7861
|
+
repositoryPath: current.analysis.structural.targetPath,
|
|
7862
|
+
...options.outputPath === void 0 ? {} : { outputPath: options.outputPath }
|
|
7863
|
+
});
|
|
7864
|
+
if (options.open === true) {
|
|
7865
|
+
const opened = await openPath(join8(bundlePath, "index.html"));
|
|
7866
|
+
if (!opened) {
|
|
7867
|
+
logger.warn("unable to open html report automatically on this platform");
|
|
7868
|
+
}
|
|
7869
|
+
}
|
|
7870
|
+
logger.info(`html report written: ${bundlePath}`);
|
|
7871
|
+
return {
|
|
7872
|
+
report,
|
|
7873
|
+
rendered: bundlePath,
|
|
7874
|
+
outputPath: bundlePath
|
|
7875
|
+
};
|
|
7876
|
+
}
|
|
7670
7877
|
const rendered = formatReport(report, options.format);
|
|
7671
7878
|
if (options.outputPath !== void 0) {
|
|
7672
|
-
await
|
|
7879
|
+
await writeFile6(options.outputPath, rendered, "utf8");
|
|
7673
7880
|
logger.info(`report written: ${options.outputPath}`);
|
|
7674
7881
|
}
|
|
7675
|
-
return {
|
|
7882
|
+
return {
|
|
7883
|
+
report,
|
|
7884
|
+
rendered,
|
|
7885
|
+
...options.outputPath === void 0 ? {} : { outputPath: options.outputPath }
|
|
7886
|
+
};
|
|
7676
7887
|
};
|
|
7677
7888
|
|
|
7678
7889
|
// src/application/run-explain-command.ts
|
|
@@ -7742,7 +7953,7 @@ var runExplainCommand = async (inputPath, authorIdentityMode, options, logger =
|
|
|
7742
7953
|
|
|
7743
7954
|
// src/index.ts
|
|
7744
7955
|
var program = new Command();
|
|
7745
|
-
var packageJsonPath =
|
|
7956
|
+
var packageJsonPath = resolve6(dirname3(fileURLToPath2(import.meta.url)), "../package.json");
|
|
7746
7957
|
var { version } = JSON.parse(readFileSync2(packageJsonPath, "utf8"));
|
|
7747
7958
|
var parseRecentWindowDays = (value) => {
|
|
7748
7959
|
const parsed = Number.parseInt(value, 10);
|
|
@@ -7988,8 +8199,8 @@ program.command("report").argument("[path]", "path to the project to analyze").a
|
|
|
7988
8199
|
"log verbosity: silent, error, warn, info, debug (logs are written to stderr)"
|
|
7989
8200
|
).choices(["silent", "error", "warn", "info", "debug"]).default(parseLogLevel(process.env["CODESENTINEL_LOG_LEVEL"]))
|
|
7990
8201
|
).addOption(
|
|
7991
|
-
new Option("--format <mode>", "output format: text, json, md").choices(["text", "json", "md"]).default("md")
|
|
7992
|
-
).option("--output <path>", "write rendered report to a file path").option("--compare <baseline>", "compare against a baseline snapshot JSON file").option("--snapshot <path>", "write current snapshot JSON artifact").option("--no-trace", "disable trace embedding in generated snapshot").addOption(
|
|
8202
|
+
new Option("--format <mode>", "output format: text, json, md, html").choices(["text", "json", "md", "html"]).default("md")
|
|
8203
|
+
).option("--output <path>", "write rendered report to a file path").option("--open", "open the generated HTML report in the default browser").option("--compare <baseline>", "compare against a baseline snapshot JSON file").option("--snapshot <path>", "write current snapshot JSON artifact").option("--no-trace", "disable trace embedding in generated snapshot").addOption(
|
|
7993
8204
|
new Option(
|
|
7994
8205
|
"--recent-window-days <days>",
|
|
7995
8206
|
"git recency window in days used for evolution volatility metrics"
|
|
@@ -8005,14 +8216,20 @@ program.command("report").argument("[path]", "path to the project to analyze").a
|
|
|
8005
8216
|
...options.output === void 0 ? {} : { outputPath: options.output },
|
|
8006
8217
|
...options.compare === void 0 ? {} : { comparePath: options.compare },
|
|
8007
8218
|
...options.snapshot === void 0 ? {} : { snapshotPath: options.snapshot },
|
|
8219
|
+
...options.open === void 0 ? {} : { open: options.open },
|
|
8008
8220
|
includeTrace: options.trace,
|
|
8009
8221
|
scoringProfile: options.scoringProfile,
|
|
8010
8222
|
recentWindowDays: options.recentWindowDays
|
|
8011
8223
|
},
|
|
8012
8224
|
logger
|
|
8013
8225
|
);
|
|
8014
|
-
if (options.output === void 0) {
|
|
8226
|
+
if (options.output === void 0 && options.format !== "html") {
|
|
8015
8227
|
process.stdout.write(`${result.rendered}
|
|
8228
|
+
`);
|
|
8229
|
+
return;
|
|
8230
|
+
}
|
|
8231
|
+
if (options.format === "html") {
|
|
8232
|
+
process.stdout.write(`${result.outputPath ?? result.rendered}
|
|
8016
8233
|
`);
|
|
8017
8234
|
}
|
|
8018
8235
|
}
|
|
@@ -8031,7 +8248,9 @@ program.command("run").argument("[path]", "path to the project to analyze").addO
|
|
|
8031
8248
|
new Option("--format <mode>", "combined output format: text, md, json").choices(["text", "md", "json"]).default("md")
|
|
8032
8249
|
).addOption(
|
|
8033
8250
|
new Option("--detail <level>", "run detail level: compact (default), standard, full").choices(["compact", "standard", "full"]).default("compact")
|
|
8034
|
-
).option("--file <path>", "explain a specific file target").option("--module <name>", "explain a specific module target").option("--top <count>", "number of top hotspots to explain when no target is selected", "5").option("--compare <baseline>", "compare against a baseline snapshot JSON file").option("--snapshot <path>", "write current snapshot JSON artifact").
|
|
8251
|
+
).option("--file <path>", "explain a specific file target").option("--module <name>", "explain a specific module target").option("--top <count>", "number of top hotspots to explain when no target is selected", "5").option("--compare <baseline>", "compare against a baseline snapshot JSON file").option("--snapshot <path>", "write current snapshot JSON artifact").addOption(
|
|
8252
|
+
new Option("--report <format>", "write an additional report bundle during the run").choices(["html"]).default(void 0)
|
|
8253
|
+
).option("--report-output <path>", "output path for the generated report bundle").option("--open", "open the generated HTML report in the default browser").option("--no-trace", "disable trace embedding in generated snapshot").addOption(
|
|
8035
8254
|
new Option(
|
|
8036
8255
|
"--recent-window-days <days>",
|
|
8037
8256
|
"git recency window in days used for evolution volatility metrics"
|
|
@@ -8058,13 +8277,28 @@ program.command("run").argument("[path]", "path to the project to analyze").addO
|
|
|
8058
8277
|
...options.trace === true ? { trace: explain.trace } : {}
|
|
8059
8278
|
});
|
|
8060
8279
|
if (options.snapshot !== void 0) {
|
|
8061
|
-
await
|
|
8280
|
+
await writeFile7(options.snapshot, JSON.stringify(snapshot, null, 2), "utf8");
|
|
8062
8281
|
logger.info(`snapshot written: ${options.snapshot}`);
|
|
8063
8282
|
}
|
|
8064
8283
|
const report = options.compare === void 0 ? createReport(snapshot) : createReport(
|
|
8065
8284
|
snapshot,
|
|
8066
|
-
compareSnapshots(snapshot, parseSnapshot(await
|
|
8285
|
+
compareSnapshots(snapshot, parseSnapshot(await readFile7(options.compare, "utf8")))
|
|
8067
8286
|
);
|
|
8287
|
+
if (options.report === "html") {
|
|
8288
|
+
const htmlOutputPath = await writeHtmlReportBundle(report, {
|
|
8289
|
+
repositoryPath: explain.summary.structural.targetPath,
|
|
8290
|
+
...options.reportOutput === void 0 ? {} : { outputPath: options.reportOutput }
|
|
8291
|
+
});
|
|
8292
|
+
if (options.open === true) {
|
|
8293
|
+
const opened = await openPath(`${htmlOutputPath}/index.html`);
|
|
8294
|
+
if (!opened) {
|
|
8295
|
+
logger.warn("unable to open html report automatically on this platform");
|
|
8296
|
+
}
|
|
8297
|
+
}
|
|
8298
|
+
logger.info(`html report written: ${htmlOutputPath}`);
|
|
8299
|
+
} else if (options.open === true) {
|
|
8300
|
+
logger.warn("--open has no effect unless --report html is set");
|
|
8301
|
+
}
|
|
8068
8302
|
if (options.format === "json") {
|
|
8069
8303
|
const analyzeSummaryOutput = formatAnalyzeOutput(explain.summary, "summary");
|
|
8070
8304
|
if (options.detail === "compact") {
|