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 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** + heartbeat + polling (fallback) | `luang-cli agent --exec` |
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
- │ ├── commands.js # login/logout/whoami/telemetry/provider
382
- │ └── agent.js # daemon realtime+fallback, task CRUD, status, mcp-config
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 (61 assertion): realtime, fallback, konsent, model
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) utk uji konsent
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
- agent Daemon realtime WS + polling tugas luang-cli agent [--exec]
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
- agent: `luang-cli agent — daemon realtime (WebSocket) + fallback polling
109
+ workspace: `luang-cli workspace — folder kerja provider (sinkron dashboard ↔ CLI)
108
110
 
109
111
  Penggunaan:
110
- luang-cli agent [--interval N] [--exec]
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':