browser-control-and-automation-cli 0.1.1.dev3__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.
- browser_control_and_automation_cli-0.1.1.dev3/.github/pull_request_template.md +34 -0
- browser_control_and_automation_cli-0.1.1.dev3/.github/workflows/ci.yml +130 -0
- browser_control_and_automation_cli-0.1.1.dev3/.github/workflows/release.yml +36 -0
- browser_control_and_automation_cli-0.1.1.dev3/.gitignore +19 -0
- browser_control_and_automation_cli-0.1.1.dev3/.pre-commit-config.yaml +18 -0
- browser_control_and_automation_cli-0.1.1.dev3/.python-version +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/AGENTS.md +309 -0
- browser_control_and_automation_cli-0.1.1.dev3/LICENSE +21 -0
- browser_control_and_automation_cli-0.1.1.dev3/MANIFEST.in +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/PKG-INFO +340 -0
- browser_control_and_automation_cli-0.1.1.dev3/README.md +328 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/manifest.json +28 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/offscreen.html +10 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/package.json +3 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/popup.html +118 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/background/artifact_actions.js +213 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/background/dialog_actions.js +29 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/background/input_actions.js +54 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/background/locator_actions.js +77 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/background/observe_actions.js +233 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/background/page_actions.js +72 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/background/trace_actions.js +136 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/background/video_actions.js +193 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/background/workspace.js +136 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/background.js +508 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/debugger.js +796 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/offscreen.js +247 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/page_runtime.js +680 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/popup.css +246 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/popup.js +219 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/popup_view.js +124 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/src/protocol.js +85 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/tests/debugger.test.js +99 -0
- browser_control_and_automation_cli-0.1.1.dev3/browser-cli-extension/tests/popup_view.test.js +102 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/examples/task-and-automation.md +82 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/extension-driver-gaps.md +37 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/installed-with-pip.md +19 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/installed-with-uv.md +118 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/smoke-checklist.md +142 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-08-browser-cli-v1-implementation-plan.md +398 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-09-browser-cli-semantic-ref-task-workflow-skill-implementation-plan.md +473 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-09-browser-cli-v2-agent-actions-implementation-plan.md +533 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-10-browser-cli-dual-driver-extension-implementation-plan.md +490 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-10-browser-cli-status-reload-implementation-plan.md +296 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-11-browser-cli-extension-driver-parity-refactor-implementation-plan.md +350 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-11-browser-cli-network-response-body-implementation-plan.md +354 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-12-browser-cli-popup-runtime-polish.md +1193 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-12-browser-cli-workflow-publish-layer-implementation-plan.md +536 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-13-browser-cli-long-run-stability-implementation-plan.md +1113 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-13-browser-cli-pip-user-ux-roadmap-implementation-plan.md +1002 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-13-browser-cli-task-automation-implementation-plan.md +1313 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-automation-manifest-roundtrip-implementation-plan.md +1109 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-browser-cli-delivery-skills-implementation-plan.md +634 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-browser-cli-douyin-automation-packaging-plan.md +188 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-browser-cli-extension-attach-race-implementation-plan.md +48 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-browser-cli-install-skills-implementation-plan.md +620 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-browser-cli-persistent-startup-page-reuse.md +465 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-browser-cli-release-readiness-implementation-plan.md +860 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-browser-cli-task-runtime-read-unification-implementation-plan.md +686 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-browser-cli-uninstall-doc-implementation-plan.md +351 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-browser-cli-uv-migration-implementation-plan.md +819 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-daemon-parameter-validation-implementation-plan.md +517 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/plans/2026-04-14-pypi-package-rename-implementation-plan.md +245 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-08-browser-cli-design.md +396 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-09-browser-cli-backed-explore-delivery-skill-design.md +394 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-09-browser-cli-explore-task-workflow-design.md +637 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-09-browser-cli-v2-agent-actions-design.md +454 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-09-browser-cli-v3a-semantic-ref-resolution-design.md +428 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-10-browser-cli-dual-driver-extension-architecture-design.md +652 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-10-browser-cli-status-reload-design.md +517 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-11-browser-cli-extension-driver-parity-refactor-design.md +338 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-11-browser-cli-extension-video-cdp-screencast-design.md +288 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-11-browser-cli-network-response-body-design.md +581 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-11-browser-cli-next-roadmap.md +167 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-12-browser-cli-popup-control-surface-runtime-polish-design.md +588 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-12-browser-cli-workflow-publish-layer-design.md +604 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-13-browser-cli-long-run-stability-design.md +635 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-13-browser-cli-pip-user-ux-backlog.md +365 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-13-browser-cli-pip-user-ux-roadmap-design.md +602 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-13-browser-cli-task-automation-design.md +444 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-14-automation-manifest-roundtrip-design.md +395 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-14-browser-cli-delivery-skills-design.md +490 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-14-browser-cli-persistent-startup-page-reuse-design.md +253 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-14-browser-cli-release-readiness-design.md +443 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-14-browser-cli-task-runtime-read-unification-design.md +395 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-14-browser-cli-uninstall-doc-design.md +266 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-14-browser-cli-uv-migration-design.md +436 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-14-daemon-parameter-validation-design.md +287 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-14-install-skills-design.md +368 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/superpowers/specs/2026-04-14-pypi-package-rename-design.md +112 -0
- browser_control_and_automation_cli-0.1.1.dev3/docs/uninstall.md +110 -0
- browser_control_and_automation_cli-0.1.1.dev3/pyproject.toml +87 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/__init__.py +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/check.sh +6 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/generate_packaged_skill_docs.py +46 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/guard.sh +9 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/guards/__init__.py +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/guards/architecture.py +132 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/guards/common.py +137 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/guards/docs_sync.py +107 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/guards/product_contracts.py +245 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/guards/python_compatibility.py +93 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/guards/run_all.py +32 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/lint.sh +19 -0
- browser_control_and_automation_cli-0.1.1.dev3/scripts/test.sh +10 -0
- browser_control_and_automation_cli-0.1.1.dev3/setup.cfg +4 -0
- browser_control_and_automation_cli-0.1.1.dev3/skills/browser-cli-converge/SKILL.md +62 -0
- browser_control_and_automation_cli-0.1.1.dev3/skills/browser-cli-delivery/SKILL.md +61 -0
- browser_control_and_automation_cli-0.1.1.dev3/skills/browser-cli-explore/SKILL.md +77 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/__init__.py +7 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/actions/__init__.py +5 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/actions/cli_specs.py +868 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/agent_scope/__init__.py +14 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/__init__.py +11 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/api/__init__.py +5 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/api/server.py +321 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/hooks.py +42 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/loader.py +134 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/models.py +127 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/persistence/__init__.py +5 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/persistence/store.py +682 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/projections.py +279 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/publisher.py +153 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/scheduler/__init__.py +5 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/scheduler/schedule.py +113 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/service/__init__.py +8 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/service/__main__.py +64 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/service/client.py +232 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/service/runtime.py +388 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/toml.py +35 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/web/__init__.py +5 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/automation/web/assets.py +377 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/browser/__init__.py +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/browser/models.py +44 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/browser/network_capture.py +392 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/browser/service.py +1519 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/browser/session.py +158 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/browser/snapshot.py +35 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/browser/stealth.py +450 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/cli/__init__.py +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/cli/error_hints.py +26 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/cli/main.py +298 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/commands/__init__.py +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/commands/action.py +25 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/commands/automation.py +304 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/commands/doctor.py +336 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/commands/install_skills.py +138 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/commands/paths.py +31 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/commands/read.py +33 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/commands/reload.py +51 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/commands/status.py +444 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/commands/task.py +71 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/constants.py +97 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/daemon/__init__.py +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/daemon/__main__.py +34 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/daemon/app.py +941 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/daemon/browser_service.py +998 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/daemon/client.py +280 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/daemon/models.py +63 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/daemon/runtime_presentation.py +167 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/daemon/server.py +103 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/daemon/state.py +15 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/daemon/transport.py +77 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/__init__.py +6 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/_extension/__init__.py +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/_extension/artifact_actions.py +154 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/_extension/dialog_actions.py +35 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/_extension/input_actions.py +63 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/_extension/locator_actions.py +100 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/_extension/observe_actions.py +285 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/_extension/page_actions.py +210 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/_extension/state_actions.py +134 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/base.py +391 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/extension_driver.py +33 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/models.py +21 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/drivers/playwright_driver.py +499 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/error_codes.py +27 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/errors.py +146 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/exit_codes.py +9 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/extension/__init__.py +32 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/extension/protocol.py +222 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/extension/session.py +393 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/network.py +147 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/outputs/__init__.py +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/outputs/json.py +10 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/outputs/render.py +7 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/packaged_skills/__init__.py +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/packaged_skills/browser-cli-converge/SKILL.md +62 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/packaged_skills/browser-cli-delivery/SKILL.md +61 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/packaged_skills/browser-cli-explore/SKILL.md +77 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/profiles/__init__.py +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/profiles/discovery.py +185 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/refs/__init__.py +17 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/refs/generator.py +386 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/refs/models.py +127 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/refs/registry.py +51 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/refs/resolver.py +214 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/tabs/__init__.py +5 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/tabs/registry.py +283 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/task_runtime/__init__.py +31 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/task_runtime/client.py +107 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/task_runtime/entrypoint.py +110 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/task_runtime/errors.py +17 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/task_runtime/flow.py +171 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/task_runtime/models.py +97 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/task_runtime/read.py +71 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_cli/task_runtime/templates.py +58 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_control_and_automation_cli.egg-info/PKG-INFO +340 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_control_and_automation_cli.egg-info/SOURCES.txt +273 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_control_and_automation_cli.egg-info/dependency_links.txt +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_control_and_automation_cli.egg-info/entry_points.txt +2 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_control_and_automation_cli.egg-info/requires.txt +5 -0
- browser_control_and_automation_cli-0.1.1.dev3/src/browser_control_and_automation_cli.egg-info/top_level.txt +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/_templates/automation.toml +30 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/_templates/task.meta.json +39 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/_templates/task.py +20 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/douyin_video_download/automation.toml +33 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/douyin_video_download/task.meta.json +107 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/douyin_video_download/task.py +314 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/interactive_reveal_capture/automation.toml +31 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/interactive_reveal_capture/task.meta.json +82 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/interactive_reveal_capture/task.py +43 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/karpathy_nitter_latest_five/task.meta.json +121 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/karpathy_nitter_latest_five/task.py +186 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/lazy_scroll_capture/automation.toml +33 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/lazy_scroll_capture/task.meta.json +76 -0
- browser_control_and_automation_cli-0.1.1.dev3/tasks/lazy_scroll_capture/task.py +25 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/__init__.py +1 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/conftest.py +27 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/integration/fixture_server.py +451 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/integration/test_daemon_actions.py +690 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/integration/test_runtime_stability.py +48 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/integration/test_task_cli.py +37 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/integration/test_task_runtime_read.py +176 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_action_catalog.py +84 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_agent_scope.py +49 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_automation_api.py +198 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_automation_commands.py +365 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_automation_projections.py +192 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_automation_publish.py +165 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_automation_service.py +228 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_browser_models.py +36 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_browser_service.py +278 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_browser_stealth.py +71 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_cli.py +175 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_daemon_app_validation.py +162 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_daemon_browser_service.py +596 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_daemon_client.py +117 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_daemon_server.py +54 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_doctor_command.py +111 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_error_hints.py +14 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_extension_driver_actions.py +358 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_extension_transport.py +493 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_guard_scripts.py +74 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_install_skills_command.py +171 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_lifecycle_commands.py +355 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_network.py +68 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_paths_command.py +26 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_profile_discovery.py +171 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_python_compat_guard.py +38 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_python_compatibility.py +36 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_release_artifacts.py +36 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_repo_metadata.py +51 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_repo_skill_docs.py +78 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_repo_text_contracts.py +42 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_repo_workflows.py +33 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_runtime_presentation.py +304 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_semantic_refs.py +31 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_task_commands.py +120 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_task_entrypoint.py +48 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_task_runtime_automation.py +89 -0
- browser_control_and_automation_cli-0.1.1.dev3/tests/unit/test_task_runtime_client_read.py +147 -0
- browser_control_and_automation_cli-0.1.1.dev3/third_party/bridgic-browser/LICENSE +22 -0
- browser_control_and_automation_cli-0.1.1.dev3/third_party/bridgic-browser/PROVENANCE.md +22 -0
- browser_control_and_automation_cli-0.1.1.dev3/uv.lock +513 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
|
|
3
|
+
<!-- Briefly describe your changes and link to any related issues. -->
|
|
4
|
+
|
|
5
|
+
Related issue:
|
|
6
|
+
|
|
7
|
+
## Type of Change
|
|
8
|
+
|
|
9
|
+
- [ ] 🐛 Bug fix
|
|
10
|
+
- [ ] ✨ New feature
|
|
11
|
+
- [ ] 📝 Documentation
|
|
12
|
+
- [ ] ♻️ Refactor
|
|
13
|
+
- [ ] 🔧 CI / build / tooling
|
|
14
|
+
- [ ] 🧪 Test coverage
|
|
15
|
+
|
|
16
|
+
## Checklist
|
|
17
|
+
|
|
18
|
+
- [ ] I ran the relevant checks (`ruff`, `mypy`, `pytest`, architecture guard)
|
|
19
|
+
- [ ] I updated tests or docs if needed
|
|
20
|
+
- [ ] My changes follow the architectural boundaries (see `AGENTS.md`)
|
|
21
|
+
|
|
22
|
+
## Architectural Boundaries
|
|
23
|
+
|
|
24
|
+
If your change crosses module boundaries, confirm it aligns with `AGENTS.md`:
|
|
25
|
+
|
|
26
|
+
- [ ] `browser_cli.actions` owns daemon-backed CLI action metadata
|
|
27
|
+
- [ ] `browser_cli.daemon` owns the long-lived daemon and command dispatch
|
|
28
|
+
- [ ] `browser_cli.drivers` owns the explicit backend contract
|
|
29
|
+
- [ ] `browser_cli.browser` owns low-level Playwright primitives
|
|
30
|
+
- [ ] `browser_cli.refs` owns semantic ref models and generation
|
|
31
|
+
|
|
32
|
+
## Screenshots / Output
|
|
33
|
+
|
|
34
|
+
<!-- If applicable, paste CLI output or test results here. -->
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
concurrency:
|
|
11
|
+
group: ci-${{ github.ref }}
|
|
12
|
+
cancel-in-progress: true
|
|
13
|
+
|
|
14
|
+
env:
|
|
15
|
+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
guard:
|
|
19
|
+
name: Guard Checks
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
|
|
24
|
+
- name: Set up uv
|
|
25
|
+
uses: astral-sh/setup-uv@v7
|
|
26
|
+
with:
|
|
27
|
+
python-version-file: .python-version
|
|
28
|
+
enable-cache: true
|
|
29
|
+
|
|
30
|
+
- name: Sync dependencies
|
|
31
|
+
run: uv sync --locked --dev
|
|
32
|
+
|
|
33
|
+
- name: Run guards
|
|
34
|
+
run: ./scripts/guard.sh
|
|
35
|
+
|
|
36
|
+
unit-test:
|
|
37
|
+
name: Unit Tests
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
strategy:
|
|
40
|
+
fail-fast: false
|
|
41
|
+
matrix:
|
|
42
|
+
python-version: ['3.10', '3.11', '3.12']
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@v4
|
|
45
|
+
|
|
46
|
+
- name: Set up uv and Python ${{ matrix.python-version }}
|
|
47
|
+
uses: astral-sh/setup-uv@v7
|
|
48
|
+
with:
|
|
49
|
+
python-version: ${{ matrix.python-version }}
|
|
50
|
+
enable-cache: true
|
|
51
|
+
|
|
52
|
+
- name: Sync dependencies
|
|
53
|
+
run: uv sync --locked --dev
|
|
54
|
+
|
|
55
|
+
- name: Run unit tests
|
|
56
|
+
run: uv run pytest tests/unit -v --tb=short
|
|
57
|
+
|
|
58
|
+
lint:
|
|
59
|
+
name: Lint (Ruff)
|
|
60
|
+
runs-on: ubuntu-latest
|
|
61
|
+
steps:
|
|
62
|
+
- uses: actions/checkout@v4
|
|
63
|
+
|
|
64
|
+
- name: Set up uv
|
|
65
|
+
uses: astral-sh/setup-uv@v7
|
|
66
|
+
with:
|
|
67
|
+
python-version-file: .python-version
|
|
68
|
+
enable-cache: true
|
|
69
|
+
|
|
70
|
+
- name: Sync dependencies
|
|
71
|
+
run: uv sync --locked --dev
|
|
72
|
+
|
|
73
|
+
- name: Run Python compatibility guard
|
|
74
|
+
run: uv run python scripts/guards/python_compatibility.py
|
|
75
|
+
|
|
76
|
+
- name: Run Ruff linter
|
|
77
|
+
run: uv run ruff check src tests scripts
|
|
78
|
+
|
|
79
|
+
- name: Run Ruff formatter check
|
|
80
|
+
run: uv run ruff format --check src tests scripts
|
|
81
|
+
|
|
82
|
+
integration-test:
|
|
83
|
+
name: Integration Tests
|
|
84
|
+
runs-on: ubuntu-latest
|
|
85
|
+
steps:
|
|
86
|
+
- uses: actions/checkout@v4
|
|
87
|
+
|
|
88
|
+
- name: Set up uv
|
|
89
|
+
uses: astral-sh/setup-uv@v7
|
|
90
|
+
with:
|
|
91
|
+
python-version-file: .python-version
|
|
92
|
+
enable-cache: true
|
|
93
|
+
|
|
94
|
+
- name: Sync dependencies
|
|
95
|
+
run: uv sync --locked --dev
|
|
96
|
+
|
|
97
|
+
- name: Install Playwright
|
|
98
|
+
run: uv run playwright install --with-deps chromium
|
|
99
|
+
|
|
100
|
+
- name: Run integration tests
|
|
101
|
+
run: uv run pytest tests/integration -v --tb=short -m "not smoke"
|
|
102
|
+
timeout-minutes: 15
|
|
103
|
+
|
|
104
|
+
packaging-smoke:
|
|
105
|
+
name: Packaging Smoke
|
|
106
|
+
runs-on: ubuntu-latest
|
|
107
|
+
steps:
|
|
108
|
+
- uses: actions/checkout@v4
|
|
109
|
+
|
|
110
|
+
- name: Set up uv
|
|
111
|
+
uses: astral-sh/setup-uv@v7
|
|
112
|
+
with:
|
|
113
|
+
python-version-file: .python-version
|
|
114
|
+
enable-cache: true
|
|
115
|
+
|
|
116
|
+
- name: Sync dependencies
|
|
117
|
+
run: uv sync --locked --dev
|
|
118
|
+
|
|
119
|
+
- name: Build wheel
|
|
120
|
+
run: uv build --wheel --no-sources
|
|
121
|
+
|
|
122
|
+
- name: Verify wheel-packaged skills
|
|
123
|
+
run: uv run pytest tests/unit/test_release_artifacts.py -v
|
|
124
|
+
|
|
125
|
+
- name: Smoke install-skills from built wheel
|
|
126
|
+
run: |
|
|
127
|
+
python -m venv .pkg-smoke-venv
|
|
128
|
+
.pkg-smoke-venv/bin/pip install dist/*.whl
|
|
129
|
+
target_dir="$(mktemp -d)"
|
|
130
|
+
.pkg-smoke-venv/bin/browser-cli install-skills --dry-run --target "$target_dir"
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
name: Release to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [created]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
deploy:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
permissions:
|
|
11
|
+
id-token: write
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
with:
|
|
16
|
+
fetch-depth: 0
|
|
17
|
+
|
|
18
|
+
- name: Set up uv
|
|
19
|
+
uses: astral-sh/setup-uv@v7
|
|
20
|
+
with:
|
|
21
|
+
python-version-file: .python-version
|
|
22
|
+
enable-cache: true
|
|
23
|
+
|
|
24
|
+
- name: Build package
|
|
25
|
+
run: uv build --no-sources --clear
|
|
26
|
+
|
|
27
|
+
- name: Verify wheel-packaged skills
|
|
28
|
+
run: |
|
|
29
|
+
uv run pytest tests/unit/test_release_artifacts.py -v
|
|
30
|
+
python -m venv .pkg-smoke-venv
|
|
31
|
+
.pkg-smoke-venv/bin/pip install dist/*.whl
|
|
32
|
+
target_dir="$(mktemp -d)"
|
|
33
|
+
.pkg-smoke-venv/bin/browser-cli install-skills --dry-run --target "$target_dir"
|
|
34
|
+
|
|
35
|
+
- name: Publish to PyPI
|
|
36
|
+
run: uv publish
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.4.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
files: ^(src|tests|scripts)/
|
|
8
|
+
- id: ruff-format
|
|
9
|
+
files: ^(src|tests|scripts)/
|
|
10
|
+
|
|
11
|
+
- repo: local
|
|
12
|
+
hooks:
|
|
13
|
+
- id: guard-checks
|
|
14
|
+
name: Guard checks
|
|
15
|
+
entry: ./scripts/guard.sh
|
|
16
|
+
language: system
|
|
17
|
+
pass_filenames: false
|
|
18
|
+
always_run: true
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.10
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
## Project Mission
|
|
4
|
+
|
|
5
|
+
Browser CLI is a `CLI-first`, `Agent-first` browser tool for AI agents. The
|
|
6
|
+
repository has three durable surfaces:
|
|
7
|
+
|
|
8
|
+
- `browser-cli read` for one-shot rendered HTML or snapshot capture
|
|
9
|
+
- daemon-backed browser actions for persistent interactive control
|
|
10
|
+
- `task.py + task.meta.json + automation.toml` for reusable packaged automation
|
|
11
|
+
- Automation Publish Layer is a persistent local automation service with a Web
|
|
12
|
+
UI primary control surface.
|
|
13
|
+
|
|
14
|
+
The job of this file is to help an agent answer: what is the contract, where is
|
|
15
|
+
the implementation, and where should a change land first.
|
|
16
|
+
|
|
17
|
+
## System Snapshot
|
|
18
|
+
|
|
19
|
+
- Primary interface is CLI.
|
|
20
|
+
- Primary implementation language is Python.
|
|
21
|
+
- Repository development is uv-only.
|
|
22
|
+
- Repository dependency resolution is pinned through `uv.lock`.
|
|
23
|
+
- Repository local Python selection is pinned through `.python-version`.
|
|
24
|
+
- Published package name is `browser-control-and-automation-cli`; the installed CLI command remains `browser-cli`.
|
|
25
|
+
- Published distributions must not include PEP 440 local version identifiers; `setuptools-scm` local suffixes are stripped so PyPI accepts non-tagged builds.
|
|
26
|
+
- `read` stays intentionally small: one URL positional plus `--snapshot` and `--scroll-bottom`.
|
|
27
|
+
- Managed profile mode is the default browser backend.
|
|
28
|
+
- Managed profile mode uses Browser CLI's dedicated Chrome data root at `~/.browser-cli/default-profile`.
|
|
29
|
+
- Extension mode is the preferred real-Chrome backend when the Browser CLI extension is connected and healthy.
|
|
30
|
+
- `browser-cli status` is the first-line lifecycle diagnosis command.
|
|
31
|
+
- `browser-cli reload` is the runtime reset command; page reload remains public as `browser-cli page-reload`.
|
|
32
|
+
- `runtime-status` includes a daemon-owned `presentation` snapshot; `browser-cli status` and the extension popup must render that shared state rather than inventing their own classifier.
|
|
33
|
+
- `v1` targets stable Google Chrome first and should not silently swap browser families.
|
|
34
|
+
- `v2` uses one daemon-managed browser instance.
|
|
35
|
+
- `v2` command output is JSON-first.
|
|
36
|
+
- `v2` uses `X_AGENT_ID` to isolate tab visibility and active-tab state.
|
|
37
|
+
- `v2` must not expose session concepts or global `--page` targeting flags.
|
|
38
|
+
- Semantic refs should follow bridgic-style reconstruction rather than DOM marker lookup.
|
|
39
|
+
- Daemon-side semantic refs remain the only ref system; drivers must not fork product semantics.
|
|
40
|
+
- Dual-driver support must preserve one CLI/daemon JSON contract across both `playwright_driver` and `extension_driver`.
|
|
41
|
+
- Driver parity is enforced through an explicit driver contract. Do not reintroduce dynamic backend passthrough through `__getattr__` or similar implicit escape hatches.
|
|
42
|
+
- Driver rebinding may happen automatically only at safe idle points, and it must be reported as `state_reset` rather than treated as perfectly continuous state.
|
|
43
|
+
- Reusable browser logic belongs in `task.py` through `browser_cli.task_runtime`.
|
|
44
|
+
- `task.meta.json` stores structured knowledge, not transcripts.
|
|
45
|
+
- `automation.toml` packages and configures a task snapshot; it must not duplicate task logic.
|
|
46
|
+
- `browser-cli task` is the first-class local authoring UX.
|
|
47
|
+
- `browser-cli automation publish` creates immutable snapshots under the Browser CLI home and auto-imports them into the automation service.
|
|
48
|
+
- Published automation snapshot truth lives under `~/.browser-cli/automations/<automation-id>/versions/<version>/automation.toml`; current service state is a separate live view.
|
|
49
|
+
- If source `automation.toml` exists, `browser-cli automation publish` must preserve its supported fields in the published snapshot; generated defaults are allowed only when the source manifest is absent and must be reported explicitly.
|
|
50
|
+
- Do not introduce a public `browser-cli explore` surface or a second browser runtime. Exploration remains an agent activity layered on top of Browser CLI.
|
|
51
|
+
- The extension popup is a human-facing runtime observer and light recovery surface. Agent feedback still flows through command responses and `runtime-status`.
|
|
52
|
+
|
|
53
|
+
## Rapid Code Map
|
|
54
|
+
|
|
55
|
+
- CLI shape, command names, help text, and top-level parser wiring:
|
|
56
|
+
`src/browser_cli/cli/main.py`
|
|
57
|
+
- Install and runtime diagnostics:
|
|
58
|
+
`src/browser_cli/commands/doctor.py`
|
|
59
|
+
- Packaged skill installation and `--target` handling:
|
|
60
|
+
`src/browser_cli/commands/install_skills.py`
|
|
61
|
+
- Runtime path discovery:
|
|
62
|
+
`src/browser_cli/commands/paths.py`
|
|
63
|
+
- Daemon-backed command catalog, arguments, aliases, and request builders:
|
|
64
|
+
`src/browser_cli/actions/cli_specs.py`
|
|
65
|
+
- Generic action command execution:
|
|
66
|
+
`src/browser_cli/commands/action.py`
|
|
67
|
+
- One-shot read contract and URL normalization:
|
|
68
|
+
`src/browser_cli/commands/read.py`
|
|
69
|
+
- One-shot read runtime contract, shared Python orchestration, and daemon bootstrap path:
|
|
70
|
+
`src/browser_cli/task_runtime/client.py`, `src/browser_cli/task_runtime/read.py`
|
|
71
|
+
- `browser_cli.task_runtime` owns the public Python read contract and routes one-shot read through the daemon-managed browser lifecycle.
|
|
72
|
+
- Runtime diagnosis and user-facing lifecycle guidance:
|
|
73
|
+
`src/browser_cli/commands/status.py`
|
|
74
|
+
- Shared daemon runtime presentation classifier:
|
|
75
|
+
`src/browser_cli/daemon/runtime_presentation.py`
|
|
76
|
+
- Runtime reset flow:
|
|
77
|
+
`src/browser_cli/commands/reload.py`
|
|
78
|
+
- Task CLI entrypoints:
|
|
79
|
+
`src/browser_cli/commands/task.py`
|
|
80
|
+
- Task templates and built-in example metadata:
|
|
81
|
+
`src/browser_cli/task_runtime/templates.py`
|
|
82
|
+
- Automation publish and service CLI entrypoints:
|
|
83
|
+
`src/browser_cli/commands/automation.py`
|
|
84
|
+
- Automation manifest loading, publishing, persistence, scheduler, API, service runtime, and Web UI:
|
|
85
|
+
`src/browser_cli/automation/*`
|
|
86
|
+
|
|
87
|
+
- Daemon socket startup, shutdown, compatibility checks, and request transport:
|
|
88
|
+
`src/browser_cli/daemon/client.py`, `src/browser_cli/daemon/transport.py`
|
|
89
|
+
- Daemon action dispatch and per-command handlers:
|
|
90
|
+
`src/browser_cli/daemon/app.py`
|
|
91
|
+
- Shared daemon state:
|
|
92
|
+
`src/browser_cli/daemon/state.py`
|
|
93
|
+
- Browser lifecycle, driver selection, safe-point rebinding, read-page flow, and ref-aware command routing:
|
|
94
|
+
`src/browser_cli/daemon/browser_service.py`
|
|
95
|
+
|
|
96
|
+
- Driver contract:
|
|
97
|
+
`src/browser_cli/drivers/base.py`
|
|
98
|
+
- Playwright adapter layer:
|
|
99
|
+
`src/browser_cli/drivers/playwright_driver.py`
|
|
100
|
+
- Extension adapter layer:
|
|
101
|
+
`src/browser_cli/drivers/extension_driver.py`
|
|
102
|
+
- Extension-driver action mixins:
|
|
103
|
+
`src/browser_cli/drivers/_extension/*.py`
|
|
104
|
+
|
|
105
|
+
- Low-level Playwright browser primitives, page state, screenshots, PDF, eval, input, storage, tracing, and video:
|
|
106
|
+
`src/browser_cli/browser/service.py`, `src/browser_cli/browser/session.py`
|
|
107
|
+
- Snapshot capture helpers:
|
|
108
|
+
`src/browser_cli/browser/snapshot.py`
|
|
109
|
+
- Network capture models/buffering:
|
|
110
|
+
`src/browser_cli/network.py`, `src/browser_cli/browser/network_capture.py`
|
|
111
|
+
- Stealth and browser launch behavior:
|
|
112
|
+
`src/browser_cli/browser/stealth.py`
|
|
113
|
+
|
|
114
|
+
- Semantic ref generation:
|
|
115
|
+
`src/browser_cli/refs/generator.py`
|
|
116
|
+
- Semantic ref reconstruction into Playwright locators:
|
|
117
|
+
`src/browser_cli/refs/resolver.py`
|
|
118
|
+
- Latest snapshot storage per page:
|
|
119
|
+
`src/browser_cli/refs/registry.py`
|
|
120
|
+
- Ref models shared across daemon and drivers:
|
|
121
|
+
`src/browser_cli/refs/models.py`
|
|
122
|
+
|
|
123
|
+
- Agent-scoped tab ownership, active-tab tracking, and busy-state conflict logic:
|
|
124
|
+
`src/browser_cli/tabs/registry.py`
|
|
125
|
+
- `X_AGENT_ID` resolution:
|
|
126
|
+
`src/browser_cli/agent_scope/__init__.py`
|
|
127
|
+
|
|
128
|
+
- Managed Chrome discovery, profile directory resolution, and lock detection:
|
|
129
|
+
`src/browser_cli/profiles/discovery.py`
|
|
130
|
+
- Runtime home, socket paths, automation paths, and extension socket config:
|
|
131
|
+
`src/browser_cli/constants.py`
|
|
132
|
+
|
|
133
|
+
- Extension session lifecycle, handshake, heartbeat, and artifact chunk assembly:
|
|
134
|
+
`src/browser_cli/extension/session.py`
|
|
135
|
+
- Extension protocol models and required capabilities:
|
|
136
|
+
`src/browser_cli/extension/protocol.py`
|
|
137
|
+
- Browser extension entrypoints:
|
|
138
|
+
`browser-cli-extension/src/background.js`, `browser-cli-extension/src/protocol.js`, `browser-cli-extension/src/page_runtime.js`
|
|
139
|
+
- Extension popup runtime observer UI and pure view model:
|
|
140
|
+
`browser-cli-extension/popup.html`, `browser-cli-extension/src/popup.js`, `browser-cli-extension/src/popup_view.js`
|
|
141
|
+
|
|
142
|
+
- Task runtime client used by `task.py`:
|
|
143
|
+
`src/browser_cli/task_runtime/client.py`
|
|
144
|
+
- High-level Flow helpers used by tasks:
|
|
145
|
+
`src/browser_cli/task_runtime/flow.py`
|
|
146
|
+
- Task entrypoint loading and validation:
|
|
147
|
+
`src/browser_cli/task_runtime/entrypoint.py`
|
|
148
|
+
- Task metadata schemas and validation:
|
|
149
|
+
`src/browser_cli/task_runtime/models.py`
|
|
150
|
+
|
|
151
|
+
- User-facing output rendering:
|
|
152
|
+
`src/browser_cli/outputs/render.py`, `src/browser_cli/outputs/json.py`
|
|
153
|
+
- Packaged Browser CLI skill assets shipped with the installed wheel:
|
|
154
|
+
`src/browser_cli/packaged_skills/*`
|
|
155
|
+
- Error taxonomy and exit codes:
|
|
156
|
+
`src/browser_cli/errors.py`, `src/browser_cli/error_codes.py`, `src/browser_cli/exit_codes.py`
|
|
157
|
+
|
|
158
|
+
- Guard scripts that enforce product contracts and package boundaries:
|
|
159
|
+
`scripts/guards/*.py`
|
|
160
|
+
- Example tasks and packaged automations:
|
|
161
|
+
`tasks/*`
|
|
162
|
+
- Browser-CLI-specific agent delivery guidance:
|
|
163
|
+
`skills/browser-cli-delivery/SKILL.md`
|
|
164
|
+
- Tests for behavior and contracts:
|
|
165
|
+
`tests/unit/*`, `tests/integration/*`
|
|
166
|
+
|
|
167
|
+
## Common Navigation Paths
|
|
168
|
+
|
|
169
|
+
- If the user wants a new daemon-backed CLI command:
|
|
170
|
+
update `src/browser_cli/actions/cli_specs.py`, then add the daemon handler in `src/browser_cli/daemon/app.py`, then implement the browser behavior in `src/browser_cli/daemon/browser_service.py` and the relevant driver(s).
|
|
171
|
+
- If the user wants to change `read` behavior:
|
|
172
|
+
inspect `src/browser_cli/commands/read.py`, `src/browser_cli/task_runtime/client.py`, and `src/browser_cli/task_runtime/read.py` first, then `src/browser_cli/daemon/browser_service.py::read_page`.
|
|
173
|
+
- If the user reports daemon startup, stale socket, or reload issues:
|
|
174
|
+
inspect `src/browser_cli/daemon/client.py`, `src/browser_cli/daemon/transport.py`, `src/browser_cli/commands/status.py`, and `src/browser_cli/commands/reload.py`.
|
|
175
|
+
If startup fails while waiting for an extension session, inspect `src/browser_cli/daemon/browser_service.py::ensure_started`; extension handshake wait is a best-effort preference signal and must fall back to Playwright instead of aborting daemon startup.
|
|
176
|
+
- If the user wants a first-run environment check or path discovery for installed users:
|
|
177
|
+
inspect `src/browser_cli/commands/doctor.py`, `src/browser_cli/commands/paths.py`, `src/browser_cli/constants.py`, and `src/browser_cli/profiles/discovery.py`.
|
|
178
|
+
- If the user reports a driver mismatch or extension/Playwright inconsistency:
|
|
179
|
+
start at `src/browser_cli/drivers/base.py`, then compare `playwright_driver.py`, `extension_driver.py`, and `daemon/browser_service.py`.
|
|
180
|
+
- If the user reports broken refs, stale snapshots, or element targeting failures:
|
|
181
|
+
start at `src/browser_cli/refs/registry.py`, `src/browser_cli/refs/generator.py`, `src/browser_cli/refs/resolver.py`, and the snapshot-related methods in `src/browser_cli/daemon/browser_service.py`.
|
|
182
|
+
- If the user reports busy-tab or tab-visibility conflicts:
|
|
183
|
+
start at `src/browser_cli/tabs/registry.py` and the tab-related handlers in `src/browser_cli/daemon/app.py`.
|
|
184
|
+
- If the user wants task or automation behavior changed:
|
|
185
|
+
inspect `src/browser_cli/task_runtime/*` and `src/browser_cli/automation/*`, then validate against example tasks under `tasks/`.
|
|
186
|
+
- If the user wants task examples or template output changed:
|
|
187
|
+
inspect `src/browser_cli/task_runtime/templates.py`, `src/browser_cli/commands/task.py`, and `tests/unit/test_task_commands.py`.
|
|
188
|
+
- If the user reports recurring runs, automation history, local Web UI, or automation-service state issues:
|
|
189
|
+
start at `src/browser_cli/automation/service/*`, `src/browser_cli/automation/persistence/*`, `src/browser_cli/automation/scheduler/*`, and `src/browser_cli/automation/api/*`.
|
|
190
|
+
- If the user reports confusion about what publish created or which version is active:
|
|
191
|
+
inspect `src/browser_cli/commands/automation.py`, `src/browser_cli/automation/publisher.py`, `src/browser_cli/automation/api/server.py`, and the snapshot directories under `~/.browser-cli/automations/<automation-id>/versions/`.
|
|
192
|
+
- If the user reports publish/config drift between a version and current service state:
|
|
193
|
+
inspect the snapshot manifest under `~/.browser-cli/automations/<automation-id>/versions/<version>/automation.toml` first, then compare it with `browser_cli.commands.automation` live inspect payload assembly and `browser_cli.automation.api.server` persisted automation serialization.
|
|
194
|
+
- If the user reports that `browser-cli read` stopped explaining fallback profile use:
|
|
195
|
+
inspect `src/browser_cli/daemon/browser_service.py::read_page`, `src/browser_cli/task_runtime/read.py`, and `src/browser_cli/commands/read.py`; fallback metadata is only guaranteed on the read path.
|
|
196
|
+
- If the user mentions extension capability gaps, artifacts, or real Chrome behavior:
|
|
197
|
+
inspect both `src/browser_cli/extension/*` and `browser-cli-extension/src/*`; many bugs live in protocol drift between Python and extension JS.
|
|
198
|
+
Symptom -> root cause -> where to inspect:
|
|
199
|
+
`Tab <id> is not debuggable: unknown` during extension-mode `read` or `open-tab`
|
|
200
|
+
-> extension tried to attach Chrome debugger before the new tab reported a debuggable URL
|
|
201
|
+
-> inspect `browser-cli-extension/src/background.js::openTab` and `browser-cli-extension/src/debugger.js::ensureAttached`
|
|
202
|
+
- If the user reports popup/runtime observer drift:
|
|
203
|
+
start at `src/browser_cli/daemon/runtime_presentation.py`, then `src/browser_cli/extension/session.py`, then `browser-cli-extension/src/background.js`, `browser-cli-extension/src/popup_view.js`, and `browser-cli-extension/src/popup.js`.
|
|
204
|
+
- If the user reports long-run stability drift across repeated reloads, reconnects, or artifact runs:
|
|
205
|
+
start at `src/browser_cli/daemon/browser_service.py`, `src/browser_cli/daemon/runtime_presentation.py`, `src/browser_cli/commands/status.py`, and `src/browser_cli/extension/session.py`.
|
|
206
|
+
Symptom -> root cause -> where to inspect:
|
|
207
|
+
`status`, popup, and command `meta` disagree after repeated reconnect or reload
|
|
208
|
+
-> runtime truth path drift
|
|
209
|
+
-> inspect `browser_service.runtime_status`, `build_runtime_presentation`, `commands/status.py`, and popup-facing extension status endpoints.
|
|
210
|
+
Repeated artifact failures poison later requests
|
|
211
|
+
-> extension artifact buffers or disconnect cleanup are not bounded
|
|
212
|
+
-> inspect `src/browser_cli/extension/session.py` and `tests/unit/test_extension_transport.py`.
|
|
213
|
+
- If a change touches architecture or public product contracts:
|
|
214
|
+
inspect `scripts/guards/architecture.py`, `scripts/guards/product_contracts.py`, and `scripts/guards/docs_sync.py` before making the change final.
|
|
215
|
+
|
|
216
|
+
## Architectural Boundaries
|
|
217
|
+
|
|
218
|
+
- `browser_cli.actions` owns daemon-backed CLI action metadata.
|
|
219
|
+
- `browser_cli.agent_scope` owns `X_AGENT_ID` resolution and defaults.
|
|
220
|
+
- `browser_cli.automation` owns automation manifest loading, publishing, persistent automation-service state, scheduler logic, local API/Web UI, hooks, and automation execution.
|
|
221
|
+
- `browser_cli.browser` owns low-level Playwright browser primitives, launch behavior, snapshot input capture, storage, trace/video plumbing, and network capture helpers.
|
|
222
|
+
- `browser_cli.cli` parses top-level commands and owns help text and exit code behavior.
|
|
223
|
+
- `browser_cli.commands` owns user-facing command handlers for `read`, `task`, `automation`, `status`, `reload`, and the generic action runner.
|
|
224
|
+
- `browser_cli.daemon` owns the long-lived daemon, socket transport, request/response protocol, browser lifecycle, runtime status, and command dispatch.
|
|
225
|
+
- `browser_cli.drivers` owns the explicit backend contract plus `playwright_driver` and `extension_driver`. Drivers consume daemon-built locator specs, not raw refs.
|
|
226
|
+
- `browser_cli.extension` owns the extension transport, handshake, heartbeat, required-capability checks, and artifact assembly from WebSocket chunks.
|
|
227
|
+
- `browser_cli.outputs` owns final rendering for content-first and JSON-first surfaces.
|
|
228
|
+
- `browser_cli.packaged_skills` owns the Browser CLI skill assets that are shipped in installed distributions and consumed by `browser-cli install-skills`.
|
|
229
|
+
- `browser_cli.profiles` owns Chrome executable discovery, managed profile directories, profile naming, and lock detection.
|
|
230
|
+
- `browser_cli.refs` owns semantic ref models, snapshot generation, latest-snapshot registry state, and locator reconstruction.
|
|
231
|
+
- `browser_cli.tabs` owns agent-visible tab state, active-tab tracking, and busy-state conflict rules.
|
|
232
|
+
- `browser_cli.task_runtime` owns the public Python runtime used by `task.py`, including one-shot read orchestration and flow helpers.
|
|
233
|
+
|
|
234
|
+
Keep these boundaries intact. Do not push browser internals into CLI handlers,
|
|
235
|
+
do not move semantic-ref logic into drivers, and do not bypass the daemon for
|
|
236
|
+
public interactive commands.
|
|
237
|
+
|
|
238
|
+
## Implementation Conventions
|
|
239
|
+
|
|
240
|
+
- Top-level parser registration lives in `src/browser_cli/cli/main.py`. `read`, `doctor`, `paths`, `task`, `automation`, `status`, and lifecycle `reload` are hand-wired there; the rest come from `get_action_specs()`.
|
|
241
|
+
- `browser-cli install-skills` installs the packaged Browser CLI skills into `~/.agents/skills` by default and `--target` overrides the destination root.
|
|
242
|
+
- Public daemon-backed actions should be added through `ActionSpec`, not by manually bolting ad hoc parsers into `main.py`.
|
|
243
|
+
- The lifecycle command `browser-cli reload` and the page action `browser-cli page-reload` are intentionally different surfaces. Do not collapse them.
|
|
244
|
+
- Public daemon commands return JSON payloads. Preserve `ok/data/meta` shape and machine-readable error codes.
|
|
245
|
+
- `runtime-status` is the agent/runtime truth surface; popup code may read and render it, but must not redefine runtime state semantics.
|
|
246
|
+
- Tab targeting is agent-scoped. Do not add public `--page`, `--page-id`, session IDs, or similar cross-agent escape hatches.
|
|
247
|
+
- Drivers must accept daemon-built `LocatorSpec`, not raw `ref` strings.
|
|
248
|
+
- Drivers must expose snapshot input, not final snapshot rendering. Final semantic snapshot generation stays daemon-owned.
|
|
249
|
+
- Extension and Playwright backends must stay behaviorally aligned on the same public contract even if their internal mechanics differ.
|
|
250
|
+
- Popup daemon status reads and workspace rebuild requests flow through the extension listener HTTP surface in `src/browser_cli/extension/session.py`; keep popup UI logic out of that state interpretation path.
|
|
251
|
+
- The extension listener is implemented on the WebSocket listener stack, which only accepts body-less `GET` HTTP requests before upgrade. If popup control endpoints need to mutate runtime state, keep them narrow and route them through dedicated `GET` paths instead of adding a parallel HTTP server.
|
|
252
|
+
- Prefer `browser-cli status` before manual daemon cleanup. Prefer `browser-cli reload` over ad hoc process killing when runtime state is bad.
|
|
253
|
+
- `task.py` contains reusable automation logic. `automation.toml` packages and configures that logic; it should not become a second implementation surface.
|
|
254
|
+
- Runtime automation state belongs to the automation service persistence layer, not `automation.toml`. `automation.toml` remains an import/export and reviewable packaging artifact.
|
|
255
|
+
- Published automations are immutable snapshots. Versioning should append a new snapshot rather than mutating an older one.
|
|
256
|
+
- `browser-cli automation inspect --version <n>` must render snapshot config and live config separately; do not collapse them into one synthesized automation view.
|
|
257
|
+
- `runtime.timeout_seconds` is enforced only by the automation service and applies to the total wall-clock budget for one automation run; timeout failures must not auto-retry.
|
|
258
|
+
- When adapting third-party logic from `third_party/bridgic-browser`, keep provenance clear and the adapted code understandable. Do not add a runtime dependency on the external package just to shortcut implementation.
|
|
259
|
+
|
|
260
|
+
## Testing And Validation
|
|
261
|
+
|
|
262
|
+
- Unit tests live under `tests/unit/`; integration coverage lives under `tests/integration/`.
|
|
263
|
+
- Contract-sensitive areas include CLI parser shape, action catalog parity, daemon lifecycle, semantic refs, driver parity, automation validation, and `X_AGENT_ID` tab isolation.
|
|
264
|
+
- The repository target is Python 3.10+. Keep runtime code and tests on Python 3.10-compatible syntax and stdlib APIs; local 3.12-only constructs can pass ad hoc checks and still fail CI collection, lint, or guards.
|
|
265
|
+
- `scripts/guards/python_compatibility.py` owns the static Python 3.10 compatibility check; keep new syntax and stdlib-API regression rules there so local 3.12 development fails before CI does.
|
|
266
|
+
- Tests and task fixtures must resolve repo assets relative to the checked-out repository, not a developer-specific absolute workspace path; CI runners will fail on hard-coded local paths first.
|
|
267
|
+
- `scripts/lint.sh` owns repository lint execution.
|
|
268
|
+
- `scripts/test.sh` owns repository test execution.
|
|
269
|
+
- `scripts/guard.sh` owns architecture, product-contract, and doc-sync guards.
|
|
270
|
+
- `scripts/check.sh` runs lint, tests, and guard in the expected order.
|
|
271
|
+
- The guard implementations live under `scripts/guards/`.
|
|
272
|
+
- Repo-local test runs should refresh the editable package with `uv sync --dev --reinstall-package browser-control-and-automation-cli` before `pytest`; otherwise daemon compatibility checks can drift after local commits because `setuptools-scm` version metadata lags behind the current checkout.
|
|
273
|
+
- Release builds should use `uv build --no-sources --clear` so stale `dist/` artifacts are not accidentally published alongside the current package.
|
|
274
|
+
- After each code change, run lint and guard as part of the full validation flow.
|
|
275
|
+
- After each code change, run lint, tests, and guard.
|
|
276
|
+
- After dependency metadata changes, run `uv sync --dev` before lint, tests, and guard.
|
|
277
|
+
- After each code change, run `scripts/lint.sh`, `scripts/test.sh`, and `scripts/guard.sh`, or run `scripts/check.sh`.
|
|
278
|
+
- When architecture, package boundaries, or frozen product decisions change, update `AGENTS.md` and the corresponding guard rules in the same change.
|
|
279
|
+
- When a new top-level `browser_cli` package, public CLI surface, or major runtime contract is introduced, update both this file and the guard expectations before considering the change complete.
|
|
280
|
+
|
|
281
|
+
## Updating This File
|
|
282
|
+
|
|
283
|
+
`AGENTS.md` is part of the implementation surface. Update it when a task
|
|
284
|
+
changes how an agent should navigate, reason about, or safely modify the repo.
|
|
285
|
+
|
|
286
|
+
Always update this file when:
|
|
287
|
+
|
|
288
|
+
- the public CLI surface changes
|
|
289
|
+
- a package boundary or ownership rule changes
|
|
290
|
+
- daemon/driver/ref/tab/automation contracts change
|
|
291
|
+
- a new recurring debugging path becomes obvious
|
|
292
|
+
- a previously documented rule becomes stale
|
|
293
|
+
|
|
294
|
+
Do not dump changelog noise here. Keep only durable, reusable knowledge that
|
|
295
|
+
should help the next agent move faster.
|
|
296
|
+
|
|
297
|
+
## Failure-Driven Knowledge Capture
|
|
298
|
+
|
|
299
|
+
Agents should learn from failures and write back only the parts that will
|
|
300
|
+
matter again.
|
|
301
|
+
|
|
302
|
+
- If a task uncovers a recurring failure mode, add the lesson next to the owning subsystem above instead of writing a generic journal entry.
|
|
303
|
+
- Record stable knowledge, not transient machine state. Good additions include invariants, protocol mismatches, common root causes, and the safest inspection path.
|
|
304
|
+
- Use the smallest durable form possible:
|
|
305
|
+
`symptom -> root cause -> where to inspect -> safe fix`
|
|
306
|
+
- Prefer code-anchored statements over anecdotes. A future agent should be able to jump from the note to the owning file immediately.
|
|
307
|
+
- If the failure was caused by stale documentation, replace the stale rule instead of appending a contradictory note.
|
|
308
|
+
- If the lesson is only useful for the current branch, log, or local environment, do not add it here.
|
|
309
|
+
- When a bug fix changes behavior, add the reusable takeaway in the same change so the next task benefits immediately.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 browser-cli contributors
|
|
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.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
recursive-include skills *
|