@allenpan2026/harshjudge 0.4.1 → 0.4.3
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/.claude-plugin/plugin.json +1 -1
- package/README.md +4 -1
- package/dist/cli.js +28 -14
- package/dist/cli.js.map +1 -1
- package/dist/dashboard-worker.js.map +1 -1
- package/dist/ux-dist/assets/index-CRmmB-pA.js +118 -0
- package/dist/ux-dist/assets/index-DF_aOVSg.css +1 -0
- package/dist/ux-dist/index.html +14 -0
- package/package.json +2 -2
- package/skills/harshjudge/references/run-browser.md +63 -0
- package/skills/harshjudge/references/run-step-agent.md +2 -2
- package/skills/harshjudge/references/run.md +26 -1
- package/skills/harshjudge/references/run-playwright.md +0 -41
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--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: rgb(59 130 246 / .5);--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: }::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: rgb(59 130 246 / .5);--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-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings: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:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-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{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,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{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.left-0{left:0}.left-1{left:.25rem}.right-0{right:0}.right-1{right:.25rem}.right-2{right:.5rem}.top-0{top:0}.top-1{top:.25rem}.top-2{top:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.h-1\.5{height:.375rem}.h-1\/4{height:25%}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-64{max-height:16rem}.max-h-96{max-height:24rem}.max-h-full{max-height:100%}.min-h-\[150px\]{min-height:150px}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-12{width:3rem}.w-2{width:.5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.max-w-32{max-width:8rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-2{row-gap:.5rem}.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))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-blue-400{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.border-green-500{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-green-800{--tw-border-opacity: 1;border-color:rgb(22 101 52 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-red-800{--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.bg-black\/60{background-color:#0009}.bg-black\/70{background-color:#000000b3}.bg-blue-300{--tw-bg-opacity: 1;background-color:rgb(147 197 253 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-400{--tw-bg-opacity: 1;background-color:rgb(74 222 128 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-green-700{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.bg-green-950\/30{background-color:#052e164d}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-red-900{--tw-bg-opacity: 1;background-color:rgb(127 29 29 / var(--tw-bg-opacity, 1))}.bg-red-900\/20{background-color:#7f1d1d33}.bg-red-900\/30{background-color:#7f1d1d4d}.bg-red-900\/50{background-color:#7f1d1d80}.bg-red-900\/90{background-color:#7f1d1de6}.bg-red-950\/30{background-color:#450a0a4d}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-yellow-500\/20{background-color:#eab30833}.bg-yellow-500\/50{background-color:#eab30880}.bg-yellow-900\/30{background-color:#713f124d}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-4xl{font-size:2.25rem;line-height:2.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-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-relaxed{line-height:1.625}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-200{--tw-text-opacity: 1;color:rgb(254 240 138 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(107 114 128 / var(--tw-placeholder-opacity, 1))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity: 1;color:rgb(107 114 128 / var(--tw-placeholder-opacity, 1))}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.ring{--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(3px + 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-1{--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(1px + 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-2{--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(2px + 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-blue-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.ring-blue-500\/50{--tw-ring-color: rgb(59 130 246 / .5)}.ring-yellow-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(234 179 8 / var(--tw-ring-opacity, 1))}.ring-offset-1{--tw-ring-offset-width: 1px}.ring-offset-gray-900{--tw-ring-offset-color: #111827}.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)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}:root{--color-bg-primary: #fff;--color-bg-secondary: #f9fafb;--color-text-primary: #111827;--color-text-secondary: #4b5563;--color-border: #e5e7eb}.dark{--color-bg-primary: #111827;--color-bg-secondary: #1f2937;--color-text-primary: #f3f4f6;--color-text-secondary: #9ca3af;--color-border: #374151}body{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;background-color:var(--color-bg-primary);color:var(--color-text-primary)}.dark ::-webkit-scrollbar{width:8px;height:8px}.dark ::-webkit-scrollbar-track{background:#1f2937}.dark ::-webkit-scrollbar-thumb{background:#4b5563;border-radius:4px}.dark ::-webkit-scrollbar-thumb:hover{background:#6b7280}.hover\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-600:hover{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-800:hover{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.hover\:bg-red-800\/50:hover{background-color:#991b1b80}.hover\:text-gray-400:hover{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:opacity-80:hover{opacity:.8}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--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(1px + 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)}.focus\:ring-2:focus{--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(2px + 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)}.focus\:ring-blue-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1))}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--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(2px + 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)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset: inset}.focus-visible\:ring-blue-500:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.\[\&_a\]\:text-blue-400 a{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:hover\:text-blue-300:hover a{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.\[\&_code\]\:rounded code{border-radius:.25rem}.\[\&_code\]\:bg-gray-700 code{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.\[\&_code\]\:px-1\.5 code{padding-left:.375rem;padding-right:.375rem}.\[\&_code\]\:py-0\.5 code{padding-top:.125rem;padding-bottom:.125rem}.\[\&_code\]\:font-mono code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.\[\&_code\]\:text-xs code{font-size:.75rem;line-height:1rem}.\[\&_code\]\:text-green-300 code{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.\[\&_em\]\:italic em{font-style:italic}.\[\&_em\]\:text-gray-400 em{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.\[\&_h1\]\:mb-4 h1{margin-bottom:1rem}.\[\&_h1\]\:mt-0 h1{margin-top:0}.\[\&_h1\]\:text-xl h1{font-size:1.25rem;line-height:1.75rem}.\[\&_h1\]\:font-bold h1{font-weight:700}.\[\&_h1\]\:text-white h1{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.\[\&_h2\]\:mb-3 h2{margin-bottom:.75rem}.\[\&_h2\]\:mt-6 h2{margin-top:1.5rem}.\[\&_h2\]\:text-lg h2{font-size:1.125rem;line-height:1.75rem}.\[\&_h2\]\:font-semibold h2{font-weight:600}.\[\&_h2\]\:text-white h2{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.\[\&_h3\]\:mb-2 h3{margin-bottom:.5rem}.\[\&_h3\]\:mt-4 h3{margin-top:1rem}.\[\&_h3\]\:text-base h3{font-size:1rem;line-height:1.5rem}.\[\&_h3\]\:font-medium h3{font-weight:500}.\[\&_h3\]\:text-white h3{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.\[\&_li\]\:mb-1 li{margin-bottom:.25rem}.\[\&_ol\]\:mb-3 ol{margin-bottom:.75rem}.\[\&_ol\]\:list-decimal ol{list-style-type:decimal}.\[\&_ol\]\:pl-6 ol{padding-left:1.5rem}.\[\&_p\]\:mb-3 p,.\[\&_pre\]\:mb-3 pre{margin-bottom:.75rem}.\[\&_pre\]\:overflow-x-auto pre{overflow-x:auto}.\[\&_pre\]\:rounded-lg pre{border-radius:.5rem}.\[\&_pre\]\:bg-gray-900 pre{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.\[\&_pre\]\:p-4 pre{padding:1rem}.\[\&_pre_code\]\:bg-transparent pre code{background-color:transparent}.\[\&_pre_code\]\:p-0 pre code{padding:0}.\[\&_strong\]\:font-semibold strong{font-weight:600}.\[\&_strong\]\:text-white strong{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.\[\&_ul\]\:mb-3 ul{margin-bottom:.75rem}.\[\&_ul\]\:list-disc ul{list-style-type:disc}.\[\&_ul\]\:pl-6 ul{padding-left:1.5rem}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en" class="dark">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>HarshJudge Dashboard</title>
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-CRmmB-pA.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DF_aOVSg.css">
|
|
10
|
+
</head>
|
|
11
|
+
<body class="bg-gray-900 text-gray-100">
|
|
12
|
+
<div id="root"></div>
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@allenpan2026/harshjudge",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
4
4
|
"description": "AI-native E2E testing orchestration CLI for Claude Code.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"LICENSE"
|
|
16
16
|
],
|
|
17
17
|
"scripts": {
|
|
18
|
-
"build": "
|
|
18
|
+
"build": "vite build && tsup",
|
|
19
19
|
"build:cli": "tsup",
|
|
20
20
|
"build:ux": "vite build",
|
|
21
21
|
"dev": "tsup --watch",
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Browser Tool Reference
|
|
2
|
+
|
|
3
|
+
Used during step execution in [[run]].
|
|
4
|
+
|
|
5
|
+
HarshJudge is **browser-tool-agnostic**. Use whatever browser automation tool is available in your environment. The step agent needs these capabilities:
|
|
6
|
+
|
|
7
|
+
## Required Capabilities
|
|
8
|
+
|
|
9
|
+
| Action | What to do |
|
|
10
|
+
|--------|-----------|
|
|
11
|
+
| Navigate | Go to a URL |
|
|
12
|
+
| Inspect page | Get current page state (DOM, accessibility tree) before interacting |
|
|
13
|
+
| Click | Click an element by text, role, or reference |
|
|
14
|
+
| Type | Enter text into an input field |
|
|
15
|
+
| Select | Choose an option from a dropdown |
|
|
16
|
+
| Wait | Wait for text to appear/disappear, or for a timeout |
|
|
17
|
+
| Screenshot | Capture the current page as an image file |
|
|
18
|
+
| Console logs | Read browser console output |
|
|
19
|
+
| Network logs | Read network requests/responses |
|
|
20
|
+
|
|
21
|
+
## Supported Browser Tools
|
|
22
|
+
|
|
23
|
+
### Playwright MCP (Default)
|
|
24
|
+
|
|
25
|
+
Most common. Available as a Claude Code plugin.
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"playwright": {
|
|
30
|
+
"command": "npx",
|
|
31
|
+
"args": ["@playwright/mcp@latest"]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Tools: `browser_navigate`, `browser_click`, `browser_type`, `browser_snapshot`, `browser_take_screenshot`, `browser_wait_for`, `browser_console_messages`, `browser_network_requests`
|
|
37
|
+
|
|
38
|
+
### browser-use MCP (Token Efficient Alternative)
|
|
39
|
+
|
|
40
|
+
Compresses DOM before sending to LLM — significantly fewer tokens per interaction. Python-based.
|
|
41
|
+
|
|
42
|
+
Setup: See [browser-use MCP docs](https://docs.browser-use.com/customize/integrations/mcp-server)
|
|
43
|
+
|
|
44
|
+
### Chrome DevTools MCP
|
|
45
|
+
|
|
46
|
+
Connects to an already-running Chrome instance via remote debugging.
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"chrome-devtools": {
|
|
51
|
+
"command": "npx",
|
|
52
|
+
"args": ["chrome-devtools-mcp"]
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Best Practices
|
|
58
|
+
|
|
59
|
+
- Always inspect the page before clicking or typing to get current element state
|
|
60
|
+
- Take a screenshot **before** and **after** each significant action
|
|
61
|
+
- Wait after navigation to confirm the page loaded
|
|
62
|
+
- Capture console errors on unexpected behavior
|
|
63
|
+
- Save screenshots to a temp path, then record via `harshjudge evidence`
|
|
@@ -20,8 +20,8 @@ Status: {pass|fail|first step}
|
|
|
20
20
|
## Your Task
|
|
21
21
|
1. Navigate to the base URL if not already there
|
|
22
22
|
2. Execute the actions described in the step content
|
|
23
|
-
3. Use
|
|
24
|
-
4.
|
|
23
|
+
3. Use the available browser tool to inspect the page before interacting
|
|
24
|
+
4. Take before/after screenshots using the browser tool
|
|
25
25
|
5. Record evidence:
|
|
26
26
|
harshjudge evidence {runId} --step {stepNumber} --type screenshot --name before --data /path/to/screenshot.png
|
|
27
27
|
6. Verify the expected outcome
|
|
@@ -15,7 +15,7 @@ Use this workflow when user wants to:
|
|
|
15
15
|
3. `harshjudge complete-step <runId>` — Complete each step, get next step
|
|
16
16
|
4. `harshjudge complete-run <runId>` — Finalize with pass/fail status
|
|
17
17
|
|
|
18
|
-
See [[run-
|
|
18
|
+
See [[run-browser]] for browser tool reference (Playwright MCP, browser-use, Chrome DevTools).
|
|
19
19
|
|
|
20
20
|
> **TOKEN OPTIMIZATION**: Each step executes in its own spawned agent. This isolates context and prevents token accumulation.
|
|
21
21
|
|
|
@@ -110,6 +110,31 @@ Saved to: `.harshJudge/scenarios/{slug}/runs/{runId}/step-01/evidence/`
|
|
|
110
110
|
|
|
111
111
|
Evidence types: `screenshot`, `console_log`, `network_log`, `html_snapshot`.
|
|
112
112
|
|
|
113
|
+
## Step Tracking (MANDATORY)
|
|
114
|
+
|
|
115
|
+
> [!warning] Never skip steps
|
|
116
|
+
> Before calling `complete-run`, verify EVERY step has been executed or explicitly skipped.
|
|
117
|
+
|
|
118
|
+
After `harshjudge start` returns the step list, create a checklist and track each step:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
Steps for run {runId}:
|
|
122
|
+
- [ ] 01 — {title} → pending
|
|
123
|
+
- [ ] 02 — {title} → pending
|
|
124
|
+
- [ ] 03 — {title} → pending
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Update after each `complete-step`:
|
|
128
|
+
```
|
|
129
|
+
- [x] 01 — Navigate to login → pass (1200ms)
|
|
130
|
+
- [x] 02 — Fill credentials → pass (800ms)
|
|
131
|
+
- [ ] 03 — Verify dashboard → pending
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Before calling `complete-run`:** Count completed steps vs total steps. If any step is still `pending` and not explicitly failed/skipped, DO NOT finalize — execute the missing step first.
|
|
135
|
+
|
|
136
|
+
**If a step agent crashes** without returning a result, mark it as `fail` via `complete-step` with `--error "Agent did not return result"`, then continue to the next step or finalize.
|
|
137
|
+
|
|
113
138
|
## Error Handling
|
|
114
139
|
|
|
115
140
|
| Error | Action |
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Playwright Tools Reference
|
|
2
|
-
|
|
3
|
-
Used during step execution in [[run]].
|
|
4
|
-
|
|
5
|
-
## Navigation & State
|
|
6
|
-
|
|
7
|
-
| Tool | Usage |
|
|
8
|
-
|------|-------|
|
|
9
|
-
| `browser_navigate` | `{ "url": "http://localhost:3000" }` |
|
|
10
|
-
| `browser_snapshot` | `{}` → Returns accessibility tree with refs |
|
|
11
|
-
| `browser_take_screenshot` | `{ "filename": "step-01-before.png" }` |
|
|
12
|
-
|
|
13
|
-
## Interactions
|
|
14
|
-
|
|
15
|
-
| Tool | Usage |
|
|
16
|
-
|------|-------|
|
|
17
|
-
| `browser_click` | `{ "element": "Login button", "ref": "e5" }` |
|
|
18
|
-
| `browser_type` | `{ "element": "Email input", "ref": "e4", "text": "test@example.com" }` |
|
|
19
|
-
| `browser_select_option` | `{ "element": "Country", "ref": "e7", "values": ["USA"] }` |
|
|
20
|
-
|
|
21
|
-
## Waiting
|
|
22
|
-
|
|
23
|
-
| Tool | Usage |
|
|
24
|
-
|------|-------|
|
|
25
|
-
| `browser_wait_for` | `{ "text": "Welcome" }` |
|
|
26
|
-
| `browser_wait_for` | `{ "textGone": "Loading..." }` |
|
|
27
|
-
| `browser_wait_for` | `{ "time": 2 }` |
|
|
28
|
-
|
|
29
|
-
## Debugging
|
|
30
|
-
|
|
31
|
-
| Tool | Usage |
|
|
32
|
-
|------|-------|
|
|
33
|
-
| `browser_console_messages` | `{ "level": "error" }` |
|
|
34
|
-
| `browser_network_requests` | `{}` |
|
|
35
|
-
|
|
36
|
-
## Best Practices
|
|
37
|
-
|
|
38
|
-
- Always call `browser_snapshot` before `browser_click` or `browser_type` to get current element refs
|
|
39
|
-
- Take a screenshot **before** and **after** each significant action
|
|
40
|
-
- Use `browser_wait_for` after navigation to confirm page loaded
|
|
41
|
-
- Capture console errors on any unexpected behavior
|