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.
Files changed (130) hide show
  1. hubstudio_desktop-0.1.0/.gitignore +15 -0
  2. hubstudio_desktop-0.1.0/PKG-INFO +263 -0
  3. hubstudio_desktop-0.1.0/README.md +222 -0
  4. hubstudio_desktop-0.1.0/data/README.md +110 -0
  5. hubstudio_desktop-0.1.0/data/domains/reddit-com.json +538 -0
  6. hubstudio_desktop-0.1.0/data/known_rules.json +92 -0
  7. hubstudio_desktop-0.1.0/data/safety_presets.json +227 -0
  8. hubstudio_desktop-0.1.0/docs/adr/ADR-002-strategy-abc-tick-driven.md +134 -0
  9. hubstudio_desktop-0.1.0/docs/dev/adding-strategy.md +330 -0
  10. hubstudio_desktop-0.1.0/docs/errors-catalog-skeleton.md +123 -0
  11. hubstudio_desktop-0.1.0/docs/img/smartscreen-warning.png +0 -0
  12. hubstudio_desktop-0.1.0/docs/release-process.md +147 -0
  13. hubstudio_desktop-0.1.0/docs/release-rules.md +129 -0
  14. hubstudio_desktop-0.1.0/docs/rollback-handbook.md +136 -0
  15. hubstudio_desktop-0.1.0/docs/style-guide.md +79 -0
  16. hubstudio_desktop-0.1.0/docs/troubleshooting.md +270 -0
  17. hubstudio_desktop-0.1.0/docs/wizard-copy-spec.md +135 -0
  18. hubstudio_desktop-0.1.0/pyproject.toml +348 -0
  19. hubstudio_desktop-0.1.0/scripts/prebuild.py +144 -0
  20. hubstudio_desktop-0.1.0/src/hubstudio_desktop/__init__.py +7 -0
  21. hubstudio_desktop-0.1.0/src/hubstudio_desktop/__main__.py +27 -0
  22. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/SKILL.md +355 -0
  23. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/action-dsl-guide.md +297 -0
  24. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/ai-config.md +175 -0
  25. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/api-reference.md +678 -0
  26. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/known-issues.md +177 -0
  27. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/recorder-guide.md +234 -0
  28. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs1-hubstudio-sdk/references/selector-recovery.md +218 -0
  29. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs2-domain-template/SKILL.md +321 -0
  30. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs2-domain-template/references/domain-creation-tutorial.md +344 -0
  31. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs2-domain-template/references/experience-system.md +171 -0
  32. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs2-domain-template/references/flow-syntax.md +313 -0
  33. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs2-domain-template/references/json-schema.md +269 -0
  34. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs3-matrix-ops/SKILL.md +380 -0
  35. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs3-matrix-ops/references/data-pipeline.md +217 -0
  36. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs3-matrix-ops/references/environment-agent.md +307 -0
  37. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs3-matrix-ops/references/n8n-integration.md +347 -0
  38. hubstudio_desktop-0.1.0/src/hubstudio_desktop/_skills_snapshot/hs3-matrix-ops/references/safety-system.md +252 -0
  39. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/__init__.py +7 -0
  40. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/__init__.py +75 -0
  41. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/decomposer.py +341 -0
  42. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/main.py +674 -0
  43. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/prompt_builder.py +346 -0
  44. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/query_gateway.py +358 -0
  45. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/retry.py +290 -0
  46. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/tools/__init__.py +28 -0
  47. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/orchestrator/tools/registry.py +754 -0
  48. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/__init__.py +97 -0
  49. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/base.py +358 -0
  50. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/defaults.py +175 -0
  51. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/health.py +338 -0
  52. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/openai_compat.py +409 -0
  53. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/providers/router.py +302 -0
  54. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/__init__.py +100 -0
  55. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/pool.py +356 -0
  56. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/scheduler.py +662 -0
  57. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/__init__.py +360 -0
  58. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/exploratory.py +226 -0
  59. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/immediate.py +67 -0
  60. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/interval.py +119 -0
  61. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/randomized.py +165 -0
  62. hubstudio_desktop-0.1.0/src/hubstudio_desktop/agent/task_pool/strategies/scheduled.py +129 -0
  63. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/__init__.py +179 -0
  64. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/bridge.py +831 -0
  65. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/cdp_client.py +319 -0
  66. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/domain_models.py +430 -0
  67. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/flow_models.py +503 -0
  68. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/health_check.py +419 -0
  69. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/platform_rules/__init__.py +45 -0
  70. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/platform_rules/base.py +197 -0
  71. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/platform_rules/reddit.py +212 -0
  72. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/safety_engine.py +449 -0
  73. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/sdk_facade.py +451 -0
  74. hubstudio_desktop-0.1.0/src/hubstudio_desktop/automation/selector_recovery.py +260 -0
  75. hubstudio_desktop-0.1.0/src/hubstudio_desktop/core/__init__.py +56 -0
  76. hubstudio_desktop-0.1.0/src/hubstudio_desktop/core/errors.py +120 -0
  77. hubstudio_desktop-0.1.0/src/hubstudio_desktop/core/events.py +367 -0
  78. hubstudio_desktop-0.1.0/src/hubstudio_desktop/i18n.py +137 -0
  79. hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/__init__.py +39 -0
  80. hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/chunker.py +336 -0
  81. hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/indexer.py +303 -0
  82. hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/loader.py +473 -0
  83. hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/retriever.py +384 -0
  84. hubstudio_desktop-0.1.0/src/hubstudio_desktop/knowledge/tools.py +130 -0
  85. hubstudio_desktop-0.1.0/src/hubstudio_desktop/locales/__init__.py +1 -0
  86. hubstudio_desktop-0.1.0/src/hubstudio_desktop/locales/en-US.json +133 -0
  87. hubstudio_desktop-0.1.0/src/hubstudio_desktop/locales/zh-CN.json +133 -0
  88. hubstudio_desktop-0.1.0/src/hubstudio_desktop/main.py +640 -0
  89. hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/__init__.py +144 -0
  90. hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/encrypted_store.py +359 -0
  91. hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/migrations.py +288 -0
  92. hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/paths.py +142 -0
  93. hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/pool_repo.py +395 -0
  94. hubstudio_desktop-0.1.0/src/hubstudio_desktop/storage/task_repo.py +527 -0
  95. hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/__init__.py +26 -0
  96. hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/app.py +485 -0
  97. hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/lnk_creator.py +139 -0
  98. hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/pages/__init__.py +13 -0
  99. hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/pages/home.py +219 -0
  100. hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/pages/settings.py +537 -0
  101. hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/pages/tasks.py +430 -0
  102. hubstudio_desktop-0.1.0/src/hubstudio_desktop/ui/wizard.py +652 -0
  103. hubstudio_desktop-0.1.0/src/hubstudio_sdk/__init__.py +355 -0
  104. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/__init__.py +88 -0
  105. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/_internal.py +395 -0
  106. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/action.py +612 -0
  107. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/ai_client.py +255 -0
  108. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/dom_index.py +190 -0
  109. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/domain_registry.py +373 -0
  110. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/domain_store.py +526 -0
  111. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/dry_run.py +348 -0
  112. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/executor.py +862 -0
  113. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/experience.py +264 -0
  114. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/nl_parser.py +547 -0
  115. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/nl_runner.py +274 -0
  116. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/recorder.py +439 -0
  117. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/recorder_js.py +311 -0
  118. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/recovery.py +315 -0
  119. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/selectors.py +181 -0
  120. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/task_runner.py +1085 -0
  121. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/verify.py +98 -0
  122. hubstudio_desktop-0.1.0/src/hubstudio_sdk/actions/wait.py +195 -0
  123. hubstudio_desktop-0.1.0/src/hubstudio_sdk/agent.py +748 -0
  124. hubstudio_desktop-0.1.0/src/hubstudio_sdk/api.py +273 -0
  125. hubstudio_desktop-0.1.0/src/hubstudio_sdk/behavior.py +325 -0
  126. hubstudio_desktop-0.1.0/src/hubstudio_sdk/exceptions.py +131 -0
  127. hubstudio_desktop-0.1.0/src/hubstudio_sdk/page_actions.py +309 -0
  128. hubstudio_desktop-0.1.0/src/hubstudio_sdk/pool.py +313 -0
  129. hubstudio_desktop-0.1.0/src/hubstudio_sdk/py.typed +0 -0
  130. 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
+ [![CI](https://github.com/zota957525/hubstudio-skills/actions/workflows/ci.yml/badge.svg)](https://github.com/zota957525/hubstudio-skills/actions/workflows/ci.yml)
45
+ [![codecov](https://codecov.io/gh/zota957525/hubstudio-skills/branch/main/graph/badge.svg)](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
+ ![SmartScreen warning screenshot](docs/img/smartscreen-warning.png)
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
+ [![CI](https://github.com/zota957525/hubstudio-skills/actions/workflows/ci.yml/badge.svg)](https://github.com/zota957525/hubstudio-skills/actions/workflows/ci.yml)
4
+ [![codecov](https://codecov.io/gh/zota957525/hubstudio-skills/branch/main/graph/badge.svg)](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
+ ![SmartScreen warning screenshot](docs/img/smartscreen-warning.png)
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 保留)