harmonyrun 0.0.29__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.
- harmonyrun-0.0.29/.dockerignore +5 -0
- harmonyrun-0.0.29/.github/workflows/release.yml +49 -0
- harmonyrun-0.0.29/.gitignore +49 -0
- harmonyrun-0.0.29/.python-version +1 -0
- harmonyrun-0.0.29/CLI/344/275/277/347/224/250/350/257/264/346/230/216.md +401 -0
- harmonyrun-0.0.29/Dockerfile +28 -0
- harmonyrun-0.0.29/LICENSE +21 -0
- harmonyrun-0.0.29/MANIFEST.in +7 -0
- harmonyrun-0.0.29/PKG-INFO +142 -0
- harmonyrun-0.0.29/README.md +79 -0
- harmonyrun-0.0.29/RELEASE_NOTES.md +20 -0
- harmonyrun-0.0.29/SKILL.md +85 -0
- harmonyrun-0.0.29/docs/ favicon.svg +5 -0
- harmonyrun-0.0.29/docs/custom.css +74 -0
- harmonyrun-0.0.29/docs/docs.json +244 -0
- harmonyrun-0.0.29/docs/favicon-dark.png +0 -0
- harmonyrun-0.0.29/docs/favicon.png +0 -0
- harmonyrun-0.0.29/docs/logo/dark.png +0 -0
- harmonyrun-0.0.29/docs/logo/light.png +0 -0
- harmonyrun-0.0.29/docs/v5/concepts/architecture.mdx +137 -0
- harmonyrun-0.0.29/docs/v5/concepts/events-and-workflows.mdx +395 -0
- harmonyrun-0.0.29/docs/v5/concepts/prompts.mdx +329 -0
- harmonyrun-0.0.29/docs/v5/concepts/scripter-agent.mdx +162 -0
- harmonyrun-0.0.29/docs/v5/concepts/shared-state.mdx +63 -0
- harmonyrun-0.0.29/docs/v5/features/app-cards.mdx +288 -0
- harmonyrun-0.0.29/docs/v5/features/credentials.mdx +249 -0
- harmonyrun-0.0.29/docs/v5/features/custom-tools.mdx +398 -0
- harmonyrun-0.0.29/docs/v5/features/custom-variables.mdx +202 -0
- harmonyrun-0.0.29/docs/v5/features/structured-output.mdx +274 -0
- harmonyrun-0.0.29/docs/v5/features/telemetry.mdx +45 -0
- harmonyrun-0.0.29/docs/v5/features/tracing.mdx +243 -0
- harmonyrun-0.0.29/docs/v5/guides/cli.mdx +383 -0
- harmonyrun-0.0.29/docs/v5/guides/device-setup.mdx +431 -0
- harmonyrun-0.0.29/docs/v5/guides/docker.mdx +143 -0
- harmonyrun-0.0.29/docs/v5/guides/overview.mdx +47 -0
- harmonyrun-0.0.29/docs/v5/overview.mdx +52 -0
- harmonyrun-0.0.29/docs/v5/quickstart.mdx +159 -0
- harmonyrun-0.0.29/docs/v5/sdk/adb-tools.mdx +477 -0
- harmonyrun-0.0.29/docs/v5/sdk/base-tools.mdx +346 -0
- harmonyrun-0.0.29/docs/v5/sdk/configuration.mdx +721 -0
- harmonyrun-0.0.29/docs/v5/sdk/droid-agent.mdx +428 -0
- harmonyrun-0.0.29/docs/v5/sdk/ios-tools.mdx +452 -0
- harmonyrun-0.0.29/docs/v5/sdk/reference.mdx +49 -0
- harmonyrun-0.0.29/droidrun/__init__.py +92 -0
- harmonyrun-0.0.29/droidrun/__main__.py +8 -0
- harmonyrun-0.0.29/droidrun/agent/__init__.py +3 -0
- harmonyrun-0.0.29/droidrun/agent/action_context.py +41 -0
- harmonyrun-0.0.29/droidrun/agent/action_result.py +16 -0
- harmonyrun-0.0.29/droidrun/agent/common/__init__.py +0 -0
- harmonyrun-0.0.29/droidrun/agent/common/constants.py +11 -0
- harmonyrun-0.0.29/droidrun/agent/common/events.py +139 -0
- harmonyrun-0.0.29/droidrun/agent/common/ui_state_snapshot.py +188 -0
- harmonyrun-0.0.29/droidrun/agent/droid/__init__.py +10 -0
- harmonyrun-0.0.29/droidrun/agent/droid/droid_agent.py +1404 -0
- harmonyrun-0.0.29/droidrun/agent/droid/events.py +110 -0
- harmonyrun-0.0.29/droidrun/agent/droid/state.py +243 -0
- harmonyrun-0.0.29/droidrun/agent/executor/__init__.py +22 -0
- harmonyrun-0.0.29/droidrun/agent/executor/events.py +47 -0
- harmonyrun-0.0.29/droidrun/agent/executor/executor_agent.py +303 -0
- harmonyrun-0.0.29/droidrun/agent/executor/prompts.py +51 -0
- harmonyrun-0.0.29/droidrun/agent/fast_agent/__init__.py +3 -0
- harmonyrun-0.0.29/droidrun/agent/fast_agent/events.py +52 -0
- harmonyrun-0.0.29/droidrun/agent/fast_agent/fast_agent.py +679 -0
- harmonyrun-0.0.29/droidrun/agent/fast_agent/xml_parser.py +191 -0
- harmonyrun-0.0.29/droidrun/agent/manager/__init__.py +28 -0
- harmonyrun-0.0.29/droidrun/agent/manager/events.py +40 -0
- harmonyrun-0.0.29/droidrun/agent/manager/manager_agent.py +599 -0
- harmonyrun-0.0.29/droidrun/agent/manager/prompts.py +106 -0
- harmonyrun-0.0.29/droidrun/agent/manager/stateless_manager_agent.py +399 -0
- harmonyrun-0.0.29/droidrun/agent/oneflows/__init__.py +0 -0
- harmonyrun-0.0.29/droidrun/agent/oneflows/app_starter_workflow.py +141 -0
- harmonyrun-0.0.29/droidrun/agent/oneflows/structured_output_agent.py +87 -0
- harmonyrun-0.0.29/droidrun/agent/tool_registry.py +336 -0
- harmonyrun-0.0.29/droidrun/agent/trajectory/__init__.py +7 -0
- harmonyrun-0.0.29/droidrun/agent/trajectory/llm_interaction_log.py +206 -0
- harmonyrun-0.0.29/droidrun/agent/trajectory/writer.py +498 -0
- harmonyrun-0.0.29/droidrun/agent/usage.py +252 -0
- harmonyrun-0.0.29/droidrun/agent/utils/__init__.py +33 -0
- harmonyrun-0.0.29/droidrun/agent/utils/actions.py +468 -0
- harmonyrun-0.0.29/droidrun/agent/utils/chat_utils.py +90 -0
- harmonyrun-0.0.29/droidrun/agent/utils/inference.py +499 -0
- harmonyrun-0.0.29/droidrun/agent/utils/llm_loader.py +256 -0
- harmonyrun-0.0.29/droidrun/agent/utils/llm_picker.py +263 -0
- harmonyrun-0.0.29/droidrun/agent/utils/prompt_resolver.py +66 -0
- harmonyrun-0.0.29/droidrun/agent/utils/signatures.py +205 -0
- harmonyrun-0.0.29/droidrun/agent/utils/trajectory.py +287 -0
- harmonyrun-0.0.29/droidrun/app_cards/__init__.py +0 -0
- harmonyrun-0.0.29/droidrun/app_cards/app_card_provider.py +26 -0
- harmonyrun-0.0.29/droidrun/app_cards/loading.py +57 -0
- harmonyrun-0.0.29/droidrun/app_cards/provider_factory.py +54 -0
- harmonyrun-0.0.29/droidrun/app_cards/providers/__init__.py +7 -0
- harmonyrun-0.0.29/droidrun/app_cards/providers/composite_provider.py +101 -0
- harmonyrun-0.0.29/droidrun/app_cards/providers/local_provider.py +114 -0
- harmonyrun-0.0.29/droidrun/app_cards/providers/server_provider.py +120 -0
- harmonyrun-0.0.29/droidrun/app_cards/suite_resolve.py +112 -0
- harmonyrun-0.0.29/droidrun/batch/__init__.py +41 -0
- harmonyrun-0.0.29/droidrun/batch/levels.py +23 -0
- harmonyrun-0.0.29/droidrun/batch/loader.py +232 -0
- harmonyrun-0.0.29/droidrun/batch/models.py +94 -0
- harmonyrun-0.0.29/droidrun/batch/prompt_templates.py +21 -0
- harmonyrun-0.0.29/droidrun/batch/report.py +617 -0
- harmonyrun-0.0.29/droidrun/batch/resource_manager.py +189 -0
- harmonyrun-0.0.29/droidrun/batch/runner.py +558 -0
- harmonyrun-0.0.29/droidrun/batch/scheduler.py +105 -0
- harmonyrun-0.0.29/droidrun/batch/schema_validation.py +58 -0
- harmonyrun-0.0.29/droidrun/batch/schemas/suite_report.schema.json +121 -0
- harmonyrun-0.0.29/droidrun/batch/schemas/test_suite.schema.json +103 -0
- harmonyrun-0.0.29/droidrun/batch/suite_runner.py +451 -0
- harmonyrun-0.0.29/droidrun/cli/__init__.py +9 -0
- harmonyrun-0.0.29/droidrun/cli/doctor.py +663 -0
- harmonyrun-0.0.29/droidrun/cli/event_handler.py +178 -0
- harmonyrun-0.0.29/droidrun/cli/logs.py +9 -0
- harmonyrun-0.0.29/droidrun/cli/main.py +585 -0
- harmonyrun-0.0.29/droidrun/config/app_cards/README.md +139 -0
- harmonyrun-0.0.29/droidrun/config/app_cards/app_cards.json +3 -0
- harmonyrun-0.0.29/droidrun/config/app_cards/gmail.md +35 -0
- harmonyrun-0.0.29/droidrun/config/config_example.yaml +202 -0
- harmonyrun-0.0.29/droidrun/config/credentials_example.yaml +106 -0
- harmonyrun-0.0.29/droidrun/config/prompts/batch/agent_goal.jinja2 +27 -0
- harmonyrun-0.0.29/droidrun/config/prompts/batch/postcondition_goal.jinja2 +8 -0
- harmonyrun-0.0.29/droidrun/config/prompts/batch/precondition_goal.jinja2 +8 -0
- harmonyrun-0.0.29/droidrun/config/prompts/batch/suite_report.jinja2 +62 -0
- harmonyrun-0.0.29/droidrun/config/prompts/batch/test_execution_goal.jinja2 +13 -0
- harmonyrun-0.0.29/droidrun/config/prompts/executor/rev1.jinja2 +103 -0
- harmonyrun-0.0.29/droidrun/config/prompts/executor/system.jinja2 +173 -0
- harmonyrun-0.0.29/droidrun/config/prompts/fast_agent/system.jinja2 +214 -0
- harmonyrun-0.0.29/droidrun/config/prompts/fast_agent/user.jinja2 +7 -0
- harmonyrun-0.0.29/droidrun/config/prompts/manager/rev1.jinja2 +131 -0
- harmonyrun-0.0.29/droidrun/config/prompts/manager/stateless.jinja2 +181 -0
- harmonyrun-0.0.29/droidrun/config/prompts/manager/system.jinja2 +179 -0
- harmonyrun-0.0.29/droidrun/config/prompts/manager/trained.jinja2 +67 -0
- harmonyrun-0.0.29/droidrun/config/test_cases_example.json +51 -0
- harmonyrun-0.0.29/droidrun/config_manager/__init__.py +37 -0
- harmonyrun-0.0.29/droidrun/config_manager/config_manager.py +345 -0
- harmonyrun-0.0.29/droidrun/config_manager/env_keys.py +51 -0
- harmonyrun-0.0.29/droidrun/config_manager/loader.py +78 -0
- harmonyrun-0.0.29/droidrun/config_manager/path_resolver.py +112 -0
- harmonyrun-0.0.29/droidrun/config_manager/prompt_loader.py +94 -0
- harmonyrun-0.0.29/droidrun/credential_manager/__init__.py +13 -0
- harmonyrun-0.0.29/droidrun/credential_manager/credential_manager.py +38 -0
- harmonyrun-0.0.29/droidrun/credential_manager/file_credential_manager.py +137 -0
- harmonyrun-0.0.29/droidrun/hdcutils/__init__.py +34 -0
- harmonyrun-0.0.29/droidrun/hdcutils/_agent_so.py +420 -0
- harmonyrun-0.0.29/droidrun/hdcutils/_device.py +1417 -0
- harmonyrun-0.0.29/droidrun/hdcutils/_hdc.py +97 -0
- harmonyrun-0.0.29/droidrun/hdcutils/_hilog.py +217 -0
- harmonyrun-0.0.29/droidrun/hdcutils/_proto.py +43 -0
- harmonyrun-0.0.29/droidrun/hdcutils/_recording.py +93 -0
- harmonyrun-0.0.29/droidrun/hdcutils/_uitest_rpc.py +1100 -0
- harmonyrun-0.0.29/droidrun/hdcutils/_utils.py +223 -0
- harmonyrun-0.0.29/droidrun/hdcutils/_version.py +6 -0
- harmonyrun-0.0.29/droidrun/hdcutils/agents/uitest_agent_v1.1.10.so +0 -0
- harmonyrun-0.0.29/droidrun/hdcutils/agents/uitest_agent_v1.1.3.so +0 -0
- harmonyrun-0.0.29/droidrun/hdcutils/agents/uitest_agent_v1.1.5.so +0 -0
- harmonyrun-0.0.29/droidrun/hdcutils/agents/uitest_agent_v1.1.9.x86_64_so +0 -0
- harmonyrun-0.0.29/droidrun/hdcutils/agents/uitest_agent_v1.2.2.so +0 -0
- harmonyrun-0.0.29/droidrun/hdcutils/errors.py +28 -0
- harmonyrun-0.0.29/droidrun/hdcutils/harmony_wake.py +314 -0
- harmonyrun-0.0.29/droidrun/hdcutils/keycode.py +361 -0
- harmonyrun-0.0.29/droidrun/hypium/__init__.py +11 -0
- harmonyrun-0.0.29/droidrun/hypium/action_mapper.py +180 -0
- harmonyrun-0.0.29/droidrun/hypium/assertion_builder.py +279 -0
- harmonyrun-0.0.29/droidrun/hypium/cli.py +148 -0
- harmonyrun-0.0.29/droidrun/hypium/code_polisher.py +207 -0
- harmonyrun-0.0.29/droidrun/hypium/component_resolver.py +221 -0
- harmonyrun-0.0.29/droidrun/hypium/generator.py +559 -0
- harmonyrun-0.0.29/droidrun/hypium/template.py +157 -0
- harmonyrun-0.0.29/droidrun/log_handlers.py +53 -0
- harmonyrun-0.0.29/droidrun/telemetry/__init__.py +15 -0
- harmonyrun-0.0.29/droidrun/telemetry/events.py +53 -0
- harmonyrun-0.0.29/droidrun/telemetry/tracker.py +151 -0
- harmonyrun-0.0.29/droidrun/tools/__init__.py +18 -0
- harmonyrun-0.0.29/droidrun/tools/driver/__init__.py +14 -0
- harmonyrun-0.0.29/droidrun/tools/driver/base.py +157 -0
- harmonyrun-0.0.29/droidrun/tools/driver/harmony.py +1071 -0
- harmonyrun-0.0.29/droidrun/tools/driver/recording.py +376 -0
- harmonyrun-0.0.29/droidrun/tools/driver/stealth.py +211 -0
- harmonyrun-0.0.29/droidrun/tools/filters/__init__.py +31 -0
- harmonyrun-0.0.29/droidrun/tools/filters/base.py +42 -0
- harmonyrun-0.0.29/droidrun/tools/filters/concise_filter.py +120 -0
- harmonyrun-0.0.29/droidrun/tools/filters/detailed_filter.py +168 -0
- harmonyrun-0.0.29/droidrun/tools/filters/passthrough_filter.py +23 -0
- harmonyrun-0.0.29/droidrun/tools/formatters/__init__.py +7 -0
- harmonyrun-0.0.29/droidrun/tools/formatters/base.py +27 -0
- harmonyrun-0.0.29/droidrun/tools/formatters/indexed_formatter.py +663 -0
- harmonyrun-0.0.29/droidrun/tools/helpers/__init__.py +18 -0
- harmonyrun-0.0.29/droidrun/tools/helpers/coordinate.py +25 -0
- harmonyrun-0.0.29/droidrun/tools/helpers/element_search.py +635 -0
- harmonyrun-0.0.29/droidrun/tools/helpers/geometry.py +49 -0
- harmonyrun-0.0.29/droidrun/tools/hilog_monitor.py +284 -0
- harmonyrun-0.0.29/droidrun/tools/screen_recorder.py +246 -0
- harmonyrun-0.0.29/droidrun/tools/ui/__init__.py +13 -0
- harmonyrun-0.0.29/droidrun/tools/ui/provider.py +239 -0
- harmonyrun-0.0.29/droidrun/tools/ui/screenshot_annotator.py +196 -0
- harmonyrun-0.0.29/droidrun/tools/ui/state.py +168 -0
- harmonyrun-0.0.29/droidrun/tools/ui/stealth_state.py +104 -0
- harmonyrun-0.0.29/pyproject.toml +180 -0
- harmonyrun-0.0.29/scripts/bench_dump_layout.py +247 -0
- harmonyrun-0.0.29/scripts/bench_snapshot.py +284 -0
- harmonyrun-0.0.29/scripts/diagnose_uitest_socket.py +1739 -0
- harmonyrun-0.0.29/scripts/dump_layout.sh +93 -0
- harmonyrun-0.0.29/scripts/package.sh +92 -0
- harmonyrun-0.0.29/scripts/server.java +852 -0
- harmonyrun-0.0.29/scripts/uitest_set_rotation.py +114 -0
- harmonyrun-0.0.29/static/droidrun-dark.png +0 -0
- harmonyrun-0.0.29/static/droidrun.png +0 -0
- harmonyrun-0.0.29/uv.lock +3422 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: release-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: false
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
release:
|
|
17
|
+
name: Build and publish GitHub Release
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
timeout-minutes: 20
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v5
|
|
22
|
+
- uses: actions/setup-python@v6
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.11"
|
|
25
|
+
- name: Verify release version
|
|
26
|
+
run: |
|
|
27
|
+
python - <<'PY'
|
|
28
|
+
import os
|
|
29
|
+
import tomllib
|
|
30
|
+
with open("pyproject.toml", "rb") as source:
|
|
31
|
+
project = tomllib.load(source)["project"]
|
|
32
|
+
assert project["name"] == "harmonyrun"
|
|
33
|
+
assert os.environ["GITHUB_REF_NAME"] == f"v{project['version']}"
|
|
34
|
+
PY
|
|
35
|
+
- name: Build and validate distributions
|
|
36
|
+
run: |
|
|
37
|
+
python -m pip install build twine
|
|
38
|
+
python -m build
|
|
39
|
+
python -m twine check --strict dist/*
|
|
40
|
+
- name: Publish GitHub Release
|
|
41
|
+
uses: softprops/action-gh-release@v2
|
|
42
|
+
with:
|
|
43
|
+
name: HarmonyRun ${{ github.ref_name }}
|
|
44
|
+
body_path: RELEASE_NOTES.md
|
|
45
|
+
make_latest: false
|
|
46
|
+
fail_on_unmatched_files: true
|
|
47
|
+
files: |
|
|
48
|
+
dist/*.whl
|
|
49
|
+
dist/*.tar.gz
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
dist/
|
|
2
|
+
build/
|
|
3
|
+
# Python bytecode files
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.py[cod]
|
|
6
|
+
*$py.class
|
|
7
|
+
trajectories/
|
|
8
|
+
*.class
|
|
9
|
+
|
|
10
|
+
test.py
|
|
11
|
+
test.ipynb
|
|
12
|
+
*.log
|
|
13
|
+
|
|
14
|
+
messages_log.json
|
|
15
|
+
|
|
16
|
+
.idea
|
|
17
|
+
.vscode
|
|
18
|
+
.vscode-test
|
|
19
|
+
.vscode-test-*
|
|
20
|
+
.idea/*
|
|
21
|
+
.vscode/*
|
|
22
|
+
patch_apis.py
|
|
23
|
+
.git
|
|
24
|
+
.arize-phoenix
|
|
25
|
+
|
|
26
|
+
todo.txt
|
|
27
|
+
|
|
28
|
+
config.yaml
|
|
29
|
+
|
|
30
|
+
credentials.yaml
|
|
31
|
+
**/credentials.yaml
|
|
32
|
+
!**/credentials_example.yaml
|
|
33
|
+
|
|
34
|
+
.*/
|
|
35
|
+
!.gitignore
|
|
36
|
+
!.github/
|
|
37
|
+
|
|
38
|
+
backend/
|
|
39
|
+
frontend/
|
|
40
|
+
|
|
41
|
+
reddit_python_posts.json
|
|
42
|
+
|
|
43
|
+
test/
|
|
44
|
+
.DS_Store
|
|
45
|
+
|
|
46
|
+
ppt-output/
|
|
47
|
+
|
|
48
|
+
.env
|
|
49
|
+
scripts/droidrun_layout.json
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
# HarmonyRun 命令行使用说明
|
|
2
|
+
|
|
3
|
+
HarmonyRun 是一款通过自然语言驱动真机或模拟器完成自动化任务的命令行工具,面向 **HarmonyOS(鸿蒙)** 平台。
|
|
4
|
+
|
|
5
|
+
交付物:
|
|
6
|
+
|
|
7
|
+
- 一份 wheel 安装包(文件名形如 `harmonyrun-<版本>-py3-none-any.whl`)
|
|
8
|
+
- 本说明文档
|
|
9
|
+
|
|
10
|
+
下文示例统一使用 `python3 -m droidrun` 的写法;若已激活虚拟环境或通过 `pipx` / `uv tool` 将命令加入 `PATH`,可直接使用 `harmonyrun`,两者等价;原 `droidrun` 命令仍兼容。
|
|
11
|
+
|
|
12
|
+
当前版本为 **0.0.29**,基于 DroidRun 0.5.29;Python 模块名、配置目录和内部实现保持不变。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. 环境要求
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
| 项目 | 说明 |
|
|
20
|
+
| ---------- | --------------------------------------------------------------------- |
|
|
21
|
+
| **操作系统** | macOS / Linux / Windows 均可 |
|
|
22
|
+
| **Python** | 3.11 ~ 3.13 |
|
|
23
|
+
| **鸿蒙设备** | 已安装 `**hdc`**(DevEco Studio 自带,需加入系统 `PATH`);`hdc list targets` 能看到设备 |
|
|
24
|
+
| **LLM 访问** | 使用 `run` / `test` 需要可访问的 LLM 服务及对应 API Key(详见 [第 4 节](#4-配置文件与环境变量)) |
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2. 安装
|
|
30
|
+
|
|
31
|
+
将交付包解压到任意目录,其中包含 `dist/` 与本说明。以下命令中的版本号、路径请按本机实际情况替换。
|
|
32
|
+
|
|
33
|
+
### 2.1 推荐:虚拟环境 + pip
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
cd /你的解压目录
|
|
37
|
+
|
|
38
|
+
python3 -m venv .venv
|
|
39
|
+
.venv/bin/python3 -m pip install -U pip
|
|
40
|
+
|
|
41
|
+
# 若 dist/ 内只有一个 wheel,可以用通配符(不要加引号)
|
|
42
|
+
.venv/bin/python3 -m pip install dist/harmonyrun-*-py3-none-any.whl
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
验证安装:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
.venv/bin/python3 -m droidrun --version
|
|
49
|
+
.venv/bin/python3 -m droidrun --help
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 2.2 可选:pipx / uv tool
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
pipx install /你的解压目录/harmonyrun-<版本>-py3-none-any.whl
|
|
56
|
+
# 或
|
|
57
|
+
uv tool install /你的解压目录/harmonyrun-<版本>-py3-none-any.whl
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 3. 快速上手
|
|
63
|
+
|
|
64
|
+
1. 确保 `hdc list targets` 能看到设备。
|
|
65
|
+
2. 首次运行任意命令会自动在用户目录生成 `config.yaml`:
|
|
66
|
+
```bash
|
|
67
|
+
python3 -m droidrun --help
|
|
68
|
+
```
|
|
69
|
+
3. 按 [第 4 节](#4-配置文件与环境变量) 编辑 `config.yaml` 与 `.env`,至少配置一个可用的 API Key。
|
|
70
|
+
4. 运行一个任务:
|
|
71
|
+
```bash
|
|
72
|
+
python3 -m droidrun run "打开设置"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 4. 配置文件与环境变量
|
|
78
|
+
|
|
79
|
+
### 4.1 配置读取优先级(从高到低)
|
|
80
|
+
|
|
81
|
+
1. 命令行 `-c` / `--config` 指定的 YAML 文件
|
|
82
|
+
2. 环境变量 `DROIDRUN_CONFIG` 指向的 YAML 文件
|
|
83
|
+
3. 用户配置目录下的 `config.yaml`
|
|
84
|
+
4. 若上述文件不存在,首次运行时按内置默认值自动生成
|
|
85
|
+
|
|
86
|
+
### 4.2 用户配置目录
|
|
87
|
+
|
|
88
|
+
`config.yaml` 与 `.env` 位于同一目录:
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
| 系统 | 用户配置目录 |
|
|
92
|
+
| ----------- | --------------------------------------------- |
|
|
93
|
+
| **macOS** | `~/Library/Application Support/droidrun/` |
|
|
94
|
+
| **Linux** | `~/.config/droidrun/`(受 `XDG_CONFIG_HOME` 影响) |
|
|
95
|
+
| **Windows** | `%LOCALAPPDATA%\droidrun\` |
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
### 4.3 `.env` 与环境变量
|
|
99
|
+
|
|
100
|
+
HarmonyRun 会从两处自动读取 `.env`:
|
|
101
|
+
|
|
102
|
+
1. **当前工作目录及父目录**:运行 `run` / `test` 时会以 `python-dotenv` 默认规则,从当前执行目录向上查找 `.env`。适合把密钥跟工程放在一起。
|
|
103
|
+
2. **用户配置目录**(见 [4.2](#42-用户配置目录))下的 `.env`:HarmonyRun 内部对 API Key 类变量会**显式覆盖**系统环境变量。
|
|
104
|
+
|
|
105
|
+
#### 4.3.1 LLM API Key
|
|
106
|
+
|
|
107
|
+
如通过阿里云百炼接入(详见 [4.7](#47-阿里云百炼dashscope接入))。把密钥放到 `.env` 而不是 `config.yaml`,更适合团队共享配置模板而密钥各自保管。
|
|
108
|
+
|
|
109
|
+
可以把下面这样的文件放在**工程当前目录**(推荐)或**用户配置目录**下:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# 百炼(Anthropic 协议)
|
|
113
|
+
ANTHROPIC_API_KEY=sk-sp-xxxxxxxxxxxxxxxx
|
|
114
|
+
|
|
115
|
+
# 其它提供商(按需)
|
|
116
|
+
# GOOGLE_API_KEY=...
|
|
117
|
+
# GEMINI_API_KEY=...
|
|
118
|
+
# OPENAI_API_KEY=...
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
同时,从 `.env` 里去掉 `config.yaml` 中各角色下的 `kwargs.api_key`,只保留 `base_url`:
|
|
122
|
+
|
|
123
|
+
```yaml
|
|
124
|
+
llm_profiles:
|
|
125
|
+
fast_agent:
|
|
126
|
+
provider: Anthropic
|
|
127
|
+
model: qwen3-vl-plus
|
|
128
|
+
temperature: 0.2
|
|
129
|
+
kwargs:
|
|
130
|
+
base_url: https://coding.dashscope.aliyuncs.com/apps/anthropic
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
#### 4.3.2 API Key 的最终优先级(从高到低)
|
|
134
|
+
|
|
135
|
+
1. `config.yaml` → `llm_profiles.<角色>.kwargs.api_key`
|
|
136
|
+
2. **用户配置目录下** `.env` 中的同名变量(显式覆盖系统变量)
|
|
137
|
+
3. 系统 / shell 环境变量(`export ANTHROPIC_API_KEY=...`)
|
|
138
|
+
4. **当前工作目录及父目录** 下 `.env` 中的同名变量(仅在上面三层都没设置时生效)
|
|
139
|
+
|
|
140
|
+
#### 4.3.3 设备解锁口令
|
|
141
|
+
|
|
142
|
+
运行任务时 HarmonyRun 会先检查设备电源状态,若处于 `SLEEP` 会自动唤醒并滑开锁屏;**若设备设置了 PIN / 密码锁,需要通过环境变量提供解锁口令**,否则只能滑开但无法通过密码屏。
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
| 变量名 | 用途 |
|
|
146
|
+
| ------------------------------------------ | -------------------------------------------------- |
|
|
147
|
+
| `DROIDRUN_DEVICE_UNLOCK_PASSWORD` | 全局回退口令,所有设备共用 |
|
|
148
|
+
| `DROIDRUN_DEVICE_UNLOCK_PASSWORD_<SERIAL>` | 指定设备专用口令;优先级高于全局回退。`<SERIAL>` 中非字母数字字符替换为下划线,并整体大写 |
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
示例:设备序列号为 `DEVICE_SAMPLE_002`,对应变量名为 `DROIDRUN_DEVICE_UNLOCK_PASSWORD_DEVICE_SAMPLE_002`:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# 全局回退
|
|
155
|
+
DROIDRUN_DEVICE_UNLOCK_PASSWORD=123456
|
|
156
|
+
|
|
157
|
+
# 指定设备(带连字符或其它符号的序列号,非字母数字都转成 _)
|
|
158
|
+
DROIDRUN_DEVICE_UNLOCK_PASSWORD_DEVICE_SAMPLE_002=123456
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
> 口令会在唤醒后自动输入;如果不配置,运行时会在日志中提示 "no DROIDRUN_DEVICE_UNLOCK_PASSWORD",此时请确保设备未设置密码锁。
|
|
162
|
+
|
|
163
|
+
### 4.4 `config.yaml` 完整示例
|
|
164
|
+
|
|
165
|
+
首次运行会在用户配置目录下生成以下模板,可直接在其上修改。每个字段旁已注明用途与默认值:
|
|
166
|
+
|
|
167
|
+
```yaml
|
|
168
|
+
# === Agent 智能体行为 ===
|
|
169
|
+
agent:
|
|
170
|
+
name: droidrun # Agent 标识,保持为 droidrun
|
|
171
|
+
max_steps: 15 # 单任务最大步数
|
|
172
|
+
reasoning: false # 是否开启带推理的规划模式
|
|
173
|
+
streaming: true # 是否在终端流式输出模型回复
|
|
174
|
+
after_sleep_action: 1.0 # 每次动作后等待设备更新的秒数
|
|
175
|
+
wait_for_stable_ui: 0.3 # 等待 UI 稳定的秒数
|
|
176
|
+
use_normalized_coordinates: false # 坐标:false=像素,true=归一化 [0,1000]
|
|
177
|
+
|
|
178
|
+
fast_agent:
|
|
179
|
+
vision: false # 是否启用截图视觉(推荐 true,需搭配支持视觉的模型)
|
|
180
|
+
parallel_tools: true # 单次回复允许合并多次工具调用
|
|
181
|
+
system_prompt: config/prompts/fast_agent/system.jinja2
|
|
182
|
+
user_prompt: config/prompts/fast_agent/user.jinja2
|
|
183
|
+
|
|
184
|
+
manager:
|
|
185
|
+
vision: false # 推荐 true
|
|
186
|
+
system_prompt: config/prompts/manager/system.jinja2
|
|
187
|
+
stateless: false # 每轮是否重建上下文(实验性)
|
|
188
|
+
|
|
189
|
+
executor:
|
|
190
|
+
vision: false # 推荐 true
|
|
191
|
+
system_prompt: config/prompts/executor/system.jinja2
|
|
192
|
+
|
|
193
|
+
app_cards:
|
|
194
|
+
enabled: true # 启用 App 专属指令卡片
|
|
195
|
+
mode: local # local / server / composite
|
|
196
|
+
app_cards_dir: config/app_cards
|
|
197
|
+
server_url: null
|
|
198
|
+
server_timeout: 10.0
|
|
199
|
+
server_max_retries: 2
|
|
200
|
+
|
|
201
|
+
# === LLM 配置(按角色区分) ===
|
|
202
|
+
# 每个角色独立配置 provider/model,彼此可以不同。
|
|
203
|
+
# 字段:
|
|
204
|
+
# provider 提供商(GoogleGenAI、OpenAI、Anthropic、Ollama、OpenRouter …)
|
|
205
|
+
# model 模型名
|
|
206
|
+
# temperature 采样温度
|
|
207
|
+
# base_url / api_base 自定义 API 地址(可选,详见 4.6)
|
|
208
|
+
# kwargs 附加参数映射,会被整体透传给底层 LLM 客户端构造函数
|
|
209
|
+
# (可写 api_key / base_url / max_tokens 等,详见 4.6)
|
|
210
|
+
#
|
|
211
|
+
# 以下为推荐配置:通过 **阿里云百炼(DashScope)** 的 Anthropic 兼容接入
|
|
212
|
+
# 调用通义千问系列模型。按需替换 api_key 与 model 即可。百炼接入详见 4.7。
|
|
213
|
+
llm_profiles:
|
|
214
|
+
manager: # 规划与任务推进
|
|
215
|
+
provider: Anthropic
|
|
216
|
+
model: qwen3.5-plus
|
|
217
|
+
temperature: 0.2
|
|
218
|
+
kwargs:
|
|
219
|
+
api_key: sk-sp-xxxxxxxxxxxxxxxx # 百炼控制台生成的 API Key
|
|
220
|
+
base_url: https://coding.dashscope.aliyuncs.com/apps/anthropic
|
|
221
|
+
|
|
222
|
+
executor: # 选择并执行原子动作
|
|
223
|
+
provider: Anthropic
|
|
224
|
+
model: qwen3.5-plus
|
|
225
|
+
temperature: 0.1
|
|
226
|
+
kwargs:
|
|
227
|
+
api_key: sk-sp-xxxxxxxxxxxxxxxx
|
|
228
|
+
base_url: https://coding.dashscope.aliyuncs.com/apps/anthropic
|
|
229
|
+
|
|
230
|
+
fast_agent: # 直接执行 Agent
|
|
231
|
+
provider: Anthropic
|
|
232
|
+
model: qwen3.5-plus
|
|
233
|
+
temperature: 0.2
|
|
234
|
+
kwargs:
|
|
235
|
+
api_key: sk-sp-xxxxxxxxxxxxxxxx
|
|
236
|
+
base_url: https://coding.dashscope.aliyuncs.com/apps/anthropic
|
|
237
|
+
|
|
238
|
+
app_opener: # 按名称/描述打开 App
|
|
239
|
+
provider: Anthropic
|
|
240
|
+
model: qwen3.5-plus
|
|
241
|
+
temperature: 0.0
|
|
242
|
+
kwargs:
|
|
243
|
+
api_key: sk-sp-xxxxxxxxxxxxxxxx
|
|
244
|
+
base_url: https://coding.dashscope.aliyuncs.com/apps/anthropic
|
|
245
|
+
|
|
246
|
+
structured_output: # 最终答案的结构化抽取
|
|
247
|
+
provider: Anthropic
|
|
248
|
+
model: qwen3.5-plus
|
|
249
|
+
temperature: 0.0
|
|
250
|
+
kwargs:
|
|
251
|
+
api_key: sk-sp-xxxxxxxxxxxxxxxx
|
|
252
|
+
base_url: https://coding.dashscope.aliyuncs.com/apps/anthropic
|
|
253
|
+
|
|
254
|
+
hypium: # Hypium 断言生成与代码润色(可选,默认回退到 fast_agent)
|
|
255
|
+
provider: Anthropic
|
|
256
|
+
model: qwen3.5-plus
|
|
257
|
+
temperature: 0.2
|
|
258
|
+
kwargs:
|
|
259
|
+
api_key: sk-sp-xxxxxxxxxxxxxxxx
|
|
260
|
+
base_url: https://coding.dashscope.aliyuncs.com/apps/anthropic
|
|
261
|
+
|
|
262
|
+
# === 设备 ===
|
|
263
|
+
device:
|
|
264
|
+
serial: null # 默认设备序列号,null = 自动选择
|
|
265
|
+
platform: harmony # 仅支持 harmony(鸿蒙 / hdc + uitest)
|
|
266
|
+
ui_backend: socket # socket(默认,推荐)或 shell(旧式,能力有限)
|
|
267
|
+
|
|
268
|
+
# === 遥测 ===
|
|
269
|
+
telemetry:
|
|
270
|
+
enabled: true # 匿名使用情况统计,可按合规关闭
|
|
271
|
+
|
|
272
|
+
# === 追踪(遗留开关,保持 false 即可) ===
|
|
273
|
+
tracing:
|
|
274
|
+
enabled: false
|
|
275
|
+
|
|
276
|
+
# === 日志与轨迹 ===
|
|
277
|
+
logging:
|
|
278
|
+
debug: false # 调试日志
|
|
279
|
+
save_trajectory: none # none / step / action
|
|
280
|
+
trajectory_path: trajectories # 轨迹根目录(相对当前工作目录或绝对路径)
|
|
281
|
+
trajectory_llm_log: false # 额外记录每次 LLM 调用的 JSON 日志
|
|
282
|
+
rich_text: false # 终端 Rich 彩色样式
|
|
283
|
+
screen_recording: false # 运行时录屏(需 save_trajectory ≠ none)
|
|
284
|
+
|
|
285
|
+
# === 工具开关 ===
|
|
286
|
+
tools:
|
|
287
|
+
# 可禁用的工具名:click / click_at / click_area / long_press / long_press_at
|
|
288
|
+
# type / type_secret / system_button / swipe / wait / open_app
|
|
289
|
+
disabled_tools:
|
|
290
|
+
- click_at
|
|
291
|
+
- click_area
|
|
292
|
+
- long_press_at
|
|
293
|
+
|
|
294
|
+
# === 凭据(可选) ===
|
|
295
|
+
credentials:
|
|
296
|
+
enabled: false
|
|
297
|
+
file_path: config/credentials.yaml
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 4.5 LLM 模型切换要点
|
|
301
|
+
|
|
302
|
+
- **推荐使用支持视觉的模型**(百炼上的 `qwen3.6-plus` 或 Claude Sonnet 4.x 等),并把 `agent.fast_agent.vision`、`agent.manager.vision`、`agent.executor.vision` 都改为 `true`;开启截图视觉能显著提高对复杂界面的理解与点击准确率。纯文本模型会导致部分场景定位失败。
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## 5. `run`:执行单个自然语言任务
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
python3 -m droidrun run "你的任务描述"
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
常用选项:
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
| 选项 | 含义 |
|
|
316
|
+
| -------------------------------- | -------------------------- |
|
|
317
|
+
| `-c, --config` | 指定配置文件 |
|
|
318
|
+
| `-d, --device` | 设备序列号或 IP |
|
|
319
|
+
| `-p` / `-m` | LLM 提供商与模型,**必须同时指定** |
|
|
320
|
+
| `--temperature` | 采样温度 |
|
|
321
|
+
| `--steps` | 单任务最大步数 |
|
|
322
|
+
| `-u`, `--base_url`, `--api_base` | 自定义 API 地址 |
|
|
323
|
+
| `--vision` / `--no-vision` | 统一开/关所有 Agent 的视觉能力 |
|
|
324
|
+
| `--reasoning` / `--no-reasoning` | 切换规划推理模式 |
|
|
325
|
+
| `--stream` / `--no-stream` | 流式输出 |
|
|
326
|
+
| `--tcp` / `--no-tcp` | 设备 TCP 通信 |
|
|
327
|
+
| `--save-trajectory` | `none` / `step` / `action` |
|
|
328
|
+
| `--debug` | 开启调试日志 |
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
退出码:成功 `0`,失败 `1`。
|
|
332
|
+
|
|
333
|
+
### 5.1 `run` 的输出件
|
|
334
|
+
|
|
335
|
+
当 `save_trajectory` 非 `none` 时,在 `logging.trajectory_path`(默认 `trajectories/`,相对当前工作目录)下生成:
|
|
336
|
+
|
|
337
|
+
```
|
|
338
|
+
trajectories/
|
|
339
|
+
└── trajectory_YYYYMMDD_HHMMSS/
|
|
340
|
+
├── trajectory.jsonl # 完整轨迹事件(含设备操作事件)
|
|
341
|
+
├── meta.json # 本次运行摘要:目标、耗时、token 统计、计数、环境信息
|
|
342
|
+
├── formatted_device_state/ # 每步模型看到的设备状态文本快照
|
|
343
|
+
├── screenshots/ # 截图帧(0000.png, 0001.png, …)
|
|
344
|
+
├── screen_recording.mp4 # 屏幕录像(screen_recording=true 时)
|
|
345
|
+
└── log/ # 每次 LLM 调用的 JSON 日志(trajectory_llm_log=true 时)
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## 6. `test`:批量执行测试套件
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
python3 -m droidrun test /路径/套件.json
|
|
354
|
+
python3 -m droidrun test --help
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
- 套件为 JSON 格式,需符合 HarmonyRun 测试套件约定。
|
|
358
|
+
- `--case <ID>`:只执行指定用例。
|
|
359
|
+
- `--level L0|L1|L2`:按优先级筛选。
|
|
360
|
+
- `-r, --report-file <路径>` 配合 `--format markdown|json`:额外导出一份报告。
|
|
361
|
+
- `-d <设备>` 可重复:多台设备组成池,用例自动分配到空闲设备。
|
|
362
|
+
|
|
363
|
+
> 即便 `save_trajectory: none`,`test` 通常也会自动按 `step` 级别落盘轨迹以便生成报告。
|
|
364
|
+
|
|
365
|
+
### 6.1 `test` 的输出件
|
|
366
|
+
|
|
367
|
+
每次运行会在 `logging.trajectory_path` 下生成一个带时间戳的套件目录:
|
|
368
|
+
|
|
369
|
+
```
|
|
370
|
+
trajectories/
|
|
371
|
+
└── <套件名>_YYYYMMDD_HHMMSS/
|
|
372
|
+
├── report.json # 套件总报告(机器可读)
|
|
373
|
+
├── report.md # 套件实时报告(人类可读,运行中持续更新)
|
|
374
|
+
└── cases/
|
|
375
|
+
├── <case_id>_YYYYMMDD_HHMMSS/
|
|
376
|
+
│ ├── trajectory.jsonl
|
|
377
|
+
│ ├── meta.json
|
|
378
|
+
│ ├── formatted_device_state/
|
|
379
|
+
│ └── screenshots/
|
|
380
|
+
└── …
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
若通过 `-r / --report-file` 另行指定路径,还会在该路径额外输出一份报告。
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
## 7. 常见问题
|
|
388
|
+
|
|
389
|
+
1. `**droidrun` / `python3 -m droidrun` 找不到**
|
|
390
|
+
请确认使用的是安装了 wheel 的那个 Python。未激活虚拟环境时,使用 `.venv/bin/python3 -m droidrun`。
|
|
391
|
+
2. `**ModuleNotFoundError: llama_index.llms.…`**
|
|
392
|
+
所选 `provider` 的依赖未安装。按 [2.3](#23-额外-llm-适配包按需) 安装对应 extras,或按报错的包名单独 `pip install`。
|
|
393
|
+
3. **401 / 403 / 模型不可用**
|
|
394
|
+
检查用户配置目录下的 `.env`(路径见 [4.2](#42-用户配置目录))中密钥是否有效;并确认 `llm_profiles` 的 `provider` 与 `model` 与该密钥匹配。
|
|
395
|
+
4. **找不到设备**
|
|
396
|
+
先执行 `hdc list targets` 确认设备可见,再 `droidrun devices`;必要时 `droidrun doctor` 进一步诊断。
|
|
397
|
+
5. **运行时报 uitest 相关错误**
|
|
398
|
+
将 `device.ui_backend` 改回 `socket`(默认),或执行 `droidrun doctor` 诊断。
|
|
399
|
+
6. `**hypium run` 失败**
|
|
400
|
+
单独安装 Hypium 相关依赖与 CLI,确保 `python -m hypium` 等命令可用。
|
|
401
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
FROM python:3.12-slim
|
|
2
|
+
|
|
3
|
+
RUN groupadd -g 1000 droidrun \
|
|
4
|
+
&& useradd -m -u 1000 -g 1000 -s /bin/bash droidrun
|
|
5
|
+
|
|
6
|
+
# hdc (HarmonyOS Device Connector) is not packaged in Debian slim; mount/copy the host binary
|
|
7
|
+
# into PATH or bake it into a derived image. curl is kept for uv installer below.
|
|
8
|
+
RUN apt-get update && \
|
|
9
|
+
apt-get install -y --no-install-recommends \
|
|
10
|
+
curl \
|
|
11
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
12
|
+
|
|
13
|
+
USER droidrun
|
|
14
|
+
|
|
15
|
+
WORKDIR /droidrun
|
|
16
|
+
|
|
17
|
+
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
18
|
+
|
|
19
|
+
ENV PATH="/home/droidrun/.local/bin:${PATH}"
|
|
20
|
+
|
|
21
|
+
COPY . .
|
|
22
|
+
|
|
23
|
+
RUN uv venv && \
|
|
24
|
+
uv pip --no-cache-dir install .[google,anthropic,openai,deepseek,ollama,openrouter]
|
|
25
|
+
|
|
26
|
+
ENTRYPOINT [".venv/bin/harmonyrun"]
|
|
27
|
+
|
|
28
|
+
CMD ["--help"]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Niels Schmidt
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|