luang-cli 0.3.0 → 0.3.2
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 +77 -5
- package/bin/luang-cli.js +72 -3
- package/lib/agent.js +386 -22
- package/lib/commands.js +157 -1
- package/lib/core.js +30 -0
- package/lib/models.js +343 -0
- package/package.json +2 -2
- package/test/bin/opencode +5 -0
- package/test/http-stub.js +39 -1
- package/test/run-e2e.js +349 -1
package/README.md
CHANGED
|
@@ -146,7 +146,11 @@ CLI API Browser (kamu)
|
|
|
146
146
|
| `provider remove` | Hapus provider dari config | `luang-cli provider remove codex` |
|
|
147
147
|
| `provider default` | Set provider default (dipakai `agent --exec`) | `luang-cli provider default opencode` |
|
|
148
148
|
| `telemetry` | Konsent kirim data usage/model (`on\|off\|status`) | `luang-cli telemetry status` |
|
|
149
|
-
| `agent` | Daemon **realtime WS** +
|
|
149
|
+
| `agent` | Daemon **realtime WS** + background/auto + polling (fallback) | `luang-cli agent start` |
|
|
150
|
+
| `models` | Daftar model AI per provider (deteksi dinamis + saran) | `luang-cli models opencode` |
|
|
151
|
+
| `workspace` | Folder kerja provider (sinkron dashboard), dipakai cwd `--exec` | `luang-cli workspace ~/project` |
|
|
152
|
+
| `agent start` | Jalankan daemon di **background** (mode auto, log + pid file) | `luang-cli agent start` |
|
|
153
|
+
| `agent stop\|status\|logs` | Hentikan (SIGTERM) · status (pid/uptime/log) · tail log | `luang-cli agent logs --tail 50` |
|
|
150
154
|
| `task list` | Daftar tugas agent (filter status) | `luang-cli task list --status todo` |
|
|
151
155
|
| `task create` | Buat tugas (butuh izin admin) | `luang-cli task create --title "Refactor auth" --priority high` |
|
|
152
156
|
| `task status` | Perbarui status + catatan progress | `luang-cli task status TGS-12 in_progress --note "mulai"` |
|
|
@@ -199,14 +203,50 @@ luang-cli provider default opencode
|
|
|
199
203
|
|
|
200
204
|
---
|
|
201
205
|
|
|
206
|
+
## 🧩 Daftar model (`luang-cli models`)
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
luang-cli models # semua provider (tabel)
|
|
210
|
+
luang-cli models opencode # satu provider saja
|
|
211
|
+
luang-cli models --json # untuk mesin: {<provider>: {provider, source, models}}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
- **Sumber (berurutan)**: dinamis **hanya** untuk `opencode` — coba perintah `opencode models`, gagal → parse `~/.config/opencode/` atau `~/.opencode`, gagal juga → registry statis. Provider lain selalu registry statis per harness (saran/datalist; versi lama tidak masalah — model tetap bisa diketik manual).
|
|
215
|
+
- **Kebijakan ketat**: binary `claude`, `gemini`, dan `codex` **tidak pernah dieksekusi**.
|
|
216
|
+
- Tabel: `Provider | Jumlah model | daftar` (wrap maks 6 baris + `…+n lagi`); `--json` untuk konsumsi mesin.
|
|
217
|
+
- Field `models` (maks 50 item, tiap ≤120 karakter) ikut dikirim ke server pada heartbeat dan hello frame WS.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
202
221
|
## 🖥 Daemon agent (`luang-cli agent`)
|
|
203
222
|
|
|
204
223
|
```bash
|
|
205
224
|
luang-cli agent # realtime WS (heartbeat + push tugas); fallback polling bila WS gagal
|
|
206
225
|
luang-cli agent --interval 10 # (mode fallback) poll tiap 10 detik
|
|
207
226
|
luang-cli agent --exec # eksekusi tugas To-Do (konfirmasi y/N)
|
|
227
|
+
|
|
228
|
+
# Background — terminal boleh ditutup
|
|
229
|
+
luang-cli agent start # spawn detached → ~/.luang-cli/agent.log + agent.pid (mode AUTO)
|
|
230
|
+
luang-cli agent start --no-auto # background tanpa eksekusi (monitor saja)
|
|
231
|
+
luang-cli agent status # pid · uptime · mode auto/manual · 3 baris log terakhir
|
|
232
|
+
luang-cli agent logs --tail 50 # tail log (default 30 baris)
|
|
233
|
+
luang-cli agent stop # SIGTERM graceful + hapus agent.pid
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Mode auto** (`agent start`, default): tugas `To-Do` yang di-assign ke key ini **langsung dieksekusi tanpa konfirmasi y/N** (karena tidak ada terminal) — termasuk event realtime `task.assigned`. Pilihan ini disimpan ke `config.json → auto_exec` dan ditampilkan oleh `agent status`. Foreground `agent` / `agent --exec` tetap memakai konfirmasi y/N seperti biasa.
|
|
237
|
+
|
|
238
|
+
### Workspace folder (`luang-cli workspace`)
|
|
239
|
+
|
|
240
|
+
Folder kerja tempat provider dijalankan (mis. repo yang dikerjakan `opencode`). Diatur dari **dashboard** (Detail Agent → Workspace Folder) **atau** CLI — server adalah sumber kebenaran, CLI menyalin ke config lokal:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
luang-cli workspace # tampilkan server/lokal/efektif
|
|
244
|
+
luang-cli workspace ~/project # simpan (validasi folder harus ada)
|
|
245
|
+
luang-cli workspace --reset # kosongkan → exec pakai folder saat ini
|
|
208
246
|
```
|
|
209
247
|
|
|
248
|
+
Dipakai sebagai **cwd** saat `--exec`/`agent start` menjalankan provider (baris `Folder : …` di log eksekusi). Folder tidak ada → warning + fallback ke folder saat ini.
|
|
249
|
+
|
|
210
250
|
**Mode utama: realtime WebSocket** (`/api/v1/agent/ws`, auth `X-CLI-Key`) — tugas di-assign dari dashboard langsung ter-push ke terminal tanpa polling. **Fallback**: bila WS gagal (jaringan/proxy/Node lama), otomatis turun ke polling HTTP seperti versi lama — daemon tetap hidup, tidak crash.
|
|
211
251
|
|
|
212
252
|
Perilaku (kedua mode):
|
|
@@ -239,6 +279,32 @@ Bila ada tugas `To-Do` yang belum pernah dieksekusi dan default provider punya `
|
|
|
239
279
|
5. Setelah selesai, event **`telemetry.run`** (started/completed/failed + provider/model/durasi/exit_code) dikirim **hanya bila konsent telemetry aktif** (lihat bawah).
|
|
240
280
|
6. Riwayat eksekusi disimpan `~/.luang-cli/state.json` — tugas yang sama tidak ditawari dua kali. `Ctrl+C` keluar bersih.
|
|
241
281
|
|
|
282
|
+
### Background + mode otomatis (`agent start`)
|
|
283
|
+
|
|
284
|
+
Terminal boleh ditutup — daemon jalan di background:
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
luang-cli agent start # background + mode auto (eksekusi To-Do TANPA konfirmasi y/N)
|
|
288
|
+
luang-cli agent start --no-auto # background tapi hanya memantau (tanpa eksekusi)
|
|
289
|
+
luang-cli agent status # pid, uptime, mode, 3 baris log terakhir
|
|
290
|
+
luang-cli agent logs --tail 50 # isi log
|
|
291
|
+
luang-cli agent stop # hentikan (SIGTERM graceful)
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
- Child ditulis ke `~/.luang-cli/agent.pid` (`{pid, started_at, auto, mode}`), log ke `~/.luang-cli/agent.log`.
|
|
295
|
+
- Mode auto: tugas To-Do yang di-assign ke key ini langsung dieksekusi (termasuk via event realtime `task.assigned`); default provider + template `{task}` tetap dipakai seperti `--exec`.
|
|
296
|
+
- Foreground (`luang-cli agent` / `--exec`) tetap seperti dulu — konfirmasi y/N, cocok untuk percobaan manual.
|
|
297
|
+
|
|
298
|
+
### Daftar model (`luang-cli models`)
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
luang-cli models # semua provider: jumlah + daftar (wrap 6 baris)
|
|
302
|
+
luang-cli models opencode # satu provider
|
|
303
|
+
luang-cli models --json # mesin
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
Urutan sumber: **deteksi dinamis** (untuk opencode: perintah/config lokal bila tersedia) → **registry saran statis** per provider → ketik manual selalu bisa. Hasil sync ke server (heartbeat/hello) sehingga dashboard bisa menampilkan saran model di Detail Agent. Kebijakan: binary `claude`/`gemini`/`codex` **tidak pernah dieksekusi** untuk deteksi (hanya opencode yang aman + parse file config).
|
|
307
|
+
|
|
242
308
|
---
|
|
243
309
|
|
|
244
310
|
## 📡 Telemetry (ops-in, konsent ganda)
|
|
@@ -315,12 +381,14 @@ File config auto-dibuat: `~/.luang-cli/config.json`
|
|
|
315
381
|
"key": "lk_…", // hasil login
|
|
316
382
|
"name": null, // nama sesi terakhir
|
|
317
383
|
"telemetry": false, // konsent lokal telemetry (default OFF)
|
|
384
|
+
"auto_exec": false, // mode auto agent (ditulis `agent start [--no-auto]`)
|
|
318
385
|
"default_provider": null,
|
|
319
386
|
"providers": { "opencode": { "path": "…", "exec_template": "…", "model": "sonnet-4" } }
|
|
320
387
|
}
|
|
321
388
|
```
|
|
322
389
|
|
|
323
390
|
State runtime (riwayat terlihat / eksekusi): `~/.luang-cli/state.json`.
|
|
391
|
+
Daemon background: `~/.luang-cli/agent.pid` (JSON `{pid, started_at, auto, mode}`) + `~/.luang-cli/agent.log`.
|
|
324
392
|
|
|
325
393
|
| Env | Mempengaruhi |
|
|
326
394
|
|---|---|
|
|
@@ -348,6 +416,9 @@ Precedence: **flag `--api <url>` → env → config file**.
|
|
|
348
416
|
| Timeout 15 detik | Cek jaringan + `--api https://api.luang.id` |
|
|
349
417
|
| Tabel provider kosong | `provider add <type> --exec_template '…'` manual |
|
|
350
418
|
| `--exec` tak berjalan | Set `provider default <type>` + template harus berisi `{task}` |
|
|
419
|
+
| Pesan "eksekusi nonaktif" | Normal tanpa `--exec` — nyalakan dengan `luang-cli agent --exec` atau `luang-cli agent start` (mode auto) |
|
|
420
|
+
| `agent start` langsung mati | Cek `luang-cli agent logs` (biasanya belum `login`) |
|
|
421
|
+
| `agent status` bilang "pid file basi" | Proses sudah mati → `luang-cli agent stop` untuk membersihkan |
|
|
351
422
|
| Menunggu `{model}` (tugas ditunda) | `provider add <type> --model <m>` · env `LUANG_MODEL` · atau set_model dari dashboard |
|
|
352
423
|
| Daemon tak realtime (polling) | Wajar bila WS gagal — cek `LUANG_NO_WS`, proxy/firewall port WS; polling tetap jalan |
|
|
353
424
|
| Telemetry tak terkirim | Butuh konsent **ganda**: `luang-cli telemetry on` + toggle server di dashboard Agents |
|
|
@@ -378,12 +449,13 @@ luang-cli/
|
|
|
378
449
|
├── lib/
|
|
379
450
|
│ ├── core.js # config, env, HTTP, provider detect, key util
|
|
380
451
|
│ ├── ws.js # klien WebSocket RFC 6455 (zero-dep) utk mode realtime
|
|
381
|
-
│ ├──
|
|
382
|
-
│
|
|
452
|
+
│ ├── models.js # registry model statis + deteksi aman (hanya opencode)
|
|
453
|
+
│ ├── commands.js # login/logout/whoami/telemetry/provider/models
|
|
454
|
+
│ └── agent.js # daemon realtime+fallback (foreground & background), task CRUD, status, mcp-config
|
|
383
455
|
├── test/
|
|
384
|
-
│ ├── run-e2e.js # E2E offline (
|
|
456
|
+
│ ├── run-e2e.js # E2E offline (151 assertion): realtime, fallback, konsent, model, lifecycle
|
|
385
457
|
│ ├── ws-stub.js # stub server WS (RFC 6455) utk uji offline
|
|
386
|
-
│ ├── http-stub.js # stub HTTP /agent/me (di-fork, IPC)
|
|
458
|
+
│ ├── http-stub.js # stub HTTP /agent/me + /agent/heartbeat (di-fork, IPC)
|
|
387
459
|
│ └── bin/opencode # stub binary provider (tidak pernah panggil claude/gemini asli)
|
|
388
460
|
└── package.json # bin: luang-cli → bin/luang-cli.js
|
|
389
461
|
```
|
package/bin/luang-cli.js
CHANGED
|
@@ -18,7 +18,9 @@ Command:
|
|
|
18
18
|
whoami Info sesi agent, tenant & izin luang-cli whoami
|
|
19
19
|
provider Kelola provider CLI coding luang-cli provider list
|
|
20
20
|
telemetry Konsent telemetry on|off|status luang-cli telemetry status
|
|
21
|
-
|
|
21
|
+
workspace Folder kerja provider (sinkron dash) luang-cli workspace [path|--reset]
|
|
22
|
+
agent Daemon realtime WS + polling tugas luang-cli agent [--exec] · start|stop|status|logs
|
|
23
|
+
models Daftar model AI per provider luang-cli models [provider] [--json]
|
|
22
24
|
task Kelola tugas (list|create|status) luang-cli task list
|
|
23
25
|
status Ringkasan CLI (key, tenant, izin) luang-cli status
|
|
24
26
|
mcp-config Snippet konfigurasi MCP klien luang-cli mcp-config
|
|
@@ -104,10 +106,30 @@ Perilaku:
|
|
|
104
106
|
realtime (started/completed/failed saat exec) — pakai header X-CLI-Key, bukan JWT.
|
|
105
107
|
• Satu flag mati → CLI tidak pernah mengirim data run (server juga men-drop).`,
|
|
106
108
|
|
|
107
|
-
|
|
109
|
+
workspace: `luang-cli workspace — folder kerja provider (sinkron dashboard ↔ CLI)
|
|
108
110
|
|
|
109
111
|
Penggunaan:
|
|
110
|
-
luang-cli
|
|
112
|
+
luang-cli workspace tampilkan server/lokal/efektif + validasi folder
|
|
113
|
+
luang-cli workspace <path> simpan ke server (POST /agent/workspace) + lokal
|
|
114
|
+
luang-cli workspace --reset kosongkan (exec memakai folder saat ini)
|
|
115
|
+
|
|
116
|
+
Perilaku:
|
|
117
|
+
• Server adalah sumber kebenaran (dashboard Agents → Detail → Workspace Folder);
|
|
118
|
+
CLI menyalin ke config lokal saat hello.ok / status / whoami.
|
|
119
|
+
• Nilai dipakai sebagai cwd saat --exec (spawn provider). Folder tidak ada /
|
|
120
|
+
bukan direktori → warning + fallback ke folder saat ini.
|
|
121
|
+
• Bentuk path: absolut (/x/y), home (~/x), atau relatif (terhadap cwd).`,
|
|
122
|
+
|
|
123
|
+
agent: `luang-cli agent — daemon realtime (WebSocket) + fallback polling
|
|
124
|
+
|
|
125
|
+
Penggunaan (foreground):
|
|
126
|
+
luang-cli agent [--interval N] [--exec] [--auto]
|
|
127
|
+
|
|
128
|
+
Penggunaan (background):
|
|
129
|
+
luang-cli agent start [--no-auto] [--auto] spawn detached → ~/.luang-cli/agent.log
|
|
130
|
+
luang-cli agent stop SIGTERM + hapus ~/.luang-cli/agent.pid
|
|
131
|
+
luang-cli agent status pid · uptime · mode · 3 baris log terakhir
|
|
132
|
+
luang-cli agent logs [--tail N] tail log (default 30 baris)
|
|
111
133
|
|
|
112
134
|
Mode:
|
|
113
135
|
1) Realtime WebSocket (utama): wss://<api>/api/v1/agent/ws, auth header
|
|
@@ -130,11 +152,53 @@ Opsi:
|
|
|
130
152
|
exit 0 → done/"selesai"; gagal → review/"gagal exit N".
|
|
131
153
|
Tiap run juga mengirim telemetry.run started/completed/failed
|
|
132
154
|
(consent: telemetry on + flag server ON).
|
|
155
|
+
--auto Mode otomatis: doExec=true TANPA konfirmasi y/N (dipakai
|
|
156
|
+
anak proses \`agent start\`; foreground juga boleh memakai).
|
|
157
|
+
|
|
158
|
+
Background (\`agent start\`):
|
|
159
|
+
• spawn detached (stdio → ~/.luang-cli/agent.log, unref) + tulis
|
|
160
|
+
~/.luang-cli/agent.pid berisi JSON {pid, started_at, auto, mode}.
|
|
161
|
+
• Default = mode AUTO: eksekusi tugas To-Do begitu terdeteksi (termasuk
|
|
162
|
+
event realtime task.assigned) tanpa y/N — karena tidak ada terminal.
|
|
163
|
+
\`--no-auto\` mematikan (monitor saja, eksekusi nonaktif).
|
|
164
|
+
• Pilihan ini ditulis ke config auto_exec (config.json) dan ditampilkan
|
|
165
|
+
oleh \`agent status\`.
|
|
166
|
+
• \`agent stop\` kirim SIGTERM (jalur shutdown sama dengan Ctrl+C) lalu
|
|
167
|
+
hapus pid file; \`agent status\` cek process.kill(pid,0) + uptime.
|
|
168
|
+
• Tanpa --exec dan tanpa mode auto → tugas hanya diberi tahu sekali:
|
|
169
|
+
"eksekusi nonaktif (jalankan \`luang-cli agent --exec\` atau \`agent start\`
|
|
170
|
+
untuk mode otomatis)" — TIDAK menyalahkan exec_template.
|
|
133
171
|
|
|
134
172
|
Perilaku:
|
|
135
173
|
• State: ~/.luang-cli/state.json · Ctrl+C keluar bersih.
|
|
136
174
|
• Heartbeat HTTP fallback tiap 30 detik (override: LUANG_HEARTBEAT_SEC).`,
|
|
137
175
|
|
|
176
|
+
models: `luang-cli models — daftar model AI per provider
|
|
177
|
+
|
|
178
|
+
Penggunaan:
|
|
179
|
+
luang-cli models [provider] [--json]
|
|
180
|
+
|
|
181
|
+
Provider: claude_code | codex | opencode | gemini_cli | custom
|
|
182
|
+
(tanpa argumen = semua provider)
|
|
183
|
+
|
|
184
|
+
Sumber data (berurutan):
|
|
185
|
+
1. Dinamis — HANYA opencode: coba perintah \`opencode models\`, bila tidak
|
|
186
|
+
ada/ gagal → parse config ~/.config/opencode/ atau ~/.opencode.
|
|
187
|
+
KEBIJAKAN KETAT: binary claude / gemini / codex TIDAK PERNAH dijalankan.
|
|
188
|
+
2. Registry statis = saran per harness (versi lama tidak masalah — ini
|
|
189
|
+
datalist; user tetap bisa mengetik model manual).
|
|
190
|
+
|
|
191
|
+
Tampilan: tabel Provider | Jumlah model | daftar (wrap maks 6 baris +
|
|
192
|
+
"…+n lagi"). \`--json\` untuk mesin: {<provider>: {provider, source, models}}.
|
|
193
|
+
|
|
194
|
+
Catatan: field \`models\` (maks 50 item, tiap ≤120 karakter) juga dikirim ke
|
|
195
|
+
server pada heartbeat dan hello frame WS.
|
|
196
|
+
|
|
197
|
+
Contoh:
|
|
198
|
+
luang-cli models
|
|
199
|
+
luang-cli models opencode
|
|
200
|
+
luang-cli models --json`,
|
|
201
|
+
|
|
138
202
|
task: `luang-cli task — kelola tugas
|
|
139
203
|
|
|
140
204
|
Penggunaan:
|
|
@@ -176,6 +240,7 @@ config bila sudah login, selain itu placeholder.`,
|
|
|
176
240
|
const VALUE_FLAGS = new Set([
|
|
177
241
|
'name', 'path', 'exec_template', 'interval', 'status', 'title', 'desc',
|
|
178
242
|
'description', 'priority', 'due', 'note', 'agent-status', 'api', 'model',
|
|
243
|
+
'tail',
|
|
179
244
|
]);
|
|
180
245
|
|
|
181
246
|
function parseArgs(argv) {
|
|
@@ -254,8 +319,12 @@ async function main() {
|
|
|
254
319
|
return c.cmdProvider(rt, args);
|
|
255
320
|
case 'telemetry':
|
|
256
321
|
return c.cmdTelemetry(rt, args);
|
|
322
|
+
case 'workspace':
|
|
323
|
+
return c.cmdWorkspace(rt, args);
|
|
257
324
|
case 'agent':
|
|
258
325
|
return ag.cmdAgent(rt, args);
|
|
326
|
+
case 'models':
|
|
327
|
+
return c.cmdModels(rt, args);
|
|
259
328
|
case 'task':
|
|
260
329
|
return ag.cmdTask(rt, args);
|
|
261
330
|
case 'status':
|