chore: scaffold Mudfish VPN decky plugin

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ysj7705andClaude Opus 5.5 committed 2026-10-24 20:44:06 +09:00
1 parent 349e44000e
commit e60873b75a
13 files changed
+187

No files matched your search

+1
View File
@@ -0,0 +1 @@
* text=auto eol=lf
+59
View File
@@ -0,0 +1,59 @@
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz
*.swp
pids
logs
results
tmp
# Coverage reports
coverage
# API keys and secrets
.env
# Dependency directory
node_modules
bower_components
.pnpm-store
# Editors
.idea
*.iml
# OS metadata
.DS_Store
Thumbs.db
# Ignore built ts files
dist/
__pycache__/
/.yalc
yalc.lock
.vscode/settings.json
# Ignore output folder
backend/out
# Make sure to ignore any instance of the loader's decky_plugin.py
decky_plugin.py
# Ignore decky CLI for building plugins
out
out/*
cli/
cli/*
cli/decky
.superpowers/
+14
View File
@@ -0,0 +1,14 @@
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "py_modules"))
import decky # noqa: E402
class Plugin:
async def _main(self):
decky.logger.info("Mudfish VPN plugin loaded")
async def _unload(self):
decky.logger.info("Mudfish VPN plugin unloaded")
+34
View File
@@ -0,0 +1,34 @@
{
"name": "mudfish-decky",
"version": "0.1.0",
"description": "Toggle Mudfish Cloud VPN Full VPN mode from Steam Deck Gaming Mode",
"type": "module",
"scripts": {
"build": "rollup -c",
"watch": "rollup -c -w"
},
"author": "ysj7705",
"license": "BSD-3-Clause",
"devDependencies": {
"@decky/rollup": "^1.0.2",
"@decky/ui": "^4.11.0",
"@types/react": "19.1.1",
"@types/react-dom": "19.1.1",
"@types/webpack": "^5.28.5",
"rollup": "^4.53.3",
"typescript": "^5.6.2"
},
"dependencies": {
"@decky/api": "^1.1.3",
"react-icons": "^5.3.0",
"tslib": "^2.7.0"
},
"pnpm": {
"peerDependencyRules": {
"ignoreMissing": [
"react",
"react-dom"
]
}
}
}
+11
View File
@@ -0,0 +1,11 @@
{
"name": "Mudfish VPN",
"author": "ysj7705",
"flags": ["root"],
"api_version": 1,
"publish": {
"tags": ["vpn", "mudfish", "root"],
"description": "Toggle Mudfish Cloud VPN Full VPN mode from Gaming Mode and pick a Japan node.",
"image": ""
}
}
+1
View File
@@ -0,0 +1 @@
"""Mudfish Cloud VPN control for the Decky plugin backend."""
+5
View File
@@ -0,0 +1,5 @@
import deckyPlugin from "@decky/rollup";
export default deckyPlugin({
// Add your extra Rollup options here
})
+12
View File
@@ -0,0 +1,12 @@
#!/usr/bin/env bash
# Build the frontend and install the plugin on the Steam Deck, then restart Decky.
# Needs passwordless sudo for the deck user (development only).
set -euo pipefail
cd "$(dirname "$0")/.."
DECK="${DECK:-deck@192.168.1.50}"
pnpm build
tar --exclude='__pycache__' -cf - dist main.py plugin.json package.json py_modules | ssh "$DECK" '
D=/home/deck/homebrew/plugins/mudfish-decky
sudo rm -rf "$D" && sudo mkdir -p "$D" && sudo tar -xf - -C "$D" &&
sudo systemctl restart plugin_loader'
echo "deployed to $DECK"
+8
View File
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
# Run the Python unit tests on the Steam Deck (its python3 matches the target runtime closely).
set -euo pipefail
cd "$(dirname "$0")/.."
DECK="${DECK:-deck@192.168.1.50}"
tar -cf - py_modules tests | ssh "$DECK" '
rm -rf /tmp/mfd-test && mkdir /tmp/mfd-test && tar -xf - -C /tmp/mfd-test &&
cd /tmp/mfd-test && PYTHONPATH=py_modules python3 -m unittest discover -s tests -t . -v'
+10
View File
@@ -0,0 +1,10 @@
import { PanelSection, staticClasses } from "@decky/ui";
import { definePlugin } from "@decky/api";
import { FaFish } from "react-icons/fa";
export default definePlugin(() => ({
name: "Mudfish VPN",
titleView: <div className={staticClasses.Title}>Mudfish VPN</div>,
content: <PanelSection />,
icon: <FaFish />,
}));
View File
Whitespace-only changes.
+12
View File
@@ -0,0 +1,12 @@
import unittest
import mudfish_decky
class SmokeTest(unittest.TestCase):
def test_package_imports(self):
self.assertTrue(hasattr(mudfish_decky, "__name__"))
if __name__ == "__main__":
unittest.main()
+20
View File
@@ -0,0 +1,20 @@
{
"compilerOptions": {
"outDir": "dist",
"module": "ESNext",
"target": "ES2020",
"jsx": "react-jsx",
"declaration": false,
"moduleResolution": "node",
"noUnusedLocals": true,
"noUnusedParameters": true,
"esModuleInterop": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": true,
"strict": true,
"allowSyntheticDefaultImports": true
},
"include": ["src"],
"exclude": ["node_modules"]
}