stackvitals 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mergescout/__init__.py +1 -0
- mergescout/archive/__init__.py +0 -0
- mergescout/archive/__main__.py +30 -0
- mergescout/archive/convert.py +83 -0
- mergescout/archive/events.py +55 -0
- mergescout/archive/manifest.py +45 -0
- mergescout/archive/stream.py +83 -0
- mergescout/bench/__init__.py +1 -0
- mergescout/bench/__main__.py +135 -0
- mergescout/bench/ci.py +257 -0
- mergescout/bench/deploys.py +115 -0
- mergescout/bench/matched.py +22 -0
- mergescout/bench/prior.py +42 -0
- mergescout/bench/report.py +230 -0
- mergescout/bench/shared.py +112 -0
- mergescout/bench/stars.py +57 -0
- mergescout/cli.py +89 -0
- mergescout/config.py +35 -0
- mergescout/crawl/__init__.py +0 -0
- mergescout/crawl/__main__.py +97 -0
- mergescout/crawl/chain.py +34 -0
- mergescout/crawl/fetch.py +146 -0
- mergescout/crawl/outcomes.py +69 -0
- mergescout/crawl/queries.py +250 -0
- mergescout/crawl/runner.py +176 -0
- mergescout/crawl/seed.py +77 -0
- mergescout/crawl/state.py +169 -0
- mergescout/crawl/writer.py +87 -0
- mergescout/discover/__init__.py +0 -0
- mergescout/discover/__main__.py +58 -0
- mergescout/discover/sweep.py +286 -0
- mergescout/github/__init__.py +0 -0
- mergescout/github/graphql.py +202 -0
- mergescout/github/identities.py +35 -0
- mergescout/github/releases.py +137 -0
- mergescout/labels.py +20 -0
- mergescout/mcp_server.py +228 -0
- mergescout/measure/__init__.py +0 -0
- mergescout/measure/__main__.py +75 -0
- mergescout/measure/api_cost.py +91 -0
- mergescout/measure/count_repos.py +30 -0
- mergescout/measure/jsonl.py +14 -0
- mergescout/measure/report.py +56 -0
- mergescout/measure/sample.py +37 -0
- mergescout/owners.py +22 -0
- mergescout/setup_check.py +64 -0
- mergescout/signals/__init__.py +0 -0
- mergescout/signals/__main__.py +96 -0
- mergescout/signals/bump_ledger.py +258 -0
- mergescout/signals/bumps.py +104 -0
- mergescout/signals/check.py +141 -0
- mergescout/signals/community_bench.py +149 -0
- mergescout/signals/delivery_bench.py +103 -0
- mergescout/signals/deps_map.py +261 -0
- mergescout/signals/deps_trends.py +117 -0
- mergescout/signals/evidence.py +94 -0
- mergescout/signals/exploits.py +43 -0
- mergescout/signals/flow_bench.py +258 -0
- mergescout/signals/identity.py +73 -0
- mergescout/signals/issues.py +76 -0
- mergescout/signals/labels.py +79 -0
- mergescout/signals/osv.py +232 -0
- mergescout/signals/owners_watch.py +80 -0
- mergescout/signals/repo_stats.py +96 -0
- mergescout/signals/rules.py +70 -0
- mergescout/signals/silver.py +33 -0
- mergescout/signals/top_packages.py +26 -0
- mergescout/signals/triage.py +71 -0
- mergescout/signals/triage_math.py +120 -0
- mergescout/signals/walls.py +91 -0
- mergescout/snapshot/__init__.py +0 -0
- mergescout/snapshot/__main__.py +215 -0
- mergescout/snapshot/build.py +147 -0
- mergescout/snapshot/publish.py +70 -0
- mergescout/snapshot/schema.py +34 -0
- mergescout/snapshot/score.py +30 -0
- mergescout/store/__init__.py +0 -0
- mergescout/store/__main__.py +46 -0
- mergescout/store/sync.py +148 -0
- mergescout/timeutil.py +11 -0
- mergescout/tool/__init__.py +0 -0
- mergescout/tool/action_pack.py +62 -0
- mergescout/tool/live.py +201 -0
- mergescout/tool/queries.py +293 -0
- mergescout/tool/refs.py +31 -0
- mergescout/tool/store.py +129 -0
- mergescout/tool/tracking.py +83 -0
- stackvitals/__init__.py +2 -0
- stackvitals/__main__.py +4 -0
- stackvitals/ci/__init__.py +1 -0
- stackvitals/ci/action.py +574 -0
- stackvitals/ci/analyze.py +577 -0
- stackvitals/ci/api.py +218 -0
- stackvitals/ci/automation.py +212 -0
- stackvitals/ci/bench.py +195 -0
- stackvitals/ci/burnin.py +102 -0
- stackvitals/ci/cli.py +570 -0
- stackvitals/ci/collect.py +239 -0
- stackvitals/ci/cost.py +107 -0
- stackvitals/ci/coverage.py +155 -0
- stackvitals/ci/feedback.py +699 -0
- stackvitals/ci/fingerprint.py +220 -0
- stackvitals/ci/gitlab.py +121 -0
- stackvitals/ci/gitlab_action.py +125 -0
- stackvitals/ci/impact.py +125 -0
- stackvitals/ci/investigate.py +59 -0
- stackvitals/ci/kinds.py +52 -0
- stackvitals/ci/monitors.py +105 -0
- stackvitals/ci/owners.py +116 -0
- stackvitals/ci/quarantine_runtime.py +90 -0
- stackvitals/ci/report.py +435 -0
- stackvitals/ci/retry.py +67 -0
- stackvitals/ci/selfheal.py +102 -0
- stackvitals/ci/shards.py +120 -0
- stackvitals/ci/share.py +59 -0
- stackvitals/ci/store.py +93 -0
- stackvitals/ci/testreports.py +351 -0
- stackvitals/ci/tickets.py +106 -0
- stackvitals/ci/track_record.json +11 -0
- stackvitals/ci/triage.py +130 -0
- stackvitals/ci/triggers.py +147 -0
- stackvitals/ci/upload.py +85 -0
- stackvitals/ci/validate.py +91 -0
- stackvitals/cli.py +111 -0
- stackvitals/codeowners.py +69 -0
- stackvitals/community/__init__.py +0 -0
- stackvitals/community/action.py +140 -0
- stackvitals/community/affiliation.py +51 -0
- stackvitals/community/analyze.py +507 -0
- stackvitals/community/build.py +56 -0
- stackvitals/community/chaoss.py +70 -0
- stackvitals/community/cli.py +79 -0
- stackvitals/community/collect.py +240 -0
- stackvitals/community/context.py +54 -0
- stackvitals/community/report.py +250 -0
- stackvitals/connectors/__init__.py +244 -0
- stackvitals/connectors/ai_spend.py +190 -0
- stackvitals/connectors/base.py +82 -0
- stackvitals/connectors/check.py +686 -0
- stackvitals/connectors/copilot.py +104 -0
- stackvitals/connectors/discord.py +103 -0
- stackvitals/connectors/discourse.py +117 -0
- stackvitals/connectors/incident_io.py +106 -0
- stackvitals/connectors/jira.py +210 -0
- stackvitals/connectors/linear.py +140 -0
- stackvitals/connectors/pagerduty.py +96 -0
- stackvitals/connectors/slack.py +110 -0
- stackvitals/connectors/sonar.py +77 -0
- stackvitals/connectors/store.py +120 -0
- stackvitals/connectors/tracker.py +108 -0
- stackvitals/connectors/writeback.py +105 -0
- stackvitals/contribute/__init__.py +1 -0
- stackvitals/contribute/brief.py +297 -0
- stackvitals/contribute/cli.py +64 -0
- stackvitals/core/__init__.py +1 -0
- stackvitals/core/actors.py +103 -0
- stackvitals/core/agent_ledger.py +120 -0
- stackvitals/core/agreements.py +95 -0
- stackvitals/core/ai_outcomes.py +276 -0
- stackvitals/core/alerts.py +224 -0
- stackvitals/core/appdata.py +112 -0
- stackvitals/core/bucket.py +190 -0
- stackvitals/core/bugs.py +43 -0
- stackvitals/core/calendar.py +34 -0
- stackvitals/core/capex.py +57 -0
- stackvitals/core/change_risk.py +181 -0
- stackvitals/core/changes.py +133 -0
- stackvitals/core/chat.py +143 -0
- stackvitals/core/config.py +373 -0
- stackvitals/core/dataflow.py +168 -0
- stackvitals/core/decisions.py +275 -0
- stackvitals/core/delivery.py +954 -0
- stackvitals/core/delivery_peers.py +98 -0
- stackvitals/core/delivery_report.py +429 -0
- stackvitals/core/deliverycli.py +147 -0
- stackvitals/core/devlake_dora.sql +485 -0
- stackvitals/core/digest.py +333 -0
- stackvitals/core/explaincli.py +107 -0
- stackvitals/core/explore.py +296 -0
- stackvitals/core/export.py +342 -0
- stackvitals/core/exportcli.py +117 -0
- stackvitals/core/findings.py +350 -0
- stackvitals/core/health.py +94 -0
- stackvitals/core/identity.py +82 -0
- stackvitals/core/insights.py +365 -0
- stackvitals/core/insightscli.py +43 -0
- stackvitals/core/installdoc.py +69 -0
- stackvitals/core/investment.py +187 -0
- stackvitals/core/joins.py +43 -0
- stackvitals/core/llmsdoc.py +40 -0
- stackvitals/core/merge_queue.py +70 -0
- stackvitals/core/metrics.py +109 -0
- stackvitals/core/model.py +285 -0
- stackvitals/core/projectcli.py +66 -0
- stackvitals/core/propose.py +86 -0
- stackvitals/core/pulse.py +85 -0
- stackvitals/core/recorded.py +145 -0
- stackvitals/core/releases.py +39 -0
- stackvitals/core/requests.py +528 -0
- stackvitals/core/resync.py +35 -0
- stackvitals/core/schema.py +205 -0
- stackvitals/core/services.py +203 -0
- stackvitals/core/settings.py +96 -0
- stackvitals/core/sqlcli.py +111 -0
- stackvitals/core/stats.py +222 -0
- stackvitals/core/store.py +125 -0
- stackvitals/core/summary.py +104 -0
- stackvitals/core/time.py +29 -0
- stackvitals/core/tomledit.py +149 -0
- stackvitals/core/uicli.py +138 -0
- stackvitals/core/webapp.py +79 -0
- stackvitals/core/what_changed.py +76 -0
- stackvitals/core/workspace.py +194 -0
- stackvitals/deps/__init__.py +1 -0
- stackvitals/deps/action.py +299 -0
- stackvitals/deps/actions_vulns.py +89 -0
- stackvitals/deps/cli.py +77 -0
- stackvitals/deps/dossier.py +341 -0
- stackvitals/deps/evidence.py +44 -0
- stackvitals/deps/fixplan.py +40 -0
- stackvitals/deps/guarddog.py +32 -0
- stackvitals/deps/hygiene.py +47 -0
- stackvitals/deps/imports.py +113 -0
- stackvitals/deps/lockfiles.py +198 -0
- stackvitals/deps/lookalike.py +80 -0
- stackvitals/deps/reach.py +59 -0
- stackvitals/deps/release.py +110 -0
- stackvitals/deps/runtimes.py +161 -0
- stackvitals/deps/supply.py +454 -0
- stackvitals/deps/vulns.py +588 -0
- stackvitals/editors/__init__.py +40 -0
- stackvitals/editors/vscode/extension.js +101 -0
- stackvitals/editors/vscode/marks.js +92 -0
- stackvitals/editors/vscode/package.json +26 -0
- stackvitals/flow/__init__.py +1 -0
- stackvitals/flow/action.py +178 -0
- stackvitals/flow/analyze.py +418 -0
- stackvitals/flow/automate.py +72 -0
- stackvitals/flow/build.py +46 -0
- stackvitals/flow/cli.py +93 -0
- stackvitals/flow/code_hosts.py +146 -0
- stackvitals/flow/collect.py +451 -0
- stackvitals/flow/gitlab_mr.py +75 -0
- stackvitals/flow/knowledge.py +202 -0
- stackvitals/flow/peers.py +90 -0
- stackvitals/flow/preflight.py +210 -0
- stackvitals/flow/report.py +253 -0
- stackvitals/flow/rules.py +135 -0
- stackvitals/flow/store.py +108 -0
- stackvitals/flow/survival.py +84 -0
- stackvitals/flow/triage.py +62 -0
- stackvitals/mcp_server.py +670 -0
- stackvitals/portal/__init__.py +0 -0
- stackvitals/portal/action.py +205 -0
- stackvitals/portal/batch.py +80 -0
- stackvitals/portal/campaigns.py +104 -0
- stackvitals/portal/catalog.py +104 -0
- stackvitals/portal/checks.py +63 -0
- stackvitals/portal/cli.py +172 -0
- stackvitals/portal/descriptor.py +105 -0
- stackvitals/portal/export.py +43 -0
- stackvitals/portal/github.py +48 -0
- stackvitals/portal/golden.py +95 -0
- stackvitals/portal/history.py +30 -0
- stackvitals/portal/inventory.py +264 -0
- stackvitals/portal/owners.py +78 -0
- stackvitals/portal/pages.py +153 -0
- stackvitals/portal/rollup.py +32 -0
- stackvitals/portal/scorecard.py +366 -0
- stackvitals/security/__init__.py +2 -0
- stackvitals/security/probes.py +154 -0
- stackvitals/security/repo_checks.py +132 -0
- stackvitals/security/workflows.py +111 -0
- stackvitals/shell.py +107 -0
- stackvitals/site.py +51 -0
- stackvitals/web/app/LICENSES.md +428 -0
- stackvitals/web/app/boot.js +1 -0
- stackvitals/web/app/chunks/AddRepo-KRPZXWCY.js +1 -0
- stackvitals/web/app/chunks/SetupRunning-XWFQAKRZ.js +1 -0
- stackvitals/web/app/chunks/accuracy-data-OQTDXI7Y.js +1 -0
- stackvitals/web/app/chunks/agents-data-BAL6QAOF.js +11 -0
- stackvitals/web/app/chunks/chunk-24LFKFZ6.js +1 -0
- stackvitals/web/app/chunks/chunk-3G4SQNUC.js +1 -0
- stackvitals/web/app/chunks/chunk-3IXWEOIJ.js +154 -0
- stackvitals/web/app/chunks/chunk-3ROQFHPV.js +1 -0
- stackvitals/web/app/chunks/chunk-45PGAQRO.js +8 -0
- stackvitals/web/app/chunks/chunk-4H53OYLG.js +1 -0
- stackvitals/web/app/chunks/chunk-4LUI7O5P.js +1 -0
- stackvitals/web/app/chunks/chunk-4SQPQ5TB.js +1 -0
- stackvitals/web/app/chunks/chunk-4WKQTWUC.js +2 -0
- stackvitals/web/app/chunks/chunk-576YHDEK.js +8 -0
- stackvitals/web/app/chunks/chunk-6BDBXA6V.js +1 -0
- stackvitals/web/app/chunks/chunk-6RLVD2DT.js +1 -0
- stackvitals/web/app/chunks/chunk-763NH7PP.js +1 -0
- stackvitals/web/app/chunks/chunk-76WAVKUG.js +1 -0
- stackvitals/web/app/chunks/chunk-7II2BD5F.js +1 -0
- stackvitals/web/app/chunks/chunk-7TJCBOAY.js +1 -0
- stackvitals/web/app/chunks/chunk-ASYNLVOP.js +1 -0
- stackvitals/web/app/chunks/chunk-CTKDYZMG.js +1 -0
- stackvitals/web/app/chunks/chunk-CVB26NMC.js +1 -0
- stackvitals/web/app/chunks/chunk-G7NGB5UX.js +1 -0
- stackvitals/web/app/chunks/chunk-GPVLJRZD.js +1 -0
- stackvitals/web/app/chunks/chunk-GQYFN4PE.js +75 -0
- stackvitals/web/app/chunks/chunk-GT4EAKAO.js +2 -0
- stackvitals/web/app/chunks/chunk-IYMBFPCV.js +1 -0
- stackvitals/web/app/chunks/chunk-LAAGCPU3.js +1 -0
- stackvitals/web/app/chunks/chunk-MAPYGK3P.js +1 -0
- stackvitals/web/app/chunks/chunk-P5TXDD45.js +1 -0
- stackvitals/web/app/chunks/chunk-PABICGBL.js +1 -0
- stackvitals/web/app/chunks/chunk-RPXHAG6F.js +1 -0
- stackvitals/web/app/chunks/chunk-RQZPSJ2Y.js +1 -0
- stackvitals/web/app/chunks/chunk-S2ZBMEVA.js +1 -0
- stackvitals/web/app/chunks/chunk-S654BBEP.js +6 -0
- stackvitals/web/app/chunks/chunk-T7QVTNXF.js +1 -0
- stackvitals/web/app/chunks/chunk-THFUOCPC.js +273 -0
- stackvitals/web/app/chunks/chunk-TO4VVRZ7.js +1 -0
- stackvitals/web/app/chunks/chunk-VQ5YXO54.js +1 -0
- stackvitals/web/app/chunks/chunk-VWKSMFWJ.js +1 -0
- stackvitals/web/app/chunks/chunk-Y6LUXDM6.js +1 -0
- stackvitals/web/app/chunks/chunk-YTANGYYH.js +1 -0
- stackvitals/web/app/chunks/connect-KONYWYTT.js +1 -0
- stackvitals/web/app/chunks/connections-data-2DYS4UVW.js +32 -0
- stackvitals/web/app/chunks/logos-N5IINUAM.js +1 -0
- stackvitals/web/app/chunks/more-KMJMJQD3.js +10 -0
- stackvitals/web/app/chunks/more-PC6FVS3P.js +1 -0
- stackvitals/web/app/chunks/more-RCIVCUDE.js +2 -0
- stackvitals/web/app/chunks/more-ZKKRY6NO.css +1 -0
- stackvitals/web/app/chunks/sealbox-35YL4EUH.js +3 -0
- stackvitals/web/app/chunks/session-DYYTOE2K.js +1 -0
- stackvitals/web/app/chunks/settingsApply-2HRJEZYM.js +1 -0
- stackvitals/web/app/chunks/settingsReview-GX2FZQ4M.js +3 -0
- stackvitals/web/app/chunks/uPlot.esm-OIWT3AHJ.js +3 -0
- stackvitals/web/app/demo/ci/impact.json +1 -0
- stackvitals/web/app/demo/ci/quarantine.json +1 -0
- stackvitals/web/app/demo/ci/tickets.json +1 -0
- stackvitals/web/app/demo/mobile/alerts.json +1 -0
- stackvitals/web/app/demo/mobile/app.json +1 -0
- stackvitals/web/app/demo/mobile/community.json +1 -0
- stackvitals/web/app/demo/mobile/connectors.json +1 -0
- stackvitals/web/app/demo/mobile/data.json +1 -0
- stackvitals/web/app/demo/mobile/decisions.json +1 -0
- stackvitals/web/app/demo/mobile/delivery.json +1 -0
- stackvitals/web/app/demo/mobile/deps.json +1 -0
- stackvitals/web/app/demo/mobile/flow.json +1 -0
- stackvitals/web/app/demo/mobile/health.json +1 -0
- stackvitals/web/app/demo/mobile/insights.json +1 -0
- stackvitals/web/app/demo/mobile/pulse.json +1 -0
- stackvitals/web/app/demo/mobile/security.json +1 -0
- stackvitals/web/app/demo/mobile/summary/ci_jobs.jsonl +5 -0
- stackvitals/web/app/demo/mobile/summary/devlake_project_pr_metrics.jsonl +14 -0
- stackvitals/web/app/demo/mobile/summary/devlake_pull_requests.jsonl +14 -0
- stackvitals/web/app/demo/mobile/summary/manifest.json +1 -0
- stackvitals/web/app/demo/mobile/summary/prs.jsonl +19 -0
- stackvitals/web/app/demo/mobile/summary/tests.jsonl +1 -0
- stackvitals/web/app/demo/mobile/supply.json +1 -0
- stackvitals/web/app/demo/mobile/vulns.json +1 -0
- stackvitals/web/app/demo/payments-api/alerts.json +1 -0
- stackvitals/web/app/demo/payments-api/app.json +1 -0
- stackvitals/web/app/demo/payments-api/community.json +1 -0
- stackvitals/web/app/demo/payments-api/connectors.json +1 -0
- stackvitals/web/app/demo/payments-api/data.json +1 -0
- stackvitals/web/app/demo/payments-api/decisions.json +1 -0
- stackvitals/web/app/demo/payments-api/delivery.json +1 -0
- stackvitals/web/app/demo/payments-api/deps.json +1 -0
- stackvitals/web/app/demo/payments-api/flow.json +1 -0
- stackvitals/web/app/demo/payments-api/health.json +1 -0
- stackvitals/web/app/demo/payments-api/insights.json +1 -0
- stackvitals/web/app/demo/payments-api/pulse.json +1 -0
- stackvitals/web/app/demo/payments-api/security.json +1 -0
- stackvitals/web/app/demo/payments-api/summary/ci_jobs.jsonl +5 -0
- stackvitals/web/app/demo/payments-api/summary/devlake_project_pr_metrics.jsonl +14 -0
- stackvitals/web/app/demo/payments-api/summary/devlake_pull_requests.jsonl +14 -0
- stackvitals/web/app/demo/payments-api/summary/manifest.json +1 -0
- stackvitals/web/app/demo/payments-api/summary/prs.jsonl +22 -0
- stackvitals/web/app/demo/payments-api/summary/tests.jsonl +3 -0
- stackvitals/web/app/demo/payments-api/supply.json +1 -0
- stackvitals/web/app/demo/payments-api/vulns.json +1 -0
- stackvitals/web/app/demo/portal.json +1 -0
- stackvitals/web/app/demo/settings.json +1 -0
- stackvitals/web/app/demo/web-app/alerts.json +1 -0
- stackvitals/web/app/demo/web-app/app.json +1 -0
- stackvitals/web/app/demo/web-app/community.json +1 -0
- stackvitals/web/app/demo/web-app/connectors.json +1 -0
- stackvitals/web/app/demo/web-app/data.json +1 -0
- stackvitals/web/app/demo/web-app/decisions.json +1 -0
- stackvitals/web/app/demo/web-app/delivery.json +1 -0
- stackvitals/web/app/demo/web-app/deps.json +1 -0
- stackvitals/web/app/demo/web-app/flow.json +1 -0
- stackvitals/web/app/demo/web-app/health.json +1 -0
- stackvitals/web/app/demo/web-app/insights.json +1 -0
- stackvitals/web/app/demo/web-app/pulse.json +1 -0
- stackvitals/web/app/demo/web-app/security.json +1 -0
- stackvitals/web/app/demo/web-app/summary/ci_jobs.jsonl +5 -0
- stackvitals/web/app/demo/web-app/summary/devlake_project_pr_metrics.jsonl +14 -0
- stackvitals/web/app/demo/web-app/summary/devlake_pull_requests.jsonl +14 -0
- stackvitals/web/app/demo/web-app/summary/manifest.json +1 -0
- stackvitals/web/app/demo/web-app/summary/prs.jsonl +18 -0
- stackvitals/web/app/demo/web-app/summary/tests.jsonl +2 -0
- stackvitals/web/app/demo/web-app/supply.json +1 -0
- stackvitals/web/app/demo/web-app/vulns.json +1 -0
- stackvitals/web/app/fonts/plex-mono-400.woff2 +0 -0
- stackvitals/web/app/fonts/plex-sans-400.woff2 +0 -0
- stackvitals/web/app/fonts/plex-sans-600.woff2 +0 -0
- stackvitals/web/app/fonts/plex-sans-condensed-700.woff2 +0 -0
- stackvitals/web/app/help/accuracy.json +1 -0
- stackvitals/web/app/help/connectors.json +1 -0
- stackvitals/web/app/help/getting-started.json +1 -0
- stackvitals/web/app/help/index.json +1 -0
- stackvitals/web/app/help/modules.json +1 -0
- stackvitals/web/app/help/privacy-and-security.json +1 -0
- stackvitals/web/app/help/reference.json +1 -0
- stackvitals/web/app/main.css +1 -0
- stackvitals/web/app/main.js +1 -0
- stackvitals/web/app/pages/about.css +1 -0
- stackvitals/web/app/pages/about.js +1 -0
- stackvitals/web/app/pages/activity.css +1 -0
- stackvitals/web/app/pages/activity.js +1 -0
- stackvitals/web/app/pages/agents.css +1 -0
- stackvitals/web/app/pages/agents.js +2 -0
- stackvitals/web/app/pages/ci.css +1 -0
- stackvitals/web/app/pages/ci.js +1 -0
- stackvitals/web/app/pages/community.css +1 -0
- stackvitals/web/app/pages/community.js +1 -0
- stackvitals/web/app/pages/connections.css +1 -0
- stackvitals/web/app/pages/connections.js +6 -0
- stackvitals/web/app/pages/delivery.css +1 -0
- stackvitals/web/app/pages/delivery.js +45 -0
- stackvitals/web/app/pages/deps.css +1 -0
- stackvitals/web/app/pages/deps.js +7 -0
- stackvitals/web/app/pages/explore.css +1 -0
- stackvitals/web/app/pages/explore.js +7 -0
- stackvitals/web/app/pages/health.css +1 -0
- stackvitals/web/app/pages/health.js +1 -0
- stackvitals/web/app/pages/help.css +1 -0
- stackvitals/web/app/pages/help.js +6 -0
- stackvitals/web/app/pages/insights.css +1 -0
- stackvitals/web/app/pages/insights.js +1 -0
- stackvitals/web/app/pages/investment.css +1 -0
- stackvitals/web/app/pages/investment.js +3 -0
- stackvitals/web/app/pages/overview.css +1 -0
- stackvitals/web/app/pages/overview.js +1 -0
- stackvitals/web/app/pages/portal.css +1 -0
- stackvitals/web/app/pages/portal.js +51 -0
- stackvitals/web/app/pages/prs.css +1 -0
- stackvitals/web/app/pages/prs.js +4 -0
- stackvitals/web/app/pages/settings.css +1 -0
- stackvitals/web/app/pages/settings.js +1 -0
- stackvitals/web/app/pages/setup.css +1 -0
- stackvitals/web/app/pages/setup.js +2 -0
- stackvitals/web/app/pages/standing.css +1 -0
- stackvitals/web/app/pages/standing.js +1 -0
- stackvitals/web/app/pages/welcome-sheet.js +1 -0
- stackvitals/web/app/pages/welcome.js +1 -0
- stackvitals/web/app/settings-workflow.json +1 -0
- stackvitals/web/index.html +34 -0
- stackvitals/web/site/index.html +108 -0
- stackvitals/web/site/integrations.html +15 -0
- stackvitals/web/site/setup.html +15 -0
- stackvitals/web/site/site.css +68 -0
- stackvitals-0.1.0.dist-info/METADATA +134 -0
- stackvitals-0.1.0.dist-info/RECORD +465 -0
- stackvitals-0.1.0.dist-info/WHEEL +4 -0
- stackvitals-0.1.0.dist-info/entry_points.txt +3 -0
- stackvitals-0.1.0.dist-info/licenses/LICENSE +202 -0
- stackvitals-0.1.0.dist-info/licenses/NOTICE +16 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
# Third-party licences
|
|
2
|
+
|
|
3
|
+
The StackVitals app bundles these libraries and fonts. Each keeps its own licence, copied in full below.
|
|
4
|
+
|
|
5
|
+
## Preact (MIT)
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
The MIT License (MIT)
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2015-present Jason Miller
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## uPlot (MIT)
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
The MIT License (MIT)
|
|
35
|
+
|
|
36
|
+
Copyright (c) 2022 Leon Sorokin
|
|
37
|
+
|
|
38
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
39
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
40
|
+
in the Software without restriction, including without limitation the rights
|
|
41
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
42
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
43
|
+
furnished to do so, subject to the following conditions:
|
|
44
|
+
|
|
45
|
+
The above copyright notice and this permission notice shall be included in
|
|
46
|
+
all copies or substantial portions of the Software.
|
|
47
|
+
|
|
48
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
49
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
50
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
51
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
52
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
53
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
54
|
+
THE SOFTWARE.
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## IBM Plex Sans (SIL Open Font License 1.1)
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Copyright 2019 IBM Corp. All rights reserved. IBMPlexSans-Italic[wdth,wght].ttf: Copyright 2019 IBM Corp. All rights reserved.
|
|
61
|
+
|
|
62
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
63
|
+
This license is copied below, and is also available with a FAQ at:
|
|
64
|
+
http://scripts.sil.org/OFL
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
-----------------------------------------------------------
|
|
68
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
69
|
+
-----------------------------------------------------------
|
|
70
|
+
|
|
71
|
+
PREAMBLE
|
|
72
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
73
|
+
development of collaborative font projects, to support the font creation
|
|
74
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
75
|
+
open framework in which fonts may be shared and improved in partnership
|
|
76
|
+
with others.
|
|
77
|
+
|
|
78
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
79
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
80
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
81
|
+
redistributed and/or sold with any software provided that any reserved
|
|
82
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
83
|
+
however, cannot be released under any other type of license. The
|
|
84
|
+
requirement for fonts to remain under this license does not apply
|
|
85
|
+
to any document created using the fonts or their derivatives.
|
|
86
|
+
|
|
87
|
+
DEFINITIONS
|
|
88
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
89
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
90
|
+
include source files, build scripts and documentation.
|
|
91
|
+
|
|
92
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
93
|
+
copyright statement(s).
|
|
94
|
+
|
|
95
|
+
"Original Version" refers to the collection of Font Software components as
|
|
96
|
+
distributed by the Copyright Holder(s).
|
|
97
|
+
|
|
98
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
99
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
100
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
101
|
+
new environment.
|
|
102
|
+
|
|
103
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
104
|
+
writer or other person who contributed to the Font Software.
|
|
105
|
+
|
|
106
|
+
PERMISSION & CONDITIONS
|
|
107
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
108
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
109
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
110
|
+
Software, subject to the following conditions:
|
|
111
|
+
|
|
112
|
+
1) Neither the Font Software nor any of its individual components,
|
|
113
|
+
in Original or Modified Versions, may be sold by itself.
|
|
114
|
+
|
|
115
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
116
|
+
redistributed and/or sold with any software, provided that each copy
|
|
117
|
+
contains the above copyright notice and this license. These can be
|
|
118
|
+
included either as stand-alone text files, human-readable headers or
|
|
119
|
+
in the appropriate machine-readable metadata fields within text or
|
|
120
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
121
|
+
|
|
122
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
123
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
124
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
125
|
+
presented to the users.
|
|
126
|
+
|
|
127
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
128
|
+
Software shall not be used to promote, endorse or advertise any
|
|
129
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
130
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
131
|
+
permission.
|
|
132
|
+
|
|
133
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
134
|
+
must be distributed entirely under this license, and must not be
|
|
135
|
+
distributed under any other license. The requirement for fonts to
|
|
136
|
+
remain under this license does not apply to any document created
|
|
137
|
+
using the Font Software.
|
|
138
|
+
|
|
139
|
+
TERMINATION
|
|
140
|
+
This license becomes null and void if any of the above conditions are
|
|
141
|
+
not met.
|
|
142
|
+
|
|
143
|
+
DISCLAIMER
|
|
144
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
145
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
146
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
147
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
148
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
149
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
150
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
151
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
152
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## IBM Plex Sans Condensed (SIL Open Font License 1.1)
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-ThinItalic.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-ExtraLight.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-ExtraLightItalic.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-Light.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-LightItalic.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-Regular.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-Italic.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-Medium.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-MediumItalic.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-SemiBold.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-SemiBoldItalic.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-Bold.ttf: Copyright 2019 IBM Corp. All rights reserved. IBMPlexSansCondensed-BoldItalic.ttf: Copyright 2019 IBM Corp. All rights reserved.
|
|
159
|
+
|
|
160
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
161
|
+
This license is copied below, and is also available with a FAQ at:
|
|
162
|
+
http://scripts.sil.org/OFL
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
-----------------------------------------------------------
|
|
166
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
167
|
+
-----------------------------------------------------------
|
|
168
|
+
|
|
169
|
+
PREAMBLE
|
|
170
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
171
|
+
development of collaborative font projects, to support the font creation
|
|
172
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
173
|
+
open framework in which fonts may be shared and improved in partnership
|
|
174
|
+
with others.
|
|
175
|
+
|
|
176
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
177
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
178
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
179
|
+
redistributed and/or sold with any software provided that any reserved
|
|
180
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
181
|
+
however, cannot be released under any other type of license. The
|
|
182
|
+
requirement for fonts to remain under this license does not apply
|
|
183
|
+
to any document created using the fonts or their derivatives.
|
|
184
|
+
|
|
185
|
+
DEFINITIONS
|
|
186
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
187
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
188
|
+
include source files, build scripts and documentation.
|
|
189
|
+
|
|
190
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
191
|
+
copyright statement(s).
|
|
192
|
+
|
|
193
|
+
"Original Version" refers to the collection of Font Software components as
|
|
194
|
+
distributed by the Copyright Holder(s).
|
|
195
|
+
|
|
196
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
197
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
198
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
199
|
+
new environment.
|
|
200
|
+
|
|
201
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
202
|
+
writer or other person who contributed to the Font Software.
|
|
203
|
+
|
|
204
|
+
PERMISSION & CONDITIONS
|
|
205
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
206
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
207
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
208
|
+
Software, subject to the following conditions:
|
|
209
|
+
|
|
210
|
+
1) Neither the Font Software nor any of its individual components,
|
|
211
|
+
in Original or Modified Versions, may be sold by itself.
|
|
212
|
+
|
|
213
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
214
|
+
redistributed and/or sold with any software, provided that each copy
|
|
215
|
+
contains the above copyright notice and this license. These can be
|
|
216
|
+
included either as stand-alone text files, human-readable headers or
|
|
217
|
+
in the appropriate machine-readable metadata fields within text or
|
|
218
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
219
|
+
|
|
220
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
221
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
222
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
223
|
+
presented to the users.
|
|
224
|
+
|
|
225
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
226
|
+
Software shall not be used to promote, endorse or advertise any
|
|
227
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
228
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
229
|
+
permission.
|
|
230
|
+
|
|
231
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
232
|
+
must be distributed entirely under this license, and must not be
|
|
233
|
+
distributed under any other license. The requirement for fonts to
|
|
234
|
+
remain under this license does not apply to any document created
|
|
235
|
+
using the Font Software.
|
|
236
|
+
|
|
237
|
+
TERMINATION
|
|
238
|
+
This license becomes null and void if any of the above conditions are
|
|
239
|
+
not met.
|
|
240
|
+
|
|
241
|
+
DISCLAIMER
|
|
242
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
243
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
244
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
245
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
246
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
247
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
248
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
249
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
250
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## IBM Plex Mono (SIL Open Font License 1.1)
|
|
254
|
+
|
|
255
|
+
```
|
|
256
|
+
Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-ThinItalic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-ExtraLight.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-ExtraLightItalic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-Light.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-LightItalic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-Regular.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-Italic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-Medium.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-MediumItalic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-SemiBold.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-SemiBoldItalic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-Bold.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-BoldItalic.ttf: Copyright 2017 IBM Corp. All rights reserved.
|
|
257
|
+
|
|
258
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
259
|
+
This license is copied below, and is also available with a FAQ at:
|
|
260
|
+
http://scripts.sil.org/OFL
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
-----------------------------------------------------------
|
|
264
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
265
|
+
-----------------------------------------------------------
|
|
266
|
+
|
|
267
|
+
PREAMBLE
|
|
268
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
269
|
+
development of collaborative font projects, to support the font creation
|
|
270
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
271
|
+
open framework in which fonts may be shared and improved in partnership
|
|
272
|
+
with others.
|
|
273
|
+
|
|
274
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
275
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
276
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
277
|
+
redistributed and/or sold with any software provided that any reserved
|
|
278
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
279
|
+
however, cannot be released under any other type of license. The
|
|
280
|
+
requirement for fonts to remain under this license does not apply
|
|
281
|
+
to any document created using the fonts or their derivatives.
|
|
282
|
+
|
|
283
|
+
DEFINITIONS
|
|
284
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
285
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
286
|
+
include source files, build scripts and documentation.
|
|
287
|
+
|
|
288
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
289
|
+
copyright statement(s).
|
|
290
|
+
|
|
291
|
+
"Original Version" refers to the collection of Font Software components as
|
|
292
|
+
distributed by the Copyright Holder(s).
|
|
293
|
+
|
|
294
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
295
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
296
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
297
|
+
new environment.
|
|
298
|
+
|
|
299
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
300
|
+
writer or other person who contributed to the Font Software.
|
|
301
|
+
|
|
302
|
+
PERMISSION & CONDITIONS
|
|
303
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
304
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
305
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
306
|
+
Software, subject to the following conditions:
|
|
307
|
+
|
|
308
|
+
1) Neither the Font Software nor any of its individual components,
|
|
309
|
+
in Original or Modified Versions, may be sold by itself.
|
|
310
|
+
|
|
311
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
312
|
+
redistributed and/or sold with any software, provided that each copy
|
|
313
|
+
contains the above copyright notice and this license. These can be
|
|
314
|
+
included either as stand-alone text files, human-readable headers or
|
|
315
|
+
in the appropriate machine-readable metadata fields within text or
|
|
316
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
317
|
+
|
|
318
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
319
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
320
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
321
|
+
presented to the users.
|
|
322
|
+
|
|
323
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
324
|
+
Software shall not be used to promote, endorse or advertise any
|
|
325
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
326
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
327
|
+
permission.
|
|
328
|
+
|
|
329
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
330
|
+
must be distributed entirely under this license, and must not be
|
|
331
|
+
distributed under any other license. The requirement for fonts to
|
|
332
|
+
remain under this license does not apply to any document created
|
|
333
|
+
using the Font Software.
|
|
334
|
+
|
|
335
|
+
TERMINATION
|
|
336
|
+
This license becomes null and void if any of the above conditions are
|
|
337
|
+
not met.
|
|
338
|
+
|
|
339
|
+
DISCLAIMER
|
|
340
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
341
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
342
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
343
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
344
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
345
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
346
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
347
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
348
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
## TweetNaCl.js (Unlicense, public domain)
|
|
352
|
+
|
|
353
|
+
```
|
|
354
|
+
This is free and unencumbered software released into the public domain.
|
|
355
|
+
|
|
356
|
+
Anyone is free to copy, modify, publish, use, compile, sell, or
|
|
357
|
+
distribute this software, either in source code form or as a compiled
|
|
358
|
+
binary, for any purpose, commercial or non-commercial, and by any
|
|
359
|
+
means.
|
|
360
|
+
|
|
361
|
+
In jurisdictions that recognize copyright laws, the author or authors
|
|
362
|
+
of this software dedicate any and all copyright interest in the
|
|
363
|
+
software to the public domain. We make this dedication for the benefit
|
|
364
|
+
of the public at large and to the detriment of our heirs and
|
|
365
|
+
successors. We intend this dedication to be an overt act of
|
|
366
|
+
relinquishment in perpetuity of all present and future rights to this
|
|
367
|
+
software under copyright law.
|
|
368
|
+
|
|
369
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
370
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
371
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
372
|
+
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
373
|
+
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
374
|
+
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
375
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
|
376
|
+
|
|
377
|
+
For more information, please refer to <http://unlicense.org>
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
## tweetnacl-sealedbox-js (MIT)
|
|
381
|
+
|
|
382
|
+
```
|
|
383
|
+
MIT License
|
|
384
|
+
|
|
385
|
+
Copyright (c) 2017 Manatsawin Hanmongkolchai
|
|
386
|
+
|
|
387
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
388
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
389
|
+
in the Software without restriction, including without limitation the rights
|
|
390
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
391
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
392
|
+
furnished to do so, subject to the following conditions:
|
|
393
|
+
|
|
394
|
+
The above copyright notice and this permission notice shall be included in all
|
|
395
|
+
copies or substantial portions of the Software.
|
|
396
|
+
|
|
397
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
398
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
399
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
400
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
401
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
402
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
403
|
+
SOFTWARE.
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
## BLAKE2s and BLAKE2b in JavaScript, blakejs (MIT)
|
|
407
|
+
|
|
408
|
+
```
|
|
409
|
+
Copyright (c) 2022 Blakejs contributors
|
|
410
|
+
|
|
411
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
412
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
413
|
+
in the Software without restriction, including without limitation the rights
|
|
414
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
415
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
416
|
+
furnished to do so, subject to the following conditions:
|
|
417
|
+
|
|
418
|
+
The above copyright notice and this permission notice shall be included in
|
|
419
|
+
all copies or substantial portions of the Software.
|
|
420
|
+
|
|
421
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
422
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
423
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
424
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
425
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
426
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
427
|
+
THE SOFTWARE.
|
|
428
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(()=>{var a=(o,t="F",e=2.6,n="")=>`<path d="${o}" fill="none" stroke="${t}" stroke-width="${e}" stroke-linecap="round" stroke-linejoin="round"${n}/>`,l={id:"strata",name:"Strata",note:"Stacked layers, the top one lit",body:a("M6.5 20.5 16 25.3l9.5-4.8")+a("M6.5 15.6 16 20.4l9.5-4.8")+'<path d="M16 5.8 25.5 10.6 16 15.4 6.5 10.6Z" fill="A"/>'},w=l.id;var c="sv:logo-def",h=new Set(["d","x","y","width","height","rx","cx","cy","r","fill","stroke","stroke-width","stroke-linecap","stroke-linejoin","opacity","transform","stroke-dasharray"]),y=/^<(path|rect|circle)((?:\s+[a-z-]+="[^"<>&]*")*)\s*\/>/;function L(o){let t=o.trim();if(!t)return!1;for(;t;){let e=y.exec(t);if(!e)return!1;for(let n of e[2].matchAll(/([a-z-]+)="([^"]*)"/g))if(!h.has(n[1])||/url\(|:|\\/i.test(n[2]))return!1;t=t.slice(e[0].length).trimStart()}return!0}function f(o){let t=o;return t&&typeof t.id=="string"&&typeof t.name=="string"&&typeof t.body=="string"&&L(t.body)?{id:t.id,name:t.name,note:String(t.note||""),body:t.body}:l}function r(o,t={T:"var(--logo-tile)",F:"var(--logo-fg)",A:"var(--logo-acc)"},e=!0){let n=o.body.replace(/"(T|F|A)"/g,(k,u)=>`"${t[u]}"`);return`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">${e?`<rect width="32" height="32" rx="8" fill="${t.T}"/>`:""}${n}</svg>`}var v={T:"#2160C4",F:"#FFFFFF",A:"#7CF0B6"};function d(o){return"data:image/svg+xml,"+encodeURIComponent(r(o,v))}function i(o){try{let t=localStorage.getItem(o);return t===null?null:JSON.parse(t)}catch{return null}}var m=document.documentElement,x=i("sv:theme");m.dataset.theme=x==="dark"?"dark":"light";i("sv:calm")===!0&&m.classList.add("calm");if(!document.getElementById("sv-font")){let o=new URL(document.querySelector('script[src*="boot.js"]')?.src||"app/boot.js",location.href);for(let[t,e]of["plex-sans-400","plex-sans-condensed-700"].entries()){let n=Object.assign(document.createElement("link"),{rel:"preload",as:"font",type:"font/woff2",crossOrigin:"anonymous",href:new URL(`fonts/${e}.woff2`,o).href});t||(n.id="sv-font"),document.head.appendChild(n)}}var p=f(i(c)),g=document.getElementById("favicon");g&&(g.href=d(p));var s=document.getElementById("splash-mark");s&&!s.firstChild&&(s.innerHTML=r(p));})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as F}from"./chunk-4WKQTWUC.js";import{h as d,p as v,t as w}from"./chunk-VQ5YXO54.js";import{d as u,e as h}from"./chunk-VWKSMFWJ.js";import{G as g,S,a as l,c as n,w as t,z as c}from"./chunk-GT4EAKAO.js";import{d as y}from"./chunk-G7NGB5UX.js";y();function _({open:A,onClose:a}){let[s,m]=n(""),[i,f]=n(""),[B,b]=n(!1),[I,r]=n(null),k=async e=>{e?.preventDefault();let o=d(s,i||void 0);if(!o){r("Type owner/repo, a github.com link, or the address of a StackVitals Pages site.");return}b(!0),r(null);let p=await F("app.json",o);if(b(!1),!p){r(o.kind==="branch"?i?"No StackVitals data found: check the name and that the token can read this repo's contents.":"No public StackVitals data found. If the repo is private, add a token that can read its contents.":"No StackVitals app.json at that address.");return}let V=v(o,p.repo);w(V),S(`Opened ${p.repo}`),m(""),f(""),a()},T=d(s)?.kind==="branch";return t(g,{open:A,onClose:a,title:"Add a repository",description:"Open any repo that runs StackVitals: its data branch, or its Pages site.",footer:t(l,{children:[t(c,{variant:"plain",onClick:a,children:"Cancel"}),t(c,{variant:"filled",loading:B,onClick:()=>k(),children:"Open"})]}),children:t("form",{class:"form",onSubmit:k,children:[t(u,{label:"Repository or Pages address",error:I,hint:"For example octo-org/octo-repo, or https://owner.github.io/repo/",children:e=>t(h,{id:e,value:s,onInput:o=>{m(o),r(null)},placeholder:"owner/repo",autoFocus:!0})}),T?t(u,{label:"Token for a private repo (optional)",hint:t(l,{children:"A fine-grained token with Contents: read on this repo. It stays in this tab only and goes only to api.github.com."}),children:e=>t(h,{id:e,type:"password",mono:!0,value:i,onInput:f,placeholder:"github_pat_\u2026"})}):null,t("button",{type:"submit",hidden:!0})]})})}export{_ as AddRepoSheet};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as b}from"./chunk-4SQPQ5TB.js";import"./chunk-4WKQTWUC.js";import{q as p}from"./chunk-VQ5YXO54.js";import{b as g,c as a,e as m,f,g as w}from"./chunk-76WAVKUG.js";import{I as s,q as r,w as t,x as h,z as n}from"./chunk-GT4EAKAO.js";import{d}from"./chunk-G7NGB5UX.js";d();var v={ci:"CI Health",flow:"Pull Requests",delivery:"Delivery",insights:"Insights",community:"Community",portal:"Portal",alerts:"Alerts",deps:"Dependencies",supply:"Supply chain",vulns:"Vulnerabilities"};function S({app:e}){let o=b(e),i=e.links||{},u=i.workflow?`https://github.com/${e.repo}/edit/${e.default_branch||"main"}/.github/workflows/${i.workflow}`:null;return t(g,{title:`${e.repo} is set up`,subtitle:"StackVitals already runs here. Change what it does, run it now, or set up another repo.",toolbar:t(n,{variant:"plain",href:"#/setup?pick=1",icon:"plus",children:"Set up another repo"}),children:[t("div",{class:`note note-${o.tone==="good"?"good":o.tone==="watch"?"watch":"bad"}`,role:"status",children:[t(h,{name:o.tone==="good"?"check":"clock"}),t("span",{children:[t("b",{children:[o.tone==="good"?"Running":o.title,"."]})," Data written ",r(o.when),e.run?.number?`, run #${e.run.number}`:"",e.run?.next?`; next run ${r(e.run.next).replace(" ago","")}`:"; it runs on the workflow's schedule","."]})]}),t(a,{title:"What it writes",description:"Each module and when it last wrote its file.",children:t(f,{label:"Modules",children:Object.entries(e.modules||{}).map(([c,l])=>t(w,{title:v[c]||c,subtitle:l.file,trailing:l.updated?t(s,{tone:"good",children:r(l.updated)}):t(s,{tone:"neutral",children:"not yet"})}))})}),t(a,{title:"Change it",children:t(m,{class:"go-card",children:t("div",{class:"go-buttons",children:[i.actions?t(n,{variant:"filled",href:i.actions,external:!0,icon:"play",children:"Run it now"}):null,t(n,{variant:"tinted",href:"#/settings",icon:"settings",children:"Change the settings"}),u?t(n,{variant:"tinted",href:u,external:!0,iconEnd:"external",children:"Edit the workflow"}):null,p?null:t(n,{variant:"plain",href:`#/setup?repo=${encodeURIComponent(e.repo)}&check=1`,icon:"refresh",children:"Check the setup again"})]})})})]})}export{S as Running};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as e}from"./chunk-G7NGB5UX.js";e();var t=[{id:"uncertainty",title:"Weekly changes and ranges",claim:"A change is flagged only when it is unlikely to be ordinary week-to-week variation. The digest checks many numbers at once, so it uses false-alarm control (Benjamini-Hochberg) rather than one cut-off per number: on this replay the two behave alike, but a fixed cut-off flags more often as numbers are added and this doesn't. The 26 repos are the independent units; shuffling their weeks tests the no-change case, it doesn't add repos.",rows:[["Shuffled weeks that flag anything (nothing changed)","7.5%","every difference: 97.9%; each number at p < 0.1: 20.8%; at p < 0.05: 11.3%"],["10x slowdowns caught in the same scans (first week)","24.7%","p < 0.1: 44.8%; p < 0.05: 32.4%; detection is the weak side"],["10x slowdowns lasting two weeks, caught in the second","34.8%","the 14-day checks; 15.1% with weekly checks only"],["Small repos' first-try share pulled toward peers (3 pushes seen)","29.3% less squared error","a 95% range for later pushes held 94.6% of them"]],weak:"A small repo's week can't tell even a large slowdown from noise; the page says so instead of guessing.",labeller:"none (replayed history)",link:"https://github.com/stackvitals/stackvitals/tree/main/bench/accuracy/uncertainty"},{id:"ai",title:"AI-assisted pull requests, like with like",claim:"Agents' pull requests are compared with people's from the same repo, month and size.",rows:[["Agents' PRs merged by someone else, against people's: unadjusted","-9.0 points",""],["The same, same repo, month and size","+0.5 points","-0.0 to +1.1; can't be told from no difference"],["Shuffled AI labels (nothing to find)","+0.1 points","200 shuffles"],["Marked PRs that state AI involvement (precision)","98.5%","96-99%, 194 PRs; by repo: 188 repos, 95-99% counting each once; 1% from unredacted/freesocks-control-plane, without it 189 of 192"],["Stated AI involvement that is marked (recall, a floor)","78.8%","held out 66.3%; weighted to the crawl"],["People's merge rate after a repo adopts agents (pre-registered)","-0.9 points","-2.7 to +0.7; throughput: not credible, adopters were already growing"]],weak:`Markers find about 79% of stated AI involvement (66% held out) and none that goes unsaid, so "AI-marked" is a floor; matching can't see what a PR was for.`,labeller:"crawl markers; the marking itself checked on 400 PRs labelled by Claude and Gemini",link:"https://github.com/stackvitals/stackvitals/tree/main/bench/accuracy/ai"},{id:"flaky",title:"Flaky CI",claim:"A job is flaky when the same code failed and passed; no failure is called safe to re-run: a likely flake needs history, a flake's sign in its log and no changed file named, and still waits for a green re-run.",rows:[["Flagged flakes that were real flakes (event precision)","97.2%","92-99%, 108 events; Claude's labels 97.2%, Gemini's 80.2%, adjudicated 97.2%; by repo: 40 repos, 87-99% counting each once; 4.6% from polyaxon/haupt, without it 100 of 103"],["Flagged flakes GitHub's own history confirms weren't the change (no labeller)","42 of 112","a floor, not a precision: every flagged flake passed on identical code, so history can confirm one but never refute it; all 112 flagged jobs, where precision uses the 108 the labels could decide"],['The plain "passed on retry" rule on the same repos',"96.9%","94-98%; ours +0.3 points (-4.0 to +4.0, not significant); scored on the retries it can see; the retries only it flags were real 53.8% of the time"],['"Known flaky" failures the change caused, old rule',"44.1%","15 of 34, 29-61%"],["The same, 2026-10-22 rule (3+ flakes, one in the failing step), held out","13 of 81","10-26%, 48 jobs in 15 repos; by repo: 11 repos, 4-45% counting each once; 53.1% from lxc/incus, without it 13 of 38; the 5% bar failed, so the rule was tightened (next row) (on the tuning sample: 0 of 5, all one job)"],["Stricter rule (history, a flake's sign in the log, no changed file named), pre-registered, fresh held out","0 of 4",`0-49%, 3 jobs in 2 repos; it kept 4 of 44 calls history made (9.1%); the 5% bar is unproven, so it reads "likely flaky", never safe; "maybe yours" (a changed file named): 4 of 5 the change's`],['End-to-end replay: "known flaky" calls a re-run turned green that the change had caused',"3 of 45 to 15 of 52","the labellers disagree: 2-18% adjudicated by Claude (its 3 are a pull-request label check), 18-42% by Gemini; Claude's labels alone 0 of 41, Gemini's 17 of 50; people's labels pending. 2,874 failed pull-request jobs replayed as of each attempt in 35 repos; known flakes are re-run, never passed"],["Calls that blamed the change but went green on a re-run (random draw, 3 per run at most)","4 of 66 to 22 of 80 were the change","2-15% to 19-38%: a green re-run doesn't prove the change clean either way, so the verdict check, by design, never passes red CI"],["Harmless failures the 2026-10-22 rule called known flaky (on its tuning sample)","5 of 19","26.3%, 12-49%; the rest cost a look"],['"Already failing on main" (same step, same error) failures the change caused',"0 of 12","0-24%, 5 repos; the step alone: 4 of 20, so the error must match; the verdict check still blocks"],['"Maybe flaky" first failures (they look like flakes) the change caused',"0 of 4","0-49%; never-flaked failures overall: 58 of 98; signs written on these logs; asks for one re-run, still blocks"],[`"PR details" failures (a check on the PR's title, description or labels) that were the change's code`,"1 of 24","1-20%, 4 repos; 21 had been called known flaky, so a re-run that fails again was advised; still blocks; by repo: 4 repos, 0-53% counting each once; 75% from DataDog/datadog-api-client-go, without it 1 of 6: preliminary"],["Never-flaked failures that were intermittent (misses)","17.3%","11-26%; Claude's labels 16.8%, Gemini's 25.4%, adjudicated 17.3%"],['Labellers on "caused by the change"',"69.2% agree (kappa 0.43)","cause: 55.9% agree (kappa 0.47)"],["Labellers against GitHub's history, where it decides","Claude 100%",'Gemini 81.2% of their definite answers on 48 failures; always answering "not caused" would score 91.7%']],weak:"14-day reads miss rare flakes; status precision (re-running pinned commits) isn't measured yet; Rust jobs were real flakes 80% of the time.",labeller:"Claude and Gemini 3.5 Flash-Lite, disagreements adjudicated blind by Claude; no person audited",link:"https://github.com/stackvitals/stackvitals/tree/main/bench/accuracy/flaky"},{id:"dora",title:"Deployments and failures",claim:"Deployments come from the source that matches how a repo ships; a revert blames the deployment that shipped what it undid.",rows:[["Repos whose deployment source is right: StackVitals","53 of 60","78-94%; the first 25 led to one fix of the rule, the later 35 are held out: 85.7%; Claude's labels 92%, Gemini's 88%, adjudicated 92% on the first"],["The same with no setup: DevLake's default pattern / every merge","15% / 8.3%","paired on the same repos: 45 to 1 against DevLake's default"],["DevLake with a pattern a user would write (deploy, release, publish or push-image)","36.7%","26-49%; paired: 33 to 2; it also counts docs-site builds"],["Lead time per pull request, on the same pull requests as Middleware","95 of 96 within 10%","5 repos, 90 days, no labeller; the rest were rebased long after they were written (Middleware starts at the rebase); Middleware returned about a month where 90 days were asked on 4 of 5 repos"],["Reverts where time order blamed a release lacking the change","71 of 89","fix chain right on 87 of 89; 117 reverts in 23 repos, checked with the commit graph (no labeller); time order wrong by repo: 18 repos, 57-92% counting each once; 14.6% from Alfresco/alfresco-ng2-components, without it 60 of 76"],["Regression reports naming the release that broke: the last release before the report was it","6 of 15","20-64%; the version the report names: 10 of 15 (not significant, so DORA's rule stays); 15 of 60 reports said which release"],["Repos whose deployment tier changes with the definition","61.9%","4,618 crawled repos"],["Labellers on whether a workflow ships","95.3% agree (kappa 0.79)","on each repo's full set of sources: 56% agree (kappa 0.50); held-out repos: 91.3% agree (kappa 0.74) and 48.6% agree (kappa 0.38)"]],weak:"Shipping workflows with plain names (docker, pypi, CD) are missed: workflow recall 60% on the held-out repos; releases from maintenance branches with backports defeat both linkage rules.",labeller:"Claude and Gemini 3.5 Flash-Lite, disagreements adjudicated blind by Claude; no person audited",link:"https://github.com/stackvitals/stackvitals/tree/main/bench/accuracy/dora"},{id:"community",title:"First responses",claim:"A first response is the project's (a maintainer, a regular responder or someone who triages), and issues still waiting stay in the median.",rows:[["Non-maintainer first comments that are drive-bys (issue-metrics counts them)","45.8%","40-52%, held-out repos"],["Project answers the roles-only rule missed / regular responders and triagers catch","18.9% / 56.5%","drive-bys among what they add: 16.3%; regular responders alone, by labeller: Claude's labels 11.1%, Gemini's 21.5%, adjudicated 16.7%"],["Repos where an answered-only median hides that most issues wait","61.1%","2,370 crawled repos"],["Labellers on the kind of comment (held-out set)","67.8% agree (kappa 0.52)","first set: 72% agree (kappa 0.57); drive-bys counted by issue-metrics: Claude's labels 46.9%, Gemini's 50.8%, adjudicated 45.8%"]],weak:`About 43% of occasional contributors' project answers still go uncounted; the rule errs toward "waiting".`,labeller:"Claude and Gemini 3.5 Flash-Lite, disagreements adjudicated blind by Claude; no person audited",link:"https://github.com/stackvitals/stackvitals/tree/main/bench/accuracy/community"},{id:"agents",title:"Against a general AI agent",claim:"The same questions, answered by an agent with live GitHub access, with and without StackVitals. On single failures the agent is as accurate either way; what StackVitals adds is answers with nobody asking (the PR comment and verdict) and comparisons with similar repos without GitHub calls.",rows:[["Failure questions right: agent / agent with StackVitals / StackVitals alone","20 / 20 / 13 of 20","a live agent reading the log needs nothing from StackVitals here; agent against StackVitals alone: 7 to 0 (McNemar p = 0.016)"],["Labelled flaky jobs found (both agents)","16 of 16","GitHub calls: 214 without, 259 with StackVitals"],["Comparing with similar public repos: repos it rests on","14-23 vs 56-311","198 calls for the live agent, 0 with StackVitals"],["100 more failures in 44 repos, Sonnet: agent / with StackVitals","86 / 88 of 91","McNemar p = 0.625; GitHub calls per failure 2.1 without, 2.2 with; 9 checks on the PR itself scored apart"],["100 more failures in 44 repos, Haiku (half of them): agent / with StackVitals","44 / 43 of 48","McNemar p = 1.000; GitHub calls per failure 2.8 without, 2.2 with; 3 checks on the PR itself scored apart"],["Same failures, no agent: StackVitals alone / with opt-in model triage","60 / 79 of 91","what the PR comment and verdict check say with nobody asking; an agent reading the log does better"]],weak:"Questions beyond GitHub's 90-day log retention, where kept history matters most, are not asked yet.",labeller:"Claude (the flaky card's first labels)",link:"https://github.com/stackvitals/stackvitals/tree/main/bench/accuracy/agents"}];export{t as CARDS};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{d as n}from"./chunk-G7NGB5UX.js";n();var h=["ci_failure","is_known_flake","ci_health","repo_brief","preflight","who_should_review","pr_queue","check_package","scan_lockfile","insights","delivery_health"],e=(s,o,t)=>({name:s,does:o,ask:t}),u=[{title:"CI",icon:"ci",tools:[e("ci_failure","Explains a failed run: known flake, already failing on main, an outside failure, or likely the change.","Why did the last CI run on my branch fail?"),e("is_known_flake","Before fixing a failing test or job: is it a known flake here?","Is test_upload a known flake in this repo?"),e("ci_health","Flaky and failing jobs and tests, slower jobs, coverage and first-try green, this week against the last four.","How healthy is our CI this week?"),e("test_status","One test's state and why: the monitors holding it, labels, mutes and its failure group.","Why is test_checkout marked flaky?"),e("failure_group","Failures with one cause across tests and runs, biggest first, with an investigation prompt.","Which failures share a cause, and where do I start?"),e("ci_slowest","The slowest jobs and tests with daily medians, what got slower, new tests and skipped ones.","Which tests got slower this week?"),e("propose_change","A prefilled GitHub issue that changes settings or records a decision; nothing changes until a person submits it.","Quarantine test_upload for 30 days.")]},{title:"Pull Requests",icon:"prs",tools:[e("repo_brief","How changes get merged in an unfamiliar repo, from its history: what PRs include, who reviews, known flakes.","How do changes get merged in this repo?"),e("preflight","What merged PRs touching these files usually include, and what this change is missing.","Is my change ready to open as a PR?"),e("who_should_review","Up to 3 reviewers: who knows the areas, code owners, open reviews and how fast each answers.","Who should review PR 412?"),e("pr_queue","Open PRs and who has to act next on each, since when, and whether that's longer than usual.","Which PRs are waiting on me?"),e("flow_health","Hours to a first review, in review and to merge; how insiders and outside contributors fare.","How long do PRs wait for a first review?"),e("reviewer_load","Each reviewer's open review requests and the PRs waiting on them.","Who has the most reviews waiting?"),e("triage_pr","For maintainers: each outside PR's chance to merge within 30 days, with the main reasons. Never stored or posted.","Which outside PRs are likely to merge?")]},{title:"Delivery",icon:"delivery",tools:[e("insights","What to fix first across modules, ranked by the hours of waiting or outage at stake.","What should we fix first to ship faster?"),e("delivery_health","DORA's keys with tiers, rework rate, where deployments come from, cycle time and stuck PRs.","What are our DORA numbers?"),e("cycle_time","Cycle time in four phases (coding, pickup, review, deploy) with P50, P75 and sample sizes.","Where does our cycle time go?"),e("stuck_prs","PRs stuck by LinearB's cut-offs, plus failing checks nobody acted on for a day.","Which PRs are stuck?")]},{title:"Dependencies",icon:"deps",tools:[e("check_package","How upgrades of an npm or PyPI package went across public repos, its advisories and a verdict.","Is it safe to upgrade to axios 1.8?"),e("scan_lockfile","Every package a lockfile pins, the ones that need a look first, each with its verdict.","Which packages in package-lock.json need a look?"),e("supply_chain","Packages by ecosystem, licence rule breaks, licence changes and Scorecard drops.","Do any of our packages break our licence rule?")]},{title:"Community",icon:"community",tools:[e("community_health","Newcomers and how many came back, first-answer times, and who carries the merged work.","How welcoming is this repo to newcomers?"),e("newcomers_waiting","First contributions nobody has answered yet, oldest first.","Which newcomers are waiting for an answer?")]},{title:"Portal",icon:"portal",tools:[e("org_catalog","An org's repos by scorecard level, owner status, the rules failing most and the typed catalog.","How do our org's repos score?"),e("repo_scorecard","One repo's scorecard level and the evidence behind each failing rule.","Why is this repo only bronze?"),e("owners_health","CODEOWNERS errors, empty teams, departed people and repos with no owners.","Which repos have no real owner?")]},{title:"Finder",icon:"explore",tools:[e("find_issues","Open issues an outsider can likely get merged, best first, each with its evidence.","Find me a Rust issue I could get merged."),e("action_pack","Everything to start on one issue: live status, rules as a checklist, accepted PRs to copy.","Help me start on owner/repo#123."),e("repo_health","How outsiders fare in one repo: merge rates, review time, walls and how to reach it.","Do outside PRs get merged in this repo?"),e("repos_needing_help","Repos that merge outsider PRs but have very few active maintainers.","Which projects need more help?"),e("check_issue","A live check on GitHub: open, assigned, linked PRs, recent claims.","Is issue 123 still free?"),e("similar_issues","Free issues whose titles share words with this one.","Any issues like this one?"),e("explain","The full evidence record behind an issue's score.","Why does this issue score so high?"),e("track","Track an issue on this machine and see what changed since the last look.","What changed on the issues I track?"),e("report_outcome","Record what happened to an issue you worked on, kept on this machine.","My PR for issue 123 was merged.")]}],p=[{id:"claude",label:"Claude Code",intro:"Run it in your repo, then restart Claude Code.",file:"Terminal"},{id:"cursor",label:"Cursor",intro:"Add it to the project's .cursor/mcp.json, or ~/.cursor/mcp.json for every project.",file:".cursor/mcp.json"},{id:"vscode",label:"VS Code / Copilot",intro:"Add it to the workspace; Copilot Chat in agent mode picks it up.",file:".vscode/mcp.json"},{id:"codex",label:"Codex",intro:"Add it to Codex's config file, then start a new session.",file:"~/.codex/config.toml"},{id:"desktop",label:"Claude Desktop",intro:"Settings, Developer, Edit config; restart the app after saving.",file:"claude_desktop_config.json"},{id:"windsurf",label:"Windsurf",intro:"Add it to Cascade's MCP servers, then refresh.",file:"~/.codeium/windsurf/mcp_config.json"}];function g(s,o){let t=["stackvitals","serve",...o?["--tools","all"]:[]],r=`[${t.map(i=>JSON.stringify(i)).join(", ")}]`,a=(i,c="")=>`{
|
|
2
|
+
"${i}": {
|
|
3
|
+
"stackvitals": {
|
|
4
|
+
${c} "command": "uvx",
|
|
5
|
+
"args": ${r}
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
}`;return s==="claude"?`claude mcp add stackvitals -- uvx ${t.join(" ")}`:s==="codex"?`[mcp_servers.stackvitals]
|
|
9
|
+
command = "uvx"
|
|
10
|
+
args = ${r}`:s==="vscode"?a("servers",` "type": "stdio",
|
|
11
|
+
`):a("mcpServers")}var w=[{id:"stackvitals-ci",title:"CI failed",icon:"ci",does:"Before fixing a failed run: checks history to tell a known flake (re-run) from the change (fix)."},{id:"stackvitals-flow",title:"Pull requests",icon:"prs",does:"What blocks PRs, who should review, and whether a change looks like the PRs that get merged."},{id:"stackvitals-delivery",title:"Delivery",icon:"delivery",does:"Cycle time, DORA, stuck PRs and what to fix first to ship faster."},{id:"stackvitals-deps",title:"Dependencies",icon:"deps",does:"Before adding a package or merging a bot update: decide with evidence."},{id:"stackvitals-community",title:"Community",icon:"community",does:"Newcomers waiting, where contributors drop out, and first-answer times."},{id:"stackvitals-portal",title:"Portal",icon:"portal",does:"Who owns what in an org, weak owners, scorecards and campaigns."},{id:"stackvitals-contribute",title:"Contribute",icon:"explore",does:"Issues you can get merged, and how a repo works before your first PR."}],l="https://raw.githubusercontent.com/stackvitals/stackvitals/main/skills";function f(s,o){let t=`~/.${o==="claude"?"claude":"codex"}/skills/${s}`;return`mkdir -p ${t} && curl -fsSL ${l}/${s}/SKILL.md -o ${t}/SKILL.md`}export{p as CLIENTS,h as CORE,u as GROUPS,w as SKILLS,g as config,f as skillCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{s as b,u as p}from"./chunk-GT4EAKAO.js";import{d as l}from"./chunk-G7NGB5UX.js";l();var c={week:[{n:4,label:"4W",aria:"4 weeks"},{n:8,label:"8W",aria:"8 weeks"},{n:12,label:"12W",aria:"12 weeks"}],month:[{n:3,label:"3M",aria:"3 months"},{n:6,label:"6M",aria:"6 months"},{n:12,label:"12M",aria:"12 months"}],day:[{n:30,label:"30D",aria:"30 days"},{n:60,label:"60D",aria:"60 days"},{n:90,label:"90D",aria:"90 days"}]};function h(n){return(n||[]).filter(e=>e[1]!==null&&e[1]!==void 0&&!Number.isNaN(e[1])).map(e=>({label:b(String(e[0])),value:e[1]}))}function x(n,e){return n.points.slice(-e)}function g(n,e){return n==="week"?`Week of ${e}`:e}function M(n,e,r){let i=e-n;if(!(i>0))return[n];let a=i/r,o=Math.pow(10,Math.floor(Math.log10(a))),t=a/o,u=(t<1.5?1:t<3?2:t<7?5:10)*o,m=[];for(let s=Math.ceil(n/u)*u;s<=e+1e-9;s+=u)m.push(+s.toFixed(10));return m}function y(n,e){if(!n.length)return[0,1];let r=Math.min(...n),i=Math.max(...n),a=(i-r)*.3||Math.abs(i)*.1||1,o=Math.max(0,r-a),t=i+a;return e==="share"&&(t=Math.min(1,t)),o===t&&(t=o+1),[o,t]}function w(n,e,r){return n==="share"?(r<.01?(e*100).toFixed(1):String(Math.round(e*100)))+"%":n==="percent"?`${+e.toFixed(1)}%`:n==="secs"?e>=60?`${+(e/60).toFixed(1)}m`:`${Math.round(e)}s`:n==="hours"?`${+e.toFixed(1)}h`:p("count",e)}export{c as a,h as b,x as c,g as d,M as e,y as f,w as g};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as ae}from"./chunk-LAAGCPU3.js";import{a as re,c as H,d as O,e as oe,f as se,g as le}from"./chunk-24LFKFZ6.js";import{d as te,h as x}from"./chunk-6BDBXA6V.js";import{a as ne}from"./chunk-VWKSMFWJ.js";import{B as U,C as ee,D as z,K as X,L as q,a as D,c as P,d as $,f as w,i as Z,j,u as E,v as J,w as t}from"./chunk-GT4EAKAO.js";import{d as W}from"./chunk-G7NGB5UX.js";W();W();var ie=null,be=()=>ie||(ie=import("./uPlot.esm-OIWT3AHJ.js").then(e=>e.default)),ve={good:"--good",bad:"--bad",neutral:"--ink",accent:"--accent"},me=["--accent","--ink-2","--watch"];function F(e,a){let c=e.match(/^#([0-9a-f]{6})$/i);if(c){let r=parseInt(c[1],16);return`rgba(${r>>16},${r>>8&255},${r&255},${a})`}let d=e.match(/\d+(\.\d+)?/g);return d?`rgba(${d[0]},${d[1]},${d[2]},${a})`:e}function ue(e){let a=w(null),c=w(null),d=w(null),r=w(null),o=w(e);o.current=e;let m=w(1),h=w(()=>{}),k=w(null),[T,_]=P(!1),L=Z(te);$(()=>{let s=!1;return be().then(i=>{if(s||!c.current||!a.current)return;r.current?.destroy();let l=o.current,g=l.labels.length,n=l.series.length>1,v=f=>n?x(`--chart-${f%3+1}`)||x(me[f%3]):x(ve[l.tone||"neutral"]),I=x("--ink-2"),N=x("--ink-3"),A=x("--line"),ce=x("--surface"),de=l.series.flat(),G=se(de,l.kind),V=l.type==="line"||n?null:l.base,he=i.paths.spline?i.paths.spline():i.paths.linear(),fe=(f,u,p,C)=>{let R=he(f,u,p,C);if(R&&m.current<1){let S=new Path2D;S.rect(0,0,f.bbox.left+f.bbox.width*m.current,f.ctx.canvas.height),R.clip=S}return R},Q=x("--chart-font")||'600 12.5px "Plus Jakarta Sans", system-ui, sans-serif',pe=x("--chart-area")==="flat",B=devicePixelRatio||1,Y=new i({width:a.current.clientWidth,height:l.height||300,padding:[26,4,0,22],legend:{show:!1},cursor:{x:!0,y:!1,drag:{x:!1,y:!1,setScale:!1},points:{size:12,width:3,stroke:()=>ce,fill:(f,u)=>v(u-1)}},scales:{x:{time:!1,range:()=>[0,Math.max(1,g-1)]},y:{range:()=>G}},axes:[{stroke:I,font:Q,grid:{show:!1},ticks:{show:!1},gap:8,size:32,splits:f=>{let u=f.bbox.width/B,p=Math.max(2,Math.floor(u/70)),C=Math.ceil(g/p),R=[];for(let S=g-1;S>=0;S-=C)R.unshift(S);return R},values:(f,u)=>u.map(p=>l.labels[Math.round(p)]||"")},{side:1,stroke:I,font:Q,ticks:{show:!1},gap:8,size:56,grid:{stroke:A,width:1},splits:()=>oe(G[0],G[1],4),values:(f,u)=>u.map(p=>le(l.kind,p,u.length>1?u[1]-u[0]:1))}],series:[{},...l.series.map((f,u)=>({stroke:v(u),width:n?2.25:2.75,dash:n?[[],[8,5],[2,4]][u%3]:void 0,paths:fe,points:{show:g===1},fill:n||l.type==="line"?void 0:pe?F(v(u),.08):p=>{let C=p.ctx.createLinearGradient(0,p.bbox.top,0,p.bbox.top+p.bbox.height);return C.addColorStop(0,F(v(u),.22)),C.addColorStop(1,F(v(u),0)),C}}))],hooks:{drawAxes:[f=>{if(V==null)return;let u=Math.round(f.valToPos(V,"y",!0))+.5,p=f.ctx;p.save(),p.setLineDash([3*B,4*B]),p.strokeStyle=N,p.lineWidth=B,p.beginPath(),p.moveTo(f.bbox.left,u),p.lineTo(f.bbox.left+f.bbox.width,u),p.stroke(),p.restore()}],setCursor:[f=>M(f)]}},[l.labels.map((f,u)=>u),...l.series],c.current);r.current=Y,K(Y),_(!0)}),()=>{s=!0}},[e.labels.join("|"),e.series.map(s=>s.join(",")).join("|"),e.tone,e.kind,e.type,e.height,L]),$(()=>{if(!(!T||!r.current)){if(h.current(),U()){m.current=1,r.current.redraw(!0,!1);return}m.current=0,h.current=z(820,s=>{m.current=s,r.current?.redraw(!0,!1)},()=>{m.current=1},ee)}},[T,e.reveal]),$(()=>()=>{h.current(),r.current?.destroy(),r.current=null},[]),$(()=>{if(!a.current||typeof ResizeObserver!="function")return;let s=new ResizeObserver(()=>{let i=a.current?.clientWidth;i&&r.current&&r.current.setSize({width:i,height:o.current.height||300})});return s.observe(a.current),()=>s.disconnect()},[]);function M(s){let i=s.cursor.idx,l=s.cursor.left,g=d.current,n=o.current;if(i==null||l===void 0||l<0){g?.classList.remove("is-on"),n.onScrub?.(null);return}if(g&&a.current){let v=a.current.getBoundingClientRect(),I=s.over.getBoundingClientRect();g.textContent=n.flag?n.flag(i):n.labels[i]||"";let N=I.left-v.left+s.valToPos(i,"x"),A=g.offsetWidth/2;g.style.left=`${Math.max(A,Math.min(v.width-A,N))}px`,g.classList.add("is-on")}n.onScrub?.(i)}function K(s){let i=s.over,l=g=>{let n=i.getBoundingClientRect(),v=g.touches[0];v&&s.setCursor({left:Math.max(0,Math.min(n.width,v.clientX-n.left)),top:n.height/2})};i.addEventListener("touchstart",l,{passive:!0}),i.addEventListener("touchmove",l,{passive:!0}),i.addEventListener("touchend",()=>s.setCursor({left:-10,top:-10}))}let b=s=>{if(!r.current||s.key!=="ArrowLeft"&&s.key!=="ArrowRight"&&s.key!=="Home"&&s.key!=="End")return;s.preventDefault();let i=o.current.labels.length,l=k.current;k.current=s.key==="Home"?0:s.key==="End"||l===null?i-1:Math.max(0,Math.min(i-1,l+(s.key==="ArrowLeft"?-1:1))),r.current.setCursor({left:r.current.valToPos(k.current,"x"),top:10})},y=()=>{k.current=null,r.current?.setCursor({left:-10,top:-10})};return t("div",{class:"scrub",ref:a,tabIndex:0,role:"group","aria-roledescription":"chart","aria-label":`${e.label}. Use the left and right arrow keys to move through the points.`,onKeyDown:b,onBlur:y,style:{height:`${e.height||300}px`},children:[T?null:t("div",{class:"sk sk-chart",style:{height:"100%"}}),t("div",{ref:c,class:"scrub-plot"}),t("div",{ref:d,class:"scrub-flag","aria-hidden":"true"})]})}function ze(){let[e,a]=P(()=>j.get("ranges",{week:12,month:6,day:90}));return[e,(c,d)=>{let r={...e,[c]:d};a(r),j.set("ranges",r)}]}function ke({text:e}){let a=e.match(/^([^\d–-]*)([\d.,–-]+)(.*)$/);return a?t(D,{children:[a[1],a[2],a[3]?t("small",{children:a[3]}):null]}):t(D,{children:e})}function He({metric:e,ranges:a,setRange:c,height:d=300,extra:r}){let o=re[e.period],m=a[e.period]||o[o.length-1].n,h=H(e,m),[k,T]=P(null),[_,L]=P(null),M=h.length-1,K=k===null?M:Math.min(k,M),b=h[K],y=h[0],s=w(null);if($(()=>{if(!b)return;let n=s.current&&s.current.id===e.id&&k===null?s.current.v:null;if(s.current={id:e.id,v:b.value},n===null||k!==null||n===b.value){L(b.value);return}return z(480,v=>L(n+(b.value-n)*v))},[e.id,b?.value,k]),!b||!y)return null;let i=J(e.better,e.kind,y.value,h[M].value),l=o.filter(n=>n.n<e.points.length||n===o.find(v=>v.n>=e.points.length)),g=e.period==="week"?"weeks":e.period==="month"?"months":"days";return t("div",{class:"hero",children:[t("div",{class:"hero-head",children:[t("div",{class:"hero-figure",children:[t("div",{class:"hero-name",children:[t("span",{children:e.name}),e.info?t(q,{info:e.info}):null]}),t("div",{class:"hero-num num",children:t(ke,{text:E(e.kind,k===null?_??b.value:b.value)})}),t("div",{class:"hero-meta",children:[h.length>1?t(X,{kind:e.kind,from:y.value,to:b.value,better:e.better}):null,t("span",{class:"hero-date",children:k===null?h.length>1?`over ${h.length} ${g}`:O(e.period,b.label):`${O(e.period,b.label)}, vs ${y.label}`})]}),e.meaning?t("p",{class:"hero-meaning",children:e.meaning(b.value,b)}):null]}),l.length>1?t("div",{class:"hero-tools",children:t(ne,{label:"Time range",value:Math.min(m,l[l.length-1].n),onChange:n=>c(e.period,n),options:l.map(n=>({value:n.n,label:n.label,aria:n.aria}))})}):null]}),t("p",{class:"sr","aria-live":"polite",children:[e.name,": ",E(e.kind,h[M].value)," now",h.length>1?`, ${E(e.kind,y.value)} ${h.length} ${g} ago`:"","."]}),h.length>1?t(ue,{labels:h.map(n=>n.label),series:[h.map(n=>n.value)],kind:e.kind,tone:i==="neutral"?"neutral":i,base:y.value,height:d,label:`${e.name} over ${h.length} ${g}`,flag:n=>O(e.period,h[n]?.label||""),onScrub:T,reveal:`${e.id}:${m}`}):t("p",{class:"hero-note",children:["One ",e.period," of history so far; the chart draws once there are two."]}),r]})}function Oe(e,a){let c=H(e,a),d=c[0],r=c[c.length-1];return{id:e.id,name:e.name,sub:e.sub,value:E(e.kind,r?.value),values:c.map(o=>o.value),info:e.info,change:d&&r&&c.length>1?t(X,{kind:e.kind,from:d.value,to:r.value,better:e.better}):null}}function _e({items:e,selected:a,onSelect:c,label:d,tones:r}){return t("ul",{class:"watch card","aria-label":d,children:e.map(o=>{let m=o.id===a,h=t(D,{children:[t("span",{class:"watch-name",children:[t("b",{children:o.name}),o.sub?t("small",{children:o.sub}):null]}),o.values&&o.values.length>1?t(ae,{values:o.values,tone:r?.[o.id]||"neutral"}):o.trailing?t("span",{class:"watch-trail",children:o.trailing}):t("span",{}),t("span",{class:"watch-val",children:[t("b",{class:"num",children:o.value}),o.change]})]});return t("li",{class:"watch-row"+(m?" is-selected":""),children:[c&&o.values&&o.values.length>1?t("button",{type:"button",class:"watch-main press","aria-pressed":m,onClick:()=>c(o.id),"aria-label":`${o.name}, ${o.value}. Show on the chart`,children:h}):t("div",{class:"watch-main",children:h}),o.info?t(q,{info:o.info}):null]})})})}function Ke(e,a){let c={};for(let d of e){let r=H(d,a[d.period]||12);c[d.id]=r.length>1?J(d.better,d.kind,r[0].value,r[r.length-1].value):"neutral"}return c}export{ze as a,He as b,Oe as c,_e as d,Ke as e};
|