Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/workflows/e2e-subtensor-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ jobs:
uv venv .venv
source .venv/bin/activate
uv pip install .[dev]
uv pip install pytest

- name: Download Cached Docker Image
uses: actions/download-artifact@v4
Expand Down
42 changes: 42 additions & 0 deletions .github/workflows/ruff-formatter.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Ruff Formatter Check
permissions:
contents: read

on:
pull_request:
types: [opened, synchronize, reopened, edited]

jobs:
ruff:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9.13"]
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Set up caching for Ruff virtual environment
id: cache-ruff
uses: actions/cache@v4
with:
path: .venv
key: v2-pypi-py-ruff-${{ matrix.python-version }}-${{ hashFiles('pyproject.toml') }}
restore-keys: |
v2-pypi-py-ruff-${{ matrix.python-version }}-

- name: Set up Ruff virtual environment if cache is missed
if: steps.cache-ruff.outputs.cache-hit != 'true'
run: |
python -m venv .venv
.venv/bin/python -m pip install ruff==0.11.5

- name: Ruff format check
run: |
.venv/bin/ruff format --diff bittensor_cli
.venv/bin/ruff format --diff tests
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Changelog

## 9.5.0 /2025-06-02

## What's Changed
* Replace PyWry by @thewhaleking in https://github.com/opentensor/btcli/pull/472
* Remove fuzzywuzzy by @thewhaleking in https://github.com/opentensor/btcli/pull/473
* Add ruff formatter by @thewhaleking in https://github.com/opentensor/btcli/pull/474

**Full Changelog**: https://github.com/opentensor/btcli/compare/v9.4.4...v9.5.0

## 9.4.4 /2025-04-29

## What's Changed
Expand Down
13 changes: 3 additions & 10 deletions bittensor_cli/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,6 @@
prompt_for_identity,
validate_uri,
prompt_for_subnet_identity,
print_linux_dependency_message,
is_linux,
validate_rate_tolerance,
)

