claude-finops 0.13.0 → 0.14.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.
- package/README.md +77 -3
- package/config/settings.json +9 -0
- package/finops/analytics.py +78 -2
- package/finops/api.py +130 -4
- package/finops/cloud.py +51 -3
- package/finops/guard.py +412 -0
- package/finops/integrate.py +78 -0
- package/finops/jev.py +175 -0
- package/package.json +1 -1
- package/run.py +16 -12
- package/web/app.js +830 -59
- package/web/guide/budgets.png +0 -0
- package/web/styles.css +71 -0
|
Binary file
|
package/web/styles.css
CHANGED
|
@@ -605,3 +605,74 @@ table.tbl .sub { font-size:10.5px; color:var(--muted); }
|
|
|
605
605
|
.actnow-it .ai .i { width:17px; height:17px; vertical-align:middle; }
|
|
606
606
|
.focus-hd .i { align-self:center; }
|
|
607
607
|
.status .glyph .i { display:block; width:10px; height:10px; }
|
|
608
|
+
|
|
609
|
+
/* ---------- budgets form ---------- */
|
|
610
|
+
.cfg .sec { font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:.07em;
|
|
611
|
+
font-weight:620; margin:0 0 6px; }
|
|
612
|
+
.cfg .fld { margin-bottom:12px; }
|
|
613
|
+
.cfg .fld > .hd { font-size:10px; text-transform:uppercase; letter-spacing:.07em; color:var(--muted);
|
|
614
|
+
padding:5px 2px 3px; font-weight:600; }
|
|
615
|
+
.cfg input[type=text], .cfg input[type=password], .cfg select {
|
|
616
|
+
width:100%; padding:5px 7px; border-radius:6px; border:1px solid var(--border); background:var(--surface-2); }
|
|
617
|
+
.cfg input.bad, .cfg select.bad { border-color:var(--critical); box-shadow:0 0 0 1px var(--critical); }
|
|
618
|
+
.cfg .sugg { display:flex; flex-wrap:wrap; gap:4px; margin:5px 0 0; align-items:center; }
|
|
619
|
+
.cfg .sugg .chip { font-size:11px; padding:2px 9px; }
|
|
620
|
+
.cfg .fld-hint { font-size:11px; color:var(--muted); margin:3px 2px 0; }
|
|
621
|
+
.cfg .fld-err { font-size:11.5px; color:var(--critical-ink); margin:3px 2px 0; font-weight:550; }
|
|
622
|
+
.cfg .fld-hint:empty, .cfg .fld-err:empty { display:none; }
|
|
623
|
+
.cfg .save-row { display:flex; gap:10px; align-items:center; flex-wrap:wrap; margin:14px 0 4px; }
|
|
624
|
+
.cfg .save-row .chip { padding:6px 18px; }
|
|
625
|
+
.cfg .ok, .cfg #cfg-msg.ok { color:var(--good-ink); font-size:12px; }
|
|
626
|
+
.cfg #cfg-msg.err { color:var(--critical-ink); font-size:12px; font-weight:550; }
|
|
627
|
+
|
|
628
|
+
/* ---------- budgets: numbered blocks ---------- */
|
|
629
|
+
.cfg .blk { border:1px solid var(--border); border-radius:10px; padding:12px 14px 4px; margin:0 0 12px; }
|
|
630
|
+
.cfg .blk h4 { display:flex; align-items:center; gap:8px; margin:0 0 2px; font-size:14px; }
|
|
631
|
+
.cfg .blk .num { color:var(--s1); font-size:16px; }
|
|
632
|
+
.cfg .blk-intro { margin:0 0 8px; color:var(--text); font-size:12.5px; }
|
|
633
|
+
.cfg .blk-sub { color:var(--muted); font-weight:450; font-size:12px; }
|
|
634
|
+
.cfg .blk-help { width:20px; height:20px; border-radius:50%; border:1px solid var(--border);
|
|
635
|
+
background:var(--surface-2); color:var(--muted); font-size:11px; font-weight:700; cursor:pointer; line-height:1; }
|
|
636
|
+
.cfg .blk-help:hover, .cfg .blk-help:focus-visible { color:var(--text); border-color:var(--border-strong); }
|
|
637
|
+
.cfg details.adv > summary { cursor:pointer; list-style:none; padding-bottom:8px; }
|
|
638
|
+
.cfg details.adv > summary::-webkit-details-marker { display:none; }
|
|
639
|
+
.cfg details.adv > summary h4::before { content:'▸'; color:var(--muted); }
|
|
640
|
+
.cfg details.adv[open] > summary h4::before { content:'▾'; }
|
|
641
|
+
.cfg .livebox { border:1px dashed var(--border-strong); border-radius:8px; padding:10px 12px; margin:4px 0 10px;
|
|
642
|
+
background:var(--surface-2); }
|
|
643
|
+
.cfg .livebox p { margin:6px 0 0; font-size:12.5px; }
|
|
644
|
+
.cfg .lb-head { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
|
|
645
|
+
.cfg .lb-state { font-size:12px; color:var(--muted); }
|
|
646
|
+
.cfg .lb-state.on { color:var(--good-ink); }
|
|
647
|
+
.cfg .lb-state.warn { color:var(--warning-ink); font-weight:550; }
|
|
648
|
+
|
|
649
|
+
/* ---------- guide popup ---------- */
|
|
650
|
+
.guide-layer { position:fixed; inset:0; z-index:200; background:rgba(0,0,0,.45);
|
|
651
|
+
display:flex; align-items:center; justify-content:center; padding:16px; }
|
|
652
|
+
.guide { width:min(760px, 100%); max-height:calc(100vh - 32px); overflow:auto; background:var(--surface);
|
|
653
|
+
border:1px solid var(--border); border-radius:14px; box-shadow:var(--shadow); outline:none; }
|
|
654
|
+
.guide header { display:flex; align-items:center; gap:10px; padding:14px 16px 6px; }
|
|
655
|
+
.guide h2 { margin:0; font-size:18px; }
|
|
656
|
+
.guide .g-step { font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:.07em; }
|
|
657
|
+
.guide .g-x { margin-left:auto; }
|
|
658
|
+
.guide .g-pic { position:relative; margin:6px 16px; border:1px solid var(--border); border-radius:10px;
|
|
659
|
+
overflow:hidden; background:var(--bg, var(--surface-2)); }
|
|
660
|
+
.guide .g-pic { text-align:center; }
|
|
661
|
+
.guide .g-fig { position:relative; display:inline-block; max-width:100%; line-height:0; }
|
|
662
|
+
.guide .g-fig img { display:block; max-width:100%; max-height:45vh; width:auto; height:auto; }
|
|
663
|
+
.guide .g-live { text-align:left; padding:12px; pointer-events:none; user-select:none; }
|
|
664
|
+
.guide .g-mark { position:absolute; transform:translate(-50%,-50%); width:26px; height:26px; border-radius:50%;
|
|
665
|
+
background:var(--s1); color:#fff; font-weight:700; font-size:14px; display:flex; align-items:center;
|
|
666
|
+
justify-content:center; box-shadow:0 0 0 3px var(--surface); }
|
|
667
|
+
.guide .g-text { padding:4px 18px 2px; font-size:15px; line-height:1.5; }
|
|
668
|
+
.guide .g-text p { margin:6px 0; }
|
|
669
|
+
.guide footer { display:flex; align-items:center; gap:8px; padding:10px 16px 14px; flex-wrap:wrap; }
|
|
670
|
+
.guide .g-dots { display:flex; gap:5px; }
|
|
671
|
+
.guide .g-dots i { width:7px; height:7px; border-radius:50%; background:var(--border-strong); }
|
|
672
|
+
.guide .g-dots i.on { background:var(--s1); }
|
|
673
|
+
.guide .g-cc { margin-top:10px; padding:10px 12px; border-radius:8px; background:#1e1e1e; color:#e6e6e6; font:12.5px/1.5 ui-monospace, Menlo, monospace; }
|
|
674
|
+
.pulse { animation: guide-pulse 1s ease-in-out 2; border-radius:10px; }
|
|
675
|
+
@media (prefers-reduced-motion: reduce) { .pulse { animation: none; outline: 3px solid var(--s1); } }
|
|
676
|
+
.guide .g-ex { text-align:left; padding:8px 12px 0; font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:.07em; }
|
|
677
|
+
@keyframes guide-pulse { 50% { box-shadow:0 0 0 4px color-mix(in srgb, var(--s1) 55%, transparent); } }
|
|
678
|
+
@media (max-width: 600px) { .guide .g-text { font-size:14px; } .guide footer .spacer { display:none; } }
|