rendez-cli 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,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rendez Engine
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,170 @@
1
+ Metadata-Version: 2.4
2
+ Name: rendez-cli
3
+ Version: 0.1.0
4
+ Summary: Put your repository into a Rendez session, from your terminal
5
+ License-Expression: MIT
6
+ Project-URL: Homepage, https://rendez.space
7
+ Project-URL: Documentation, https://rendez.space
8
+ Keywords: rendez,agent,collaboration,terminal
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Topic :: Software Development
14
+ Requires-Python: >=3.10
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Requires-Dist: websockets>=12
18
+ Dynamic: license-file
19
+
20
+ # rendez CLI — put your repository into a session
21
+
22
+ Status: **experimental** (`DEC-021`). Files, plus shell with your
23
+ consent per command (`DEC-022`).
24
+
25
+ The web app is the control plane: the plan, the transcript, who is steering.
26
+ This puts the *files* somewhere useful — the repository already checked out on
27
+ your machine, instead of an empty directory on the server.
28
+
29
+ ```bash
30
+ pipx install "git+https://github.com/rendez-engine/hive.git#subdirectory=cli"
31
+
32
+ cd ~/code/your-repo
33
+ rendez connect -g "add rate limiting"
34
+ ```
35
+
36
+ Not on PyPI: the name `rendez` there belongs to an unrelated project, so the
37
+ distribution would be `rendez-cli` (the installed command stays `rendez`).
38
+ Authentication works and the server is deployed; what is still open before
39
+ publishing is a protocol-version handshake, so an installed CLI and a
40
+ redeployed server cannot drift apart silently (`DEPLOYMENT.md` §10).
41
+ Installing from the repository needs read access to it.
42
+
43
+ **HTTPS rather than `git+ssh`**, which assumes a GitHub SSH key that a
44
+ developer may not have — `gh auth login` covers HTTPS and is already how most
45
+ people here reach this repo. Found by installing on a machine that had no SSH
46
+ key. `pipx reinstall rendez-cli` picks up later commits. From a checkout,
47
+ `PYTHONPATH=cli python3 -m rendez connect` runs the working tree.
48
+
49
+ **A plain `pipx install` copies the source, so it silently shadows your
50
+ checkout.** Editing `cli/rendez/__init__.py` then changes nothing about what
51
+ `rendez connect` runs, and the symptom is a feature that works in tests and is
52
+ absent in the app -- with no error anywhere, because the installed copy is
53
+ older but perfectly valid. If you are developing the CLI:
54
+
55
+ ```bash
56
+ pipx install --force --editable ./cli # runs your checkout, not a copy
57
+ ```
58
+
59
+ To tell which one is live:
60
+
61
+ ```bash
62
+ "$(pipx environment --value PIPX_LOCAL_VENVS)/rendez-cli/bin/python" \
63
+ -c "import rendez, inspect; print(inspect.getfile(rendez))"
64
+ ```
65
+
66
+ ```
67
+ 2 recent session(s) on this repo:
68
+ 1. add rate limiting you · 2026-09-29 14:02
69
+ 2. fix the cart bug sam · 2026-09-28 11:40
70
+
71
+ your 1 most recent session(s) with no repository — joining one connects it here:
72
+ 3. plan the migration you · 2026-09-27 09:15
73
+
74
+ Number to join, or Enter for a new session:
75
+
76
+ Session add rate limiting
77
+ Open http://localhost:3000/sessions/8f3a...
78
+ Workspace /Users/you/code/your-repo (main, clean)
79
+ ```
80
+
81
+ Sessions are filed under the repository they were attached to, keyed on the
82
+ git remote (`DEC-023`), so a teammate's clone at a different path matches
83
+ yours. A repository with no remote keys on its first commit instead, which
84
+ means renaming or moving the checkout keeps its sessions. A folder that is
85
+ not a git repository has nothing stable to key on and is filed under its
86
+ path -- renaming it hides its sessions, and `rendez connect` says so. Your own sessions that have **no** repository follow underneath, up to
87
+ two of them: a session started in the browser is filed under nothing, and
88
+ joining one from a checkout connects it to that repository for good. They are
89
+ a tail rather than peers — this repository's own sessions come first and are
90
+ never displaced by them, because "what was already going on here?" is the
91
+ question the list answers. To join
92
+ a specific session directly — the app shows this command on its Files tab —
93
+ use `rendez connect --session <id>`. The header then shows the session's
94
+ goal rather than its id -- the id identifies the session, but it is not what
95
+ anyone calls it. A goal is a label, not an identifier: two sessions may share
96
+ one, and `--session` always takes the id. Without this, two people in one repo start parallel sessions that
97
+ cannot see each other's edits. Press Enter to start fresh, or `--new` to skip
98
+ the question. It is skipped automatically when stdin is not a terminal, so
99
+ scripts do not hang.
100
+
101
+ Authentication is mandatory. First sign up and verify your email in the browser,
102
+ then run `rendez login --api https://YOUR-API`. The CLI prompts for your
103
+ **username** -- not your email address (`DEC-067`) -- and your password, and
104
+ stores a revocable token at `~/.config/rendez/auth.json` with
105
+ mode 0600. `rendez logout` revokes it. `rendez connect` uses the same account
106
+ name as the browser. The terminal's printed session URL identifies a session;
107
+ use the browser Share panel to create a link or invite teammates. For a
108
+ link-only CLI join, supply `--session` and the link's `access` value as
109
+ `--share-token`.
110
+
111
+ Your teammates open an invited session in a browser — nothing to install,
112
+ nothing to clone. They see the transcript and the plan; the owner can grant
113
+ collaborator access to steer the agent. When the agent reads or writes a file, it
114
+ happens **here**, in your working tree, and your editor updates.
115
+
116
+ ## Options
117
+
118
+ | | |
119
+ |---|---|
120
+ | `-d, --dir` | repository root (default: current directory) |
121
+ | `-g, --goal` | what the session is for |
122
+ | `-s, --session` | join an existing session instead of creating one |
123
+ | `-n, --new` | start a new session without being offered existing ones |
124
+ | `-u, --user` | your name in the room (default: `$USER`) |
125
+ | `--share-token` | access value from a revocable share URL |
126
+ | `--api` | server (default `http://localhost:8100`, or `RENDEZ_API`) |
127
+ | `--web` | web app, for the share link (or `RENDEZ_WEB`) |
128
+
129
+ Requires `websockets`. Only the session **owner** may attach a workspace —
130
+ normally the person who created it, which `connect` does for you.
131
+
132
+ ## What it does, exactly
133
+
134
+ Three operations, forwarded from the server and run against your tree:
135
+
136
+ - `read_file` · `write_file` · `list_dir`
137
+
138
+ Paths are resolved and refused if they leave the root. `.git`,
139
+ `node_modules`, `__pycache__`, `.next` and `.venv` are hidden from listings.
140
+ Files over 256KB are refused in both directions — a tool result re-enters the
141
+ model's history on every later request (`DEC-020`), so a large file is paid
142
+ for every turn, not once.
143
+
144
+ ## What it does not do
145
+
146
+ - **Shell asks first** (`DEC-022`). `ls`, `cat`, `grep` and similar run
147
+ unprompted; anything else prompts you in this terminal — `y` once, `a`
148
+ always for that exact command this session, `n` no. Only you can answer:
149
+ it is your machine. A redirect kills the command's whole process group, so
150
+ an interrupted `npm test` does not leave its runner behind.
151
+ - **The watcher warns, it does not prevent.** Edit a file the agent is
152
+ working on and the session notices within ~1.5s and tells the agent on its
153
+ next turn. It does not stop the write that already happened, and only files
154
+ the agent has touched are watched.
155
+ - **No git.** Branch and dirty state are shown for context. Nothing commits,
156
+ pushes or checks out.
157
+ - **No second host.** One machine per session. Close your laptop and the
158
+ session has no filesystem until you reconnect; in-flight calls fail
159
+ immediately rather than hanging.
160
+
161
+ ## Be aware
162
+
163
+ Anyone who can steer the session can make the agent read and write files in
164
+ this directory. Confinement to the root is a path check, not a sandbox: a
165
+ `.env` **inside** the repository is inside the repository. Run this on repos
166
+ you would screen-share, with people you would screen-share to.
167
+
168
+ For isolated automation, `RENDEZ_AUTH_FILE` overrides the default CLI login
169
+ cache path (`~/.config/rendez/auth.json`). The managed test runner uses a private
170
+ temporary cache so tests cannot replace a developer's saved credentials.
@@ -0,0 +1,151 @@
1
+ # rendez CLI — put your repository into a session
2
+
3
+ Status: **experimental** (`DEC-021`). Files, plus shell with your
4
+ consent per command (`DEC-022`).
5
+
6
+ The web app is the control plane: the plan, the transcript, who is steering.
7
+ This puts the *files* somewhere useful — the repository already checked out on
8
+ your machine, instead of an empty directory on the server.
9
+
10
+ ```bash
11
+ pipx install "git+https://github.com/rendez-engine/hive.git#subdirectory=cli"
12
+
13
+ cd ~/code/your-repo
14
+ rendez connect -g "add rate limiting"
15
+ ```
16
+
17
+ Not on PyPI: the name `rendez` there belongs to an unrelated project, so the
18
+ distribution would be `rendez-cli` (the installed command stays `rendez`).
19
+ Authentication works and the server is deployed; what is still open before
20
+ publishing is a protocol-version handshake, so an installed CLI and a
21
+ redeployed server cannot drift apart silently (`DEPLOYMENT.md` §10).
22
+ Installing from the repository needs read access to it.
23
+
24
+ **HTTPS rather than `git+ssh`**, which assumes a GitHub SSH key that a
25
+ developer may not have — `gh auth login` covers HTTPS and is already how most
26
+ people here reach this repo. Found by installing on a machine that had no SSH
27
+ key. `pipx reinstall rendez-cli` picks up later commits. From a checkout,
28
+ `PYTHONPATH=cli python3 -m rendez connect` runs the working tree.
29
+
30
+ **A plain `pipx install` copies the source, so it silently shadows your
31
+ checkout.** Editing `cli/rendez/__init__.py` then changes nothing about what
32
+ `rendez connect` runs, and the symptom is a feature that works in tests and is
33
+ absent in the app -- with no error anywhere, because the installed copy is
34
+ older but perfectly valid. If you are developing the CLI:
35
+
36
+ ```bash
37
+ pipx install --force --editable ./cli # runs your checkout, not a copy
38
+ ```
39
+
40
+ To tell which one is live:
41
+
42
+ ```bash
43
+ "$(pipx environment --value PIPX_LOCAL_VENVS)/rendez-cli/bin/python" \
44
+ -c "import rendez, inspect; print(inspect.getfile(rendez))"
45
+ ```
46
+
47
+ ```
48
+ 2 recent session(s) on this repo:
49
+ 1. add rate limiting you · 2026-09-29 14:02
50
+ 2. fix the cart bug sam · 2026-09-28 11:40
51
+
52
+ your 1 most recent session(s) with no repository — joining one connects it here:
53
+ 3. plan the migration you · 2026-09-27 09:15
54
+
55
+ Number to join, or Enter for a new session:
56
+
57
+ Session add rate limiting
58
+ Open http://localhost:3000/sessions/8f3a...
59
+ Workspace /Users/you/code/your-repo (main, clean)
60
+ ```
61
+
62
+ Sessions are filed under the repository they were attached to, keyed on the
63
+ git remote (`DEC-023`), so a teammate's clone at a different path matches
64
+ yours. A repository with no remote keys on its first commit instead, which
65
+ means renaming or moving the checkout keeps its sessions. A folder that is
66
+ not a git repository has nothing stable to key on and is filed under its
67
+ path -- renaming it hides its sessions, and `rendez connect` says so. Your own sessions that have **no** repository follow underneath, up to
68
+ two of them: a session started in the browser is filed under nothing, and
69
+ joining one from a checkout connects it to that repository for good. They are
70
+ a tail rather than peers — this repository's own sessions come first and are
71
+ never displaced by them, because "what was already going on here?" is the
72
+ question the list answers. To join
73
+ a specific session directly — the app shows this command on its Files tab —
74
+ use `rendez connect --session <id>`. The header then shows the session's
75
+ goal rather than its id -- the id identifies the session, but it is not what
76
+ anyone calls it. A goal is a label, not an identifier: two sessions may share
77
+ one, and `--session` always takes the id. Without this, two people in one repo start parallel sessions that
78
+ cannot see each other's edits. Press Enter to start fresh, or `--new` to skip
79
+ the question. It is skipped automatically when stdin is not a terminal, so
80
+ scripts do not hang.
81
+
82
+ Authentication is mandatory. First sign up and verify your email in the browser,
83
+ then run `rendez login --api https://YOUR-API`. The CLI prompts for your
84
+ **username** -- not your email address (`DEC-067`) -- and your password, and
85
+ stores a revocable token at `~/.config/rendez/auth.json` with
86
+ mode 0600. `rendez logout` revokes it. `rendez connect` uses the same account
87
+ name as the browser. The terminal's printed session URL identifies a session;
88
+ use the browser Share panel to create a link or invite teammates. For a
89
+ link-only CLI join, supply `--session` and the link's `access` value as
90
+ `--share-token`.
91
+
92
+ Your teammates open an invited session in a browser — nothing to install,
93
+ nothing to clone. They see the transcript and the plan; the owner can grant
94
+ collaborator access to steer the agent. When the agent reads or writes a file, it
95
+ happens **here**, in your working tree, and your editor updates.
96
+
97
+ ## Options
98
+
99
+ | | |
100
+ |---|---|
101
+ | `-d, --dir` | repository root (default: current directory) |
102
+ | `-g, --goal` | what the session is for |
103
+ | `-s, --session` | join an existing session instead of creating one |
104
+ | `-n, --new` | start a new session without being offered existing ones |
105
+ | `-u, --user` | your name in the room (default: `$USER`) |
106
+ | `--share-token` | access value from a revocable share URL |
107
+ | `--api` | server (default `http://localhost:8100`, or `RENDEZ_API`) |
108
+ | `--web` | web app, for the share link (or `RENDEZ_WEB`) |
109
+
110
+ Requires `websockets`. Only the session **owner** may attach a workspace —
111
+ normally the person who created it, which `connect` does for you.
112
+
113
+ ## What it does, exactly
114
+
115
+ Three operations, forwarded from the server and run against your tree:
116
+
117
+ - `read_file` · `write_file` · `list_dir`
118
+
119
+ Paths are resolved and refused if they leave the root. `.git`,
120
+ `node_modules`, `__pycache__`, `.next` and `.venv` are hidden from listings.
121
+ Files over 256KB are refused in both directions — a tool result re-enters the
122
+ model's history on every later request (`DEC-020`), so a large file is paid
123
+ for every turn, not once.
124
+
125
+ ## What it does not do
126
+
127
+ - **Shell asks first** (`DEC-022`). `ls`, `cat`, `grep` and similar run
128
+ unprompted; anything else prompts you in this terminal — `y` once, `a`
129
+ always for that exact command this session, `n` no. Only you can answer:
130
+ it is your machine. A redirect kills the command's whole process group, so
131
+ an interrupted `npm test` does not leave its runner behind.
132
+ - **The watcher warns, it does not prevent.** Edit a file the agent is
133
+ working on and the session notices within ~1.5s and tells the agent on its
134
+ next turn. It does not stop the write that already happened, and only files
135
+ the agent has touched are watched.
136
+ - **No git.** Branch and dirty state are shown for context. Nothing commits,
137
+ pushes or checks out.
138
+ - **No second host.** One machine per session. Close your laptop and the
139
+ session has no filesystem until you reconnect; in-flight calls fail
140
+ immediately rather than hanging.
141
+
142
+ ## Be aware
143
+
144
+ Anyone who can steer the session can make the agent read and write files in
145
+ this directory. Confinement to the root is a path check, not a sandbox: a
146
+ `.env` **inside** the repository is inside the repository. Run this on repos
147
+ you would screen-share, with people you would screen-share to.
148
+
149
+ For isolated automation, `RENDEZ_AUTH_FILE` overrides the default CLI login
150
+ cache path (`~/.config/rendez/auth.json`). The managed test runner uses a private
151
+ temporary cache so tests cannot replace a developer's saved credentials.
@@ -0,0 +1,50 @@
1
+ # Packaging for the terminal client (`DEPLOYMENT.md` §10).
2
+ #
3
+ # The distribution is `rendez-cli` because `rendez` on PyPI is taken: version
4
+ # 1.2.1, "REUNION Authors", an unrelated cryptography library. The installed
5
+ # command is still `rendez` -- a distribution name and its entry points need
6
+ # not match.
7
+ #
8
+ # Published to PyPI as `rendez-cli` (`DEC-092`). The source repository is
9
+ # private, so no `Source` URL is advertised -- a link a stranger cannot open is
10
+ # worse than none. Installing from the repo still works for people with access:
11
+ #
12
+ # pipx install "git+https://github.com/rendez-engine/hive.git#subdirectory=cli"
13
+ [build-system]
14
+ requires = ["setuptools>=68"]
15
+ build-backend = "setuptools.build_meta"
16
+
17
+ [project]
18
+ name = "rendez-cli"
19
+ version = "0.1.0"
20
+ description = "Put your repository into a Rendez session, from your terminal"
21
+ readme = "README.md"
22
+ license = "MIT"
23
+ # The CLI only. `server/`, `site/` and `docs/` are not covered and are not
24
+ # published -- the repository they live in is private (`DEC-092`).
25
+ license-files = ["LICENSE"]
26
+ requires-python = ">=3.10"
27
+ keywords = ["rendez", "agent", "collaboration", "terminal"]
28
+ classifiers = [
29
+ "Development Status :: 3 - Alpha",
30
+ "Environment :: Console",
31
+ "Intended Audience :: Developers",
32
+ "Programming Language :: Python :: 3",
33
+ "Topic :: Software Development",
34
+ ]
35
+
36
+ # `websockets` is the only non-stdlib import. Floored rather than pinned: the
37
+ # server pins 16.1.1 because a deploy pulls whatever is current at build time,
38
+ # but a CLI is installed once by a person who may already have a newer one.
39
+ dependencies = ["websockets>=12"]
40
+
41
+ [project.urls]
42
+ Homepage = "https://rendez.space"
43
+ Documentation = "https://rendez.space"
44
+ # Issues: no public tracker; the repository is private. hello@rendez.space.
45
+
46
+ [project.scripts]
47
+ rendez = "rendez:main"
48
+
49
+ [tool.setuptools]
50
+ packages = ["rendez"]