@capstone-nomos/cli 0.1.9 → 0.1.10

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.
@@ -223,6 +223,7 @@ async function once() {
223
223
  }
224
224
  await handleTask(client, self.projectId, task);
225
225
  }
226
+ // 멈춘 이유를 돌려준다 — connect는 배정이 풀린 경우(해제·프로젝트 중단) 다시 배정을 기다린다.
226
227
  async function start() {
227
228
  const client = createClient();
228
229
  const self = await client.describeSelf();
@@ -260,6 +261,18 @@ async function start() {
260
261
  }
261
262
  }
262
263
  catch (err) {
264
+ // 대표나 본인이 웹에서 이 에이전트의 연결을 해제했다(서버 021) — 계속 물어도 같은 답이니 이유를 알리고 멈춘다.
265
+ if (err instanceof NomosApiError && err.code === 'AGENT_DISCONNECTED') {
266
+ log('이 에이전트는 연결이 해제됐다 — 다시 쓰려면 connect를 실행하라');
267
+ source.close();
268
+ return 'disconnected';
269
+ }
270
+ // 배정이 풀렸다(대표의 해제·프로젝트 중단, 서버 021). 같은 목록을 계속 물어도 거부된다.
271
+ if (err instanceof NomosApiError && err.code === 'NOT_PROJECT_MEMBER' && inFlight.size === 0) {
272
+ log('프로젝트 배정이 풀렸다(해제 또는 프로젝트 중단)');
273
+ source.close();
274
+ return 'unassigned';
275
+ }
263
276
  log(`태스크 목록 실패: ${err instanceof Error ? err.message : String(err)}`);
264
277
  }
265
278
  // 다른 역할이 이 역할에 물은 질문 — 질문이 생기면 서버가 { type: 'questions' }로 깨운다. 신호가 없으면 1분마다만 확인한다.
@@ -369,16 +382,21 @@ async function connectCommand(argv) {
369
382
  log(`${t.name}을 실행할 수 없다: ${t.detail}\n → ${t.hint}`);
370
383
  throw new Error('필요한 도구가 없어 시작하지 않는다');
371
384
  }
372
- await connect({
373
- server,
374
- agentName,
375
- readCredentials,
376
- login: () => loginTo(server, agentName, args.connectKey),
377
- ...serverCalls({ read: readCredentials, updateAccessToken }),
378
- sleep: (ms) => new Promise((r) => setTimeout(r, ms)),
379
- log,
380
- });
381
- await start();
385
+ // 배정이 풀리면(해제·프로젝트 중단) 창을 닫지 않고 다시 배정을 기다린다. 연결 해제면 멈춘다.
386
+ for (;;) {
387
+ await connect({
388
+ server,
389
+ agentName,
390
+ readCredentials,
391
+ login: () => loginTo(server, agentName, args.connectKey),
392
+ ...serverCalls({ read: readCredentials, updateAccessToken }),
393
+ sleep: (ms) => new Promise((r) => setTimeout(r, ms)),
394
+ log,
395
+ });
396
+ if ((await start()) !== 'unassigned')
397
+ return;
398
+ log('다시 배정을 기다린다');
399
+ }
382
400
  }
383
401
  async function doctor(argv) {
384
402
  const { json } = parseArgs(argv);
@@ -460,8 +478,10 @@ async function main() {
460
478
  return refresh();
461
479
  if (command === 'once')
462
480
  return once();
463
- if (command === 'start')
464
- return start();
481
+ if (command === 'start') {
482
+ await start();
483
+ return;
484
+ }
465
485
  if (command === 'pm-worker')
466
486
  return pmWorker();
467
487
  if (command === 'clean') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capstone-nomos/cli",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "description": "NOMOS 에이전트 CLI — 노트북의 Claude Code를 NOMOS 서버에 연결하고 배정된 태스크를 실행한다",
5
5
  "type": "module",
6
6
  "bin": {