hubstudio-desktop 0.1.0__tar.gz
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.
- hubstudio_desktop-0.1.0/.gitignore +15 -0
- hubstudio_desktop-0.1.0/PKG-INFO +263 -0
- hubstudio_desktop-0.1.0/README.md +222 -0
- hubstudio_desktop-0.1.0/data/README.md +110 -0
- hubstudio_desktop-0.1.0/data/domains/reddit-com.json +538 -0
- hubstudio_desktop-0.1.0/data/known_rules.json +92 -0
- hubstudio_desktop-0.1.0/data/safety_presets.json +227 -0
- hubstudio_desktop-0.1.0/docs/adr/ADR-002-strategy-abc-tick-driven.md +134 -0
- hubstudio_desktop-0.1.0/docs/dev/adding-strategy.md +330 -0
- hubstudio_desktop-0.1.0/docs/errors-catalog-skeleton.md +123 -0
- hubstudio_desktop-0.1.0/docs/img/smartscreen-warning.png +0 -0
- hubstudio_desktop-0.1.0/docs/release-process.md +147 -0
- hubstudio_desktop-0.1.0/docs/release-rules.md +129 -0
- hubstudio_desktop-0.1.0/docs/rollback-handbook.md +136 -0
- hubstudio_desktop-0.1.0/docs/style-guide.md +79 -0
- hubstudio_desktop-0.1.0/docs/troubleshooting.md +270 -0
- hubstudio_desktop-0.1.0/docs/wizard-copy-spec.md +135 -0
- hubstudio_desktop-0.1.0/pyproject.toml +348 -0
- hubstudio_desktop-0.1.0/scripts/prebuild.py +144 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/__init__.py +7 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/__main__.py +27 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/SKILL.md +355 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/action-dsl-guide.md +297 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/ai-config.md +175 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/api-reference.md +678 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/known-issues.md +177 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/recorder-guide.md +234 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/selector-recovery.md +218 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs2-domain-template/SKILL.md +321 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs2-domain-template/references/domain-creation-tutorial.md +344 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs2-domain-template/references/experience-system.md +171 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs2-domain-template/references/flow-syntax.md +313 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs2-domain-template/references/json-schema.md +269 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs3-matrix-ops/SKILL.md +380 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs3-matrix-ops/references/data-pipeline.md +217 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs3-matrix-ops/references/environment-agent.md +307 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs3-matrix-ops/references/n8n-integration.md +347 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs3-matrix-ops/references/safety-system.md +252 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/__init__.py +7 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/__init__.py +75 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/decomposer.py +341 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/main.py +674 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/prompt_builder.py +346 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/query_gateway.py +358 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/retry.py +290 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/tools/__init__.py +28 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/tools/registry.py +754 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/__init__.py +97 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/base.py +358 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/defaults.py +175 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/health.py +338 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/openai_compat.py +409 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/router.py +302 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/__init__.py +100 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/pool.py +356 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/scheduler.py +662 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/__init__.py +360 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/exploratory.py +226 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/immediate.py +67 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/interval.py +119 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/randomized.py +165 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/scheduled.py +129 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/__init__.py +179 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/bridge.py +831 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/cdp_client.py +319 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/domain_models.py +430 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/flow_models.py +503 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/health_check.py +419 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/platform_rules/__init__.py +45 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/platform_rules/base.py +197 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/platform_rules/reddit.py +212 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/safety_engine.py +449 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/sdk_facade.py +451 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/selector_recovery.py +260 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/core/__init__.py +56 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/core/errors.py +120 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/core/events.py +367 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/i18n.py +137 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/__init__.py +39 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/chunker.py +336 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/indexer.py +303 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/loader.py +473 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/retriever.py +384 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/tools.py +130 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/locales/__init__.py +1 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/locales/en-US.json +133 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/locales/zh-CN.json +133 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/main.py +640 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/__init__.py +144 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/encrypted_store.py +359 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/migrations.py +288 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/paths.py +142 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/pool_repo.py +395 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/task_repo.py +527 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/__init__.py +26 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/app.py +485 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/lnk_creator.py +139 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/pages/__init__.py +13 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/pages/home.py +219 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/pages/settings.py +537 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/pages/tasks.py +430 -0
- hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/wizard.py +652 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/__init__.py +355 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/__init__.py +88 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/_internal.py +395 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/action.py +612 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/ai_client.py +255 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/dom_index.py +190 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/domain_registry.py +373 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/domain_store.py +526 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/dry_run.py +348 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/executor.py +862 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/experience.py +264 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/nl_parser.py +547 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/nl_runner.py +274 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/recorder.py +439 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/recorder_js.py +311 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/recovery.py +315 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/selectors.py +181 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/task_runner.py +1085 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/verify.py +98 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/wait.py +195 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/agent.py +748 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/api.py +273 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/behavior.py +325 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/exceptions.py +131 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/page_actions.py +309 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/pool.py +313 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/py.typed +0 -0
- hubstudio_desktop-0.1.0/src/hubstudio_sdk/session.py +516 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# K-Q-4.7 D2 (Sprint 4 batch 5 prep, 老大 2026-05-06):
|
|
2
|
+
# build-time copies populated by scripts/prebuild.py — never commit.
|
|
3
|
+
# References:
|
|
4
|
+
# - architecture v5.1.2 [12.5.B.3] D2 实施清单
|
|
5
|
+
# - spec sprint-4-release-prep [7.7] / [6.5] 批 5 DoR 第 6 项
|
|
6
|
+
src/hubstudio_sdk/
|
|
7
|
+
src/hubstudio_desktop/_skills_snapshot/
|
|
8
|
+
|
|
9
|
+
# Build artefacts
|
|
10
|
+
build/
|
|
11
|
+
dist/
|
|
12
|
+
*.egg-info/
|
|
13
|
+
|
|
14
|
+
# venv used for local D2 verification (not committed)
|
|
15
|
+
.venv/
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: hubstudio-desktop
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: HubStudio Desktop — local automation GUI on top of hubstudio-skills (Sprint 1).
|
|
5
|
+
Project-URL: Homepage, https://github.com/zota957525/hubstudio-skills
|
|
6
|
+
Project-URL: Repository, https://github.com/zota957525/hubstudio-skills
|
|
7
|
+
Author: zota957525
|
|
8
|
+
License: MIT
|
|
9
|
+
Keywords: agent,browser-automation,fingerprint-browser,hubstudio,nicegui,pydantic-ai
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Requires-Python: <3.14,>=3.11
|
|
16
|
+
Requires-Dist: aiohttp<4,>=3.9
|
|
17
|
+
Requires-Dist: cryptography<46,>=42
|
|
18
|
+
Requires-Dist: httpx<1,>=0.27
|
|
19
|
+
Requires-Dist: loguru<1,>=0.7
|
|
20
|
+
Requires-Dist: nicegui<4,>=3.0
|
|
21
|
+
Requires-Dist: playwright<2,>=1.45
|
|
22
|
+
Requires-Dist: pydantic<3,>=2.6
|
|
23
|
+
Requires-Dist: pywebview<6,>=5.0; sys_platform == 'win32'
|
|
24
|
+
Requires-Dist: pywin32>=306; sys_platform == 'win32'
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: aiohttp<4,>=3.9; extra == 'dev'
|
|
27
|
+
Requires-Dist: pre-commit<5,>=3.7; extra == 'dev'
|
|
28
|
+
Requires-Dist: pyright<2,>=1.1.380; extra == 'dev'
|
|
29
|
+
Requires-Dist: pytest-asyncio<1,>=0.23; extra == 'dev'
|
|
30
|
+
Requires-Dist: pytest-cov<7,>=5; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest-httpx<1,>=0.30; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-mock<4,>=3.12; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest-timeout<3,>=2.3; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest-vcr<2,>=1.0.2; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest-xdist<4,>=3.5; extra == 'dev'
|
|
36
|
+
Requires-Dist: pytest<9,>=8; extra == 'dev'
|
|
37
|
+
Requires-Dist: pyyaml<7,>=6; extra == 'dev'
|
|
38
|
+
Requires-Dist: ruff<1,>=0.5; extra == 'dev'
|
|
39
|
+
Requires-Dist: vcrpy<8,>=6; extra == 'dev'
|
|
40
|
+
Description-Content-Type: text/markdown
|
|
41
|
+
|
|
42
|
+
# hubstudio-desktop
|
|
43
|
+
|
|
44
|
+
[](https://github.com/zota957525/hubstudio-skills/actions/workflows/ci.yml)
|
|
45
|
+
[](https://codecov.io/gh/zota957525/hubstudio-skills)
|
|
46
|
+
|
|
47
|
+
> Local Windows GUI on top of `hubstudio-skills`. Drives HubStudio fingerprint browsers
|
|
48
|
+
> through pydantic-ai + NiceGUI native + Playwright `connect_over_cdp`.
|
|
49
|
+
>
|
|
50
|
+
> **Status**: **Sprint 4 release prep — batches 1-4 closed** (2026-05-06). 484+ unit
|
|
51
|
+
> tests + 9 e2e scenarios green, line coverage >=85% repo-wide and >=80% on the
|
|
52
|
+
> `ui/` sub-gate (settings.py 99%, lnk_creator.py 100%, main.py 94%), ruff /
|
|
53
|
+
> pyright clean, real DeepSeek + OpenRouter HTTPS cassettes recorded (K1 v2 —
|
|
54
|
+
> Gemini via OpenRouter routing, Ollama deferred to v0.2), pywebview Windows
|
|
55
|
+
> matrix CI active, first-run 4-step wizard wired, i18n zh-CN / en-US toggle,
|
|
56
|
+
> desktop `.lnk` shortcut on first launch, `--health-check` CLI active. Sprint
|
|
57
|
+
> 4 batch 5 (`uv publish` first PyPI release) remaining.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Install
|
|
62
|
+
|
|
63
|
+
### Standard install (recommended)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
uv tool install hubstudio-desktop
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
That's it. After installation:
|
|
70
|
+
|
|
71
|
+
- Type `hubstudio-desktop` in any terminal to launch the GUI
|
|
72
|
+
- A "HubStudio Desktop.lnk" shortcut appears on your desktop on first launch
|
|
73
|
+
- Run `hubstudio-desktop --health-check` for non-interactive provider /
|
|
74
|
+
connection diagnostics (exit code 0 / 1 / 2)
|
|
75
|
+
|
|
76
|
+
### Alternative: pip install
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
pip install hubstudio-desktop
|
|
80
|
+
hubstudio-desktop # launches NiceGUI native window
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Developer install (from monorepo)
|
|
84
|
+
|
|
85
|
+
`hubstudio-sdk` ships as a **vendored wheel** in `desktop/vendor/` (K-Q-3.1
|
|
86
|
+
v0.5 — 2026-05-05) and is automatically copied into the published wheel by
|
|
87
|
+
the K-Q-4.7 D2 prebuild hook (architecture v5.1.2 [12.5.B]). For local
|
|
88
|
+
development:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# from repo root
|
|
92
|
+
pip install desktop/vendor/hubstudio_sdk-0.1.0-py3-none-any.whl
|
|
93
|
+
pip install -e desktop[dev]
|
|
94
|
+
playwright install chromium # for CDP smoke tests; CI installs separately
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
This pattern avoids hatchling's PEP 508 file-relative-path quirk and works
|
|
98
|
+
identically in CI / dev / fresh checkout. The wheel ships PEP 561 `py.typed`
|
|
99
|
+
marker so pyright treats it as fully typed (K-Q-3.5 audit list trimmed to 4
|
|
100
|
+
libs in Sprint 3 — google-genai removed under K1 v2, hubstudio-sdk vendored).
|
|
101
|
+
|
|
102
|
+
#### Upgrading hubstudio-sdk
|
|
103
|
+
|
|
104
|
+
The SDK source lives in a separate user project (monorepo sub-package) and
|
|
105
|
+
stays **local-only** by design — it does **not** publish to PyPI. The
|
|
106
|
+
vendored-wheel pattern makes this self-contained: every consumer reads it
|
|
107
|
+
from `desktop/vendor/`. To roll a new wheel:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
cd /path/to/hubstudio-sdk-source
|
|
111
|
+
python -m build --wheel --outdir /path/to/hubstudio-skills/desktop/vendor/
|
|
112
|
+
# git rm old wheel + git add new wheel + commit (in hubstudio-skills repo)
|
|
113
|
+
pip install desktop/vendor/hubstudio_sdk-X.Y.Z-py3-none-any.whl
|
|
114
|
+
pip install -e desktop[dev]
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Tests use fakes and never import the real SDK at runtime (NOT-Q-5: zero real
|
|
118
|
+
network traffic). The runtime falls back gracefully when the SDK is absent.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## First-launch SmartScreen warning
|
|
123
|
+
|
|
124
|
+
When you first run `hubstudio-desktop`, Windows may show:
|
|
125
|
+
|
|
126
|
+
> **Windows protected your PC** — Microsoft Defender SmartScreen prevented an
|
|
127
|
+
> unrecognized app from starting. Running this app might put your PC at risk.
|
|
128
|
+
|
|
129
|
+
**This is expected** — `hubstudio-desktop` is not code-signed (we chose not
|
|
130
|
+
to purchase an EV certificate for v0.1; see [why](docs/troubleshooting.md#why-smartscreen-warning)).
|
|
131
|
+
|
|
132
|
+
To proceed:
|
|
133
|
+
|
|
134
|
+
1. Click **More info** (small link below the bold title)
|
|
135
|
+
2. Click **Run anyway** (button that appears after step 1)
|
|
136
|
+
|
|
137
|
+
After this one-time approval, Windows will remember your choice and not
|
|
138
|
+
prompt again on subsequent launches.
|
|
139
|
+
|
|
140
|
+

|
|
141
|
+
|
|
142
|
+
> Full troubleshooting guide: [docs/troubleshooting.md](docs/troubleshooting.md).
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Desktop shortcut
|
|
147
|
+
|
|
148
|
+
On first launch, hubstudio-desktop creates a `.lnk` shortcut on your desktop
|
|
149
|
+
pointing to itself (Sprint 4 batch 3 / K-Q-4.2 = C self-implemented
|
|
150
|
+
PowerShell COM). You can double-click this shortcut to relaunch instead of
|
|
151
|
+
typing the command.
|
|
152
|
+
|
|
153
|
+
If shortcut creation fails (e.g. PowerShell unavailable in your environment,
|
|
154
|
+
Defender blocks subprocess, or you don't have desktop write permission),
|
|
155
|
+
this is **non-fatal** — the app launches normally without a shortcut. See
|
|
156
|
+
[troubleshooting](docs/troubleshooting.md#desktop-shortcut-not-created) for
|
|
157
|
+
manual creation steps and how to retry.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Diagnostics: `--health-check`
|
|
162
|
+
|
|
163
|
+
For non-interactive diagnostics (CI / remote support / "is my config OK?"):
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
hubstudio-desktop --health-check
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Output:
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
DeepSeek: Healthy (latency 234ms)
|
|
173
|
+
OpenRouter: Healthy (latency 412ms)
|
|
174
|
+
HubStudio: Healthy (cdp_url=http://localhost:6873 ok)
|
|
175
|
+
KB: Healthy (3 skills loaded: hs1, hs2, hs3)
|
|
176
|
+
|
|
177
|
+
overall_status: healthy
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Exit codes:
|
|
181
|
+
|
|
182
|
+
- `0` — all components healthy
|
|
183
|
+
- `1` — degraded (some provider unreachable but core works)
|
|
184
|
+
- `2` — critical failure (e.g. HubStudio offline, KB missing, or pywebview
|
|
185
|
+
/ WebView2 missing on Windows)
|
|
186
|
+
|
|
187
|
+
Output language follows your system locale (zh-CN by default per K-Q-4.5 /
|
|
188
|
+
en-US when system locale is English). To force English from a Chinese
|
|
189
|
+
machine: `LANG=en_US.UTF-8 hubstudio-desktop --health-check`. See the i18n
|
|
190
|
+
locale switch section of [troubleshooting](docs/troubleshooting.md#i18n-locale-switch).
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Run
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
hubstudio-desktop # launches NiceGUI native window
|
|
198
|
+
hubstudio-desktop --no-native # browser tab fallback (dev / WSL)
|
|
199
|
+
hubstudio-desktop --port 9000 # custom port
|
|
200
|
+
hubstudio-desktop --reset-data # wipe runtime tables (destructive)
|
|
201
|
+
hubstudio-desktop --skip-health-check
|
|
202
|
+
hubstudio-desktop --health-check # CLI-only diagnostics, see above
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Test
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
cd desktop
|
|
209
|
+
|
|
210
|
+
ruff check src/ tests/ scripts/
|
|
211
|
+
ruff format --check src/ tests/ scripts/
|
|
212
|
+
pyright src/ tests/ scripts/
|
|
213
|
+
python scripts/check-section-refs.py # docstring lint gate
|
|
214
|
+
python scripts/check-i18n-coverage.py # i18n key coverage gate
|
|
215
|
+
|
|
216
|
+
pytest # full suite (484+ unit + 9 e2e)
|
|
217
|
+
pytest -m "not slow" --cov=src/hubstudio_desktop --cov-fail-under=85
|
|
218
|
+
pytest --cov=src/hubstudio_desktop/ui --cov-fail-under=80 # ui sub-gate
|
|
219
|
+
pytest tests/e2e/ -v # 3 happy-path + wildcard + matrix scenarios
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Layout
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
desktop/
|
|
226
|
+
├── src/hubstudio_desktop/ # production code (8 modules + i18n + lnk_creator)
|
|
227
|
+
├── tests/ # 484+ unit tests + 9 e2e scenarios
|
|
228
|
+
│ ├── core/ storage/ agent/ automation/ knowledge/ ui/
|
|
229
|
+
│ ├── fakes/ fixtures/ helpers/
|
|
230
|
+
│ └── e2e/ # full-loop / eventbus-wildcard / 3 scenarios /
|
|
231
|
+
│ # pywebview-matrix / real-providers-recording
|
|
232
|
+
├── scripts/check-section-refs.py
|
|
233
|
+
├── scripts/check-i18n-coverage.py
|
|
234
|
+
├── data/ # K5 hardened YAML / JSON
|
|
235
|
+
├── docs/ # release / rollback handbooks, ADRs, troubleshooting
|
|
236
|
+
├── locales/ # zh-CN / en-US translation tables (114 keys)
|
|
237
|
+
└── pyproject.toml
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## CI
|
|
241
|
+
|
|
242
|
+
`.github/workflows/ci.yml` runs on push to `main`, every PR, and manual
|
|
243
|
+
`workflow_dispatch`. Jobs:
|
|
244
|
+
|
|
245
|
+
1. **lint** — `ruff check` + `ruff format --check`
|
|
246
|
+
2. **typecheck** — `pyright src/ tests/ scripts/` (strict)
|
|
247
|
+
3. **test** — matrix `os: [ubuntu, windows] x python: [3.11, 3.12]`; coverage
|
|
248
|
+
gate `--cov-fail-under=85`; uploads to Codecov from the ubuntu-py3.11 cell
|
|
249
|
+
4. **win_lnk_real** — Sprint 4 batch 3 windows-latest matrix exercising real
|
|
250
|
+
`.lnk` creation via PowerShell COM
|
|
251
|
+
5. **deps** — `pip-audit` (report-only; non-blocking)
|
|
252
|
+
|
|
253
|
+
## References
|
|
254
|
+
|
|
255
|
+
- Project constitution: `../CLAUDE.md`
|
|
256
|
+
- Spec: `../specs/hubstudio-desktop-init/spec.md`
|
|
257
|
+
- Architecture: `../specs/hubstudio-desktop-init/architecture.md`
|
|
258
|
+
- Sprint 2 plan: `../specs/sprint-2-foundation/spec.md`
|
|
259
|
+
- Sprint 2 closing report: `../specs/sprint-2-foundation/sprint-closing-report.md`
|
|
260
|
+
- Sprint 4 plan: `../specs/sprint-4-release-prep/spec.md`
|
|
261
|
+
- Sprint 4 release SOP: `../specs/sprint-4-release-prep/release-path-sop.md`
|
|
262
|
+
- Troubleshooting guide: [docs/troubleshooting.md](docs/troubleshooting.md)
|
|
263
|
+
- Changelog: [CHANGELOG.md](CHANGELOG.md)
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# hubstudio-desktop
|
|
2
|
+
|
|
3
|
+
[](https://github.com/zota957525/hubstudio-skills/actions/workflows/ci.yml)
|
|
4
|
+
[](https://codecov.io/gh/zota957525/hubstudio-skills)
|
|
5
|
+
|
|
6
|
+
> Local Windows GUI on top of `hubstudio-skills`. Drives HubStudio fingerprint browsers
|
|
7
|
+
> through pydantic-ai + NiceGUI native + Playwright `connect_over_cdp`.
|
|
8
|
+
>
|
|
9
|
+
> **Status**: **Sprint 4 release prep — batches 1-4 closed** (2026-05-06). 484+ unit
|
|
10
|
+
> tests + 9 e2e scenarios green, line coverage >=85% repo-wide and >=80% on the
|
|
11
|
+
> `ui/` sub-gate (settings.py 99%, lnk_creator.py 100%, main.py 94%), ruff /
|
|
12
|
+
> pyright clean, real DeepSeek + OpenRouter HTTPS cassettes recorded (K1 v2 —
|
|
13
|
+
> Gemini via OpenRouter routing, Ollama deferred to v0.2), pywebview Windows
|
|
14
|
+
> matrix CI active, first-run 4-step wizard wired, i18n zh-CN / en-US toggle,
|
|
15
|
+
> desktop `.lnk` shortcut on first launch, `--health-check` CLI active. Sprint
|
|
16
|
+
> 4 batch 5 (`uv publish` first PyPI release) remaining.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Install
|
|
21
|
+
|
|
22
|
+
### Standard install (recommended)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
uv tool install hubstudio-desktop
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
That's it. After installation:
|
|
29
|
+
|
|
30
|
+
- Type `hubstudio-desktop` in any terminal to launch the GUI
|
|
31
|
+
- A "HubStudio Desktop.lnk" shortcut appears on your desktop on first launch
|
|
32
|
+
- Run `hubstudio-desktop --health-check` for non-interactive provider /
|
|
33
|
+
connection diagnostics (exit code 0 / 1 / 2)
|
|
34
|
+
|
|
35
|
+
### Alternative: pip install
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
pip install hubstudio-desktop
|
|
39
|
+
hubstudio-desktop # launches NiceGUI native window
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Developer install (from monorepo)
|
|
43
|
+
|
|
44
|
+
`hubstudio-sdk` ships as a **vendored wheel** in `desktop/vendor/` (K-Q-3.1
|
|
45
|
+
v0.5 — 2026-05-05) and is automatically copied into the published wheel by
|
|
46
|
+
the K-Q-4.7 D2 prebuild hook (architecture v5.1.2 [12.5.B]). For local
|
|
47
|
+
development:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# from repo root
|
|
51
|
+
pip install desktop/vendor/hubstudio_sdk-0.1.0-py3-none-any.whl
|
|
52
|
+
pip install -e desktop[dev]
|
|
53
|
+
playwright install chromium # for CDP smoke tests; CI installs separately
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
This pattern avoids hatchling's PEP 508 file-relative-path quirk and works
|
|
57
|
+
identically in CI / dev / fresh checkout. The wheel ships PEP 561 `py.typed`
|
|
58
|
+
marker so pyright treats it as fully typed (K-Q-3.5 audit list trimmed to 4
|
|
59
|
+
libs in Sprint 3 — google-genai removed under K1 v2, hubstudio-sdk vendored).
|
|
60
|
+
|
|
61
|
+
#### Upgrading hubstudio-sdk
|
|
62
|
+
|
|
63
|
+
The SDK source lives in a separate user project (monorepo sub-package) and
|
|
64
|
+
stays **local-only** by design — it does **not** publish to PyPI. The
|
|
65
|
+
vendored-wheel pattern makes this self-contained: every consumer reads it
|
|
66
|
+
from `desktop/vendor/`. To roll a new wheel:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
cd /path/to/hubstudio-sdk-source
|
|
70
|
+
python -m build --wheel --outdir /path/to/hubstudio-skills/desktop/vendor/
|
|
71
|
+
# git rm old wheel + git add new wheel + commit (in hubstudio-skills repo)
|
|
72
|
+
pip install desktop/vendor/hubstudio_sdk-X.Y.Z-py3-none-any.whl
|
|
73
|
+
pip install -e desktop[dev]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Tests use fakes and never import the real SDK at runtime (NOT-Q-5: zero real
|
|
77
|
+
network traffic). The runtime falls back gracefully when the SDK is absent.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## First-launch SmartScreen warning
|
|
82
|
+
|
|
83
|
+
When you first run `hubstudio-desktop`, Windows may show:
|
|
84
|
+
|
|
85
|
+
> **Windows protected your PC** — Microsoft Defender SmartScreen prevented an
|
|
86
|
+
> unrecognized app from starting. Running this app might put your PC at risk.
|
|
87
|
+
|
|
88
|
+
**This is expected** — `hubstudio-desktop` is not code-signed (we chose not
|
|
89
|
+
to purchase an EV certificate for v0.1; see [why](docs/troubleshooting.md#why-smartscreen-warning)).
|
|
90
|
+
|
|
91
|
+
To proceed:
|
|
92
|
+
|
|
93
|
+
1. Click **More info** (small link below the bold title)
|
|
94
|
+
2. Click **Run anyway** (button that appears after step 1)
|
|
95
|
+
|
|
96
|
+
After this one-time approval, Windows will remember your choice and not
|
|
97
|
+
prompt again on subsequent launches.
|
|
98
|
+
|
|
99
|
+

|
|
100
|
+
|
|
101
|
+
> Full troubleshooting guide: [docs/troubleshooting.md](docs/troubleshooting.md).
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Desktop shortcut
|
|
106
|
+
|
|
107
|
+
On first launch, hubstudio-desktop creates a `.lnk` shortcut on your desktop
|
|
108
|
+
pointing to itself (Sprint 4 batch 3 / K-Q-4.2 = C self-implemented
|
|
109
|
+
PowerShell COM). You can double-click this shortcut to relaunch instead of
|
|
110
|
+
typing the command.
|
|
111
|
+
|
|
112
|
+
If shortcut creation fails (e.g. PowerShell unavailable in your environment,
|
|
113
|
+
Defender blocks subprocess, or you don't have desktop write permission),
|
|
114
|
+
this is **non-fatal** — the app launches normally without a shortcut. See
|
|
115
|
+
[troubleshooting](docs/troubleshooting.md#desktop-shortcut-not-created) for
|
|
116
|
+
manual creation steps and how to retry.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Diagnostics: `--health-check`
|
|
121
|
+
|
|
122
|
+
For non-interactive diagnostics (CI / remote support / "is my config OK?"):
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
hubstudio-desktop --health-check
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Output:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
DeepSeek: Healthy (latency 234ms)
|
|
132
|
+
OpenRouter: Healthy (latency 412ms)
|
|
133
|
+
HubStudio: Healthy (cdp_url=http://localhost:6873 ok)
|
|
134
|
+
KB: Healthy (3 skills loaded: hs1, hs2, hs3)
|
|
135
|
+
|
|
136
|
+
overall_status: healthy
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Exit codes:
|
|
140
|
+
|
|
141
|
+
- `0` — all components healthy
|
|
142
|
+
- `1` — degraded (some provider unreachable but core works)
|
|
143
|
+
- `2` — critical failure (e.g. HubStudio offline, KB missing, or pywebview
|
|
144
|
+
/ WebView2 missing on Windows)
|
|
145
|
+
|
|
146
|
+
Output language follows your system locale (zh-CN by default per K-Q-4.5 /
|
|
147
|
+
en-US when system locale is English). To force English from a Chinese
|
|
148
|
+
machine: `LANG=en_US.UTF-8 hubstudio-desktop --health-check`. See the i18n
|
|
149
|
+
locale switch section of [troubleshooting](docs/troubleshooting.md#i18n-locale-switch).
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Run
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
hubstudio-desktop # launches NiceGUI native window
|
|
157
|
+
hubstudio-desktop --no-native # browser tab fallback (dev / WSL)
|
|
158
|
+
hubstudio-desktop --port 9000 # custom port
|
|
159
|
+
hubstudio-desktop --reset-data # wipe runtime tables (destructive)
|
|
160
|
+
hubstudio-desktop --skip-health-check
|
|
161
|
+
hubstudio-desktop --health-check # CLI-only diagnostics, see above
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Test
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
cd desktop
|
|
168
|
+
|
|
169
|
+
ruff check src/ tests/ scripts/
|
|
170
|
+
ruff format --check src/ tests/ scripts/
|
|
171
|
+
pyright src/ tests/ scripts/
|
|
172
|
+
python scripts/check-section-refs.py # docstring lint gate
|
|
173
|
+
python scripts/check-i18n-coverage.py # i18n key coverage gate
|
|
174
|
+
|
|
175
|
+
pytest # full suite (484+ unit + 9 e2e)
|
|
176
|
+
pytest -m "not slow" --cov=src/hubstudio_desktop --cov-fail-under=85
|
|
177
|
+
pytest --cov=src/hubstudio_desktop/ui --cov-fail-under=80 # ui sub-gate
|
|
178
|
+
pytest tests/e2e/ -v # 3 happy-path + wildcard + matrix scenarios
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Layout
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
desktop/
|
|
185
|
+
├── src/hubstudio_desktop/ # production code (8 modules + i18n + lnk_creator)
|
|
186
|
+
├── tests/ # 484+ unit tests + 9 e2e scenarios
|
|
187
|
+
│ ├── core/ storage/ agent/ automation/ knowledge/ ui/
|
|
188
|
+
│ ├── fakes/ fixtures/ helpers/
|
|
189
|
+
│ └── e2e/ # full-loop / eventbus-wildcard / 3 scenarios /
|
|
190
|
+
│ # pywebview-matrix / real-providers-recording
|
|
191
|
+
├── scripts/check-section-refs.py
|
|
192
|
+
├── scripts/check-i18n-coverage.py
|
|
193
|
+
├── data/ # K5 hardened YAML / JSON
|
|
194
|
+
├── docs/ # release / rollback handbooks, ADRs, troubleshooting
|
|
195
|
+
├── locales/ # zh-CN / en-US translation tables (114 keys)
|
|
196
|
+
└── pyproject.toml
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## CI
|
|
200
|
+
|
|
201
|
+
`.github/workflows/ci.yml` runs on push to `main`, every PR, and manual
|
|
202
|
+
`workflow_dispatch`. Jobs:
|
|
203
|
+
|
|
204
|
+
1. **lint** — `ruff check` + `ruff format --check`
|
|
205
|
+
2. **typecheck** — `pyright src/ tests/ scripts/` (strict)
|
|
206
|
+
3. **test** — matrix `os: [ubuntu, windows] x python: [3.11, 3.12]`; coverage
|
|
207
|
+
gate `--cov-fail-under=85`; uploads to Codecov from the ubuntu-py3.11 cell
|
|
208
|
+
4. **win_lnk_real** — Sprint 4 batch 3 windows-latest matrix exercising real
|
|
209
|
+
`.lnk` creation via PowerShell COM
|
|
210
|
+
5. **deps** — `pip-audit` (report-only; non-blocking)
|
|
211
|
+
|
|
212
|
+
## References
|
|
213
|
+
|
|
214
|
+
- Project constitution: `../CLAUDE.md`
|
|
215
|
+
- Spec: `../specs/hubstudio-desktop-init/spec.md`
|
|
216
|
+
- Architecture: `../specs/hubstudio-desktop-init/architecture.md`
|
|
217
|
+
- Sprint 2 plan: `../specs/sprint-2-foundation/spec.md`
|
|
218
|
+
- Sprint 2 closing report: `../specs/sprint-2-foundation/sprint-closing-report.md`
|
|
219
|
+
- Sprint 4 plan: `../specs/sprint-4-release-prep/spec.md`
|
|
220
|
+
- Sprint 4 release SOP: `../specs/sprint-4-release-prep/release-path-sop.md`
|
|
221
|
+
- Troubleshooting guide: [docs/troubleshooting.md](docs/troubleshooting.md)
|
|
222
|
+
- Changelog: [CHANGELOG.md](CHANGELOG.md)
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# desktop/data/ 目录索引
|
|
2
|
+
|
|
3
|
+
本目录存放 hubstudio-desktop 运行时加载的静态数据文件(K5 硬化数据层)。
|
|
4
|
+
|
|
5
|
+
数据来源:从 `skills/hs1`、`hs2`、`hs3` 的 Markdown 文档中提取算法性和平台行为性内容,
|
|
6
|
+
转换为机器可读的 JSON 格式(D1 决策:与 hs2 源 .json 同构、解析快、SQLite json1 兼容)。
|
|
7
|
+
原始 Markdown 文件保留在 `skills/` 目录,同时服务 Claude Code 用户。
|
|
8
|
+
|
|
9
|
+
## 文件清单
|
|
10
|
+
|
|
11
|
+
### domains/reddit-com.json
|
|
12
|
+
|
|
13
|
+
- 用途:Reddit 域名自动化模板库,包含页面元素选择器、经验处理器和任务流程定义
|
|
14
|
+
- 来源:`skills/hs2-domain-template/examples/reddit-com.json`(K5 内容拆分,格式转 yaml)
|
|
15
|
+
- Schema 权威源:`specs/hubstudio-desktop-init/architecture.md [3.6]` / `spec.md [19]`
|
|
16
|
+
- 字段结构:
|
|
17
|
+
- `_domain` / `_description` / `_version` / `_updated_at`:元信息
|
|
18
|
+
- `global`:全站通用经验处理器(cookie 弹窗、登录重定向等)
|
|
19
|
+
- `pages`:按 URL 路径分组的元素选择器和经验处理器
|
|
20
|
+
- `tasks`:可重放任务流程定义(含参数 schema 和 flow DSL)
|
|
21
|
+
- 加载入口:`automation/domain_models.py`(Sprint 0b,DomainTemplate Pydantic 模型校验)
|
|
22
|
+
|
|
23
|
+
### safety_presets.json
|
|
24
|
+
|
|
25
|
+
- 用途:安全门控三档预设(保守 / 中等 / 激进),供运行时选择后注入域名 JSON 的 `safety` 段
|
|
26
|
+
- 来源:`skills/hs3-matrix-ops/references/safety-system.md` 第 5 节"三种预设档位"
|
|
27
|
+
- Schema 权威源:`specs/hubstudio-desktop-init/spec.md [19]` / `architecture.md [5.13]`
|
|
28
|
+
- 字段结构:
|
|
29
|
+
- `presets.conservative`:保守档(新账号 / 高风险平台)
|
|
30
|
+
- `presets.moderate`:中等档(已升温账号 / 正常运营)
|
|
31
|
+
- `presets.aggressive`:激进档(内部测试 / 低风控平台,不建议生产使用)
|
|
32
|
+
- 每档含 `safety.rate_limits`、`safety.warmup.phases`、`safety.timing`
|
|
33
|
+
- 字段语义:与 `hubstudio-sdk` `agent.py` `DomainState` 读取字段严格对齐
|
|
34
|
+
- `rate_limits.<action>.daily_max`:每日上限(int,-1 = 无上限)
|
|
35
|
+
- `rate_limits.<action>.cooldown`:冷却范围 [min_s, max_s](二元数组)
|
|
36
|
+
- `warmup.phases[].days`:[start_day, end_day](含两端,从 first_used_date 起算)
|
|
37
|
+
- `timing.active_hours`:[start_h, end_h)(本机时区)
|
|
38
|
+
- 加载入口:`automation/safety_engine.py`(Sprint 0b,占位;待架构师 D13 决定具体加载路径)
|
|
39
|
+
|
|
40
|
+
### known_rules.json
|
|
41
|
+
|
|
42
|
+
- 用途:平台行为性和算法性规则列表,供 `platform_rules/` 模块在自动化执行时检查和应用
|
|
43
|
+
- 来源:`skills/hs1-hubstudio-sdk/references/known-issues.md`(K5 内容拆分,仅硬化算法性规则)
|
|
44
|
+
- Schema 权威源:`specs/hubstudio-desktop-init/spec.md [19]`
|
|
45
|
+
- 字段结构:
|
|
46
|
+
- `id`:规则唯一标识符(`snake_case`)
|
|
47
|
+
- `domain`:适用域名(`"*"` = 全平台)
|
|
48
|
+
- `scenario`:触发场景描述
|
|
49
|
+
- `category`:`platform_behavior`(平台行为规则)或 `algorithmic`(算法性规则)
|
|
50
|
+
- `rule`:一句话规则摘要
|
|
51
|
+
- `detail`:详细说明
|
|
52
|
+
- `implementation_hint`:代码级实现提示(伪代码)
|
|
53
|
+
- `why`:为什么要这样做
|
|
54
|
+
- `fallback`:规则失败时的降级策略
|
|
55
|
+
- `platform_rule_file`:实现该规则的目标代码文件路径
|
|
56
|
+
- 加载入口:`automation/platform_rules/{reddit,quora,...}.py`(Sprint 0b)
|
|
57
|
+
- 硬化范围说明:
|
|
58
|
+
- 已硬化(本文件):Reddit URL 搜索导航、CDP connect 方式、DOM snapshot 时机、端口动态获取等
|
|
59
|
+
- 保留 Skills(不硬化):GBK 编码经验、录制器 Shadow DOM 注意事项、OpenRouter 模型差异、
|
|
60
|
+
WaitStrategy 序列化限制等经验性陷阱
|
|
61
|
+
|
|
62
|
+
## Schema 权威源
|
|
63
|
+
|
|
64
|
+
| 文件 | 权威源 |
|
|
65
|
+
|---|---|
|
|
66
|
+
| `domains/reddit-com.json` | `architecture.md [3.6]`(域名模板 Pydantic 模型)/ `spec [19]`(K5 硬化清单) |
|
|
67
|
+
| `safety_presets.json` | `spec [19]`(K5 硬化清单)/ `architecture.md [5.13]`(D13 数据持久化) |
|
|
68
|
+
| `known_rules.json` | `spec [19]`(K5 硬化清单)/ `automation/platform_rules/` 代码实现 |
|
|
69
|
+
|
|
70
|
+
## 运行时加载入口(占位,Sprint 0b 实现)
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
desktop/src/hubstudio_desktop/
|
|
74
|
+
├── automation/
|
|
75
|
+
│ ├── domain_models.py # 加载 domains/*.json,Pydantic 校验
|
|
76
|
+
│ ├── platform_rules/
|
|
77
|
+
│ │ ├── reddit.py # 消费 known_rules.json 中 domain=reddit.com 的规则
|
|
78
|
+
│ │ └── ... # 其他平台
|
|
79
|
+
│ └── safety_engine.py # 加载 safety_presets.json,注入 DomainState.safety 段
|
|
80
|
+
(注:上述 desktop/src/hubstudio_desktop/ 是 src layout 路径,
|
|
81
|
+
F2 修复:原 desktop/agent/ 已迁到此处)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 用户编辑指南
|
|
85
|
+
|
|
86
|
+
### 调整 safety_presets.json
|
|
87
|
+
|
|
88
|
+
1. 打开 `desktop/data/safety_presets.json`,找到要调整的档位(conservative / moderate / aggressive)
|
|
89
|
+
2. 修改对应 `rate_limits.<action>.daily_max` 或 `cooldown` 值
|
|
90
|
+
3. `cooldown` 必须是二元数组 `[min_s, max_s]`,不能拆分为两个字段
|
|
91
|
+
4. `active_hours` 必须是二元数组 `[start_h, end_h)`,end 不包含
|
|
92
|
+
5. 保存后重启应用生效(Sprint 0b 实现热重载前需重启)
|
|
93
|
+
6. 注意:硬编码阈值(域名冷却时长、连续失败触发冷却等)在 `hubstudio-sdk` 代码中,
|
|
94
|
+
无法通过本文件覆盖
|
|
95
|
+
7. JSON 编辑建议用 VS Code(自带 jsonschema 校验 + 语法高亮)
|
|
96
|
+
|
|
97
|
+
### 新增域名模板
|
|
98
|
+
|
|
99
|
+
1. 参照 `domains/reddit-com.json` 结构新建 `domains/{domain}.json`
|
|
100
|
+
2. 必填字段:`_domain` / `_description` / `_version` / `_updated_at`
|
|
101
|
+
3. 同时在 `automation/platform_rules/{domain}.py` 中注册对应规则
|
|
102
|
+
4. 同时在 `skills/hs2-domain-template/examples/<domain>.json` 保留 JSON 版本
|
|
103
|
+
(K5 原则:skills/ 是 Claude Code 用户的知识库,desktop/data/ 是运行时数据)
|
|
104
|
+
|
|
105
|
+
### 新增 known_rules 规则
|
|
106
|
+
|
|
107
|
+
1. 在 `known_rules.json` 的 `rules:` 列表末尾追加新规则
|
|
108
|
+
2. 必填字段:`id`(唯一)/ `domain` / `scenario` / `category` / `rule` / `why` / `fallback`
|
|
109
|
+
3. 同时在对应 `platform_rule_file` 代码中实现该规则
|
|
110
|
+
4. 仅硬化算法性 / 平台行为性规则;经验性陷阱仍写入 `known-issues.md`(Skills 保留)
|