codeaway 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.
@@ -0,0 +1,82 @@
1
+ name: publish
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ build:
13
+ name: Build and validate distributions
14
+ runs-on: windows-latest
15
+
16
+ steps:
17
+ - name: Check out repository
18
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
19
+
20
+ - name: Install uv and Python
21
+ uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
22
+ with:
23
+ python-version: "3.11"
24
+
25
+ - name: Install test environment
26
+ run: uv sync --extra test
27
+
28
+ - name: Run Python tests
29
+ run: uv run pytest -q
30
+
31
+ - name: Run browser tests
32
+ run: node --test tests/test_web_ui.cjs tests/test_web_dom.cjs tests/test_web_theme.cjs
33
+
34
+ - name: Build distributions
35
+ run: uv build
36
+
37
+ - name: Check distribution metadata
38
+ run: uv run --isolated --no-project --with twine twine check dist/*
39
+
40
+ - name: Smoke-test wheel and source distribution
41
+ shell: pwsh
42
+ run: |
43
+ $wheels = @(Get-ChildItem -Path dist -Filter *.whl -File)
44
+ $sdists = @(Get-ChildItem -Path dist -Filter *.tar.gz -File)
45
+ if ($wheels.Count -ne 1) {
46
+ throw "Expected exactly one wheel in dist/, found $($wheels.Count)."
47
+ }
48
+ if ($sdists.Count -ne 1) {
49
+ throw "Expected exactly one source distribution in dist/, found $($sdists.Count)."
50
+ }
51
+ uv run --isolated --no-project --with $wheels[0].FullName codeaway --help
52
+ uv run --isolated --no-project --with $sdists[0].FullName codeaway --help
53
+
54
+ - name: Upload distributions
55
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
56
+ with:
57
+ name: distributions
58
+ path: dist/
59
+ if-no-files-found: error
60
+
61
+ publish:
62
+ name: Publish to PyPI
63
+ runs-on: ubuntu-latest
64
+ needs: build
65
+ environment:
66
+ name: pypi
67
+ url: https://pypi.org/p/codeaway
68
+ permissions:
69
+ contents: read
70
+ id-token: write
71
+
72
+ steps:
73
+ - name: Download distributions
74
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
75
+ with:
76
+ name: distributions
77
+ path: dist/
78
+
79
+ - name: Publish distributions to PyPI
80
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
81
+ with:
82
+ packages-dir: dist/
@@ -0,0 +1,43 @@
1
+ name: test
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ test:
12
+ name: Windows / Python 3.11
13
+ runs-on: windows-latest
14
+
15
+ steps:
16
+ - name: Check out repository
17
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
18
+
19
+ - name: Install uv and Python
20
+ uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
21
+ with:
22
+ python-version: "3.11"
23
+
24
+ - name: Install test environment
25
+ run: uv sync --extra test
26
+
27
+ - name: Run Python tests
28
+ run: uv run pytest -q
29
+
30
+ - name: Run browser tests
31
+ run: node --test tests/test_web_ui.cjs tests/test_web_dom.cjs tests/test_web_theme.cjs
32
+
33
+ - name: Build distributions
34
+ run: uv build
35
+
36
+ - name: Install wheel in a clean environment and run the command
37
+ shell: pwsh
38
+ run: |
39
+ $wheels = @(Get-ChildItem -Path dist -Filter *.whl -File)
40
+ if ($wheels.Count -ne 1) {
41
+ throw "Expected exactly one wheel in dist/, found $($wheels.Count)."
42
+ }
43
+ uv run --isolated --no-project --with $wheels[0].FullName codeaway --help
@@ -0,0 +1,6 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.py[cod]
4
+ /dist/
5
+ /output/
6
+ /uv.lock
codeaway-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CodeAway 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,113 @@
1
+ Metadata-Version: 2.5
2
+ Name: codeaway
3
+ Version: 0.1.0
4
+ Summary: Control a local coding agent from your phone
5
+ Project-URL: Homepage, https://github.com/jmoraispk/codeaway2
6
+ Project-URL: Repository, https://github.com/jmoraispk/codeaway2
7
+ Project-URL: Issues, https://github.com/jmoraispk/codeaway2/issues
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: ai,coding agents,remote control,tailscale
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: Microsoft :: Windows
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Topic :: Software Development
19
+ Requires-Python: >=3.11
20
+ Requires-Dist: pillow>=11.0
21
+ Requires-Dist: uiautomation>=2.0.20; sys_platform == 'win32'
22
+ Provides-Extra: test
23
+ Requires-Dist: pytest>=8.0; extra == 'test'
24
+ Description-Content-Type: text/markdown
25
+
26
+ # CodeAway
27
+
28
+ ![CodeAway sends commands to desktop coding agents and returns replies and live status](https://raw.githubusercontent.com/jmoraispk/codeaway2/main/docs/assets/codeaway-hero.png)
29
+
30
+ CodeAway is a thin, browser-based remote control for local AI coding agents.
31
+ Version 0.1 supports one pairing only: **Windows with Codex Desktop**. The
32
+ source repository is `codeaway2`; the Python package and command are
33
+ `codeaway`.
34
+
35
+ > Status: early alpha. The Windows/Codex Desktop phone flow has been
36
+ > smoke-tested; expect rough edges and breaking changes.
37
+
38
+ ## Install
39
+
40
+ The shortest recommended path is:
41
+
42
+ ```powershell
43
+ uvx codeaway
44
+ ```
45
+
46
+ `uvx` is convenient, not required. You can instead install with either:
47
+
48
+ ```powershell
49
+ pipx install codeaway
50
+ ```
51
+
52
+ ```powershell
53
+ py -m pip install codeaway
54
+ ```
55
+
56
+ ## Platform support
57
+
58
+ Windows with Codex Desktop is the supported pairing. macOS and Linux can
59
+ install the package, but desktop control for those platforms is not implemented
60
+ yet.
61
+
62
+ ## Run CodeAway
63
+
64
+ The first run is laptop-only. Start CodeAway in the foreground:
65
+
66
+ ```powershell
67
+ uvx codeaway
68
+ ```
69
+
70
+ It listens on `127.0.0.1:8765` and opens `/setup` in the laptop browser. Choose
71
+ the visible Codex Desktop window and draw all three capture regions:
72
+
73
+ - **Sidebar:** the projects and tasks on the left.
74
+ - **Conversation:** the right pane above the input.
75
+ - **Composer:** the chat box only; it may grow taller. Do not include the
76
+ full-width toolbar or status row.
77
+
78
+ To enable phone access, restart with an address assigned to the laptop on your
79
+ LAN or Tailscale network:
80
+
81
+ ```powershell
82
+ uvx codeaway --ip <IPv4-LAN-or-Tailscale-address>
83
+ ```
84
+
85
+ The explicit address is saved only after it binds successfully. Later
86
+ `uvx codeaway` launches reuse both that address and the saved calibration. If
87
+ the saved Codex window and all three regions resolve, CodeAway prints the phone
88
+ workspace URL without opening a laptop browser. The phone workspace still
89
+ links to `/setup` when recalibration is needed.
90
+
91
+ If a cached address is no longer available, CodeAway warns, falls back to
92
+ `127.0.0.1`, and saves that fallback. An invalid explicit address exits instead
93
+ of silently changing interfaces. Use `--no-browser` to suppress an otherwise
94
+ necessary setup launch and `--port PORT` to select and cache another port.
95
+ CodeAway v0.1 accepts IPv4 literals only; IPv6 addresses are rejected with an
96
+ actionable startup error.
97
+
98
+ > **Security:** A non-loopback endpoint grants full desktop mouse and keyboard
99
+ > input control to every device that can reach it. CodeAway v0.1 has no pairing
100
+ > or authentication, so expose it only on a network boundary you trust.
101
+
102
+ ## Architecture
103
+
104
+ CodeAway deliberately separates two independent backend axes:
105
+
106
+ | Module | Backends | Responsibility |
107
+ | --- | --- | --- |
108
+ | `agents.py` | Codex first; Claude Code and Cursor later | Owns application semantics: detection, projects and tasks, navigation, calibrated surfaces, and actions |
109
+ | `desktop.py` | Windows first; macOS and Linux later | Owns OS mechanics: windows, screenshots, accessibility, mouse, keyboard, and clipboard operations |
110
+
111
+ The server composes one agent backend with one desktop backend. For the first
112
+ release that pair is Codex Desktop on Windows. Agent backends do not contain
113
+ Windows APIs, and desktop backends do not contain Codex-specific behavior.
@@ -0,0 +1,88 @@
1
+ # CodeAway
2
+
3
+ ![CodeAway sends commands to desktop coding agents and returns replies and live status](https://raw.githubusercontent.com/jmoraispk/codeaway2/main/docs/assets/codeaway-hero.png)
4
+
5
+ CodeAway is a thin, browser-based remote control for local AI coding agents.
6
+ Version 0.1 supports one pairing only: **Windows with Codex Desktop**. The
7
+ source repository is `codeaway2`; the Python package and command are
8
+ `codeaway`.
9
+
10
+ > Status: early alpha. The Windows/Codex Desktop phone flow has been
11
+ > smoke-tested; expect rough edges and breaking changes.
12
+
13
+ ## Install
14
+
15
+ The shortest recommended path is:
16
+
17
+ ```powershell
18
+ uvx codeaway
19
+ ```
20
+
21
+ `uvx` is convenient, not required. You can instead install with either:
22
+
23
+ ```powershell
24
+ pipx install codeaway
25
+ ```
26
+
27
+ ```powershell
28
+ py -m pip install codeaway
29
+ ```
30
+
31
+ ## Platform support
32
+
33
+ Windows with Codex Desktop is the supported pairing. macOS and Linux can
34
+ install the package, but desktop control for those platforms is not implemented
35
+ yet.
36
+
37
+ ## Run CodeAway
38
+
39
+ The first run is laptop-only. Start CodeAway in the foreground:
40
+
41
+ ```powershell
42
+ uvx codeaway
43
+ ```
44
+
45
+ It listens on `127.0.0.1:8765` and opens `/setup` in the laptop browser. Choose
46
+ the visible Codex Desktop window and draw all three capture regions:
47
+
48
+ - **Sidebar:** the projects and tasks on the left.
49
+ - **Conversation:** the right pane above the input.
50
+ - **Composer:** the chat box only; it may grow taller. Do not include the
51
+ full-width toolbar or status row.
52
+
53
+ To enable phone access, restart with an address assigned to the laptop on your
54
+ LAN or Tailscale network:
55
+
56
+ ```powershell
57
+ uvx codeaway --ip <IPv4-LAN-or-Tailscale-address>
58
+ ```
59
+
60
+ The explicit address is saved only after it binds successfully. Later
61
+ `uvx codeaway` launches reuse both that address and the saved calibration. If
62
+ the saved Codex window and all three regions resolve, CodeAway prints the phone
63
+ workspace URL without opening a laptop browser. The phone workspace still
64
+ links to `/setup` when recalibration is needed.
65
+
66
+ If a cached address is no longer available, CodeAway warns, falls back to
67
+ `127.0.0.1`, and saves that fallback. An invalid explicit address exits instead
68
+ of silently changing interfaces. Use `--no-browser` to suppress an otherwise
69
+ necessary setup launch and `--port PORT` to select and cache another port.
70
+ CodeAway v0.1 accepts IPv4 literals only; IPv6 addresses are rejected with an
71
+ actionable startup error.
72
+
73
+ > **Security:** A non-loopback endpoint grants full desktop mouse and keyboard
74
+ > input control to every device that can reach it. CodeAway v0.1 has no pairing
75
+ > or authentication, so expose it only on a network boundary you trust.
76
+
77
+ ## Architecture
78
+
79
+ CodeAway deliberately separates two independent backend axes:
80
+
81
+ | Module | Backends | Responsibility |
82
+ | --- | --- | --- |
83
+ | `agents.py` | Codex first; Claude Code and Cursor later | Owns application semantics: detection, projects and tasks, navigation, calibrated surfaces, and actions |
84
+ | `desktop.py` | Windows first; macOS and Linux later | Owns OS mechanics: windows, screenshots, accessibility, mouse, keyboard, and clipboard operations |
85
+
86
+ The server composes one agent backend with one desktop backend. For the first
87
+ release that pair is Codex Desktop on Windows. Agent backends do not contain
88
+ Windows APIs, and desktop backends do not contain Codex-specific behavior.
@@ -0,0 +1,62 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.27"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "codeaway"
7
+ version = "0.1.0"
8
+ description = "Control a local coding agent from your phone"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = "MIT"
12
+ license-files = ["LICENSE"]
13
+ keywords = ["ai", "coding agents", "remote control", "tailscale"]
14
+ classifiers = [
15
+ "Development Status :: 3 - Alpha",
16
+ "Intended Audience :: Developers",
17
+ "Topic :: Software Development",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Operating System :: Microsoft :: Windows",
20
+ "Programming Language :: Python",
21
+ "Programming Language :: Python :: 3",
22
+ "Programming Language :: Python :: 3.11",
23
+ ]
24
+ dependencies = [
25
+ "Pillow>=11.0",
26
+ "uiautomation>=2.0.20; sys_platform == 'win32'",
27
+ ]
28
+
29
+ [project.urls]
30
+ Homepage = "https://github.com/jmoraispk/codeaway2"
31
+ Repository = "https://github.com/jmoraispk/codeaway2"
32
+ Issues = "https://github.com/jmoraispk/codeaway2/issues"
33
+
34
+ [project.optional-dependencies]
35
+ test = ["pytest>=8.0"]
36
+
37
+ [project.scripts]
38
+ codeaway = "codeaway.cli:main"
39
+
40
+ [tool.hatch.build.targets.wheel]
41
+ packages = ["src/codeaway"]
42
+ artifacts = [
43
+ "src/codeaway/web/*.html",
44
+ "src/codeaway/web/*.css",
45
+ "src/codeaway/web/*.js",
46
+ ]
47
+
48
+ [tool.hatch.build.targets.sdist]
49
+ exclude = [
50
+ "/.superpowers/**",
51
+ "/output/**",
52
+ "/dist/**",
53
+ "/uv.lock",
54
+ "/.pytest_cache/**",
55
+ "/.ruff_cache/**",
56
+ "/.mypy_cache/**",
57
+ "**/__pycache__/**",
58
+ "**/*.py[cod]",
59
+ ]
60
+
61
+ [tool.pytest.ini_options]
62
+ testpaths = ["tests"]
@@ -0,0 +1,4 @@
1
+ from importlib.metadata import version
2
+
3
+
4
+ __version__ = version("codeaway")
@@ -0,0 +1,5 @@
1
+ from .cli import main
2
+
3
+
4
+ if __name__ == "__main__":
5
+ raise SystemExit(main())