codarch 0.1.4 → 0.2.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.
@@ -1 +1 @@
1
- :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--paper:#eef1f2;--panel:#f6f8f8;--ink:#121a20;--ink-soft:#35434c;--muted:#64727b;--line:#c8d1d5;--line-strong:#9fadb4;--cobalt:#2f6fed;--ochre:#d9a21b;--rust:#d95d39;--violet:#7b61ff;--patina:#3f8f7a;--debt:#d64545;--mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--sans:"IBM Plex Sans", system-ui, -apple-system, "Segoe UI", sans-serif;--display:"Bricolage Grotesque", "IBM Plex Sans", system-ui, sans-serif}*{box-sizing:border-box}html,body,#root{min-height:100%}body{background:var(--paper);color:var(--ink);font:14px/1.45 var(--sans);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;margin:0}button,input,select{font:inherit}button{color:inherit}:focus-visible{outline:2px solid var(--rust);outline-offset:2px}#boot-error{color:#ffd7d7;font:12px/1.5 var(--mono);white-space:pre-wrap;background:#2b1111;margin:0;padding:24px}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.app{background:radial-gradient(circle at 18% 4%, #ffffff8c, transparent 34%), var(--paper);min-height:100dvh}.topbar{z-index:20;background:var(--ink);color:#f3f6f5;border-bottom:1px solid #05090c;grid-template-columns:minmax(250px,auto) 1fr auto;align-items:center;gap:22px;min-height:64px;padding:0 20px;display:grid;position:relative}.brand{align-items:baseline;gap:12px;min-width:0;display:flex}.brand-mark{font:750 18px/1 var(--display);letter-spacing:.16em}.brand-sub{font:500 9.5px/1 var(--mono);letter-spacing:.18em;text-transform:uppercase;color:#a9b7bc;white-space:nowrap}.snapshot-meta{text-align:center;flex-direction:column;align-items:center;gap:2px;min-width:0;display:flex}.snapshot-meta .project{font:600 12px/1.2 var(--sans);white-space:nowrap;text-overflow:ellipsis;max-width:100%;overflow:hidden}.snapshot-meta .mono{color:#93a2a8;white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:10px;overflow:hidden}.server-mode{font:500 8.5px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:#a9b7bc;align-items:center;gap:5px;display:inline-flex}.server-mode i{background:#7f8b90;border-radius:50%;width:5px;height:5px}.server-mode-demo{color:#e7c06b}.server-mode-demo i{background:var(--ochre)}.server-mode-local{color:#a9b7bc}.server-mode-live{color:#8fe3c0}.server-mode-live i{background:#45d6a0;box-shadow:0 0 0 3px #45d6a029}.demo-banner{color:var(--ink-soft);background:#d9a21b14;border:1px solid #d9a21b59;flex-wrap:wrap;align-items:baseline;gap:5px 8px;margin-bottom:10px;padding:7px 10px;font-size:11px;display:flex}.demo-banner strong{font:600 9px/1 var(--mono);letter-spacing:.1em;text-transform:uppercase;color:#8a650d}.topbar-actions{justify-content:flex-end;gap:8px;display:flex}.button-label-short{display:none}.button{color:var(--ink);font:600 11px/1 var(--mono);letter-spacing:.04em;text-transform:uppercase;cursor:pointer;background:#f3f6f5;border:1px solid #f3f6f5;border-radius:2px;padding:8px 12px;transition:background .12s,color .12s}.button:hover{background:#fff}.button.ghost{color:#dbe3e4;background:0 0;border-color:#596970}.open-menu{position:relative}.open-menu>summary{cursor:pointer;align-items:center;list-style:none;display:inline-flex}.open-menu>summary::-webkit-details-marker{display:none}.open-menu[open]>summary{background:#fff}.open-menu-panel{z-index:30;border:1px solid var(--line-strong);background:var(--panel);min-width:216px;padding:4px;display:grid;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 14px 30px #121a202e}.open-menu-panel button{color:var(--ink);text-align:left;font:500 11px/1.3 var(--sans);cursor:pointer;background:0 0;border:0;padding:8px 10px}.open-menu-panel button:hover{background:#2f6fed14}.open-menu-panel p{color:var(--muted);margin:4px 10px 6px;font-size:9.5px;line-height:1.35}.open-menu-panel button:disabled{opacity:.45;cursor:not-allowed}.live-row{justify-content:space-between;align-items:center;gap:10px;display:flex}.live-state{letter-spacing:.11em;text-transform:uppercase;color:var(--muted);font-size:10px}.live-state.is-live{color:var(--patina)}.button.small{margin-top:0;padding:6px 9px;font-size:9px}.button.ghost.dark-text{color:var(--ink);border-color:var(--line-strong);background:0 0}.modal-backdrop{z-index:100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#121a208c;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.modal{border:1px solid var(--line-strong);background:var(--panel);flex-direction:column;width:min(660px,100%);max-height:min(780px,100dvh - 40px);padding:20px;display:flex;box-shadow:0 24px 60px #121a2047}.modal h2{font:650 27px/1.08 var(--display);letter-spacing:-.03em;margin:2px 0 5px}.folder-path{grid-template-columns:32px minmax(0,1fr) auto;gap:6px;margin:14px 0 8px;display:grid}.folder-path input{border:1px solid var(--line);min-width:0;color:var(--ink);font:11px/1.3 var(--mono);background:#fff;padding:7px 8px}.folder-up{border:1px solid var(--line);width:32px;color:var(--ink);cursor:pointer;background:#fff;font-size:16px}.folder-up:disabled{color:var(--line-strong);cursor:default}.folder-list{border:1px solid var(--line);background:#fff;min-height:120px;max-height:340px;margin-bottom:12px;overflow:auto}.folder-entry{width:100%;color:var(--ink);text-align:left;font:12px/1.3 var(--sans);cursor:pointer;background:0 0;border:0;border-bottom:1px solid #c8d1d58c;grid-template-columns:18px minmax(0,1fr);gap:5px;padding:7px 10px;display:grid}.folder-entry:hover{background:#2f6fed12}.folder-icon{color:var(--muted);font-family:var(--mono)}.folder-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.folder-empty{color:var(--muted);text-align:center;padding:28px 18px;font-size:11.5px}.folder-footer{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.folder-current{text-overflow:ellipsis;white-space:nowrap;max-width:52%;color:var(--muted);font-size:9.5px;overflow:hidden}.folder-actions{gap:8px;display:flex}.folder-actions .button{margin-top:0}.button.ghost:hover{background:#ffffff14}.shell{background:var(--line);grid-template-columns:258px minmax(0,1fr) 302px;gap:1px;min-height:calc(100dvh - 64px);display:grid}.rail,.inspector{background:var(--panel);padding:20px 18px;overflow:auto}.rail{border-right:1px solid var(--line)}.inspector{border-left:1px solid var(--line)}.panel-block{border-bottom:1px solid var(--line);margin:0 0 17px;padding:0 0 17px}.panel-block:last-child{border-bottom:0;margin-bottom:0;padding-bottom:0}.eyebrow{font:500 9.5px/1.2 var(--mono);letter-spacing:.13em;text-transform:uppercase;color:var(--muted);margin-bottom:8px}.field{margin-bottom:10px;display:block}.field>span{font:500 9.5px/1.2 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:4px;display:block}.field select,.field input{appearance:none;border:1px solid var(--line);width:100%;color:var(--ink);background:#fff;border-radius:2px;padding:7px 8px;font-size:12px}.field select{background-image:linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%);background-position:calc(100% - 13px) 12px,calc(100% - 9px) 12px;background-repeat:no-repeat;background-size:4px 4px,4px 4px;padding-right:24px}.search-field{margin-top:13px}.url-load{border-top:1px solid var(--line);gap:2px;margin:6px 6px 2px;padding-top:6px;display:grid}.url-load .field{margin-bottom:6px}.url-load .field input{font-family:var(--mono);font-size:10.5px}.url-load>button{border:1px solid var(--line-strong);color:var(--ink);text-align:center;font:500 10px/1.3 var(--mono);letter-spacing:.04em;text-transform:uppercase;margin-top:2px}.tiny{font-size:10.5px}.small{font-size:12px}.muted{color:var(--muted)}.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}.strata{border:1px solid var(--line-strong);background:var(--paper);border-radius:2px;gap:1px;height:24px;padding:1px;display:flex;overflow:hidden}.strata i{min-width:2px;height:100%;display:block}.strata-legend{gap:4px;margin-top:9px;display:grid}.strata-row{color:var(--ink-soft);grid-template-columns:7px 1fr auto;align-items:center;gap:7px;font-size:11px;display:grid}.strata-row i,.legend i,.status-chip i{border-radius:50%;width:7px;height:7px;display:inline-block}.strata-row .mono{color:var(--muted);font-size:10px}.status-row{border-top:1px solid var(--line);flex-wrap:wrap;gap:5px 10px;margin-top:11px;padding-top:9px;display:flex}.status-chip{color:var(--muted);align-items:center;gap:5px;font-size:10.5px;display:inline-flex}.status-chip b{color:var(--ink);font-weight:600}.legend{gap:6px;display:grid}.legend>div{grid-template-columns:7px 1fr auto;align-items:center;gap:7px;font-size:11px;display:grid}.legend .mono{color:var(--muted);font-size:10px}.ellipsis{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gradient{border:1px solid var(--line);border-radius:1px;height:9px}.gradient.risk{background:linear-gradient(90deg,#ebe7df 0%,#e9cd98 35%,#d68a54 65%,#a42e2c 100%)}.gradient.metric{background:linear-gradient(90deg,#ebe7df 0%,#b9c9cf 50%,#355b6b 100%)}.gradient-labels{font:10px/1 var(--mono);color:var(--muted);justify-content:space-between;margin-top:4px;display:flex}.debt-list{gap:2px;display:grid}.debt-row{text-align:left;cursor:pointer;background:0 0;border:0;border-radius:1px;grid-template-columns:minmax(0,1fr) 54px 34px;align-items:center;gap:7px;width:100%;padding:5px 0;display:grid}.debt-row:hover,.debt-row.is-selected{background:#2f6fed12}.debt-name{text-overflow:ellipsis;white-space:nowrap;color:var(--ink-soft);font-size:10.5px;overflow:hidden}.debt-track{background:#e0e6e8;height:5px;overflow:hidden}.debt-track i{height:100%;display:block}.debt-row .mono{text-align:right;color:var(--muted);font-size:10px}.stage{background:var(--paper);flex-direction:column;min-width:0;padding:20px 22px 14px;display:flex}.stage-head{justify-content:space-between;align-items:flex-end;gap:22px;margin-bottom:14px;display:flex}.stage h1{font:650 31px/1.05 var(--display);letter-spacing:-.03em;text-overflow:ellipsis;white-space:nowrap;max-width:620px;margin:0;overflow:hidden}.stage-kpis{flex:none;grid-template-columns:repeat(4,minmax(64px,auto));gap:15px;display:grid}.kpi{flex-direction:column;gap:2px;display:flex}.kpi span{font:500 8.5px/1.1 var(--mono);letter-spacing:.11em;text-transform:uppercase;color:var(--muted)}.kpi b{font:600 20px/1 var(--display);letter-spacing:-.02em}.kpi-debt b{color:var(--debt)}.map-frame{border:1px solid var(--line-strong);background:#f8fafa;flex:1;min-height:440px;position:relative;overflow:hidden;box-shadow:inset 0 1px #fffc,0 10px 30px #121a200d}.map-inner{width:100%;height:100%}.map{width:100%;height:100%;display:block}.cell{cursor:pointer}.cell:hover{filter:brightness(1.08)}.cell:focus-visible{stroke:var(--rust);stroke-width:2.5px;outline:none}.cell.is-cursor,.folder-block.is-cursor{stroke:var(--rust);stroke-width:2px}.folder-block{cursor:zoom-in}.folder-block:hover{fill:#121a200d}.folder-block:focus-visible{stroke:var(--rust);stroke-width:2px;outline:none}.folder-hit{cursor:zoom-in}.folder-hit:focus-visible{stroke:var(--rust);stroke-width:2px;outline:none}.empty{text-align:center;color:var(--muted);flex-direction:column;justify-content:center;align-items:center;gap:6px;padding:30px;display:flex;position:absolute;inset:0}.empty.error{color:var(--debt)}.empty.error span{color:var(--muted);max-width:520px}.drop-hint{border:1px dashed var(--cobalt);color:var(--cobalt);font:600 12px/1 var(--mono);letter-spacing:.08em;text-transform:uppercase;pointer-events:none;background:#2f6fed14;justify-content:center;align-items:center;display:flex;position:absolute;inset:12px}.breadcrumb{font:10px/1.3 var(--mono);color:var(--muted);flex-wrap:wrap;align-items:center;gap:5px;margin-top:6px;display:flex}.breadcrumb button{border:0;border-bottom:1px solid var(--line-strong);color:var(--ink);font:inherit;cursor:pointer;background:0 0;padding:0}.breadcrumb button:hover{border-bottom-color:var(--ink)}.stage-foot{color:var(--muted);justify-content:space-between;gap:18px;margin-top:9px;font-size:10px;display:flex}.stage-foot .mono{text-overflow:ellipsis;white-space:nowrap;max-width:55%;overflow:hidden}.inspector h2{font:650 27px/1.08 var(--display);letter-spacing:-.03em;overflow-wrap:anywhere;margin:6px 0 14px}.inspector-path{font:10.5px/1.45 var(--mono);color:var(--muted);overflow-wrap:anywhere}.inspector-empty h2{margin-top:6px}.inspector-note{border-top:1px solid var(--line);color:var(--muted);justify-content:space-between;gap:10px;margin-top:24px;padding-top:12px;font-size:10px;display:flex}.inspector-status{color:var(--ink-soft);align-items:center;gap:7px;margin-bottom:14px;font-size:11px;display:flex}.status-dot{border-radius:50%;width:8px;height:8px}.inspector-status .mono{color:var(--muted);text-transform:uppercase;margin-left:auto;font-size:10px}.metric-grid{border-top:1px solid var(--line);border-left:1px solid var(--line);grid-template-columns:1fr 1fr;gap:0;margin-bottom:18px;display:grid}.metric{border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:9px 10px}.metric span{font:500 8.5px/1.1 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);display:block}.metric b{font:600 18px/1 var(--display);letter-spacing:-.02em;margin-top:3px;display:block}.metric-table{border-top:1px solid var(--line);padding-top:12px}.metric-table>div:not(.eyebrow){color:var(--ink-soft);justify-content:space-between;gap:12px;padding:4px 0;font-size:11px;display:flex}.metric-table span:last-child{color:var(--muted)}.tabs{border-bottom:1px solid var(--line);gap:18px;margin:-2px 0 16px;display:flex}.tab{color:var(--muted);font:500 9.5px/1 var(--mono);letter-spacing:.1em;text-transform:uppercase;cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:0 0 9px;display:inline-flex}.tab.is-active{color:var(--ink);border-bottom-color:var(--ink)}.tab-dot{background:var(--rust);border-radius:50%;width:5px;height:5px;display:inline-block}.button.dark{background:var(--ink);color:var(--paper);border-color:var(--ink);margin-top:12px}.button.dark:hover{background:#26333b}.pr-panel h2{margin-bottom:4px}.pr-checksums{color:var(--muted);margin-bottom:14px;font-size:10px}.pr-grid{border-top:1px solid var(--line);border-left:1px solid var(--line);grid-template-columns:1fr 1fr;margin-bottom:16px;display:grid}.pr-stat{border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:9px 10px}.pr-stat span{font:500 8.5px/1.1 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);display:block}.pr-stat b{font:600 15px/1.1 var(--display);letter-spacing:-.02em;margin-top:3px;display:block}.pr-stat-bad b{color:var(--debt)}.pr-section{border-top:1px solid var(--line);margin-top:13px;padding-top:12px}.pr-rule-summary{color:var(--muted);flex-wrap:wrap;gap:4px 13px;margin-bottom:7px;font-size:10.5px;display:flex}.pr-rule-summary b{color:var(--ink)}.violation-list{gap:4px;display:grid}.violation{text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:6px 1fr;gap:8px;width:100%;padding:5px 0;display:grid}.violation:hover{background:#d645450f}.violation i{background:var(--muted);border-radius:50%;width:6px;height:6px;margin-top:5px}.violation-error i{background:var(--debt)}.violation-warn i{background:var(--ochre)}.violation-info i{background:var(--cobalt)}.violation b{font:600 11px/1.3 var(--sans);display:block}.violation small{color:var(--muted);font-size:10.5px;line-height:1.35;display:block}.pr-rows{gap:1px;display:grid}.pr-row{text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;width:100%;padding:5px 0;display:grid}.pr-row:hover{background:#2f6fed0f}.pr-path{text-overflow:ellipsis;white-space:nowrap;color:var(--ink-soft);font-size:10.5px;overflow:hidden}.pr-delta{color:var(--muted);font-size:9.5px}.pr-cycle{grid-template-columns:22px minmax(0,1fr);gap:6px;padding:4px 0;font-size:10.5px;display:grid}.pr-error{color:var(--debt);margin-top:10px;font-size:11px}code{font-family:var(--mono);background:#64727b1f;border-radius:2px;padding:1px 3px;font-size:10px}@media (max-width:1180px){.shell{grid-template-columns:226px minmax(0,1fr)}.inspector{border-left:0;border-top:1px solid var(--line);grid-column:1/-1;grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr);gap:30px;display:grid}.stage-kpis{grid-template-columns:repeat(2,minmax(64px,auto))}}@media (max-width:820px){.topbar{grid-template-columns:minmax(0,1fr) auto;gap:10px;padding:10px 14px}.snapshot-meta,.brand-sub,.button-label-long{display:none}.button-label-short{display:inline}.topbar-actions{flex-wrap:nowrap}.topbar-actions .button{padding:7px 9px;font-size:9.5px}.shell{flex-direction:column;min-height:0;display:flex}.stage{order:1;padding:16px 12px 12px}.rail{border-right:0;border-top:1px solid var(--line);order:2;grid-template-columns:1fr 1fr;gap:18px;display:grid}.inspector{order:3;display:block}.stage-head{flex-direction:column;align-items:flex-start;gap:12px}.stage-kpis{gap:10px 20px;justify-content:initial;grid-template-columns:repeat(2,minmax(0,1fr));width:100%}.map-frame,.map{min-height:360px}}@media (max-width:560px){.rail{grid-template-columns:1fr}.stage-kpis{grid-template-columns:repeat(2,auto)}.stage h1{font-size:25px}.stage-foot{flex-direction:column;gap:3px}.stage-foot .mono{max-width:100%}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}
1
+ :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--paper:#eef1f2;--panel:#f6f8f8;--ink:#121a20;--ink-soft:#35434c;--muted:#64727b;--line:#c8d1d5;--line-strong:#9fadb4;--cobalt:#2f6fed;--ochre:#d9a21b;--rust:#d95d39;--violet:#7b61ff;--patina:#3f8f7a;--debt:#d64545;--mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--sans:"IBM Plex Sans", system-ui, -apple-system, "Segoe UI", sans-serif;--display:"Bricolage Grotesque", "IBM Plex Sans", system-ui, sans-serif}*{box-sizing:border-box}html,body,#root{min-height:100%}body{background:var(--paper);color:var(--ink);font:14px/1.45 var(--sans);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;margin:0}button,input,select{font:inherit}button{color:inherit}:focus-visible{outline:2px solid var(--rust);outline-offset:2px}#boot-error{color:#ffd7d7;font:12px/1.5 var(--mono);white-space:pre-wrap;background:#2b1111;margin:0;padding:24px}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.app{background:radial-gradient(circle at 18% 4%, #ffffff8c, transparent 34%), var(--paper);min-height:100dvh}.topbar{z-index:20;background:var(--ink);color:#f3f6f5;border-bottom:1px solid #05090c;grid-template-columns:minmax(250px,auto) 1fr auto;align-items:center;gap:22px;min-height:64px;padding:0 20px;display:grid;position:relative}.brand{align-items:baseline;gap:12px;min-width:0;display:flex}.brand-mark{font:750 18px/1 var(--display);letter-spacing:.16em}.brand-sub{font:500 9.5px/1 var(--mono);letter-spacing:.18em;text-transform:uppercase;color:#a9b7bc;white-space:nowrap}.snapshot-meta{text-align:center;flex-direction:column;align-items:center;gap:2px;min-width:0;display:flex}.snapshot-meta .project{font:600 12px/1.2 var(--sans);white-space:nowrap;text-overflow:ellipsis;max-width:100%;overflow:hidden}.snapshot-meta .mono{color:#93a2a8;white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:10px;overflow:hidden}.server-mode{font:500 8.5px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:#a9b7bc;align-items:center;gap:5px;display:inline-flex}.server-mode i{background:#7f8b90;border-radius:50%;width:5px;height:5px}.server-mode-demo{color:#e7c06b}.server-mode-demo i{background:var(--ochre)}.server-mode-local{color:#a9b7bc}.server-mode-live{color:#8fe3c0}.server-mode-live i{background:#45d6a0;box-shadow:0 0 0 3px #45d6a029}.demo-banner{color:var(--ink-soft);background:#d9a21b14;border:1px solid #d9a21b59;flex-wrap:wrap;align-items:baseline;gap:5px 8px;margin-bottom:10px;padding:7px 10px;font-size:11px;display:flex}.demo-banner strong{font:600 9px/1 var(--mono);letter-spacing:.1em;text-transform:uppercase;color:#8a650d}.topbar-actions{justify-content:flex-end;gap:8px;display:flex}.button-label-short{display:none}.button{color:var(--ink);font:600 11px/1 var(--mono);letter-spacing:.04em;text-transform:uppercase;cursor:pointer;background:#f3f6f5;border:1px solid #f3f6f5;border-radius:2px;padding:8px 12px;transition:background .12s,color .12s}.button:hover{background:#fff}.button.ghost{color:#dbe3e4;background:0 0;border-color:#596970}.open-menu{position:relative}.open-menu>summary{cursor:pointer;align-items:center;list-style:none;display:inline-flex}.open-menu>summary::-webkit-details-marker{display:none}.open-menu[open]>summary{background:#fff}.open-menu-panel{z-index:30;border:1px solid var(--line-strong);background:var(--panel);min-width:216px;padding:4px;display:grid;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 14px 30px #121a202e}.open-menu-panel button{color:var(--ink);text-align:left;font:500 11px/1.3 var(--sans);cursor:pointer;background:0 0;border:0;padding:8px 10px}.open-menu-panel button:hover{background:#2f6fed14}.open-menu-panel p{color:var(--muted);margin:4px 10px 6px;font-size:9.5px;line-height:1.35}.open-menu-panel button:disabled{opacity:.45;cursor:not-allowed}.live-row{justify-content:space-between;align-items:center;gap:10px;display:flex}.live-state{letter-spacing:.11em;text-transform:uppercase;color:var(--muted);font-size:10px}.live-state.is-live{color:var(--patina)}.button.small{margin-top:0;padding:6px 9px;font-size:9px}.button.ghost.dark-text{color:var(--ink);border-color:var(--line-strong);background:0 0}.modal-backdrop{z-index:100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#121a208c;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.modal{border:1px solid var(--line-strong);background:var(--panel);flex-direction:column;width:min(660px,100%);max-height:min(780px,100dvh - 40px);padding:20px;display:flex;box-shadow:0 24px 60px #121a2047}.modal h2{font:650 27px/1.08 var(--display);letter-spacing:-.03em;margin:2px 0 5px}.folder-path{grid-template-columns:32px minmax(0,1fr) auto;gap:6px;margin:14px 0 8px;display:grid}.folder-path input{border:1px solid var(--line);min-width:0;color:var(--ink);font:11px/1.3 var(--mono);background:#fff;padding:7px 8px}.folder-up{border:1px solid var(--line);width:32px;color:var(--ink);cursor:pointer;background:#fff;font-size:16px}.folder-up:disabled{color:var(--line-strong);cursor:default}.folder-list{border:1px solid var(--line);background:#fff;min-height:120px;max-height:340px;margin-bottom:12px;overflow:auto}.folder-entry{width:100%;color:var(--ink);text-align:left;font:12px/1.3 var(--sans);cursor:pointer;background:0 0;border:0;border-bottom:1px solid #c8d1d58c;grid-template-columns:18px minmax(0,1fr);gap:5px;padding:7px 10px;display:grid}.folder-entry:hover{background:#2f6fed12}.folder-icon{color:var(--muted);font-family:var(--mono)}.folder-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.folder-empty{color:var(--muted);text-align:center;padding:28px 18px;font-size:11.5px}.folder-footer{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.folder-current{text-overflow:ellipsis;white-space:nowrap;max-width:52%;color:var(--muted);font-size:9.5px;overflow:hidden}.folder-actions{gap:8px;display:flex}.folder-actions .button{margin-top:0}.button.ghost:hover{background:#ffffff14}.shell{background:var(--line);grid-template-columns:258px minmax(0,1fr) 302px;gap:1px;min-height:calc(100dvh - 64px);display:grid}.rail,.inspector{background:var(--panel);padding:20px 18px;overflow:auto}.rail{border-right:1px solid var(--line)}.inspector{border-left:1px solid var(--line)}.panel-block{border-bottom:1px solid var(--line);margin:0 0 17px;padding:0 0 17px}.panel-block:last-child{border-bottom:0;margin-bottom:0;padding-bottom:0}.eyebrow{font:500 9.5px/1.2 var(--mono);letter-spacing:.13em;text-transform:uppercase;color:var(--muted);margin-bottom:8px}.field{margin-bottom:10px;display:block}.field>span{font:500 9.5px/1.2 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:4px;display:block}.field select,.field input{appearance:none;border:1px solid var(--line);width:100%;color:var(--ink);background:#fff;border-radius:2px;padding:7px 8px;font-size:12px}.field select{background-image:linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%);background-position:calc(100% - 13px) 12px,calc(100% - 9px) 12px;background-repeat:no-repeat;background-size:4px 4px,4px 4px;padding-right:24px}.search-field{margin-top:13px}.url-load{border-top:1px solid var(--line);gap:2px;margin:6px 6px 2px;padding-top:6px;display:grid}.url-load .field{margin-bottom:6px}.url-load .field input{font-family:var(--mono);font-size:10.5px}.url-load>button{border:1px solid var(--line-strong);color:var(--ink);text-align:center;font:500 10px/1.3 var(--mono);letter-spacing:.04em;text-transform:uppercase;margin-top:2px}.tiny{font-size:10.5px}.small{font-size:12px}.muted{color:var(--muted)}.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}.strata{border:1px solid var(--line-strong);background:var(--paper);border-radius:2px;gap:1px;height:24px;padding:1px;display:flex;overflow:hidden}.strata i{min-width:2px;height:100%;display:block}.strata-legend{gap:4px;margin-top:9px;display:grid}.strata-row{color:var(--ink-soft);grid-template-columns:7px 1fr auto;align-items:center;gap:7px;font-size:11px;display:grid}.strata-row i,.legend i,.status-chip i{border-radius:50%;width:7px;height:7px;display:inline-block}.strata-row .mono{color:var(--muted);font-size:10px}.status-row{border-top:1px solid var(--line);flex-wrap:wrap;gap:5px 10px;margin-top:11px;padding-top:9px;display:flex}.status-chip{color:var(--muted);align-items:center;gap:5px;font-size:10.5px;display:inline-flex}.status-chip b{color:var(--ink);font-weight:600}.legend{gap:6px;display:grid}.legend>div{grid-template-columns:7px 1fr auto;align-items:center;gap:7px;font-size:11px;display:grid}.legend .mono{color:var(--muted);font-size:10px}.ellipsis{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gradient{border:1px solid var(--line);border-radius:1px;height:9px}.gradient.risk{background:linear-gradient(90deg,#ebe7df 0%,#e9cd98 35%,#d68a54 65%,#a42e2c 100%)}.gradient.metric{background:linear-gradient(90deg,#ebe7df 0%,#b9c9cf 50%,#355b6b 100%)}.gradient-labels{font:10px/1 var(--mono);color:var(--muted);justify-content:space-between;margin-top:4px;display:flex}.debt-list{gap:2px;display:grid}.debt-row{text-align:left;cursor:pointer;background:0 0;border:0;border-radius:1px;grid-template-columns:minmax(0,1fr) 54px 34px;align-items:center;gap:7px;width:100%;padding:5px 0;display:grid}.debt-row:hover,.debt-row.is-selected{background:#2f6fed12}.debt-name{text-overflow:ellipsis;white-space:nowrap;color:var(--ink-soft);font-size:10.5px;overflow:hidden}.debt-track{background:#e0e6e8;height:5px;overflow:hidden}.debt-track i{height:100%;display:block}.debt-row .mono{text-align:right;color:var(--muted);font-size:10px}.stage{background:var(--paper);flex-direction:column;min-width:0;padding:20px 22px 14px;display:flex}.stage-head{justify-content:space-between;align-items:flex-end;gap:22px;margin-bottom:14px;display:flex}.stage h1{font:650 31px/1.05 var(--display);letter-spacing:-.03em;text-overflow:ellipsis;white-space:nowrap;max-width:620px;margin:0;overflow:hidden}.stage-kpis{flex:none;grid-template-columns:repeat(4,minmax(64px,auto));gap:15px;display:grid}.kpi{flex-direction:column;gap:2px;display:flex}.kpi span{font:500 8.5px/1.1 var(--mono);letter-spacing:.11em;text-transform:uppercase;color:var(--muted)}.kpi b{font:600 20px/1 var(--display);letter-spacing:-.02em}.kpi-debt b{color:var(--debt)}.map-frame{border:1px solid var(--line-strong);background:#f8fafa;flex:1;min-height:440px;position:relative;overflow:hidden;box-shadow:inset 0 1px #fffc,0 10px 30px #121a200d}.map-inner{width:100%;height:100%}.map{width:100%;height:100%;display:block}.cell{cursor:pointer}.cell:hover{filter:brightness(1.08)}.cell:focus-visible{stroke:var(--rust);stroke-width:2.5px;outline:none}.cell.is-cursor,.folder-block.is-cursor{stroke:var(--rust);stroke-width:2px}.folder-block{cursor:zoom-in}.folder-block:hover{fill:#121a200d}.folder-block:focus-visible{stroke:var(--rust);stroke-width:2px;outline:none}.folder-hit{cursor:zoom-in}.folder-hit:focus-visible{stroke:var(--rust);stroke-width:2px;outline:none}.empty{text-align:center;color:var(--muted);flex-direction:column;justify-content:center;align-items:center;gap:6px;padding:30px;display:flex;position:absolute;inset:0}.empty.error{color:var(--debt)}.empty.error span{color:var(--muted);max-width:520px}.drop-hint{border:1px dashed var(--cobalt);color:var(--cobalt);font:600 12px/1 var(--mono);letter-spacing:.08em;text-transform:uppercase;pointer-events:none;background:#2f6fed14;justify-content:center;align-items:center;display:flex;position:absolute;inset:12px}.breadcrumb{font:10px/1.3 var(--mono);color:var(--muted);flex-wrap:wrap;align-items:center;gap:5px;margin-top:6px;display:flex}.breadcrumb button{border:0;border-bottom:1px solid var(--line-strong);color:var(--ink);font:inherit;cursor:pointer;background:0 0;padding:0}.breadcrumb button:hover{border-bottom-color:var(--ink)}.stage-foot{color:var(--muted);justify-content:space-between;gap:18px;margin-top:9px;font-size:10px;display:flex}.stage-foot .mono{text-overflow:ellipsis;white-space:nowrap;max-width:55%;overflow:hidden}.progress-cell{align-items:center;gap:10px;min-width:0;display:inline-flex}.progress-cell .detail-note{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.progress-cell .button{text-transform:none;letter-spacing:.02em;flex:none;padding:3px 9px;font-size:9px}.inspector h2{font:650 27px/1.08 var(--display);letter-spacing:-.03em;overflow-wrap:anywhere;margin:6px 0 14px}.inspector-path{font:10.5px/1.45 var(--mono);color:var(--muted);overflow-wrap:anywhere}.inspector-empty h2{margin-top:6px}.inspector-note{border-top:1px solid var(--line);color:var(--muted);justify-content:space-between;gap:10px;margin-top:24px;padding-top:12px;font-size:10px;display:flex}.inspector-status{color:var(--ink-soft);align-items:center;gap:7px;margin-bottom:14px;font-size:11px;display:flex}.status-dot{border-radius:50%;width:8px;height:8px}.inspector-status .mono{color:var(--muted);text-transform:uppercase;margin-left:auto;font-size:10px}.metric-grid{border-top:1px solid var(--line);border-left:1px solid var(--line);grid-template-columns:1fr 1fr;gap:0;margin-bottom:18px;display:grid}.metric{border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:9px 10px}.metric span{font:500 8.5px/1.1 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);display:block}.metric b{font:600 18px/1 var(--display);letter-spacing:-.02em;margin-top:3px;display:block}.metric-table{border-top:1px solid var(--line);padding-top:12px}.metric-table>div:not(.eyebrow){color:var(--ink-soft);justify-content:space-between;gap:12px;padding:4px 0;font-size:11px;display:flex}.metric-table span:last-child{color:var(--muted)}.tabs{border-bottom:1px solid var(--line);gap:18px;margin:-2px 0 16px;display:flex}.tab{color:var(--muted);font:500 9.5px/1 var(--mono);letter-spacing:.1em;text-transform:uppercase;cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:0 0 9px;display:inline-flex}.tab.is-active{color:var(--ink);border-bottom-color:var(--ink)}.tab-dot{background:var(--rust);border-radius:50%;width:5px;height:5px;display:inline-block}.button.dark{background:var(--ink);color:var(--paper);border-color:var(--ink);margin-top:12px}.button.dark:hover{background:#26333b}.pr-panel h2{margin-bottom:4px}.pr-checksums{color:var(--muted);margin-bottom:14px;font-size:10px}.pr-grid{border-top:1px solid var(--line);border-left:1px solid var(--line);grid-template-columns:1fr 1fr;margin-bottom:16px;display:grid}.pr-stat{border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:9px 10px}.pr-stat span{font:500 8.5px/1.1 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);display:block}.pr-stat b{font:600 15px/1.1 var(--display);letter-spacing:-.02em;margin-top:3px;display:block}.pr-stat-bad b{color:var(--debt)}.pr-stat-good b{color:var(--patina)}.pr-delta.is-worse{color:var(--debt)}.pr-delta.is-better{color:var(--patina)}.pr-section{border-top:1px solid var(--line);margin-top:13px;padding-top:12px}.pr-rule-summary{color:var(--muted);flex-wrap:wrap;gap:4px 13px;margin-bottom:7px;font-size:10.5px;display:flex}.pr-rule-summary b{color:var(--ink)}.violation-list{gap:4px;display:grid}.violation{text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:6px 1fr;gap:8px;width:100%;padding:5px 0;display:grid}.violation:hover{background:#d645450f}.violation i{background:var(--muted);border-radius:50%;width:6px;height:6px;margin-top:5px}.violation-error i{background:var(--debt)}.violation-warn i{background:var(--ochre)}.violation-info i{background:var(--cobalt)}.violation b{font:600 11px/1.3 var(--sans);display:block}.violation-source{border:1px solid var(--line-strong);font:500 8.5px/1.4 var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);vertical-align:1px;border-radius:2px;margin-left:6px;padding:1px 5px;font-style:normal}.violation small{color:var(--muted);font-size:10.5px;line-height:1.35;display:block}.pr-rows{gap:1px;display:grid}.pr-row{text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;width:100%;padding:5px 0;display:grid}.pr-row:hover{background:#2f6fed0f}.pr-path{text-overflow:ellipsis;white-space:nowrap;color:var(--ink-soft);font-size:10.5px;overflow:hidden}.pr-delta{color:var(--muted);font-size:9.5px}.pr-cycle{grid-template-columns:22px minmax(0,1fr);gap:6px;padding:4px 0;font-size:10.5px;display:grid}.pr-error{color:var(--debt);margin-top:10px;font-size:11px}code{font-family:var(--mono);background:#64727b1f;border-radius:2px;padding:1px 3px;font-size:10px}@media (max-width:1180px){.shell{grid-template-columns:226px minmax(0,1fr)}.inspector{border-left:0;border-top:1px solid var(--line);grid-column:1/-1;grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr);gap:30px;display:grid}.stage-kpis{grid-template-columns:repeat(2,minmax(64px,auto))}}@media (max-width:820px){.topbar{grid-template-columns:minmax(0,1fr) auto;gap:10px;padding:10px 14px}.snapshot-meta,.brand-sub,.button-label-long{display:none}.button-label-short{display:inline}.topbar-actions{flex-wrap:nowrap}.topbar-actions .button{padding:7px 9px;font-size:9.5px}.shell{flex-direction:column;min-height:0;display:flex}.stage{order:1;padding:16px 12px 12px}.rail{border-right:0;border-top:1px solid var(--line);order:2;grid-template-columns:1fr 1fr;gap:18px;display:grid}.inspector{order:3;display:block}.stage-head{flex-direction:column;align-items:flex-start;gap:12px}.stage-kpis{gap:10px 20px;justify-content:initial;grid-template-columns:repeat(2,minmax(0,1fr));width:100%}.map-frame,.map{min-height:360px}}@media (max-width:560px){.rail{grid-template-columns:1fr}.stage-kpis{grid-template-columns:repeat(2,auto)}.stage h1{font-size:25px}.stage-foot{flex-direction:column;gap:3px}.stage-foot .mono{max-width:100%}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}
@@ -458,4 +458,4 @@ typeof Symbol<`u`&&(_=Symbol.for(`node-ignore`));let v=_,y=(e,t,n)=>(Object.defi
458
458
  `,be=e=>{let t=e.length;for(;t&&ye(e[t-1]);)t--;let n=t;for(;t&&e[t-1]===` `;)t--;if(t===n)return e.slice(0,t);let r=0;for(;r<t&&e[t-r-1]===`\\`;)r++;return r%2?e.slice(0,t-1)+` `:e.slice(0,t)},xe=({pattern:e,mark:t},n)=>{let r=e[0]===``?e.slice(1):e;if(r[0]===`#`)return;let i=!1;r[0]===`!`&&(i=!0,r=r.slice(1));let a=r[r.length-1];if((a===` `||a===`\r`||a===`
459
459
  `)&&(r=be(r)),!r)return;r=r.replace(u,`!`).replace(d,`#`);let o=ue(r);return new ve(e,t,r,n,i,o)};var Se=class{constructor(e){this._ignoreCase=e,this._rules=[],this._basenameCount=0}_add(e){if(e&&e[v]){this._rules=this._rules.concat(e._rules._rules),this._basenameCount+=e._rules._basenameCount,this._added=!0;return}he(e)&&(e={pattern:e});let t=ge(e.pattern)&&xe(e,this._ignoreCase);t&&(this._added=!0,this._rules.push(t),fe(t.body)&&this._basenameCount++)}add(e){return this._added=!1,n(he(e)?_e(e):e).forEach(this._add,this),this._added&&(this._literalRules=void 0),this._added}testLiteral(e){let t=this._literalRules||=this._rules.filter(({body:e})=>e[e.length-(e[e.length-1]===`/`?2:1)]===`*`),n=!1,r=!1,i;for(let a=t.length-1;a>=0;a--){let o=t[a];if(o.checkRegex.test(e)){n=!o.negative,r=o.negative,i=o.negative?void 0:o;break}}let a={ignored:n,unignored:r};return i&&(a.rule=i),a}test(e,t,n){let r=!1,i=!1,a,o=this._rules,{length:s}=o,c=this._basenameCount*2>=s,l=c?pe(e):e;for(let u=0;u<s;u++){let s=o[u],{negative:d}=s;!(i===d&&r!==i||d&&!r&&!i&&!t)&&s[n].test(c&&s._basenameOnly?l:e)&&(r=!d,i=d,a=d?void 0:s)}let u={ignored:r,unignored:i};return a&&(u.rule=a),u}};let Ce=(e,t)=>{throw new t(e)},L=(e,t,n)=>he(e)?e?!L.isNotRelative(e)||n(`path should be a \`path.relative()\`d string, but got "${t}"`,RangeError):n(`path must not be empty`,TypeError):n(`path must be a string, but got \`${t}\``,TypeError),we=e=>{let t=e.charCodeAt(0);if(t===47)return!0;if(t!==46)return!1;if(e.length===1)return!0;let n=e.charCodeAt(1);return n===47?!0:n===46?e.length===2||e.charCodeAt(2)===47:!1};
460
460
  /* istanbul ignore next */
461
- L.isNotRelative=we,L.convert=e=>e;var Te=class{constructor({ignorecase:e=!0,ignoreCase:t=e,allowRelativePaths:n=!1}={}){y(this,v,!0),this._rules=new Se(t),this._strictPathCheck=!n,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(e){return this._rules.add(e)&&this._initCache(),this}addPattern(e){return this.add(e)}_test(e,t,n){let r=e&&L.convert(e);return L(r,e,this._strictPathCheck?Ce:b),this._t(r,t,n)}checkIgnore(e){if(e.charCodeAt(e.length-1)!==47)return this.test(e);let t=this._t(e,this._testCache,!0);if(t.ignored)return t;let n=this._rules.testLiteral(e);return n.ignored||n.unignored?n:t}_t(e,t,n){if(e in t)return t[e];let r=me(e),i=r?this._t(r,t,n):void 0;return t[e]=i&&i.ignored?i:this._rules.test(e,n,F)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return n(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}};let Ee=e=>new Te(e),De=e=>L(e&&L.convert(e),e,b),Oe=()=>{L.convert=e=>/^\\\\\?\\/.test(e)||/["<>|\u0000-\u001F]+/u.test(e)?e:e.replace(/\\/g,`/`);let e=/^[a-z]:\//i;L.isNotRelative=t=>e.test(t)||we(t)};typeof process<`u`&&process.platform===`win32`&&Oe(),t.exports=Ee,Ee.default=Ee,t.exports.isPathValid=De,y(t.exports,Symbol.for(`setupWindows`),Oe)})),import_ignore=/* @__PURE__ */ __toESM(require_ignore(),1);const DEFAULT_EXTENSIONS=[`.ts`,`.tsx`,`.mts`,`.cts`,`.js`,`.jsx`,`.mjs`,`.cjs`],ALWAYS_IGNORED=[`.git`,`node_modules`,`.codarch`];function walkSourceFiles(e,t={}){let n=t.extensions??DEFAULT_EXTENSIONS,r=[],i=[],a=(0,import_ignore.default)().add(ALWAYS_IGNORED);for(let e of t.ignore??[])a.add(e);let o=readGitignore(e,`/`,``,r);o&&a.add(o);let s=[{absolutePath:`/`,relativePath:``,layers:[{base:``,matcher:a}]}];for(;s.length>0;){let t=s.pop(),a;try{a=e.readDirectory(t.absolutePath)}catch(e){r.push(`no se pudo leer ${t.relativePath||`.`}: ${e.message}`);continue}a.sort((e,t)=>e.name<t.name?-1:+(e.name>t.name));for(let o of a){let a=t.relativePath?`${t.relativePath}/${o.name}`:o.name,c=t.absolutePath===`/`?`/${o.name}`:`${t.absolutePath}/${o.name}`;if(o.isDirectory){if(isIgnored(t.layers,a,!0))continue;let n=readGitignore(e,c,a,r),i=n?[...t.layers,{base:a,matcher:(0,import_ignore.default)().add(n)}]:t.layers;s.push({absolutePath:c,relativePath:a,layers:i})}else if(o.isFile){if(isIgnored(t.layers,a,!1)||!matchesExtension(o.name,n))continue;i.push({absolutePath:c,relativePath:a})}}}return i.sort((e,t)=>e.relativePath<t.relativePath?-1:+(e.relativePath>t.relativePath)),r.sort(),{files:i,warnings:r}}function readGitignore(e,t,n,r){let i=t===`/`?`/.gitignore`:`${t}/.gitignore`;try{return e.tryReadFile(i)}catch(e){return r.push(`no se pudo leer ${n?`${n}/`:``}.gitignore: ${e.message}`),null}}function isIgnored(e,t,n){let r=!1;for(let i of e){let e=i.base?t.slice(i.base.length+1):t;if(!e)continue;let a=n?`${e}/`:e,o=i.matcher.test(a);o.ignored?r=!0:o.unignored&&(r=!1)}return r}function matchesExtension(e,t){let n=e.toLowerCase();return t.some(e=>n.endsWith(e))}function analyzeFiles(e){let t=Date.now(),n=e.fileSystem,r=e.root??`/`,i=e.projectName??readProjectName(n,r,e.fallbackName),a=walkSourceFiles(n,{ignore:e.ignore,extensions:e.extensions??MIGRATION_EXTENSIONS}),o=[...a.warnings],s=new ImportResolver(r,a.files,n);o.push(...s.warnings);let c=e.parser,l=[],u=[],d=[],f=[],p=[],m=0,h=0,g=0;for(let e of a.files){let t=languageForPath(e.relativePath);if(!t)continue;if(isNativeLanguage(t)){l.push({relativePath:e.relativePath,metrics:{loc:0,rloc:0}}),u.push({relativePath:e.relativePath,language:t,loc:0,rloc:0,maxComplexity:0,fanIn:0,bridge:!1});continue}let r;try{r=n.readFile(e.absolutePath)}catch(t){o.push(`no se pudo leer ${e.relativePath}: ${t.message}`);continue}if(t===`rust`){let n=measureRustSource(r);l.push({relativePath:e.relativePath,metrics:{loc:n.loc,rloc:n.rloc}}),u.push({relativePath:e.relativePath,language:t,loc:n.loc,rloc:n.rloc,maxComplexity:0,fanIn:0,bridge:rustIsBridge(r)});continue}let i;try{i=c.parse(r,e.relativePath)}catch(t){o.push(`no se pudo analizar ${e.relativePath}: ${t.message}`);continue}let a=0,_=0,v=0,y=0;for(let t of i.imports){if(t.typeOnly&&v++,isAssetSpecifier(t.specifier))continue;let n=s.resolve(e.absolutePath,t.specifier);if(n.kind===`internal`){let r=languageForPath(n.file.relativePath);r===`wasm`||r===`node`?d.push({from:e.relativePath,to:n.file.relativePath,kind:r===`wasm`?`wasm`:`native`}):f.push({from:e.relativePath,to:n.file.relativePath,typeOnly:t.typeOnly})}else n.kind===`external`?n.builtin?_++:a++:(y++,p.push({file:e.relativePath,line:t.line,specifier:t.specifier,reason:n.reason}))}m+=a,h+=_,g+=v,l.push({relativePath:e.relativePath,metrics:{...i.metrics,imports:i.imports.length,externalImports:a,builtinImports:_,typeOnlyImports:v,unresolvedImports:y}}),u.push({relativePath:e.relativePath,language:t,loc:i.metrics.loc??0,rloc:i.metrics.rloc??0,maxComplexity:i.metrics.maxComplexity??0,fanIn:0,bridge:jsIsBridge(r,i.imports.map(e=>e.specifier))})}let _=null;if(e.churn){_=e.churn(l.map(e=>e.relativePath)),o.push(..._.warnings);for(let e of l){let t=_.metrics.get(e.relativePath);t&&(e.metrics.number_of_commits=t.commits,e.metrics.number_of_authors=t.authors)}}let v=buildGraph(l.map(e=>e.relativePath),f);for(let e of l){let t=v.metrics.get(e.relativePath);t&&(e.metrics.fanIn=t.fanIn,e.metrics.fanOut=t.fanOut,e.metrics.inCycle=t.inCycle,e.metrics.cycleSize=t.cycleSize,e.metrics.dependencyLevel=t.dependencyLevel)}for(let e of u)e.fanIn=v.metrics.get(e.relativePath)?.fanIn??0;let y=buildMigration(u,d);for(let e of l){let t=y.nodes.get(e.relativePath);t&&(e.metrics.ffiCrossings=t.crossings,t.debt!==void 0&&(e.metrics.migrationDebt=t.debt))}p.length>0&&o.push(`${p.length} imports sin resolver; se excluyen del grafo`);let b=buildSnapshot({projectName:i,files:l,graph:v,migration:y}),x=0;walkTree(b.files,e=>{e.node.type===`Folder`&&e.depth>0&&x++});let S=/* @__PURE__ */ new Set;for(let e of l)for(let t of Object.keys(e.metrics))S.add(t);return o.sort(),{snapshot:b,files:l.length,folders:x,edges:v.edges.length,cycles:v.cycles,metricNames:[...S].sort(),warnings:o,unresolved:p,externalImports:m,builtinImports:h,typeOnlyImports:g,unresolvedImports:p.length,migration:y.summary,churn:_,durationMs:Date.now()-t}}function readProjectName(e,t,n){try{let n=e.readFile(join(t,`package.json`)),r=JSON.parse(n.replace(/^\uFEFF/,``));if(typeof r==`object`&&r&&!Array.isArray(r)&&typeof r.name==`string`){let e=r.name.trim();if(e)return e}}catch{}return n??basename(t)??`Proyecto`}var MemoryFileSystem=class{caseSensitive;files;constructor(e=[],t=!0){this.files=/* @__PURE__ */ new Map,this.caseSensitive=t;for(let[t,n]of e)this.files.set(t,n)}readFile(e){let t=this.tryReadFile(e);if(t===null)throw Error(`no existe el fichero: ${e}`);return t}tryReadFile(e){return this.files.get(e)??null}readDirectory(e){let t=e===`/`?`/`:`${e}/`,n=/* @__PURE__ */ new Map;for(let e of this.files.keys()){if(!e.startsWith(t))continue;let r=e.slice(t.length);if(r===``)continue;let i=r.indexOf(`/`);if(i===-1){n.set(r,{name:r,isDirectory:!1,isFile:!0});continue}let a=r.slice(0,i);n.set(a,{name:a,isDirectory:!0,isFile:!1})}return[...n.values()].sort((e,t)=>e.name<t.name?-1:+(e.name>t.name))}exists(e){if(this.files.has(e))return!0;let t=e===`/`?`/`:`${e}/`;for(let e of this.files.keys())if(e.startsWith(t))return!0;return!1}set(e,t){this.files.set(e,t)}paths(){return[...this.files.keys()].sort()}entries(){return[...this.files.entries()].sort((e,t)=>e[0]<t[0]?-1:+(e[0]>t[0]))}};async function runAnalysis(e,t){try{let n=await WasmTypeScriptParser.create(t.typescript,t.tsx,{runtime:t.runtime}),r=Date.now(),i=analyzeFiles({fileSystem:new MemoryFileSystem(e.files),root:`/`,projectName:e.projectName,parser:n});return{type:`done`,snapshot:i.snapshot,files:i.files,edges:i.edges,warnings:i.warnings,durationMs:Date.now()-r}}catch(e){return{type:`error`,message:e.message??String(e)}}}var tree_sitter_default=`/assets/tree-sitter-B8lY9Ae0.wasm`,tree_sitter_typescript_default=`/assets/tree-sitter-typescript-BQpamM5l.wasm`,tree_sitter_tsx_default=`/assets/tree-sitter-tsx-DFihddBo.wasm`;const scope=self;scope.addEventListener(`message`,e=>{let t=e.data;t.type===`analyze`&&(async()=>{scope.postMessage({type:`progress`,message:`Cargando el parser…`});let e=await runAnalysis(t,{typescript:tree_sitter_typescript_default,tsx:tree_sitter_tsx_default,runtime:tree_sitter_default});scope.postMessage(e)})()})})();
461
+ L.isNotRelative=we,L.convert=e=>e;var Te=class{constructor({ignorecase:e=!0,ignoreCase:t=e,allowRelativePaths:n=!1}={}){y(this,v,!0),this._rules=new Se(t),this._strictPathCheck=!n,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(e){return this._rules.add(e)&&this._initCache(),this}addPattern(e){return this.add(e)}_test(e,t,n){let r=e&&L.convert(e);return L(r,e,this._strictPathCheck?Ce:b),this._t(r,t,n)}checkIgnore(e){if(e.charCodeAt(e.length-1)!==47)return this.test(e);let t=this._t(e,this._testCache,!0);if(t.ignored)return t;let n=this._rules.testLiteral(e);return n.ignored||n.unignored?n:t}_t(e,t,n){if(e in t)return t[e];let r=me(e),i=r?this._t(r,t,n):void 0;return t[e]=i&&i.ignored?i:this._rules.test(e,n,F)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return n(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}};let Ee=e=>new Te(e),De=e=>L(e&&L.convert(e),e,b),Oe=()=>{L.convert=e=>/^\\\\\?\\/.test(e)||/["<>|\u0000-\u001F]+/u.test(e)?e:e.replace(/\\/g,`/`);let e=/^[a-z]:\//i;L.isNotRelative=t=>e.test(t)||we(t)};typeof process<`u`&&process.platform===`win32`&&Oe(),t.exports=Ee,Ee.default=Ee,t.exports.isPathValid=De,y(t.exports,Symbol.for(`setupWindows`),Oe)})),import_ignore=/* @__PURE__ */ __toESM(require_ignore(),1);const DEFAULT_EXTENSIONS=[`.ts`,`.tsx`,`.mts`,`.cts`,`.js`,`.jsx`,`.mjs`,`.cjs`],ALWAYS_IGNORED=[`.git`,`node_modules`,`.codarch`];function walkSourceFiles(e,t={}){let n=t.extensions??DEFAULT_EXTENSIONS,r=[],i=[],a=(0,import_ignore.default)().add(ALWAYS_IGNORED);for(let e of t.ignore??[])a.add(e);let o=readGitignore(e,`/`,``,r);o&&a.add(o);let s=[{absolutePath:`/`,relativePath:``,layers:[{base:``,matcher:a}]}];for(;s.length>0;){let t=s.pop(),a;try{a=e.readDirectory(t.absolutePath)}catch(e){r.push(`no se pudo leer ${t.relativePath||`.`}: ${e.message}`);continue}a.sort((e,t)=>e.name<t.name?-1:+(e.name>t.name));for(let o of a){let a=t.relativePath?`${t.relativePath}/${o.name}`:o.name,c=t.absolutePath===`/`?`/${o.name}`:`${t.absolutePath}/${o.name}`;if(o.isDirectory){if(isIgnored(t.layers,a,!0))continue;let n=readGitignore(e,c,a,r),i=n?[...t.layers,{base:a,matcher:(0,import_ignore.default)().add(n)}]:t.layers;s.push({absolutePath:c,relativePath:a,layers:i})}else if(o.isFile){if(isIgnored(t.layers,a,!1)||!matchesExtension(o.name,n))continue;i.push({absolutePath:c,relativePath:a})}}}return i.sort((e,t)=>e.relativePath<t.relativePath?-1:+(e.relativePath>t.relativePath)),r.sort(),{files:i,warnings:r}}function readGitignore(e,t,n,r){let i=t===`/`?`/.gitignore`:`${t}/.gitignore`;try{return e.tryReadFile(i)}catch(e){return r.push(`no se pudo leer ${n?`${n}/`:``}.gitignore: ${e.message}`),null}}function isIgnored(e,t,n){let r=!1;for(let i of e){let e=i.base?t.slice(i.base.length+1):t;if(!e)continue;let a=n?`${e}/`:e,o=i.matcher.test(a);o.ignored?r=!0:o.unignored&&(r=!1)}return r}function matchesExtension(e,t){let n=e.toLowerCase();return t.some(e=>n.endsWith(e))}function analyzeFiles(e){let t=Date.now(),n=e.fileSystem,r=e.root??`/`,i=e.projectName??readProjectName(n,r,e.fallbackName),a=walkSourceFiles(n,{ignore:e.ignore,extensions:e.extensions??MIGRATION_EXTENSIONS}),o=[...a.warnings],s=new ImportResolver(r,a.files,n);o.push(...s.warnings);let c=e.parser,l=[],u=[],d=[],f=[],p=[],m=0,h=0,g=0,_=0;for(let t of a.files){_+=1,e.onProgress?.({done:_,total:a.files.length,current:t.relativePath});let r=languageForPath(t.relativePath);if(!r)continue;if(isNativeLanguage(r)){l.push({relativePath:t.relativePath,metrics:{loc:0,rloc:0}}),u.push({relativePath:t.relativePath,language:r,loc:0,rloc:0,maxComplexity:0,fanIn:0,bridge:!1});continue}let i;try{i=n.readFile(t.absolutePath)}catch(e){o.push(`no se pudo leer ${t.relativePath}: ${e.message}`);continue}if(r===`rust`){let e=measureRustSource(i);l.push({relativePath:t.relativePath,metrics:{loc:e.loc,rloc:e.rloc}}),u.push({relativePath:t.relativePath,language:r,loc:e.loc,rloc:e.rloc,maxComplexity:0,fanIn:0,bridge:rustIsBridge(i)});continue}let v;try{v=c.parse(i,t.relativePath)}catch(e){o.push(`no se pudo analizar ${t.relativePath}: ${e.message}`);continue}let y=0,b=0,x=0,S=0;for(let e of v.imports){if(e.typeOnly&&x++,isAssetSpecifier(e.specifier))continue;let n=s.resolve(t.absolutePath,e.specifier);if(n.kind===`internal`){let r=languageForPath(n.file.relativePath);r===`wasm`||r===`node`?d.push({from:t.relativePath,to:n.file.relativePath,kind:r===`wasm`?`wasm`:`native`}):f.push({from:t.relativePath,to:n.file.relativePath,typeOnly:e.typeOnly})}else n.kind===`external`?n.builtin?b++:y++:(S++,p.push({file:t.relativePath,line:e.line,specifier:e.specifier,reason:n.reason}))}m+=y,h+=b,g+=x,l.push({relativePath:t.relativePath,metrics:{...v.metrics,imports:v.imports.length,externalImports:y,builtinImports:b,typeOnlyImports:x,unresolvedImports:S}}),u.push({relativePath:t.relativePath,language:r,loc:v.metrics.loc??0,rloc:v.metrics.rloc??0,maxComplexity:v.metrics.maxComplexity??0,fanIn:0,bridge:jsIsBridge(i,v.imports.map(e=>e.specifier))})}let v=null;if(e.churn){v=e.churn(l.map(e=>e.relativePath)),o.push(...v.warnings);for(let e of l){let t=v.metrics.get(e.relativePath);t&&(e.metrics.number_of_commits=t.commits,e.metrics.number_of_authors=t.authors)}}let y=buildGraph(l.map(e=>e.relativePath),f);for(let e of l){let t=y.metrics.get(e.relativePath);t&&(e.metrics.fanIn=t.fanIn,e.metrics.fanOut=t.fanOut,e.metrics.inCycle=t.inCycle,e.metrics.cycleSize=t.cycleSize,e.metrics.dependencyLevel=t.dependencyLevel)}for(let e of u)e.fanIn=y.metrics.get(e.relativePath)?.fanIn??0;let b=buildMigration(u,d);for(let e of l){let t=b.nodes.get(e.relativePath);t&&(e.metrics.ffiCrossings=t.crossings,t.debt!==void 0&&(e.metrics.migrationDebt=t.debt))}p.length>0&&o.push(`${p.length} imports sin resolver; se excluyen del grafo`);let x=buildSnapshot({projectName:i,files:l,graph:y,migration:b}),S=0;walkTree(x.files,e=>{e.node.type===`Folder`&&e.depth>0&&S++});let w=/* @__PURE__ */ new Set;for(let e of l)for(let t of Object.keys(e.metrics))w.add(t);return o.sort(),{snapshot:x,files:l.length,folders:S,edges:y.edges.length,cycles:y.cycles,metricNames:[...w].sort(),warnings:o,unresolved:p,externalImports:m,builtinImports:h,typeOnlyImports:g,unresolvedImports:p.length,migration:b.summary,churn:v,durationMs:Date.now()-t}}function readProjectName(e,t,n){try{let n=e.readFile(join(t,`package.json`)),r=JSON.parse(n.replace(/^\uFEFF/,``));if(typeof r==`object`&&r&&!Array.isArray(r)&&typeof r.name==`string`){let e=r.name.trim();if(e)return e}}catch{}return n??basename(t)??`Proyecto`}var MemoryFileSystem=class{caseSensitive;files;constructor(e=[],t=!0){this.files=/* @__PURE__ */ new Map,this.caseSensitive=t;for(let[t,n]of e)this.files.set(t,n)}readFile(e){let t=this.tryReadFile(e);if(t===null)throw Error(`no existe el fichero: ${e}`);return t}tryReadFile(e){return this.files.get(e)??null}readDirectory(e){let t=e===`/`?`/`:`${e}/`,n=/* @__PURE__ */ new Map;for(let e of this.files.keys()){if(!e.startsWith(t))continue;let r=e.slice(t.length);if(r===``)continue;let i=r.indexOf(`/`);if(i===-1){n.set(r,{name:r,isDirectory:!1,isFile:!0});continue}let a=r.slice(0,i);n.set(a,{name:a,isDirectory:!0,isFile:!1})}return[...n.values()].sort((e,t)=>e.name<t.name?-1:+(e.name>t.name))}exists(e){if(this.files.has(e))return!0;let t=e===`/`?`/`:`${e}/`;for(let e of this.files.keys())if(e.startsWith(t))return!0;return!1}set(e,t){this.files.set(e,t)}paths(){return[...this.files.keys()].sort()}entries(){return[...this.files.entries()].sort((e,t)=>e[0]<t[0]?-1:+(e[0]>t[0]))}};async function runAnalysis(e,t,n=()=>void 0){try{let r=await WasmTypeScriptParser.create(t.typescript,t.tsx,{runtime:t.runtime}),i=Date.now(),a=analyzeFiles({fileSystem:new MemoryFileSystem(e.files),root:`/`,projectName:e.projectName,parser:r,onProgress:e=>n({type:`progress-file`,...e})});return{type:`done`,snapshot:a.snapshot,files:a.files,edges:a.edges,warnings:a.warnings,durationMs:Date.now()-i}}catch(e){return{type:`error`,message:e.message??String(e)}}}var tree_sitter_default=`/assets/tree-sitter-B8lY9Ae0.wasm`,tree_sitter_typescript_default=`/assets/tree-sitter-typescript-BQpamM5l.wasm`,tree_sitter_tsx_default=`/assets/tree-sitter-tsx-DFihddBo.wasm`;const scope=self;scope.addEventListener(`message`,e=>{let t=e.data;t.type===`analyze`&&(async()=>{scope.postMessage({type:`progress`,message:`Cargando el parser…`});let e=await runAnalysis(t,{typescript:tree_sitter_typescript_default,tsx:tree_sitter_tsx_default,runtime:tree_sitter_default},e=>scope.postMessage(e));scope.postMessage(e)})()})})();
Binary file
package/web/icon.png ADDED
Binary file
package/web/index.html CHANGED
@@ -4,6 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta name="theme-color" content="#eef1f2" />
7
+ <link rel="icon" type="image/png" href="/favicon.png" />
8
+ <link rel="apple-touch-icon" href="/icon.png" />
7
9
  <title>CodArch · atlas de arquitectura</title>
8
10
  <link rel="preconnect" href="https://fonts.googleapis.com" />
9
11
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
@@ -11,8 +13,8 @@
11
13
  href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,500;12..96,650;12..96,750&family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@400;500;600&display=swap"
12
14
  rel="stylesheet"
13
15
  />
14
- <script type="module" crossorigin src="/assets/index-BLE7eQgu.js"></script>
15
- <link rel="stylesheet" crossorigin href="/assets/index-Bnq20GR3.css">
16
+ <script type="module" crossorigin src="/assets/index-BRgqIG_S.js"></script>
17
+ <link rel="stylesheet" crossorigin href="/assets/index-C_1au_Hz.css">
16
18
  </head>
17
19
  <body>
18
20
  <div id="root"></div>