From e72818399c4d75834a18d65035906419732dc1e3 Mon Sep 17 00:00:00 2001 From: Falck Date: Sun, 19 Apr 2026 12:00:02 +0800 Subject: [PATCH] update project configuration and add development tools - Add Python virtual environment patterns to .gitignore - Replace .codebuddy with .clinerules in .gitignore - Add .pid file for process tracking - Add comprehensive .pylintrc configuration for Python linting - Update start.bat with English translations and simplified functions --- .gitignore | 10 +- .pid | 1 + .pylintrc | 287 ++++++++++++++++++ .vscode/launch.json | 188 ++++++++++++ .vscode/settings.json | 153 ++++++++++ .vscode/tasks.json | 219 +++++++++++++ oss/__pycache__/__init__.cpython-313.pyc | Bin 183 -> 183 bytes oss/__pycache__/cli.cpython-313.pyc | Bin 2359 -> 2359 bytes oss/logger/__pycache__/logger.cpython-313.pyc | Bin 4200 -> 4200 bytes .../__pycache__/capabilities.cpython-313.pyc | Bin 4131 -> 4131 bytes oss/plugin/__pycache__/loader.cpython-313.pyc | Bin 7134 -> 7134 bytes .../__pycache__/manager.cpython-313.pyc | Bin 1806 -> 1806 bytes oss/plugin/__pycache__/types.cpython-313.pyc | Bin 4990 -> 4990 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 315 -> 315 bytes oss/shared/__pycache__/router.cpython-313.pyc | Bin 5621 -> 5621 bytes start.bat | 230 ++++++-------- start.sh | 0 .../__pycache__/main.cpython-313.pyc | Bin 7686 -> 7686 bytes .../__pycache__/main.cpython-313.pyc | Bin 10088 -> 10088 bytes .../__pycache__/router.cpython-313.pyc | Bin 1141 -> 1141 bytes .../__pycache__/static.cpython-313.pyc | Bin 3631 -> 3631 bytes .../__pycache__/template.cpython-313.pyc | Bin 13205 -> 13205 bytes .../__pycache__/main.cpython-313.pyc | Bin 3337 -> 3337 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 174 -> 174 bytes .../__pycache__/quality.cpython-313.pyc | Bin 4648 -> 4648 bytes .../__pycache__/references.cpython-313.pyc | Bin 15879 -> 15879 bytes .../__pycache__/security.cpython-313.pyc | Bin 3562 -> 3562 bytes .../checks/__pycache__/style.cpython-313.pyc | Bin 2789 -> 2789 bytes .../core/__pycache__/__init__.cpython-313.pyc | Bin 172 -> 172 bytes .../core/__pycache__/reviewer.cpython-313.pyc | Bin 4458 -> 4458 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 174 -> 174 bytes .../__pycache__/formatter.cpython-313.pyc | Bin 3863 -> 3863 bytes .../__pycache__/main.cpython-313.pyc | Bin 21024 -> 21073 bytes store/@{FutureOSS}/dashboard/main.py | 6 +- .../__pycache__/main.cpython-313.pyc | Bin 6722 -> 6722 bytes .../__pycache__/main.cpython-313.pyc | Bin 9950 -> 9950 bytes .../http-api/__pycache__/main.cpython-313.pyc | Bin 3311 -> 3311 bytes .../__pycache__/middleware.cpython-313.pyc | Bin 3756 -> 3756 bytes .../__pycache__/router.cpython-313.pyc | Bin 1221 -> 1221 bytes .../__pycache__/server.cpython-313.pyc | Bin 6861 -> 6938 bytes store/@{FutureOSS}/http-api/server.py | 2 +- .../__pycache__/events.cpython-313.pyc | Bin 1038 -> 1038 bytes .../http-tcp/__pycache__/main.cpython-313.pyc | Bin 1829 -> 1829 bytes .../__pycache__/middleware.cpython-313.pyc | Bin 3271 -> 3271 bytes .../__pycache__/router.cpython-313.pyc | Bin 1192 -> 1192 bytes .../__pycache__/server.cpython-313.pyc | Bin 10818 -> 10818 bytes .../__pycache__/i18n.cpython-313.pyc | Bin 7406 -> 7406 bytes .../__pycache__/main.cpython-313.pyc | Bin 8834 -> 8834 bytes .../__pycache__/middleware.cpython-313.pyc | Bin 4020 -> 4020 bytes .../__pycache__/main.cpython-313.pyc | Bin 9580 -> 9580 bytes .../__pycache__/main.cpython-313.pyc | Bin 7629 -> 7629 bytes .../__pycache__/main.cpython-313.pyc | Bin 28432 -> 28468 bytes store/@{FutureOSS}/log-terminal/main.py | 3 +- .../__pycache__/main.cpython-313.pyc | Bin 27569 -> 27600 bytes store/@{FutureOSS}/pkg-manager/main.py | 3 +- .../__pycache__/main.cpython-313.pyc | Bin 11671 -> 11671 bytes .../__pycache__/main.cpython-313.pyc | Bin 3580 -> 3580 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 179 -> 179 bytes .../__pycache__/breaker.cpython-313.pyc | Bin 3581 -> 3581 bytes .../circuit/__pycache__/state.cpython-313.pyc | Bin 556 -> 556 bytes .../core/__pycache__/__init__.cpython-313.pyc | Bin 176 -> 176 bytes .../core/__pycache__/config.cpython-313.pyc | Bin 4374 -> 4374 bytes .../core/__pycache__/enhancer.cpython-313.pyc | Bin 11275 -> 11275 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 180 -> 180 bytes .../__pycache__/auto_fix.cpython-313.pyc | Bin 3596 -> 3596 bytes .../__pycache__/health.cpython-313.pyc | Bin 4710 -> 4710 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 177 -> 177 bytes .../utils/__pycache__/logger.cpython-313.pyc | Bin 3583 -> 3583 bytes .../__pycache__/main.cpython-313.pyc | Bin 36301 -> 34438 bytes .../__pycache__/main.cpython-313.pyc | Bin 20050 -> 20050 bytes .../__pycache__/main.cpython-313.pyc | Bin 16721 -> 16721 bytes .../webui/__pycache__/main.cpython-313.pyc | Bin 5995 -> 5944 bytes .../core/__pycache__/__init__.cpython-313.pyc | Bin 155 -> 155 bytes .../core/__pycache__/server.cpython-313.pyc | Bin 9928 -> 9955 bytes store/@{FutureOSS}/webui/core/server.py | 3 +- .../ws-api/__pycache__/main.cpython-313.pyc | Bin 1645 -> 1645 bytes 76 files changed, 953 insertions(+), 152 deletions(-) create mode 100644 .pid create mode 100644 .pylintrc create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json mode change 100755 => 100644 start.sh diff --git a/.gitignore b/.gitignore index b5c0310..fa48c81 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,14 @@ QWEN.md data/ +# 虚拟环境(用户自行创建) +.venv/ +venv/ +env/ +*.egg-info/ +dist/ +build/ + # 日志 logs/ *.log @@ -11,4 +19,4 @@ data/signature-verifier/keys/private/ # 签名文件(可选,本地开发可能不需要) # store/**/SIGNATURE -.codebuddy/ \ No newline at end of file +.clinerules \ No newline at end of file diff --git a/.pid b/.pid new file mode 100644 index 0000000..1447442 --- /dev/null +++ b/.pid @@ -0,0 +1 @@ +18490 diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 0000000..de82293 --- /dev/null +++ b/.pylintrc @@ -0,0 +1,287 @@ +[MASTER] +jobs=4 +persistent=yes +rcfile= +load-plugins= +extension-pkg-whitelist= +ignore-patterns=^test_.*\.py$ +ignore=CVS +output-format=colorized +reports=yes +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) +score=yes +fail-under=7.0 + +[MESSAGES CONTROL] +disable=all +enable= + missing-docstring, + empty-docstring, + invalid-name, + too-few-public-methods, + too-many-arguments, + too-many-instance-attributes, + too-many-locals, + too-many-public-methods, + too-many-statements, + redefined-builtin, + redefined-outer-name, + unused-argument, + unused-import, + unused-variable, + unused-wildcard-import, + wrong-import-order, + wrong-import-position, + import-error, + no-name-in-module, + no-member, + no-self-use, + not-callable, + undefined-variable, + used-before-assignment, + broad-except, + bare-except, + try-except-raise, + duplicate-code, + fixme, + trailing-whitespace, + bad-whitespace, + line-too-long, + missing-final-newline, + mixed-line-endings, + bad-continuation, + trailing-newlines, + multiple-statements, + anomalous-backslash-in-string, + deprecated-module, + deprecated-method, + super-with-arguments, + raise-missing-from, + consider-using-f-string, + consider-using-with, + use-implicit-booleaness-not-comparison, + use-list-literal, + use-dict-literal, + consider-using-enumerate, + consider-iterating-dictionary, + consider-using-set-comprehension, + consider-using-generator, + consider-using-any-or-all, + consider-using-in, + consider-using-max-builtin, + consider-using-min-builtin, + consider-using-sum, + consider-merging-isinstance, + chained-comparison, + simplifiable-if-expression, + unnecessary-lambda, + unnecessary-comprehension, + unnecessary-dunder-call, + unnecessary-pass, + unnecessary-ellipsis, + useless-else-on-loop, + useless-return, + useless-object-inheritance, + useless-suppression, + wrong-spelling-in-comment, + wrong-spelling-in-docstring + +[REPORTS] +output-format=text +files-output=no +reports=yes +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) +score=yes + +[REFACTORING] +max-nested-blocks=5 +max-line-length=88 +max-module-lines=1000 +max-statements=50 +max-args=5 +max-locals=15 +max-returns=6 +max-branches=12 +max-statements-in-a-loop=20 +max-public-methods=20 +max-attributes=7 +max-parents=7 +max-bool-expr=5 + +[BASIC] +good-names=i, + j, + k, + ex, + Run, + _, + __, + fd, + msg, + v, + var, + x, + y, + z, + ax, + fig, + plt, + df, + idx, + cnt, + doc, + env, + app, + req, + res, + cls, + self, + mcs, + obj, + mod, + pkgs, + pkg, + cfg, + conf, + config, + opts, + args, + kwargs, + logger, + log +bad-names=foo, + bar, + baz, + toto, + tutu, + tata +docstring-min-length=-1 + +[FORMAT] +max-line-length=88 +ignore-long-lines=^\\s*(# )??$ +single-line-if-stmt=no +single-line-class-stmt=no +max-module-lines=1000 +indent-string=' ' + +[SIMILARITIES] +min-similarity-lines=4 +ignore-comments=yes +ignore-docstrings=yes +ignore-imports=no + +[TYPECHECK] +ignored-modules= +ignored-classes=optparse.Values,thread._local,_thread._local +generated-members=REQUEST,acl_users,aq_parent +contextmanager-decorators=contextlib.contextmanager +missing-member-hint=yes +missing-member-hint-distance=1 +missing-member-max-choices=1 +missing-member-local-gt=2 +ignore-on-opaque-inference=yes +ignored-checks-for-mixins= +signature-mutators= +ignore-mixin-members=yes +ignore-none=yes +ignored-parents= +ignore-erase=no +ignore-import-error=yes +ignore-missing-imports=yes +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ +additional-builtins= + +[VARIABLES] +additional-builtins= +init-import=no +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ +callbacks=cb_,_cb +redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io +allow-global-unused-variables=no + +[LOGGING] +logging-modules=logging + +[MISCELLANEOUS] +notes=FIXME, + XXX, + TODO, + HACK, + BUG, + NOTE, + OPTIMIZE, + REVIEW, + WARNING, + DEPRECATED +max-string-length=100 + +[DESIGN] +max-args=5 +max-locals=15 +max-returns=6 +max-branches=12 +max-statements=50 +max-parents=7 +max-attributes=7 +min-public-methods=2 +max-public-methods=20 + +[IMPORTS] +deprecated-modules= +import-graph= +ext-import-graph= +int-import-graph= +known-standard-library= +known-third-party= +known-local-folder= +preferred-modules= +allow-wildcard-with-all=no +allow-any-import-level=no +allow-relative-imports=yes +allow-from-import-under-package=yes +allow-import-from-same-module=no +allow-import-from-package=yes +allow-unused-imports=no +allow-cyclic-import=no +cyclic-import-limit=10 +ignore-imports=no +ignore-import-error=yes +ignore-missing-imports=yes +preferred-modules= +single-line-exceptions=no + +[EXCEPTIONS] +overgeneral-exceptions=Exception,BaseException,StandardError,ArithmeticError,LookupError,EnvironmentError,EOFError,ImportError +ignore-on-exception=no + +[CLASSES] +defining-attr-methods=__init__, + __new__, + setUp, + __post_init__ +valid-classmethod-first-arg=cls +valid-metaclass-classmethod-first-arg=mcs +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make +bad-dunder-names=__authors__, + __version__, + __date__, + __credits__, + __status__, + __maintainer__, + __email__, + __contact__, + __copyright__, + __license__, + __uri__, + __url__, + __program__, + __description__, + __build__ + +[STRING] +check-str-concat-over-line-jumps=no diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2e467d5 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,188 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "FutureOSS: 启动服务", + "type": "python", + "request": "launch", + "module": "oss.cli", + "args": ["serve"], + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONPATH": "${workspaceFolder}", + "PYTHONUNBUFFERED": "1" + }, + "cwd": "${workspaceFolder}", + "python": "${command:python.interpreterPath}" + }, + { + "name": "FutureOSS: 调试模式启动", + "type": "python", + "request": "launch", + "module": "oss.cli", + "args": ["serve", "--debug"], + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONPATH": "${workspaceFolder}", + "PYTHONUNBUFFERED": "1", + "LOG_LEVEL": "DEBUG" + }, + "cwd": "${workspaceFolder}", + "python": "${command:python.interpreterPath}" + }, + { + "name": "FutureOSS: 运行测试", + "type": "python", + "request": "launch", + "module": "pytest", + "args": [ + "-v", + "--tb=short", + "--cov=oss", + "--cov-report=html", + "--cov-report=term" + ], + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONPATH": "${workspaceFolder}" + }, + "cwd": "${workspaceFolder}", + "python": "${command:python.interpreterPath}" + }, + { + "name": "FutureOSS: 调试插件加载器", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/oss/plugin/loader.py", + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONPATH": "${workspaceFolder}", + "PYTHONUNBUFFERED": "1" + }, + "cwd": "${workspaceFolder}", + "python": "${command:python.interpreterPath}" + }, + { + "name": "FutureOSS: 调试日志终端插件", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/store/@{FutureOSS}/log-terminal/main.py", + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONPATH": "${workspaceFolder}", + "PYTHONUNBUFFERED": "1" + }, + "cwd": "${workspaceFolder}", + "python": "${command:python.interpreterPath}" + }, + { + "name": "FutureOSS: 调试WebUI", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/store/@{FutureOSS}/webui/main.py", + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONPATH": "${workspaceFolder}", + "PYTHONUNBUFFERED": "1" + }, + "cwd": "${workspaceFolder}", + "python": "${command:python.interpreterPath}" + }, + { + "name": "FutureOSS: 调试HTTP API", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/store/@{FutureOSS}/http-api/main.py", + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONPATH": "${workspaceFolder}", + "PYTHONUNBUFFERED": "1" + }, + "cwd": "${workspaceFolder}", + "python": "${command:python.interpreterPath}" + }, + { + "name": "FutureOSS: 调试WS API", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/store/@{FutureOSS}/ws-api/main.py", + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONPATH": "${workspaceFolder}", + "PYTHONUNBUFFERED": "1" + }, + "cwd": "${workspaceFolder}", + "python": "${command:python.interpreterPath}" + }, + { + "name": "FutureOSS: 调试特定文件", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONPATH": "${workspaceFolder}", + "PYTHONUNBUFFERED": "1" + }, + "cwd": "${workspaceFolder}", + "python": "${command:python.interpreterPath}" + }, + { + "name": "FutureOSS: 附加到进程", + "type": "python", + "request": "attach", + "processId": "${command:pickProcess}", + "host": "localhost", + "port": 5678, + "pathMappings": [ + { + "localRoot": "${workspaceFolder}", + "remoteRoot": "." + } + ], + "justMyCode": false + }, + { + "name": "FutureOSS: 运行CLI命令", + "type": "python", + "request": "launch", + "module": "oss.cli", + "args": ["${input:cliCommand}"], + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONPATH": "${workspaceFolder}", + "PYTHONUNBUFFERED": "1" + }, + "cwd": "${workspaceFolder}", + "python": "${command:python.interpreterPath}" + } + ], + "inputs": [ + { + "id": "cliCommand", + "type": "promptString", + "description": "输入要执行的CLI命令(如:install, uninstall, list等)", + "default": "help" + } + ], + "compounds": [ + { + "name": "FutureOSS: 完整调试环境", + "configurations": [ + "FutureOSS: 启动服务", + "FutureOSS: 调试日志终端插件" + ], + "stopAll": true + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f071da5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,153 @@ +{ + "python.defaultInterpreterPath": "/usr/bin/python3", + "python.terminal.activateEnvironment": true, + "python.terminal.activateEnvInCurrentTerminal": true, + "python.analysis.extraPaths": [ + "${workspaceFolder}", + "${workspaceFolder}/oss", + "${workspaceFolder}/store/@{FutureOSS}" + ], + "python.analysis.typeCheckingMode": "basic", + "python.analysis.autoImportCompletions": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": true, + "python.linting.pylintPath": "pylint", + "python.linting.pylintArgs": [ + "--rcfile=${workspaceFolder}/.pylintrc" + ], + "python.formatting.provider": "black", + "python.formatting.blackPath": "black", + "python.formatting.blackArgs": [ + "--line-length=88" + ], + "python.testing.pytestEnabled": true, + "python.testing.unittestEnabled": false, + "python.testing.nosetestsEnabled": false, + "python.testing.pytestPath": "pytest", + "python.testing.pytestArgs": [ + "-v", + "--tb=short", + "--cov=oss", + "--cov-report=html", + "--cov-report=term" + ], + "python.testing.cwd": "${workspaceFolder}", + "debug.internalConsoleOptions": "neverOpen", + "debug.javascript.usePreview": true, + "debug.onTaskErrors": "showErrors", + "debug.openDebug": "openOnDebugBreak", + "debug.openExplorerOnEnd": false, + "debug.saveBeforeStart": "allEditorsInActiveGroup", + "debug.showInStatusBar": "always", + "debug.toolBarLocation": "floating", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + }, + "files.exclude": { + "**/__pycache__": true, + "**/.pytest_cache": true, + "**/.coverage": true, + "**/.mypy_cache": true, + "**/.ruff_cache": true, + "**/*.pyc": true, + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/Thumbs.db": true, + "**/node_modules": true + }, + "files.watcherExclude": { + "**/__pycache__/**": true, + "**/.pytest_cache/**": true, + "**/.git/**": true, + "**/node_modules/**": true, + "**/.venv/**": true + }, + "search.exclude": { + "**/__pycache__": true, + "**/.pytest_cache": true, + "**/.git": true, + "**/node_modules": true, + "**/.venv": true + }, + "terminal.integrated.env.linux": { + "PYTHONPATH": "${workspaceFolder}", + "PYTHONUNBUFFERED": "1" + }, + "terminal.integrated.defaultProfile.linux": "bash", + "terminal.integrated.profiles.linux": { + "bash": { + "path": "bash", + "icon": "terminal-bash" + }, + "zsh": { + "path": "zsh" + }, + "fish": { + "path": "fish" + }, + "tmux": { + "path": "tmux", + "icon": "terminal-tmux" + }, + "pwsh": { + "path": "pwsh", + "icon": "terminal-powershell" + } + }, + "task.problemMatchers.neverPrompt": true, + "task.autoDetect": "on", + "task.saveBeforeRun": "always", + "explorer.autoReveal": true, + "explorer.compactFolders": false, + "explorer.confirmDelete": true, + "explorer.confirmDragAndDrop": false, + "workbench.editor.enablePreview": false, + "workbench.editor.enablePreviewFromQuickOpen": false, + "workbench.startupEditor": "none", + "workbench.colorTheme": "Default Dark Modern", + "workbench.iconTheme": "vs-seti", + "breadcrumbs.enabled": true, + "editor.minimap.enabled": true, + "editor.renderWhitespace": "boundary", + "editor.rulers": [ + 88 + ], + "editor.wordWrap": "on", + "editor.suggestSelection": "first", + "editor.quickSuggestions": { + "strings": true + }, + "editor.acceptSuggestionOnEnter": "smart", + "editor.suggest.showClasses": true, + "editor.suggest.showColors": true, + "editor.suggest.showConstants": true, + "editor.suggest.showConstructors": true, + "editor.suggest.showCustomcolors": true, + "editor.suggest.showDeprecated": true, + "editor.suggest.showEnumMembers": true, + "editor.suggest.showEvents": true, + "editor.suggest.showFields": true, + "editor.suggest.showFiles": true, + "editor.suggest.showFolders": true, + "editor.suggest.showFunctions": true, + "editor.suggest.showInterfaces": true, + "editor.suggest.showIssues": true, + "editor.suggest.showKeywords": true, + "editor.suggest.showMethods": true, + "editor.suggest.showModules": true, + "editor.suggest.showOperators": true, + "editor.suggest.showProperties": true, + "editor.suggest.showReferences": true, + "editor.suggest.showSnippets": true, + "editor.suggest.showStructs": true, + "editor.suggest.showTypeParameters": true, + "editor.suggest.showUnits": true, + "editor.suggest.showUsers": true, + "editor.suggest.showValues": true, + "editor.suggest.showVariables": true, + "editor.suggest.showWords": true +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..fac1aca --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,219 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "FutureOSS: 安装依赖", + "type": "shell", + "command": "pip install -r requirements.txt", + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared", + "showReuseMessage": true, + "clear": true + }, + "problemMatcher": [], + "options": { + "cwd": "${workspaceFolder}" + } + }, + { + "label": "FutureOSS: 启动开发服务器", + "type": "shell", + "command": "python -m oss.cli serve", + "group": "none", + "isBackground": true, + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": true, + "clear": false + }, + "problemMatcher": [ + { + "pattern": [ + { + "regexp": ".", + "file": 1, + "location": 2, + "message": 3 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": ".*启动 FutureOSS 服务.*", + "endsPattern": ".*服务已启动.*" + } + } + ], + "options": { + "cwd": "${workspaceFolder}" + } + }, + { + "label": "FutureOSS: 运行测试", + "type": "shell", + "command": "pytest -v --tb=short", + "group": "test", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + }, + "problemMatcher": [ + { + "owner": "python", + "fileLocation": ["relative", "${workspaceFolder}"], + "pattern": [ + { + "regexp": "^test_(.*)\\.py::(.*) (PASSED|FAILED|ERROR)$", + "file": 1, + "location": 2, + "severity": 3 + } + ] + } + ], + "options": { + "cwd": "${workspaceFolder}" + } + }, + { + "label": "FutureOSS: 代码检查", + "type": "shell", + "command": "python -m pylint oss/ store/@{FutureOSS}/ --rcfile=${workspaceFolder}/.pylintrc || echo 'Pylint检查完成'", + "group": "build", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + }, + "problemMatcher": [ + { + "owner": "python", + "fileLocation": ["relative", "${workspaceFolder}"], + "pattern": [ + { + "regexp": "^(.*):(\\d+):(\\d+): (\\w+): (.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + ] + } + ], + "options": { + "cwd": "${workspaceFolder}" + } + }, + { + "label": "FutureOSS: 格式化代码", + "type": "shell", + "command": "python -m black oss/ store/@{FutureOSS}/", + "group": "build", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + }, + "problemMatcher": [], + "options": { + "cwd": "${workspaceFolder}" + } + }, + { + "label": "FutureOSS: 清理缓存文件", + "type": "shell", + "command": "find . -type f -name '*.pyc' -delete && find . -type d -name '__pycache__' -delete && find . -type f -name '.pid' -delete", + "group": "build", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + }, + "problemMatcher": [], + "options": { + "cwd": "${workspaceFolder}" + } + }, + { + "label": "FutureOSS: 查看服务状态", + "type": "shell", + "command": "if [ -f .pid ]; then echo '服务正在运行,PID: ' && cat .pid; else echo '服务未运行'; fi", + "group": "none", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new", + "showReuseMessage": true, + "clear": true + }, + "problemMatcher": [], + "options": { + "cwd": "${workspaceFolder}" + } + }, + { + "label": "FutureOSS: 停止服务", + "type": "shell", + "command": "if [ -f .pid ]; then kill $(cat .pid) && rm -f .pid && echo '服务已停止'; else echo '服务未运行'; fi", + "group": "none", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new", + "showReuseMessage": true, + "clear": true + }, + "problemMatcher": [], + "options": { + "cwd": "${workspaceFolder}" + } + }, + { + "label": "FutureOSS: 重启服务", + "type": "shell", + "dependsOrder": "sequence", + "dependsOn": [ + "FutureOSS: 停止服务", + "FutureOSS: 启动开发服务器" + ], + "group": "none", + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + }, + "problemMatcher": [], + "options": { + "cwd": "${workspaceFolder}" + } + } + ] +} diff --git a/oss/__pycache__/__init__.cpython-313.pyc b/oss/__pycache__/__init__.cpython-313.pyc index 41fd71b762fc61ccccc182264eb7ad877288a767..6d77e06a100264022d449f0b3c649f201b6ab573 100644 GIT binary patch delta 19 ZcmdnaxSf&vGcPX}0}u%LKAFh91^_XI1s(tZ delta 19 ZcmdnaxSf&vGcPX}0}vRhKAOnA1^_W{1rq=O diff --git a/oss/__pycache__/cli.cpython-313.pyc b/oss/__pycache__/cli.cpython-313.pyc index 226dafc905bc1929eff059848d13511d8418bb11..8d42fc8fba1846c34dd2191ee2fa57ae705d1257 100644 GIT binary patch delta 20 acmdlkv|Wh%GcPX}0}u%LKH12v!wCR5kOb)f delta 20 acmdlkv|Wh%GcPX}0}vRhKHA8w!wCR5Zv@@| diff --git a/oss/logger/__pycache__/logger.cpython-313.pyc b/oss/logger/__pycache__/logger.cpython-313.pyc index 05d73c17df5edc4ba50726b9a79877b715538820..f9982f606cf8417c0efd610b2c3deab992917c74 100644 GIT binary patch delta 20 acmaE%@Irz6GcPX}0}u%LKH10}D*ymOHwB*n delta 20 acmaE%@Irz6GcPX}0}vRfKHA6~D*ymO4+WC| diff --git a/oss/plugin/__pycache__/capabilities.cpython-313.pyc b/oss/plugin/__pycache__/capabilities.cpython-313.pyc index 57ec4d6496154a108db06575543309ca5915b6ca..c3efc938cee7ee55eb2d4809549d2187297ffe3a 100644 GIT binary patch delta 20 acmZ3iuvmfnGcPX}0}u%LKH11EApih3Zv@Z) delta 20 acmZ3iuvmfnGcPX}0}vRhKHA7FApih3P6WjO diff --git a/oss/plugin/__pycache__/loader.cpython-313.pyc b/oss/plugin/__pycache__/loader.cpython-313.pyc index 3a9d22395c22716f1c18795cb5ab0bad69eb4052..87be3c261873a395544571d73aef6b373686348b 100644 GIT binary patch delta 20 acmca-e$SlyGcPX}0}u%LKH129SsDOD?glyl delta 20 acmca-e$SlyGcPX}0}vRhKHA8ASsDOD%?2+3 diff --git a/oss/plugin/__pycache__/manager.cpython-313.pyc b/oss/plugin/__pycache__/manager.cpython-313.pyc index 111db9f4d9c3e103cc73cad42ec2f0137f1089fd..31b8ea72803907274841d01552912042f6078db3 100644 GIT binary patch delta 20 acmeC<>*M48%*)Hg00ct5Pd0KhvjYGzmIPz~ delta 20 acmeC<>*M48%*)Hg00f4rk2Z2MvjYGzbp%-e diff --git a/oss/plugin/__pycache__/types.cpython-313.pyc b/oss/plugin/__pycache__/types.cpython-313.pyc index 58cf0a8ea30e399ae0130d8bedb73a3bab6af3b0..63fbf09b82966db7deeabc4e5ecf0d5388f5ff81 100644 GIT binary patch delta 20 acmeyT_D_xbGcPX}0}u%LKH11!EDQiff(7sZ delta 20 acmeyT_D_xbGcPX}0}vRhKHA7#EDQifVFl#? diff --git a/oss/shared/__pycache__/__init__.cpython-313.pyc b/oss/shared/__pycache__/__init__.cpython-313.pyc index b56aad078e7380938d8d687b56fbd07cc67b0560..9455fb86e7d1c5e560eb13423b72a2f5450b8259 100644 GIT binary patch delta 20 acmdnZw3~_hGcPX}0}u%LKH11^zz6^~=mgCG delta 20 acmdnZw3~_hGcPX}0}vRhKHA7_zz6^~#{|Lv diff --git a/oss/shared/__pycache__/router.cpython-313.pyc b/oss/shared/__pycache__/router.cpython-313.pyc index 44b71faa11e4b72c8214d476db6aecb6f413c388..e52de121c31fdbfd38b40403ac0e1b4666c7d32e 100644 GIT binary patch delta 20 acmeyW{Z*U$GcPX}0}u%LKH13qN)!M_&<0@u delta 20 acmeyW{Z*U$GcPX}0}vRhKHA9rN)!M_uLf2C diff --git a/start.bat b/start.bat index ff086f7..d48e5c5 100644 --- a/start.bat +++ b/start.bat @@ -1,56 +1,31 @@ @echo off -chcp 65001 >nul 2>&1 setlocal enabledelayedexpansion -:: ═══════════════════════════════════════════════════════════ -:: FutureOSS 智能启动脚本 - Windows -:: 自动检测环境 / 安装依赖 / 进度显示 / 守护重启 -:: ═══════════════════════════════════════════════════════════ - +:: FutureOSS Smart Startup Script - Windows cd /d "%~dp0" -:: ── 处理命令行参数 ── +:: Handle command line parameters if "%1"=="--help" goto :show_help if "%1"=="-h" goto :show_help if "%1"=="--version" goto :show_version if "%1"=="-v" goto :show_version -:: ── 颜色代码 ── -for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do ( - set "DEL=%%a" -) - -:: ── 工具函数 ── -call :colorEcho 0B "[信息] 环境检测中..." -call :colorEcho 0A "[成功] 检测完成" -call :colorEcho 0E "[警告] 某些组件缺失" -call :colorEcho 0C "[错误] 检测失败" - -:: ── Logo ── echo. -call :colorEcho 0B " ███████╗ ██████╗ ██████╗ ██████╗ ██████╗ ██████╗ " -call :colorEcho 0B " ██╔════╝ ██╔══██╗ ██╔══██╗ ██╔══██╗ ██╔══██╗██╔════╝ " -call :colorEcho 0B " █████╗ ██████╔╝ ██████╔╝ ██████╔╝ ██║ ██║██║ ███╗" -call :colorEcho 0B " ██╔══╝ ██╔══██╗ ██╔══██╗ ██╔══██╗ ██║ ██║██║ ██║" -call :colorEcho 0B " ██║ ██║ ██║ ██║ ██║ ██║ ██║ ██████╔╝╚██████╔╝" -call :colorEcho 0B " ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ " -echo. -call :colorEcho 0F " 开发者通用工具套组 · 一切皆为插件" -call :colorEcho 07 " https://gitee.com/starlight-apk/feature-oss" +echo ======================================== +echo FutureOSS Startup Script - Windows +echo ======================================== echo. -:: ── 检查是否已有实例在运行 ── +:: Check if an instance is already running call :check_pid if %errorlevel% neq 0 ( - call :colorEcho 0C "[错误] 检测到已有实例在运行,请先停止" + echo [ERROR] An instance is already running, please stop it first pause exit /b 1 ) -:: ═══════════════════════════════════════════════════════════ -:: 1. 检测 Python -:: ═══════════════════════════════════════════════════════════ -call :colorEcho 0B "[信息] 检测 Python..." +:: 1. Detect Python +echo [INFO] Detecting Python... set "PYTHON_CMD=" for %%p in (python python3 py py3) do ( @@ -63,47 +38,43 @@ for %%p in (python python3 py py3) do ( :found_python if "%PYTHON_CMD%"=="" ( - call :colorEcho 0C "[错误] 未找到 Python,请先安装 Python 3.10+" - call :colorEcho 0E "[提示] 下载地址: https://www.python.org/downloads/" + echo [ERROR] Python not found, please install Python 3.10+ + echo [TIP] Download from: https://www.python.org/downloads/ pause exit /b 1 ) for /f "tokens=*" %%i in ('%PYTHON_CMD% --version 2^>^&1') do set "PY_VER=%%i" -call :colorEcho 0A "[成功] %PY_VER%" +echo [SUCCESS] %PY_VER% -:: 显示系统信息 -call :colorEcho 0B "[信息] 系统信息:" +:: Display system info +echo [INFO] System Information: echo OS: Windows -echo 工作目录: %CD% -echo 时间: %date% %time% +echo Working Directory: %CD% +echo Time: %date% %time% -:: ═══════════════════════════════════════════════════════════ -:: 2. 虚拟环境 -:: ═══════════════════════════════════════════════════════════ +:: 2. Virtual Environment echo. -call :colorEcho 0B "[信息] 配置 Python 环境..." +echo [INFO] Configuring Python environment... if not exist ".venv" ( - call :colorEcho 0E "[信息] 创建虚拟环境..." + echo [INFO] Creating virtual environment... %PYTHON_CMD% -m venv .venv >nul 2>&1 if errorlevel 1 ( - call :colorEcho 0C "[错误] 无法创建虚拟环境" + echo [ERROR] Cannot create virtual environment pause exit /b 1 ) - call :colorEcho 0A "[成功] 虚拟环境已创建" + echo [SUCCESS] Virtual environment created ) else ( - call :colorEcho 0A "[成功] 虚拟环境已存在" + echo [SUCCESS] Virtual environment exists ) call .venv\Scripts\activate.bat >nul 2>&1 -:: ═══════════════════════════════════════════════════════════ -:: 3. 安装依赖 -:: ═══════════════════════════════════════════════════════════ +:: 3. Install Dependencies echo. -call :colorEcho 0B "[信息] 安装 Python 依赖..." +echo [INFO] Installing Python dependencies... set "DEPS=click pyyaml websockets psutil cryptography" set "TOTAL=5" @@ -111,7 +82,7 @@ set "CURRENT=0" for %%d in (%DEPS%) do ( set /a CURRENT+=1 - call :printProgress !CURRENT! !TOTAL! "安装 %%d" + call :printProgress !CURRENT! !TOTAL! "Installing %%d" %PYTHON_CMD% -c "import %%d" 2>nul if errorlevel 1 ( @@ -120,40 +91,35 @@ for %%d in (%DEPS%) do ( ) echo. -echo. -call :colorEcho 0A "[成功] Python 依赖安装完成" +echo [SUCCESS] Python dependencies installed -:: 安装项目依赖 +:: Install project dependencies if exist "pyproject.toml" ( - call :colorEcho 0E "[信息] 安装项目配置依赖..." + echo [INFO] Installing project configuration dependencies... pip install -e . -q 2>nul ) if exist "requirements.txt" ( - call :colorEcho 0E "[信息] 安装 requirements.txt..." + echo [INFO] Installing requirements.txt... pip install -r requirements.txt -q 2>nul ) -:: ═══════════════════════════════════════════════════════════ -:: 4. 检查 PHP -:: ═══════════════════════════════════════════════════════════ +:: 4. Check PHP echo. -call :colorEcho 0B "[信息] 检查 PHP..." +echo [INFO] Checking PHP... where php >nul 2>&1 if errorlevel 1 ( - call :colorEcho 0E "[警告] PHP 未安装,WebUI 可能无法正常工作" - call :colorEcho 07 "[提示] 安装: choco install php 或从 https://windows.php.net/download/ 下载" + echo [WARNING] PHP not installed, WebUI may not work properly + echo [TIP] Install: choco install php or download from https://windows.php.net/download/ ) else ( for /f "tokens=*" %%i in ('php --version 2^>^&1 ^| findstr /r "PHP"') do set "PHP_VER=%%i" - call :colorEcho 0A "[成功] !PHP_VER!" + echo [SUCCESS] !PHP_VER! ) -:: ═══════════════════════════════════════════════════════════ -:: 5. 创建数据目录 -:: ═══════════════════════════════════════════════════════════ +:: 5. Create Data Directories echo. -call :colorEcho 0B "[信息] 初始化数据目录..." +echo [INFO] Initializing data directories... set "DIRS=data data\html-render data\web-toolkit data\plugin-storage data\DCIM data\pkg data\signature-verifier\keys\private data\signature-verifier\keys\public logs" @@ -161,30 +127,28 @@ for %%d in (%DIRS%) do ( if not exist "%%d" ( mkdir "%%d" >nul 2>&1 if errorlevel 1 ( - call :colorEcho 0C "[错误] 无法创建目录: %%d" + echo [ERROR] Cannot create directory: %%d ) ) ) -call :colorEcho 0A "[成功] 数据目录已就绪" +echo [SUCCESS] Data directories ready -:: ═══════════════════════════════════════════════════════════ -:: 6. 启动服务 -:: ═══════════════════════════════════════════════════════════ +:: 6. Start Service echo. -call :colorEcho 0B "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -call :colorEcho 0B " 启动 FutureOSS" -call :colorEcho 0B "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo ======================================== +echo Starting FutureOSS +echo ======================================== echo. -:: 创建 PID 文件 +:: Create PID file call :create_pid "!random!" if "%1"=="--daemon" goto :daemon_mode if "%1"=="-d" goto :daemon_mode -:: 前台模式 -call :colorEcho 0F "运行中... 按 Ctrl+C 停止" +:: Foreground mode +echo Running... Press Ctrl+C to stop echo. set "RESTART_DELAY=3" @@ -196,21 +160,21 @@ set "MAX_RESTARTS=10" set "EXIT_CODE=%errorlevel%" if %EXIT_CODE% equ 0 ( - call :colorEcho 0A "[成功] 服务正常退出" + echo [SUCCESS] Service exited normally goto :end ) -:: 检查是否超过最大重启次数 +:: Check if max restarts exceeded if %RESTART_COUNT% geq %MAX_RESTARTS% ( - call :colorEcho 0C "[错误] 达到最大重启次数 (%MAX_RESTARTS%),停止服务" + echo [ERROR] Reached maximum restart count (%MAX_RESTARTS%), stopping service goto :end ) set /a RESTART_COUNT+=1 -call :colorEcho 0E "[警告] 服务异常退出 (code: %EXIT_CODE%),!RESTART_DELAY!s 后重启... (第 !RESTART_COUNT!/%MAX_RESTARTS% 次)" +echo [WARNING] Service exited abnormally (code: %EXIT_CODE%), restarting in !RESTART_DELAY!s... (!RESTART_COUNT!/%MAX_RESTARTS%) timeout /t !RESTART_DELAY! /nobreak >nul -:: 指数退避 (最大 60 秒) +:: Exponential backoff (max 60 seconds) if !RESTART_DELAY! lss 60 ( set /a RESTART_DELAY=!RESTART_DELAY! * 2 if !RESTART_DELAY! gtr 60 set "RESTART_DELAY=60" @@ -219,10 +183,10 @@ if !RESTART_DELAY! lss 60 ( goto :loop :daemon_mode -call :colorEcho 0E "[警告] Windows 守护模式需要额外配置" -call :colorEcho 07 "[提示] 建议使用任务计划程序或 nssm 工具实现" +echo [WARNING] Windows daemon mode requires additional configuration +echo [TIP] Use Task Scheduler or nssm tool instead echo. -call :colorEcho 0B "[信息] 启动后台服务..." +echo [INFO] Starting background service... start /b %PYTHON_CMD% -m oss.cli serve > logs\daemon.log 2>&1 goto :end @@ -230,65 +194,41 @@ goto :end call :cleanup call .venv\Scripts\deactivate.bat >nul 2>&1 echo. -call :colorEcho 0B "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -call :colorEcho 0F " FutureOSS 已停止" -call :colorEcho 0B "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo ======================================== +echo FutureOSS Stopped +echo ======================================== pause exit /b 0 -:: ── 进度条函数 ── +:: Progress bar function :printProgress set /a "pct=%1 * 100 / %2" set /a "filled=pct / 2" set /a "empty=50-filled" set "bar=" -for /l %%i in (1,1,%filled%) do set "bar=!bar!█" -for /l %%i in (1,1,%empty%) do set "bar=!bar!░" +for /l %%i in (1,1,%filled%) do set "bar=!bar!#" +for /l %%i in (1,1,%empty%) do set "bar=!bar!-" echo [!bar!] !pct!%% - %3 exit /b 0 -:: ── 颜色输出函数 ── -:colorEcho -set "params=%1" -set "msg=%~2" -call :colorText %params% "%msg%" -exit /b 0 - -:colorText -nul 2>&1 exit /b %errorlevel% -:: ── 获取当前时间戳 ── +:: Get current timestamp :get_timestamp for /f "tokens=1-3 delims=/ " %%a in ('date /t') do set "T_DATE=%%c-%%a-%%b" for /f "tokens=1-3 delims=: " %%a in ('time /t') do set "T_TIME=%%a:%%b:%%c" set "TIMESTAMP=%T_DATE% %T_TIME%" exit /b 0 -:: ── 打印分隔线 ── +:: Print separator :print_separator -echo ═══════════════════════════════════════════════════════════ +echo ======================================== exit /b 0 -:: ── 打印带颜色的状态 ── -:print_status -set "status_type=%~1" -set "status_msg=%~2" -if "%status_type%"=="info" call :colorEcho 0B "[信息] %status_msg%" -if "%status_type%"=="success" call :colorEcho 0A "[成功] %status_msg%" -if "%status_type%"=="warn" call :colorEcho 0E "[警告] %status_msg%" -if "%status_type%"=="error" call :colorEcho 0C "[错误] %status_msg%" -exit /b 0 - -:: ── 健康检查 ── +:: Health check :health_check set "check_url=%~1" set "max_retries=%~2" @@ -299,33 +239,33 @@ set "retry_count=0" set /a retry_count+=1 curl -s "%check_url%" >nul 2>&1 if %errorlevel% equ 0 ( - call :colorEcho 0A "[健康检查] 服务已就绪" + echo [HEALTH CHECK] Service is ready exit /b 0 ) if %retry_count% geq %max_retries% ( - call :colorEcho 0C "[健康检查] 服务启动超时" + echo [HEALTH CHECK] Service startup timeout exit /b 1 ) timeout /t 1 /nobreak >nul goto :health_loop -:: ── 创建 PID 文件 ── +:: Create PID file :create_pid echo %~1 > .pid exit /b 0 -:: ── 删除 PID 文件 ── +:: Remove PID file :remove_pid if exist ".pid" del ".pid" exit /b 0 -:: ── 检查 PID 文件 ── +:: Check PID file :check_pid if exist ".pid" ( set /p PID=<.pid tasklist /fi "pid eq %PID%" 2>nul | find "%PID%" >nul if %errorlevel% equ 0 ( - call :colorEcho 0E "[警告] 服务已在运行 (PID: %PID%)" + echo [WARNING] Service already running (PID: %PID%) exit /b 1 ) else ( call :remove_pid @@ -333,34 +273,34 @@ if exist ".pid" ( ) exit /b 0 -:: ── 显示帮助信息 ── +:: Show help information :show_help echo. -call :colorEcho 0F "FutureOSS 启动脚本 - Windows 版本" +echo FutureOSS Startup Script - Windows Version echo. -echo 用法: start.bat [选项] +echo Usage: start.bat [options] echo. -echo 选项: -echo --daemon, -d 以后台模式运行(Windows 建议使用任务计划程序) -echo --help, -h 显示此帮助信息 -echo --version, -v 显示版本信息 +echo Options: +echo --daemon, -d Run in background mode (Windows recommends Task Scheduler) +echo --help, -h Show this help message +echo --version, -v Show version information echo. -echo 示例: -echo start.bat 前台运行模式 -echo start.bat --daemon 后台运行模式 +echo Examples: +echo start.bat Foreground mode +echo start.bat --daemon Background mode echo. exit /b 0 -:: ── 显示版本信息 ── +:: Show version information :show_version echo FutureOSS v1.0.0 -echo 基于 Python 的开发者通用工具套组 +echo Developer toolkit based on Python echo. exit /b 0 -:: ── 清理函数 ── +:: Cleanup function :cleanup -call :colorEcho 0E "[信息] 正在清理..." +echo [INFO] Cleaning up... call :remove_pid -call :colorEcho 0A "[成功] 清理完成" +echo [SUCCESS] Cleanup completed exit /b 0 \ No newline at end of file diff --git a/start.sh b/start.sh old mode 100755 new mode 100644 diff --git a/store/@{Falck}/html-render/__pycache__/main.cpython-313.pyc b/store/@{Falck}/html-render/__pycache__/main.cpython-313.pyc index 7caa9877260d0ae9dbe74ea3fe1c01bdb7f1b494..108a6d0e131ed55e0205180e32efcd10f9056694 100644 GIT binary patch delta 20 acmZp(X|v(}%*)Hg00ct5Pd0M@mIVMfXhRC%*)Hg00hFmPd0M@;{gCPiUo53 delta 20 acmeB_>XhRC%*)Hg00f4rk2Z4u;{gCPVg+Xa diff --git a/store/@{FutureOSS}/code-reviewer.disabled/checks/__pycache__/__init__.cpython-313.pyc b/store/@{FutureOSS}/code-reviewer.disabled/checks/__pycache__/__init__.cpython-313.pyc index 4da314b448dfb1ca9b5dd748a35953b0c7ff4860..5bf29df23178e8b85b7a218dad408bfb48ad7571 100644 GIT binary patch delta 19 ZcmZ3-xQ>zgGcPX}0}u%LKAFh97yvLh1p@#8 delta 19 ZcmZ3-xQ>zgGcPX}0}vRhKAOnA7yvLL1o!{| diff --git a/store/@{FutureOSS}/code-reviewer.disabled/checks/__pycache__/quality.cpython-313.pyc b/store/@{FutureOSS}/code-reviewer.disabled/checks/__pycache__/quality.cpython-313.pyc index 74e45e56532b646a0a157b4d135ce55c7f47ec20..20cbb6bbb782d2792500840f0c2e7365ff6fb0fa 100644 GIT binary patch delta 20 acmZ3XvO}A^ECyi! delta 20 acmZp#X|Lh_%*)Hg00f4rk2Z4uu>}A^3kFsI diff --git a/store/@{FutureOSS}/code-reviewer.disabled/checks/__pycache__/security.cpython-313.pyc b/store/@{FutureOSS}/code-reviewer.disabled/checks/__pycache__/security.cpython-313.pyc index e4a4b606f65f4061966188a2c1a74026b485c2d6..6b58e98322c11cec77d207a81d540370411ec0d0 100644 GIT binary patch delta 20 acmaDQ{YskqGcPX}0}u%LKH129pBDf^&;}R) delta 20 acmaDQ{YskqGcPX}0}vRhKHA8ApBDf^uLcbO diff --git a/store/@{FutureOSS}/code-reviewer.disabled/checks/__pycache__/style.cpython-313.pyc b/store/@{FutureOSS}/code-reviewer.disabled/checks/__pycache__/style.cpython-313.pyc index 34d140e8fa8527cd9d88b1531e313d6d49bed180..753bfc8686c4849ededa910c0f2dfa62f399db66 100644 GIT binary patch delta 20 acmaDV`c#zrGcPX}0}u%NKH129iwgijGzI$r delta 20 acmaDV`c#zrGcPX}0}vRhKHA8Aiwgij3zgGcPX}0}u%NKAFh97yvLn1q1*9 delta 19 ZcmZ3-xQ>zgGcPX}0}vRhKAOnA7yvLL1o!{| diff --git a/store/@{FutureOSS}/code-reviewer.disabled/report/__pycache__/formatter.cpython-313.pyc b/store/@{FutureOSS}/code-reviewer.disabled/report/__pycache__/formatter.cpython-313.pyc index 252d63b7907faeda570f85c279b81f73bd0c024a..2519a6bebaa0874ff622f09c035e7e19110701fd 100644 GIT binary patch delta 20 acmbO(H(ieVGcPX}0}u%NKH134!wO$4X_ delta 20 acmbO(H(ieVGcPX}0}vRhKHA95!wB?O!R diff --git a/store/@{FutureOSS}/dashboard/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/dashboard/__pycache__/main.cpython-313.pyc index ec210cfb8e07d7f3138ab4ca15fdad0e8d95752c..dfc4c997e5845306315a086523c9fe8088dd56fc 100644 GIT binary patch delta 736 zcmY+AUr19?9LLY^p51%5>;9x;Zr4q>*;1xqO=G6Ebfx>FZZvOuh=P(eK`@o$MnzE3 zL-^L8gVm$KAcMfd7b6J5oc0n^5@h%g5kYSoGXm?ObA5<9hx7e?e;*D%ethS1u#p2p z#bA&SJLcHe@y%BT{eV@+I?P_hqd{m6DKLqX+z8MI{<@{X0VgLK6`LY=33MVXLmj;v zb|17SrI7}8%KyiR6h{YcKn>`;o|ca}=(lhde$xvPH{|He$OovWk!U;Y(HqgQzbKOQ z^u%Z?{hTivQ=`+FEJcS)f(G2bFGp7%+ilYBk^OxFM+CcK8b!@Zid z0H^w1DWVtGb*f*l0@dp=^QnKM`5W;gM&}UCG&Wj~u%r{9aO`45qwtE*B}}3ueacxl zMWl-{H)!cbOg^9;LjmkWW8l@ry_m>!FV@&v%M#d+fjCshvAN_96E9CZDmbJ{lPb+L z5D)tLn4MABhuf&6;dSy(jpK3K!?sO#e<69UaOrYka%$UqbXhKAF!#gk>Cg08+*j@I zL9d|)y^(@i{7!_RcIkUO2R=J*nO91Pm6vDt%W`U0?MmH9s3~y*FF#3D5GxhTK!p?N z+cQyFU4b;Ki+Y$8aXfvMoMJ3ST?sq%&=Uz8cxW<_5L8O~=nDo0=xUIjqK1Wm(~Q*#Rnz{J7v|u(B2@J4!Ex|6_BxO;w z>7VS4_gZILKX^}+(q~I!7fZRTtM>fN;5x3Sf_0rC@&ZESl^T)hYY8Iqg6rfw1YMG& zFj^+eo}JmYmzgT>$~{E3mjy}E?`JB6S%orC5hVO}Dz5kQDGu-f{Y*A!YJAc<&R7CX zvjIYQ#dLxXZ<(gdsnw6485qQ$X19M*1pQ97O1N)M*a$dEj{T2zeIz{<8K7zV*S~F) Bq?G^w diff --git a/store/@{FutureOSS}/dashboard/main.py b/store/@{FutureOSS}/dashboard/main.py index 979b0de..ce50094 100644 --- a/store/@{FutureOSS}/dashboard/main.py +++ b/store/@{FutureOSS}/dashboard/main.py @@ -306,7 +306,8 @@ class DashboardPlugin(Plugin): f.write(f"\n{php_content}") result = subprocess.run( ["php", "-f", tmp_file], - capture_output=True, text=True, timeout=10 + capture_output=True, text=True, timeout=10, + encoding='utf-8', errors='replace' ) return result.stdout if result.returncode == 0 else f"
{result.stderr}
" finally: @@ -319,7 +320,8 @@ class DashboardPlugin(Plugin): @staticmethod def _get_php_version() -> str: try: - res = subprocess.run(['php', '-r', 'echo phpversion();'], capture_output=True, text=True, timeout=5) + res = subprocess.run(['php', '-r', 'echo phpversion();'], capture_output=True, text=True, timeout=5, + encoding='utf-8', errors='replace') return res.stdout if res.returncode == 0 else 'N/A' except Exception: return 'N/A' diff --git a/store/@{FutureOSS}/dependency/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/dependency/__pycache__/main.cpython-313.pyc index c38b9c8ff71cbc4ba3a0e7941824bc954c03ecc6..4b01bf312698a3d4b8f7dc14a4e76cd1403f0236 100644 GIT binary patch delta 20 acmX?Pa>#`HGcPX}0}u%NKH11^E(HKTC#`HGcPX}0}vRhKHA7_E(HKT00mS4 diff --git a/store/@{FutureOSS}/hot-reload.disabled/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/hot-reload.disabled/__pycache__/main.cpython-313.pyc index f19214feb685df3ea2d1c524ef5075f6c8ad7f11..af1cdac1ba2e14e0cc019c09b3246b21db08ea16 100644 GIT binary patch delta 20 acmccTd(W5qGcPX}0}u%NKH129Sq%V47zT0x delta 20 acmccTd(W5qGcPX}0}vRhKHA8ASq%V3@CIf8 diff --git a/store/@{FutureOSS}/http-api/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/http-api/__pycache__/main.cpython-313.pyc index 6ca874ebfe8fc5adbcd820e9b87f2f59e443745a..f6b06c5d86a892c05179f4bf0b8a0db3b59ad6e0 100644 GIT binary patch delta 20 acmaDa`CgLyGcPX}0}u%NKH13qga-gaRt6&g delta 20 acmaDa`CgLyGcPX}0}vRhKHA9rga-gaE(R9> diff --git a/store/@{FutureOSS}/http-api/__pycache__/middleware.cpython-313.pyc b/store/@{FutureOSS}/http-api/__pycache__/middleware.cpython-313.pyc index 3307c169fb5b2c31f31f31431a19eaaf2949da35..f92c55ab9806583ef07177495d1376ff1ab3c76b 100644 GIT binary patch delta 20 acmZ1@yGEA#GcPX}0}u%NKH12X&+a}+TasmLC6(H0A diff --git a/store/@{FutureOSS}/http-api/server.py b/store/@{FutureOSS}/http-api/server.py index a7a4876..4496efd 100644 --- a/store/@{FutureOSS}/http-api/server.py +++ b/store/@{FutureOSS}/http-api/server.py @@ -104,7 +104,7 @@ class HttpServer: self.wfile.write(resp.body.encode("utf-8")) else: self.wfile.write(resp.body) - except BrokenPipeError: + except (BrokenPipeError, ConnectionAbortedError, ConnectionResetError): pass # 忽略客户端断开 def log_message(self, format, *args): diff --git a/store/@{FutureOSS}/http-tcp/__pycache__/events.cpython-313.pyc b/store/@{FutureOSS}/http-tcp/__pycache__/events.cpython-313.pyc index a69b322a888d372dcd6e41284a801d14f40f6024..296ad48549625929d3b555a8a682908c90f878e5 100644 GIT binary patch delta 20 acmeC<=;Pr2%*)Hg00hFmPd0Khvj6}v!UR?T delta 20 acmeC<=;Pr2%*)Hg00c&=k2Z2Mvj6}vp#)0+ diff --git a/store/@{FutureOSS}/http-tcp/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/http-tcp/__pycache__/main.cpython-313.pyc index dddb1a01efff956c1d150592fb9f7b497b52df85..3c50217fae8dc696b6cc49bd45ce97c20398dd54 100644 GIT binary patch delta 20 acmZ3=x0H|jGcPX}0}zP#KH11E#SQ>9JOrx% delta 20 acmZ3=x0H|jGcPX}0}vRgKHA7F#SQ>96a=3D diff --git a/store/@{FutureOSS}/http-tcp/__pycache__/middleware.cpython-313.pyc b/store/@{FutureOSS}/http-tcp/__pycache__/middleware.cpython-313.pyc index 938c0e7dfd270cc75a7c0b10052c0ed3ae0745a8..c841a699aad33b2714bf410708a460a590c03660 100644 GIT binary patch delta 20 acmX>ud0dkFGcPX}0}zP#KH12ud0dkFGcPX}0}vRgKHA8=hX(*W^#z~+ diff --git a/store/@{FutureOSS}/http-tcp/__pycache__/router.cpython-313.pyc b/store/@{FutureOSS}/http-tcp/__pycache__/router.cpython-313.pyc index c26601e7c31cb6fa28ad30dc4f811bba54ad1790..b6971e47de2041b8af10c668d42427939fc2d7b6 100644 GIT binary patch delta 20 acmZ3%xq_4XGcPX}0}zP#KH11UmjwVd{RJlg delta 20 acmZ3%xq_4XGcPX}0}vRgKHA7VmjwVd)dd>> diff --git a/store/@{FutureOSS}/http-tcp/__pycache__/server.cpython-313.pyc b/store/@{FutureOSS}/http-tcp/__pycache__/server.cpython-313.pyc index 3a842fcb1abdac201e7388e8eee983938b7d9731..d4819bd6fbb5fe7eaece32df5a24a0934d909eea 100644 GIT binary patch delta 20 acmX>UawvrRGcPX}0}zP#KH11^t_1)?zXh=X delta 20 acmX>UawvrRGcPX}0}vRgKHA7_t_1)?mj$H& diff --git a/store/@{FutureOSS}/i18n.disabled/__pycache__/i18n.cpython-313.pyc b/store/@{FutureOSS}/i18n.disabled/__pycache__/i18n.cpython-313.pyc index 6b610204be5d995693b86e6c4f5e66982c883006..214108e14aa1c8f47b2f5e74ffc53fd8b9690785 100644 GIT binary patch delta 20 acmaE7`OcF2GcPX}0}zP#KH13qSOx$`#RhQz delta 20 acmaE7`OcF2GcPX}0}vRgKHA9rSOx$`od#t9 diff --git a/store/@{FutureOSS}/i18n.disabled/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/i18n.disabled/__pycache__/main.cpython-313.pyc index b1a087a6e5731caf21cd2ea0c1617609b6173092..8fe0147f0f46f28455c5a570434f16a3dc418e55 100644 GIT binary patch delta 20 acmZp2ZF1%Q%*)Hg00bhwPd0LwD**sFn*~b% delta 20 acmZp2ZF1%Q%*)Hg00c&=k2Z3bD**sFa|J&D diff --git a/store/@{FutureOSS}/i18n.disabled/__pycache__/middleware.cpython-313.pyc b/store/@{FutureOSS}/i18n.disabled/__pycache__/middleware.cpython-313.pyc index d7018644411b4dc4ecda4426303594d687077fa3..13f70190affbf444afbf9d515f2e83f8268759a2 100644 GIT binary patch delta 20 acmdlYzeS$=GcPX}0}zP#KH12<^~f0 delta 20 acmX?Web$=$GcPX}0}vRgKHA8ANEQG>z6J*X diff --git a/store/@{FutureOSS}/log-terminal/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/log-terminal/__pycache__/main.cpython-313.pyc index e8de1f394624c2681b5ce2e2e84ccf3b6c7740db..8c8751d8d0e87818249a08e6140b5bf6def929ce 100644 GIT binary patch delta 417 zcmbPmk8#UAM&8f7yj%=GAmaNZbLmFjGs&WyKpry?e^y~(V3^7f%$Ua<$~5_bl*nWU zL5|H_De_G0e8G~zQkHC!b0L#(&Q-_ z`m9Adj0_Bu&t%+ZJU@9&=2=F*$yHfyd^aQ&R!DwiXA$G;aQnbD`D9k0usj2w@l{@< zU*EYHgv_rBn*IJFFM=2uspXrBg0`W2{#4iBTSC`K+aKND>p-?WBgohvh2qc zxZL#Ek7=<3#g7?sx!JKEvt0HijAfT5=sKx~?>njX4pV=50<%^Vnz6JnFid3#X3S#_Wt#jzN@TKw zAjf8|6nQ3QNlTW=25FLvQj@*X6d9!_=cGw;$`~`tF~~7Q^Gr6dmzlgOt(5WCWQBA^ z#zm8z(oZtVPUgwzVk+7`d3%OF=PmZ4)PkJE_G8j`dn@{tjDYwL8LvS2QTw+Mk{w)mgCk; zAhs=+2N(MZb`bjnCnJc>#q7bmnIq>JqnI?S=z`!63_xl_2$uoQ$F~*uF4;=#L4LW%I=W#&Ba$ diff --git a/store/@{FutureOSS}/log-terminal/main.py b/store/@{FutureOSS}/log-terminal/main.py index 73f00b9..afd2c90 100644 --- a/store/@{FutureOSS}/log-terminal/main.py +++ b/store/@{FutureOSS}/log-terminal/main.py @@ -589,7 +589,8 @@ class LogTerminalPlugin(Plugin): f.write(f"\n{php_content}") result = subprocess.run( ["php", "-f", tmp_file], - capture_output=True, text=True, timeout=10 + capture_output=True, text=True, timeout=10, + encoding='utf-8', errors='replace' ) return result.stdout if result.returncode == 0 else f"
{result.stderr}
" finally: diff --git a/store/@{FutureOSS}/pkg-manager/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/pkg-manager/__pycache__/main.cpython-313.pyc index f68ca7fc12b8573a23fe7d7edf8019169c0f86b7..e12be4433a73cf90dc8d287f1d52d9693aceab71 100644 GIT binary patch delta 2404 zcmaJ@X>3$g6rMZFd+ki8tX-xp(*>sGl|m~^u~U#m+ERoDD1~SWP1|{Gr^^hvZ-zyJ zAjl$Wf*#QyMXW5L0wv&Ufnbo56e&iuAP7FuqzEPk6DlCGS-s~zU_ix5=6mO!bMAMR zd*034f1Y%mC-xh5yVbyc17}?JX79Jpjke;_#Qrz7s14DVjrNG*=;D|h(HBt?F*^xn zMGgd?Bbmg)Mu$Uij50Y5PIx;u3BGm&$oH`Kg(PE96I8|RAaM{8ztN_NR9;wLUMWig zY>7{_(;%bP1esDlRp3bcVX_>SB)m(mfql>|(g)1WX#*}elA0Yoq9J-nkHH)rxjw(g z3Z>3j1CkAqqt4k!-u=UB=s)&czwCQGanSC3ex}pZG14|wG<1xQEyy$-kD7#w&r{q} z4aO5rYe9y1BGXzhUObT_GJU7PIMrsd zoCs@KqI4ZpB+Vl4sjW%#h}4Lh%?KYbkc^t3RMyB1<(gO-q*V3=^63_|Ho@qWf`|KG zO&KIKqxNIio-&R!s@*BQWWtkFcWuj3{Biy*& zg>GXq-33n9h}3l`u0a=px=`-VKntr?{JydVzejg%0qUAWcBrkc?PSoCQ6FZjGwgz3 zniQiKjT&=^leR!xS{~V_-b?$7NFQM+o(8AekIPRG^lVvEYJvf8Jxg+M`p~g$XnDl? zuXO2WXm4SlSr^s^tG&K5kC)Peuqu5VIiMa*zd~G3%{mm89)Xh?gKeQWZSY}Ql&}NI z4?_Rp<4K1)b9jl7b7@9@9X*1kP}<>ojw))m!55i>lX-V}_PoVmkG11~?iHC8Lk>b} z)@1Uf>diV79?QdXir1NkCV1pZzelERkmFup`wmqmpMNpk0bAWe*v=E~4B;43wZI+s zSkeK{+k9fZ3G_YnR>*aTOnCy-kZHY1G`t64MZEaV&5JbUJfZ_&z`N28RDa30|T1Iflu zg?CjGy#blB!_fqh*a$Nu`K;C?>BU1Q--a7J3vHd`us8jao6D<*|XqP?}A@vqQa6EKJS2qL;KA z?!PFJ_tn&wZWCcQ@~(yVi#pjf+R zu9KH4QlH1V$cH%Lavj+DK JfegW3(H*p_}t(5opZjw z$2s@5yN4X?UUjo66UZSTtfm9F&B-3N$jF z4`-t!XekLL5pXDSC%FpobK=P^s4;&*B4LzeD<|rp)e;LmmSbccY>(POZbM4+eG&pO zG4n$DcuiPRpGF%N(v;U11nXi-UWwI&OuB5!eDuJm8Iyf^bk^g(2Ft1|4y>{25$llrcY5-zTiE1~-@E&+(+ds6D5*6=-$m z3CHa7TCPB^KhN_8Mv2B6i102em2QT{xDxWAbTMuT5qF}e8SycL$jO4YqS{&Kko6UQ zN}ct-Jo*XF?t;>U{O9{WONbWsqIVyhPMAiTk0w4PGlwfZ3SO7saVOY()bD(o?qZ8? z4G^}Y9HSU1CL;5-9!I5@wxH5}m~KrMHlw)--msbl#oG$oth2}->7sQHi5?!{d0wa| zu^eEbj++iGkg-{b?L0}V(yRkv>2dgLd}4AS zjuKW0Hnfi27_1E@rcEcOB~RKSPSKV*kDDIHsX!S9HRmJfZGl@8662M|24sVV)bO>s zDlH?Nw1GWiHtCX@GTIFhN;-l};+bQrq(29&~BzJ!|N0_}-SpcK&G_ zFPucFR*1;SCa0h{XB@dItB%(J>lzu>e1(S;a=@FIRfTwsuOD_yltnvN#7 zrkr-e$=7nGC|$;gG!7^DIyZLt3OXVX!!xBa`hJ56_DEq1noUq-j~}NLkB3Yf5Z^M0 zqt!Ox0n!YF8VQ>1X5l7|8{wEeb0jcR)_eWsgQxr09!omFk|&Z>$)2~FBTuBRxeeM4 zFRO1My@O&{Anik7ee^D(n?W>DrMUku=pHU#jOa(Gm7z7jAcn9?a@jzs;wieHAf6!< z@%w10HKFwY@euJh;xPiiSQteHAf+&cERg0Gx_R<59A8kJdK#>1TCBW#=_|bOL+MCTC&{HZNS2m;ZbWV{ zIkw^XHz9D^7}cv|Ky6j|I^0{7O14PRi$5T_ih?enKm{gA^{6}eUMgA!^!|s|3Anu^ znY=HJUb>G|@VJPwSn7@UF{?=A=?U~SAYL?$24Mhx$kkN36Rduh1HJL`Y#U}inEC;* zEECB`l6~1jA{;=;MwnBU8mi>DmyPA1O6N+4zt-oa+hAi^E;-0{L_u$viL^*}%Cbn_ zA>1_{5z2BX616lI2Vra=YrRh2u(GG%l$lNatA$6wwOkDT5+`hINrMK`UyqiKE&owR zbkI~0LoUF+iZ?gBta9~^_o8?VVj-dwk;o)zBeP_EmDA_&`6%6pehUIG9=mQXua9Ew zvd-;X>lH^1>7sINlTZWuIf5F|R4*AEthA6s=%~yg?Z7!F5J}2(uI9)lI8c=}BN-Q- zQbfx=o?6<$OsYi;An-EM>jJ+J3B-}Lc2p#y2YuNG`4<$ JkQgP2e*g!WT5$jX diff --git a/store/@{FutureOSS}/pkg-manager/main.py b/store/@{FutureOSS}/pkg-manager/main.py index 81020f1..fd07ce5 100644 --- a/store/@{FutureOSS}/pkg-manager/main.py +++ b/store/@{FutureOSS}/pkg-manager/main.py @@ -134,7 +134,8 @@ class PkgManagerPlugin(Plugin): result = subprocess.run( ["php", "-f", tmp_file], - capture_output=True, text=True, timeout=10, cwd=views_dir + capture_output=True, text=True, timeout=10, cwd=views_dir, + encoding='utf-8', errors='replace' ) return result.stdout if result.returncode == 0 else f"
{result.stderr}
" finally: diff --git a/store/@{FutureOSS}/plugin-bridge/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/plugin-bridge/__pycache__/main.cpython-313.pyc index a42905d0189dbcafb73866559c37c7130521e458..fc3f36a995a4d7ea2cff208201ece3c14c0b58f7 100644 GIT binary patch delta 20 acmbOpJw2NHGcPX}0}zP#KH13KqYD5(1_i+Y delta 20 acmbOpJw2NHGcPX}0}vRgKHA9LqYD5&-UYP) diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/__pycache__/main.cpython-313.pyc index 519786d628c07ab9c05c012f7f1df55835a1731b..56859ca7b44a2b10a2c4d10303dca01abf2a2210 100644 GIT binary patch delta 20 acmew({YRSnGcPX}0}zP%KH13qkrx0(wFXfD delta 20 acmew({YRSnGcPX}0}vRiKHA9rkrx0(jRr*k diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/circuit/__pycache__/__init__.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/circuit/__pycache__/__init__.cpython-313.pyc index 4fbec5f37401899cbb03481afc532ef5d7fd38a6..41291437f57c7be81eaa17c78fb574fe2ed29a67 100644 GIT binary patch delta 19 ZcmdnYxS5grGcPX}0}zP#KAFh90st`m1rz`P delta 19 ZcmdnYxS5grGcPX}0}vRgKAOnA0st`K1qc8D diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/circuit/__pycache__/breaker.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/circuit/__pycache__/breaker.cpython-313.pyc index f0e5b8aa3abeb37db254b1766b5f7e3d3f44fc7f..8d72e34bb264eed2fe562c9b16233a85b96e440d 100644 GIT binary patch delta 20 acmew>{a2d%GcPX}0}zP#KH13qi5CDx)&^4m delta 20 acmew>{a2d%GcPX}0}vRgKHA9ri5CDxt_DW{ diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/circuit/__pycache__/state.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/circuit/__pycache__/state.cpython-313.pyc index c3c701bdfaf10dab9adecea05f5853452fedefff..ec343264b0fe13b4c5c0f0b18dfbc9efaeaa0019 100644 GIT binary patch delta 20 acmZ3(vWA8GGcPX}0}zP%KH12v$OHg1?gXd+ delta 20 acmZ3(vWA8GGcPX}0}vRgKHA8w$OHg1zXY2A diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/core/__pycache__/__init__.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/core/__pycache__/__init__.cpython-313.pyc index de50d1d3c20f80f8dd3198dc65af2f7a7edcfcd7..058c22f6a876d78f10f5b2a8655d53000456e1e1 100644 GIT binary patch delta 19 ZcmdnMxPg)TGcPX}0}zP%KAFh96aX-k1q=WH delta 19 ZcmdnMxPg)TGcPX}0}vRgKAOnA6aX-C1pfd4 diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/core/__pycache__/config.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/core/__pycache__/config.cpython-313.pyc index 6f6ed9190668d227e6c85f993bc172a57b23cdf8..9e16a340697786d581e0d0809b576add11430fb2 100644 GIT binary patch delta 20 acmbQHG);;7GcPX}0}zP%KH134EeHTL#RRbc delta 20 acmbQHG);;7GcPX}0}vRgKHA95EeHTLmIR~# diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/core/__pycache__/enhancer.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/core/__pycache__/enhancer.cpython-313.pyc index 2ec0c1665d9d47c87267de672c1f2c4319ef76fc..32b0fa32f295003922f3e35410fb72964175db38 100644 GIT binary patch delta 19 ZcmeB<=#Jq2%*)Hg00g4GPZo0P001_n1qT2C delta 19 ZcmeB<=#Jq2%*)Hg00c&=j}~(4001_F1o{8~ diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/recovery/__pycache__/__init__.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/recovery/__pycache__/__init__.cpython-313.pyc index 6935652ac267899f7fd587caf5cb4ae29069265e..62a896bf0b1fc9ee816044e4842a56a52df26e33 100644 GIT binary patch delta 19 ZcmdnOxP_7XGcPX}0}zP%KAFh95&$tM1sDJT delta 19 ZcmdnOxP_7XGcPX}0}vRgKAOnA5&$s<1q%QG diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/recovery/__pycache__/auto_fix.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/recovery/__pycache__/auto_fix.cpython-313.pyc index 55d3e7ba2312609446f833d82d077d3a88a30521..58f15d09551992a4ddee21662ae279187fc21604 100644 GIT binary patch delta 20 acmeB?>5<|7%*)Hg00g4GPd0Kh@&N!dS_Fgu delta 20 acmeB?>5<|7%*)Hg00c&=k2Z2M@&N!dD+G4{ diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/recovery/__pycache__/health.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/recovery/__pycache__/health.cpython-313.pyc index adfc640e8763a8c98f92fd2c4032dfee4fdd2fd5..4ffbf3cafb9c5e90194ecb2bedfae788b74f087e 100644 GIT binary patch delta 20 acmaE+@=S&MGcPX}0}zP%KH10}Ed&5Ujs>Ow delta 20 acmaE+@=S&MGcPX}0}vRgKHA6~Ed&5UUj>-} diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/utils/__pycache__/__init__.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/utils/__pycache__/__init__.cpython-313.pyc index 8a02816527ca5ff769e3910dc4fb6858d484d6b6..5e0d4d0d3bf369a774934096d8dbaffc75241b05 100644 GIT binary patch delta 19 ZcmdnUxRH_jGcPX}0}zP%KAFh93;-~>1rGoK delta 19 ZcmdnUxRH_jGcPX}0}vRiKAOnA3;-~l1p@#8 diff --git a/store/@{FutureOSS}/plugin-loader-pro.disabled/utils/__pycache__/logger.cpython-313.pyc b/store/@{FutureOSS}/plugin-loader-pro.disabled/utils/__pycache__/logger.cpython-313.pyc index 3ad8bd968b321ff31d7847f2e56314a9aba97c34..6cec58f304127fdb2abd20352bb6093d99a89d1a 100644 GIT binary patch delta 20 acmew_{a>22)iF`1r8~dRVD(#1|SnMll(|d+mQj^{fzkBAK z|J-xufA4&KLg*V7Vt+`!O^+NNlRc)o6@LGR~P{AIlqAz zyyp6B#Tx=+L58gZR`p`#w}4}Avrq{*?M@YvZe!S8Y;)$Y&y$Ot#q7&O`%0IQ-N-RG zZQ_khKrA-6qQxma5RC?xO`KZ2##JOv6-h3ex~(c*02%$&-4KuS)iRvIH8r<{0#GA0 z1)%eavJQW#mA973I)#4;Q$8l714jmjEGe~=h~{xv(sr+8QSltl1|$v(4JDOCChYKJ zt+>j|0R`Xpv`Y~qi%Y`%L9>v@@O_QH+3=ORZ|5or zGVy3bmT(u;@rDXf_zP5NccBE&qOG-H?K6Bu*|^*|EVeZIlu^EzV#og04dB4Z);2Jx zPx(@Hwp^}Orm3jy^hq9Zk2N>*sZ>s-I~)NW$Fhs%=*+wiBON5yUpNL>$=?lemwK`Japj5I}7j@_6I$Xjdy~LZZma^ zCzuFvgakq+p_EWbXs1n;Q)DO96Sh#Ufua$LngJJ*lkrT?7e#iEo*vD7z-W$?2?GX!Q^abJlFpV!7@sa|S)}QHiXhd%eLbGs_ZtN9*#6Pza8zr(uio3JV99|UuwOlK zAPzRgP@@uR^aml99)IVNEG~Jc)f0I(K-ZPqwsiOWc(*qfLKxpyDdYhjUZ0|N^m(DK zjo$yiHJ6W4@sW;PdU!^8|Gua-`|lY!@z22&soB@O=dikcUMb{Frm7Cyq%q5LH6JG3rKdUC{w-vv|691bmA;(<3C$2yD(TzXo~o46cce_E((_kS5(VEy(&}EQKtt7fcmZ9lzDrS*=kx&s zRM*4sYB90UJ09~6#>${iUQ!~qN+z@!0kASP3}UGSkpdXE1K{9W`KYR9E99e|n(d+% zN{s8&!qYS8W{tj%i^gus^gNEnPPr?Dq+kh`iiuvpS%@GC^NUQlU|a@KUc}Nx0WMi% z(_wBAHaP`Yz(zhUfk0%)U`gX&!^Tc8YOr+dUzGqw{7BEdJoR-!KrA0F87%ROHFIK3 zK&2gP9BurgDt!b76w0yu(fqMOR5-nDy8CRgKRJIcIp3dLIGug_QIE9`zD|rsOUWjA|wMcSY3Tf2QM(QqSNcUT6t?J#{i2ckA4EMi1E(y@E)4T9!9`Q43=2=HS#q$8PR2%3a0{_ zlsuwBZ`%@b*K@(~P2n?PiQXEG9Wf>|0OSN%8H>2^EdXqqaJG0!iP(9JmBD#PH|EhI zB)>@fbZip)B*hjX?!maVTyPJj;0OY2>Z{+B!&qciK@7;Fp4jVvMd%Qe3R;AbaYJv) zQA+LR{-bf>Q@!$adjn_Op>h?#~VdKN!c0 zd+0s2eATmj{k4rKee{NAy^4{Gf;OAO)?(*4k`_mtE%Kdq8+YjY+!ivSkJuetdD!x> z!`Wp!a)g^BmIh4p!bp>6;dRw6N=Q?OZ5)T}krr=j;T8p)-RU~gkAF--5a#piW!|xCLH% zw)`WByU(}R=F9%xg7Q!xJ!8cD=hUomAqGZpZsTm-^@eK=vu2-R|AN{S&?Haop4dH; zf2sK0V!x(fUQ-azX3ccYX>)&KUJ-z_Eg=z5XUxRT$7hC}^poiBirIc&iP>lF^clFj zYG;TB>a0)_P_nCAK(uVwIA|Pc^rctdl^pnXRRENmz5x&~{+>)R7Bw0*p5xnEdL!wE z!k4wzFDsjqmHjhB6a6D+8ZNrGG<~lM{5qvH3lBHtdQ5MrL}e6xOZU{?VgY@tn86eD zvOdo9pIRvml_;ieGyKxCvo4l_X=q3VmfaXia$2^pYnh zi!)#WH;qGbW>nO?16CuhxgBoteBPYEgGK1yKS<#3CMM;m?}a#ut3^9nGoaPe(CQ;D zvpX}P0e!dgC@et>od=*9rQNJ!@xvAPHY)0_ zg_&ry+iubl=L$k(gv1h}BqWUxa>lqiLOMu_wS+Sh;vi%Xk#!R84B=jcXeB-#9X$Hm z?ax4_a6090fQ%s{rC^fXyj6gQP^OGg%{&_dcyRAoCBxULo0uB-bqT6H_ANYzOg+;K zmy4aEzxOo2cRaPdGMFDjf)tY=j|h>H=|3>1rz7na)~m48NgiI@GLdfSMU#Em@O^Zr zuaYW(Xf##r$?b1}&mSZB|L1eV=8!ZvQX%}Jhu`j!bznFc{*x5$&q%cA&{xN`(Bl!m z+yGTQ#B%)t2``ANLuXGY`PEpns77b|6nuPna9zJa?pJQWR@8YSlOGP~AZD-)dsCCY z2_1LP{E2PiaL!?`xkx&okLx7?dPy~&BOLL{wS{*;)J=Fo&Y|{!JlKuS5A4G9F9TZW iNB+rw; diff --git a/store/@{FutureOSS}/plugin-storage/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/plugin-storage/__pycache__/main.cpython-313.pyc index 39e69779f75b8c7b9ef824ac97976875473f874f..99b09b988a6308b3e09d2f5b29005a032d49c769 100644 GIT binary patch delta 22 ccmcaKhw;)JM()qNyj%=GAnN;MBe%OB095-1m;e9( delta 22 ccmcaKhw;)JM()qNyj%=GV66IRBe%OB094Zki~s-t diff --git a/store/@{FutureOSS}/signature-verifier/__pycache__/main.cpython-313.pyc b/store/@{FutureOSS}/signature-verifier/__pycache__/main.cpython-313.pyc index bc65e0c8f6232ab52c766016bde862ce755ab9e0..92aae8d7ace8d9efc85f2e8b2204feaa830724e5 100644 GIT binary patch delta 22 ccmccE#CWlZk^3_*FBbz4i26R+$nE9`08q^aQ~&?~ delta 22 ccmccE#CWlZk^3_*FBbz47^^zyGO|o==MHCNoqV6$k)JJ?-INKUT7e;*XRkj3*;U{SW5#A7!6+ui+|9YdMU0Gv*jD8dMn?S! gYF`*Y^v67A21d~du?xJfFc^GhV`P*p5(nA`0Kx=26aWAK delta 298 zcmdm?_gatlGcPX}0}vRiKFWNvk@p&x$vQ>`hN%p}jCqXFKo$f9Gnqo!NMg(|F@2`V z%-pt&ER!9%4H;P{7juU*vQ0kC?I^$=%wfs|F+qVLoi}vy1y<3?hCHH7Y!GHFkEkGL zFjp|Q9#b%nB{N8kCg0>{o*HfuJ^hr#l0^N2?DWlFc+wd)cL9xQVEDksAftGJL*faK zzy(45%RB~mKn(TEJQ^QZnZ>v|xIS}iuI8J@$e1`;NZ<@(=H~kXQA~_^o2`V47#XWJ zuN6^YWEE%S`(!lvnrJ6u^W+4vt;(g0jQSJQzA%93j|I#OjG_}_7kFP`F!;>I$S7GP H4zw5mNTfzJ diff --git a/store/@{FutureOSS}/webui/core/__pycache__/__init__.cpython-313.pyc b/store/@{FutureOSS}/webui/core/__pycache__/__init__.cpython-313.pyc index 07feb995f2ac6a262e25c7b8e695b63f79f18f8c..6683f03e86c4449b1cd6235e2f64d8d27b0e54f4 100644 GIT binary patch delta 19 ZcmbQuIGd6CGcPX}0}zP%KAFfp0RSzF1kC^d delta 19 ZcmbQuIGd6CGcPX}0}vRiKAOlq0RSy;1i=6R diff --git a/store/@{FutureOSS}/webui/core/__pycache__/server.cpython-313.pyc b/store/@{FutureOSS}/webui/core/__pycache__/server.cpython-313.pyc index e411ae8e0d54a0506fca3b567fa7bfdeeabfed66..5b5f93dba068004b9ee32582105d904e4e44c28c 100644 GIT binary patch delta 743 zcmYk2Ur1AN6vuz(Zo4-&@8;YeopWvK=KqE^G8~CTGUzTJ@@7IlIlG0W89&P`0?|r> zQp*zr1`_nrOORX$dg~?ANsmPgdWd=~m`U{SrQf-GsPphS=XcKc-0$IT^nL16cU0BM zL{3Dcf#_FUq54utEmt$B3^MeqoQ#gfQ;-Zn_EzH!h3~j~LA|UiBx+2E_*o zvcdTTpTt%Fl7kP4j@cRT04$i9pbp^2l}gS1J`{Tr+E(mA_pMB^48K+``Z}09^-kUU z`$sve*#Fks`KK7i#j2yZZriIamzHGf_A1R|Tdz4(BOb52(ppT~*hhm+NNbJKX17x- zQ}Q0C7E$scMfCGANsBx3jgr>t$R{D2vgO;;**5!DizMo;HYwY#Y$YAplzAZ3A@vT6 zOL>lPn9xL^>-ibN2toWk#>WMk9o$Rx48dAVQ8kTgVV_K@LJ%Pugemi5_^C8AOT&JG zPM9NHC)^Nd-c@q794uGM#yaAkzvXH#xz5unxfblB7me{ryC`EKcm)kk(;z%(Ov*OvZe6U z*T8*jtIxq*T&jN#4=@w&fEApMKZFtVCmLPW)rNHeW)kfh;A jJc-+hUe_uqCkSJBu;Cay#^r{DSC`-td}CJP0WtjxuE4Xy delta 695 zcmY+AO=uHQ5XW~m*`(dL(KOAsr1|K^Cd8&OU~PIRVo}(%U=ypA3USkhKp7c-c}9N6wi($8lQqS^aqI+G(oQ*Z z0Crq=Dea#GgVVZnxG7?rd)c1gtf@EBzVEGFTu1+F+x{QT5I%H|6b22?1}sXP+cdfr z$*{TmpqCw<_oo#7lEh~~N^Dn4`FWoGrdpI1UcUFMajP>(|bSglU3GC=esGqG?x%0_ZxP+zxNW~k zqj~)0cS8|fT>)6o4s^W)Q<>^BXbE