asher-cli 0.0.5__tar.gz → 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- asher_cli-0.1.0/.github/pull_request_template.md +24 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.github/workflows/ci.yml +2 -2
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.github/workflows/claude-code-review.yml +1 -1
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.github/workflows/claude.yml +1 -1
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.github/workflows/coverage.yml +1 -1
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.github/workflows/release.yml +2 -2
- {asher_cli-0.0.5 → asher_cli-0.1.0}/CLAUDE.md +4 -0
- asher_cli-0.1.0/CODEOWNERS +1 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/PKG-INFO +3 -3
- {asher_cli-0.0.5 → asher_cli-0.1.0}/ROADMAP.md +257 -175
- asher_cli-0.1.0/asher/activity_labels.py +83 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/commands/__init__.py +364 -49
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/robot_adapters.py +60 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/robot_protocol.py +17 -1
- {asher_cli-0.0.5 → asher_cli-0.1.0}/pyproject.toml +4 -4
- asher_cli-0.1.0/tests/test_activity_labels.py +133 -0
- asher_cli-0.1.0/tests/test_lr5_commands.py +264 -0
- asher_cli-0.1.0/tests/test_missing_robot_commands.py +404 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_new_commands_pilot.py +12 -5
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_robot_adapters.py +188 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/uv.lock +10 -10
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.claude/hooks/block-env.ps1 +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.claude/settings.json +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.claude/skills/pylitterbot-ref/SKILL.md +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.claude/skills/release/SKILL.md +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.claude/skills/textual/SKILL.md +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.env.example +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.githooks/pre-push +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.gitignore +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.vscode/launch.json +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.vscode/settings.json +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/.vscode/tasks.json +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/LICENSE +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/README.md +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/app.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/__init__.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/__main__.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/app.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/auth.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/cats.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/commands/base.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/connection/__init__.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/constants.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/helpers.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/login_flow.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/mcp_bridge.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/mcp_config.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/monitoring/__init__.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/slash-commands/__init__.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/ui/__init__.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/asher/ui/style.tcss +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/renovate.json +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/requirements.txt +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/test.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/__init__.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/conftest.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_app_pilot.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_auth.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_auth_pilot.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_cats.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_commands_pilot.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_connection.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_connection_mixin.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_mcp_bridge.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_mcp_command.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_mcp_config.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_monitoring.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/test_ui.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/tests/testhelpers.py +0 -0
- {asher_cli-0.0.5 → asher_cli-0.1.0}/watchrun.py +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- What does this PR change, and why? -->
|
|
4
|
+
|
|
5
|
+
## Related issue
|
|
6
|
+
|
|
7
|
+
Closes #
|
|
8
|
+
|
|
9
|
+
## Changes
|
|
10
|
+
|
|
11
|
+
-
|
|
12
|
+
|
|
13
|
+
## Testing
|
|
14
|
+
|
|
15
|
+
- [ ] `pytest` passes locally
|
|
16
|
+
- [ ] Added/updated tests for new or changed behavior
|
|
17
|
+
- [ ] Manually ran the CLI to verify the change (`asher ...`)
|
|
18
|
+
|
|
19
|
+
## Checklist
|
|
20
|
+
|
|
21
|
+
- [ ] Code is linted/formatted per project conventions
|
|
22
|
+
- [ ] README / CLI help text updated if flags or commands changed
|
|
23
|
+
- [ ] No secrets, tokens, or local paths committed
|
|
24
|
+
- [ ] Version bump considered if this affects the published PyPI package
|
|
@@ -13,7 +13,7 @@ jobs:
|
|
|
13
13
|
runs-on: ubuntu-latest
|
|
14
14
|
steps:
|
|
15
15
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
|
|
16
|
-
- uses: astral-sh/setup-uv@
|
|
16
|
+
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
17
17
|
- run: uv sync --dev
|
|
18
18
|
- run: uv run ruff check .
|
|
19
19
|
- run: uv run ruff format --check .
|
|
@@ -29,6 +29,6 @@ jobs:
|
|
|
29
29
|
runs-on: ${{ matrix.os }}
|
|
30
30
|
steps:
|
|
31
31
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
|
|
32
|
-
- uses: astral-sh/setup-uv@
|
|
32
|
+
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
33
33
|
- run: uv sync --dev
|
|
34
34
|
- run: uv run pytest tests/ -v --tb=short
|
|
@@ -33,7 +33,7 @@ jobs:
|
|
|
33
33
|
|
|
34
34
|
- name: Run Claude Code Review
|
|
35
35
|
id: claude-review
|
|
36
|
-
uses: anthropics/claude-code-action@
|
|
36
|
+
uses: anthropics/claude-code-action@af0559ee4f514d1ef21826982bed13f7edc3c35e # v1
|
|
37
37
|
with:
|
|
38
38
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
39
39
|
plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'
|
|
@@ -32,7 +32,7 @@ jobs:
|
|
|
32
32
|
|
|
33
33
|
- name: Run Claude Code
|
|
34
34
|
id: claude
|
|
35
|
-
uses: anthropics/claude-code-action@
|
|
35
|
+
uses: anthropics/claude-code-action@af0559ee4f514d1ef21826982bed13f7edc3c35e # v1
|
|
36
36
|
with:
|
|
37
37
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
38
38
|
|
|
@@ -13,7 +13,7 @@ jobs:
|
|
|
13
13
|
runs-on: ubuntu-latest
|
|
14
14
|
steps:
|
|
15
15
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
|
|
16
|
-
- uses: astral-sh/setup-uv@
|
|
16
|
+
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
17
17
|
- run: uv sync --dev
|
|
18
18
|
- name: Run tests with coverage
|
|
19
19
|
run: uv run pytest tests/ --cov=asher --cov-report=lcov --cov-report=term-missing
|
|
@@ -20,7 +20,7 @@ jobs:
|
|
|
20
20
|
- name: Extract version from branch name
|
|
21
21
|
id: version
|
|
22
22
|
run: echo "version=${GITHUB_REF_NAME#release/}" >> "$GITHUB_OUTPUT"
|
|
23
|
-
- uses: astral-sh/setup-uv@
|
|
23
|
+
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
24
24
|
- run: uv build
|
|
25
25
|
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
26
26
|
with:
|
|
@@ -37,7 +37,7 @@ jobs:
|
|
|
37
37
|
with:
|
|
38
38
|
name: dist
|
|
39
39
|
path: dist/
|
|
40
|
-
- uses: pypa/gh-action-pypi-publish@
|
|
40
|
+
- uses: pypa/gh-action-pypi-publish@ba38be9e461d3875417946c167d0b5f3d385a247 # release/v1
|
|
41
41
|
|
|
42
42
|
github-release:
|
|
43
43
|
name: Create GitHub Release
|
|
@@ -159,6 +159,10 @@ pylitterbot auto-detects robot type. Commands that differ per model are handled
|
|
|
159
159
|
- `robot.set_night_light_brightness(int)` or `robot.set_night_light_mode(NightLightMode)`
|
|
160
160
|
- `robot.get_activity_history(limit=int)` → list of `Activity` objects with `.timestamp` and `.action` (`LitterBoxStatus` enum)
|
|
161
161
|
|
|
162
|
+
## Code comments
|
|
163
|
+
|
|
164
|
+
Don't add comments above functions or inline unless the WHY is genuinely non-obvious (a hidden constraint, a subtle invariant, a workaround for a specific bug). Well-named identifiers should make the WHAT self-evident. Before reaching for a comment, check whether the explanation can instead be expressed through abstraction or encapsulation — e.g. domain logic buried in a mixin or command handler should move to a self-commenting, domain-named method rather than being explained in a comment. Favor human-readable, domain-driven names and logical flow over prose explanations, while keeping code legible to agents working in this repo.
|
|
165
|
+
|
|
162
166
|
## Development notes
|
|
163
167
|
|
|
164
168
|
- Textual and pylitterbot are both asyncio-native — compose cleanly with `@work` tasks
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @karanshukla
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: asher-cli
|
|
3
|
-
Version: 0.0
|
|
3
|
+
Version: 0.1.0
|
|
4
4
|
Summary: Terminal dashboard for Litter Robot (LR3/LR4/LR5) via the Whisker cloud API
|
|
5
5
|
License: MIT License
|
|
6
6
|
|
|
@@ -35,13 +35,13 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
35
35
|
Classifier: Topic :: Home Automation
|
|
36
36
|
Requires-Python: >=3.10
|
|
37
37
|
Requires-Dist: keyring>=24.0.0
|
|
38
|
-
Requires-Dist: pylitterbot==2025.
|
|
38
|
+
Requires-Dist: pylitterbot==2025.6.2
|
|
39
39
|
Requires-Dist: python-dotenv>=1.0.0
|
|
40
40
|
Requires-Dist: rich>=13.0.0
|
|
41
41
|
Requires-Dist: textual>=0.47.0
|
|
42
42
|
Requires-Dist: tzlocal>=5.4
|
|
43
43
|
Provides-Extra: mcp
|
|
44
|
-
Requires-Dist: pylitterbot[mcp]==2025.
|
|
44
|
+
Requires-Dist: pylitterbot[mcp]==2025.6.2; extra == 'mcp'
|
|
45
45
|
Description-Content-Type: text/markdown
|
|
46
46
|
|
|
47
47
|
# Asher CLI
|