liutaio 0.1.4 → 0.1.6
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.
- package/README.md +13 -13
- package/bin/liutaio +6 -0
- package/docker/entrypoint.sh +5 -5
- package/docker/run.sh +11 -9
- package/package.json +3 -3
- /package/{agents-template.md → agent-template.md} +0 -0
package/README.md
CHANGED
|
@@ -24,12 +24,12 @@ You need three things:
|
|
|
24
24
|
|
|
25
25
|
1. **Docker** installed and running
|
|
26
26
|
2. **SSH keys** in `~/.ssh/` that can push to your repo
|
|
27
|
-
3. An **
|
|
27
|
+
3. An **agent.md** file in your repo describing the work to do (see [Writing Your agent.md](#writing-your-agentmd))
|
|
28
28
|
|
|
29
29
|
Then just run:
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
liutaio
|
|
32
|
+
liutaio agent.md 10 my-feature-branch
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
That's it. Liutaio figures out authentication, builds the container, clones your repo, installs dependencies, and starts working.
|
|
@@ -52,7 +52,7 @@ If you've ever used Claude Code on your machine, you're already set. If not, Liu
|
|
|
52
52
|
If you don't want to touch your host credentials, or you're on a machine where Claude Code isn't installed, use `--oauth`:
|
|
53
53
|
|
|
54
54
|
```bash
|
|
55
|
-
liutaio
|
|
55
|
+
liutaio agent.md 10 my-branch --oauth
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
Liutaio will show you a URL to open in your browser. After authorising, you'll see a code on the page — paste it back into the terminal. Your credentials are then cached in a Docker volume, so you only need to do this once.
|
|
@@ -60,7 +60,7 @@ Liutaio will show you a URL to open in your browser. After authorising, you'll s
|
|
|
60
60
|
To re-authenticate later (e.g. switching accounts):
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
|
-
liutaio
|
|
63
|
+
liutaio agent.md 10 my-branch --fresh-login
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
### Cached OAuth credentials
|
|
@@ -95,9 +95,9 @@ Each iteration works on exactly one ticket. After completing it (code committed,
|
|
|
95
95
|
|
|
96
96
|
If the container crashes or you stop it (`docker stop`), it pushes whatever work is on the base branch before shutting down — you never lose progress.
|
|
97
97
|
|
|
98
|
-
## Writing Your
|
|
98
|
+
## Writing Your agent.md
|
|
99
99
|
|
|
100
|
-
The `
|
|
100
|
+
The `agent.md` file tells Claude Code what to do. Put it anywhere in your repo (you pass the path as the first argument). Here's a minimal example:
|
|
101
101
|
|
|
102
102
|
```markdown
|
|
103
103
|
# My Feature
|
|
@@ -131,7 +131,7 @@ Maintain a `progress.md` file tracking what's been done.
|
|
|
131
131
|
When all tickets are complete, output: <promise>COMPLETE</promise>
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
-
See `
|
|
134
|
+
See `agent-template.md` for a more complete template.
|
|
135
135
|
|
|
136
136
|
### Key conventions
|
|
137
137
|
|
|
@@ -175,20 +175,20 @@ npm install --prefix packages/client
|
|
|
175
175
|
Pass private tokens with `--env`:
|
|
176
176
|
|
|
177
177
|
```bash
|
|
178
|
-
liutaio
|
|
178
|
+
liutaio agent.md 10 my-branch --env MY_NPM_TOKEN=ghp_xxxx
|
|
179
179
|
```
|
|
180
180
|
|
|
181
181
|
## CLI Reference
|
|
182
182
|
|
|
183
183
|
```
|
|
184
|
-
liutaio <
|
|
184
|
+
liutaio <agent-file> <iterations> <base-branch> [options]
|
|
185
185
|
```
|
|
186
186
|
|
|
187
187
|
### Arguments
|
|
188
188
|
|
|
189
189
|
| Argument | Description |
|
|
190
190
|
|----------|-------------|
|
|
191
|
-
| `
|
|
191
|
+
| `agent-file` | Path to your agent.md relative to repo root |
|
|
192
192
|
| `iterations` | Maximum number of loop iterations (one ticket per iteration) |
|
|
193
193
|
| `base-branch` | Name of the branch to create from main |
|
|
194
194
|
|
|
@@ -227,7 +227,7 @@ docker logs -f liutaio-my-branch
|
|
|
227
227
|
docker exec -it liutaio-my-branch bash
|
|
228
228
|
|
|
229
229
|
# Check progress on your host (updated after each ticket)
|
|
230
|
-
cat path/to/
|
|
230
|
+
cat path/to/agent-dir/progress.md
|
|
231
231
|
|
|
232
232
|
# Stop gracefully (pushes work before exiting)
|
|
233
233
|
docker stop liutaio-my-branch
|
|
@@ -265,14 +265,14 @@ Check that you're copying the entire code from the callback page (including any
|
|
|
265
265
|
Liutaio uses Claude Code's public OAuth client ID to authenticate. If Anthropic rotates this ID in a future update, OAuth login will fail. You can override it by passing the new client ID:
|
|
266
266
|
|
|
267
267
|
```bash
|
|
268
|
-
liutaio
|
|
268
|
+
liutaio agent.md 10 my-branch --env LIUTAIO_OAUTH_CLIENT_ID=new-client-id-here
|
|
269
269
|
```
|
|
270
270
|
|
|
271
271
|
You can find the current client ID by running `claude auth login` on your host and inspecting the authorization URL it generates.
|
|
272
272
|
|
|
273
273
|
### Loop doesn't stop after all work is done
|
|
274
274
|
|
|
275
|
-
The loop looks for `<promise>COMPLETE</promise>` in the session output. Make sure your
|
|
275
|
+
The loop looks for `<promise>COMPLETE</promise>` in the session output. Make sure your agent.md instructs Claude to output this exact string when finished.
|
|
276
276
|
|
|
277
277
|
## License
|
|
278
278
|
|
package/bin/liutaio
CHANGED
|
@@ -17,5 +17,11 @@ if [[ "${1:-}" == "--version" || "${1:-}" == "-v" ]]; then
|
|
|
17
17
|
exit 0
|
|
18
18
|
fi
|
|
19
19
|
|
|
20
|
+
# Handle --agent-template
|
|
21
|
+
if [[ "${1:-}" == "--agent-template" ]]; then
|
|
22
|
+
cat "$LIUTAIO_HOME/agent-template.md"
|
|
23
|
+
exit 0
|
|
24
|
+
fi
|
|
25
|
+
|
|
20
26
|
# Delegate to run.sh with all arguments
|
|
21
27
|
exec "$LIUTAIO_HOME/docker/run.sh" "$@"
|
package/docker/entrypoint.sh
CHANGED
|
@@ -7,9 +7,9 @@ BASE_BRANCH="${3:-}"
|
|
|
7
7
|
LOGDIR="${4:-/tmp/liutaio}"
|
|
8
8
|
|
|
9
9
|
if [ -z "$AGENTS_FILE" ] || [ -z "$ITERATIONS" ] || [ -z "$BASE_BRANCH" ]; then
|
|
10
|
-
echo "Usage: liutaio <
|
|
10
|
+
echo "Usage: liutaio <agent-file> <iterations> <base-branch> [log-dir]"
|
|
11
11
|
echo ""
|
|
12
|
-
echo "
|
|
12
|
+
echo " agent-file Path to agent.md relative to repo root"
|
|
13
13
|
echo " iterations Number of ralph loop iterations"
|
|
14
14
|
echo " base-branch Name of the base branch to create from main"
|
|
15
15
|
echo " log-dir Log directory (default: /tmp/liutaio)"
|
|
@@ -174,7 +174,7 @@ echo ""
|
|
|
174
174
|
echo "============================================"
|
|
175
175
|
echo " Liutaio"
|
|
176
176
|
echo "============================================"
|
|
177
|
-
echo "
|
|
177
|
+
echo " Agent file : $AGENTS_FILE"
|
|
178
178
|
echo " Iterations : $ITERATIONS"
|
|
179
179
|
echo " Base branch : $BASE_BRANCH"
|
|
180
180
|
echo " Log dir : $LOGDIR"
|
|
@@ -193,9 +193,9 @@ if [ -n "$REAL_REMOTE" ]; then
|
|
|
193
193
|
echo " Remote set to: $REAL_REMOTE"
|
|
194
194
|
fi
|
|
195
195
|
|
|
196
|
-
# Copy
|
|
196
|
+
# Copy agent file (and its directory) from host if not on main
|
|
197
197
|
if [ ! -f "/workspace/$AGENTS_FILE" ] && [ -f "/repo/$AGENTS_FILE" ]; then
|
|
198
|
-
echo "
|
|
198
|
+
echo " Agent file not on main — copying from host repo..."
|
|
199
199
|
mkdir -p "/workspace/$AGENTS_DIR"
|
|
200
200
|
cp -r "/repo/$AGENTS_DIR/." "/workspace/$AGENTS_DIR/"
|
|
201
201
|
echo " Copied: $AGENTS_DIR/"
|
package/docker/run.sh
CHANGED
|
@@ -4,7 +4,7 @@ set -euo pipefail
|
|
|
4
4
|
# ─── Liutaio — run Claude Code loops with auto-detecting auth ───
|
|
5
5
|
#
|
|
6
6
|
# Usage:
|
|
7
|
-
# liutaio <
|
|
7
|
+
# liutaio <agent-file> <iterations> <base-branch> [options]
|
|
8
8
|
#
|
|
9
9
|
# Authentication (checked in this order):
|
|
10
10
|
# 1. Cached OAuth credentials (Docker volume from a previous --oauth run)
|
|
@@ -69,10 +69,10 @@ if [ -z "$AGENTS_FILE" ] || [ -z "$ITERATIONS" ] || [ -z "$BASE_BRANCH" ]; then
|
|
|
69
69
|
echo "Liutaio — run Claude Code loops with auto-detecting auth"
|
|
70
70
|
echo ""
|
|
71
71
|
echo "Usage:"
|
|
72
|
-
echo " liutaio <
|
|
72
|
+
echo " liutaio <agent-file> <iterations> <base-branch> [options]"
|
|
73
73
|
echo ""
|
|
74
74
|
echo "Arguments:"
|
|
75
|
-
echo "
|
|
75
|
+
echo " agent-file Path to agent.md relative to repo root"
|
|
76
76
|
echo " iterations Number of loop iterations"
|
|
77
77
|
echo " base-branch Name of the base branch to create from main"
|
|
78
78
|
echo ""
|
|
@@ -86,6 +86,8 @@ if [ -z "$AGENTS_FILE" ] || [ -z "$ITERATIONS" ] || [ -z "$BASE_BRANCH" ]; then
|
|
|
86
86
|
echo " --node-version V Node.js version (default: 22, or LIUTAIO_NODE_VERSION)"
|
|
87
87
|
echo " --repo PATH Path to git repo (default: auto-detect from cwd)"
|
|
88
88
|
echo " --env KEY=VALUE Pass env var into the container (repeatable)"
|
|
89
|
+
echo " --agent-template Print the agent.md template to stdout"
|
|
90
|
+
echo " --version, -v Show version number"
|
|
89
91
|
echo ""
|
|
90
92
|
echo "Authentication (checked in this order):"
|
|
91
93
|
echo " 1. Cached OAuth credentials (Docker volume from a previous --oauth run)"
|
|
@@ -94,9 +96,9 @@ if [ -z "$AGENTS_FILE" ] || [ -z "$ITERATIONS" ] || [ -z "$BASE_BRANCH" ]; then
|
|
|
94
96
|
echo " 4. Interactive OAuth login (prompts in the terminal)"
|
|
95
97
|
echo ""
|
|
96
98
|
echo "Examples:"
|
|
97
|
-
echo " liutaio
|
|
98
|
-
echo " liutaio
|
|
99
|
-
echo " liutaio
|
|
99
|
+
echo " liutaio agent.md 10 my-branch # auto-detect auth"
|
|
100
|
+
echo " liutaio agent.md 10 my-branch --oauth # force OAuth login"
|
|
101
|
+
echo " liutaio agent.md 10 my-branch --fresh-login # re-authenticate"
|
|
100
102
|
exit 1
|
|
101
103
|
fi
|
|
102
104
|
|
|
@@ -111,9 +113,9 @@ fi
|
|
|
111
113
|
|
|
112
114
|
CONTAINER_NAME="${CONTAINER_NAME:-liutaio-${BASE_BRANCH}}"
|
|
113
115
|
|
|
114
|
-
# ─── Validate
|
|
116
|
+
# ─── Validate agent file exists ──────────────────────────────────────
|
|
115
117
|
if [ ! -f "$REPO_ROOT/$AGENTS_FILE" ]; then
|
|
116
|
-
echo "Error:
|
|
118
|
+
echo "Error: agent file not found: $REPO_ROOT/$AGENTS_FILE"
|
|
117
119
|
exit 1
|
|
118
120
|
fi
|
|
119
121
|
|
|
@@ -340,7 +342,7 @@ echo "============================================"
|
|
|
340
342
|
echo " Liutaio"
|
|
341
343
|
echo "============================================"
|
|
342
344
|
echo " Container : $CONTAINER_NAME"
|
|
343
|
-
echo "
|
|
345
|
+
echo " Agent : $AGENTS_FILE"
|
|
344
346
|
echo " Iterations : $ITERATIONS"
|
|
345
347
|
echo " Base branch: $BASE_BRANCH"
|
|
346
348
|
echo " Node : $NODE_VERSION"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "liutaio",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Run AI coding agents in Docker containers — autonomously, safely, and with zero setup.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"bin": {
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"files": [
|
|
10
10
|
"bin/",
|
|
11
11
|
"docker/",
|
|
12
|
-
"
|
|
12
|
+
"agent-template.md",
|
|
13
13
|
"LICENSE",
|
|
14
14
|
"README.md"
|
|
15
15
|
],
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
],
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|
|
27
|
-
"url": "git+https://github.com/
|
|
27
|
+
"url": "git+https://github.com/narley/liutaio.git"
|
|
28
28
|
},
|
|
29
29
|
"engines": {
|
|
30
30
|
"node": ">=18"
|
|
File without changes
|