Expand Down Expand Up @@ -4875,9 +4873,6 @@ def subnets_price(
if all_netuids and not json_output:
html_output = True

if html_output and is_linux():
print_linux_dependency_message()

return self._run_command(
price.price(
self.initialize_chain(network),
Expand Down Expand Up @@ -5655,7 +5650,7 @@ def view_dashboard(
help="Coldkey SS58 address to view dashboard for",
),
use_wry: bool = typer.Option(
False, "--use-wry", help="Use PyWry instead of browser window"
False, "--use-wry", "--html", help="Display output in browser window."
),
save_file: bool = typer.Option(
False, "--save-file", "--save", help="Save the dashboard HTML file"
Expand All @@ -5668,12 +5663,10 @@ def view_dashboard(
Display html dashboard with subnets list, stake, and neuron information.
"""
self.verbosity_handler(quiet, verbose)
if use_wry and is_linux():
print_linux_dependency_message()

if use_wry and save_file:
print_error("Cannot save file when using PyWry.")
raise typer.Exit()
print_error("Cannot save file when using browser output.")
return

if save_file:
if not dashboard_path:
Expand Down
24 changes: 24 additions & 0 deletions bittensor_cli/src/bittensor/templates/main-filters.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<div class="filters-section">
<div class="search-box">
<input type="text" id="subnet-search" placeholder="search for name, or netuid..." onkeyup="filterSubnets()">
</div>
<div class="filter-toggles">
<label>
<input type="checkbox" id="show-verbose" onchange="toggleVerboseNumbers()">
Precise Numbers
</label>
<label>
<input type="checkbox" id="show-staked" onchange="filterSubnets()">
Show Only Staked
</label>
<label>
<input type="checkbox" id="show-tiles" onchange="toggleTileView()" checked>
Tile View
</label>
<label class="disabled-label" title="Coming soon">
<input type="checkbox" id="live-mode" disabled>
Live Mode (coming soon)
</label>
</div>
</div>
<div id="subnet-tiles-container" class="subnet-tiles-container"></div>
36 changes: 36 additions & 0 deletions bittensor_cli/src/bittensor/templates/main-header.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{#
vars:
wallet_info.coldkey, truncated_coldkey, wallet_info.balance, root_symbol_html, wallet_info.total_ideal_stake_value,
slippage_percentage, wallet_info.total_slippage_value, block_number
#}

<div class="header">
<meta charset="UTF-8">
<div class="wallet-info">
<span class="wallet-name">{{ wallet_info.name }}</span>
<div class="wallet-address-container" onclick="copyToClipboard('{{ coldkey }}', this)">
<span class="wallet-address" title="Click to copy">{{ truncated_coldkey }}}</span>
<span class="copy-indicator">Copy</span>
</div>
</div>
<div class="stake-metrics">
<div class="stake-metric">
<span class="metric-label">Block</span>
<span class="metric-value" style="color: #FF9900;">{{ block_number }}</span>
</div>
<div class="stake-metric">
<span class="metric-label">Balance</span>
<span class="metric-value">{{ "%.4f"|format(wallet_info.balance) }} {{ root_symbol_html }}</span>
</div>
<div class="stake-metric">
<span class="metric-label">Total Stake Value</span>
<span class="metric-value">{{ "%.4f"|format(wallet_info.total_ideal_stake_value) }} {{ root_symbol_html }}</span>
</div>
<div class="stake-metric">
<span class="metric-label">Slippage Impact</span>
<span class="metric-value slippage-value">
{{ "%.2f"|format(slippage_percentage) }}% <span class="slippage-detail">({{ "%.4f"|format(wallet_info.total_slippage_value) }} {{ root_symbol_html }})</span>
</span>
</div>
</div>
</div>
111 changes: 111 additions & 0 deletions bittensor_cli/src/bittensor/templates/neuron-details.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
<div id="neuron-detail-container" style="display: none;">
<div class="neuron-detail-header">
<button class="back-button neuron-detail-back" onclick="closeNeuronDetails()">&larr; Back</button>
</div>
<div class="neuron-detail-content">
<div class="neuron-info-top">
<h2 class="neuron-name" id="neuron-name"></h2>
<div class="neuron-keys">
<div class="hotkey-label">
<span style="color: #FF9900;">Hotkey:</span>
<span id="neuron-hotkey" class="truncated-address"></span>
</div>
<div class="coldkey-label">
<span style="color: #FF9900;">Coldkey:</span>
<span id="neuron-coldkey" class="truncated-address"></span>
</div>
</div>
</div>
<div class="neuron-cards-container">
<!-- First row: Stakes, Dividends, Incentive, Emissions -->
<div class="neuron-metrics-row">
<div class="metric-card">
<div class="metric-label">Stake Weight</div>
<div id="neuron-stake-total" class="metric-value formatted-number"
data-value="0" data-symbol=""></div>
</div>

<div class="metric-card">
<div class="metric-label">Stake (Alpha)</div>
<div id="neuron-stake-token" class="metric-value formatted-number"
data-value="0" data-symbol=""></div>
</div>

<div class="metric-card">
<div class="metric-label">Stake (Root)</div>
<div id="neuron-stake-root" class="metric-value formatted-number"
data-value="0" data-symbol="&#x03C4;"></div>
</div>

<div class="metric-card">
<div class="metric-label">Dividends</div>
<div id="neuron-dividends" class="metric-value formatted-number"
data-value="0" data-symbol=""></div>
</div>

<div class="metric-card">
<div class="metric-label">Incentive</div>
<div id="neuron-incentive" class="metric-value formatted-number"
data-value="0" data-symbol=""></div>
</div>

<div class="metric-card">
<div class="metric-label">Emissions</div>
<div id="neuron-emissions" class="metric-value formatted-number"
data-value="0" data-symbol=""></div>
</div>
</div>

<!-- Second row: Rank, Trust, Pruning Score, Validator Permit, Consensus, Last Update -->
<div class="neuron-metrics-row">
<div class="metric-card">
<div class="metric-label">Rank</div>
<div id="neuron-rank" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Trust</div>
<div id="neuron-trust" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Pruning Score</div>
<div id="neuron-pruning-score" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Validator Permit</div>
<div id="neuron-validator-permit" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Consensus</div>
<div id="neuron-consensus" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Last Update</div>
<div id="neuron-last-update" class="metric-value"></div>
</div>
</div>

<!-- Third row: Reg Block, IP Info, Active -->
<div class="neuron-metrics-row last-row">
<div class="metric-card">
<div class="metric-label">Reg Block</div>
<div id="neuron-reg-block" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">IP Info</div>
<div id="neuron-ipinfo" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Active</div>
<div id="neuron-active" class="metric-value"></div>
</div>
</div>
</div>
</div>
</div>
Loading
Loading