genetics-mcp 2.16.0 → 2.16.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.
Binary file
package/bin/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "aarch64-apple-darwin": "b41c63ec51d07fa2d11fe88283fefa6783b6447ec9a9637779d04fb1f528db92",
3
- "aarch64-unknown-linux-musl": "34610013e6f6358954e1d66bde546a2757cb47d163e5c7251989d28de8ee6d19",
4
- "x86_64-apple-darwin": "e97149a290f2079c39cfd19ac9d034b6e0990afc5bb67a352052a48193d43a89",
5
- "x86_64-unknown-linux-musl": "85b9f4eccd2c4b4556bceafc7d6b1a88484847256d95fef71cd033e7670f27c4"
2
+ "aarch64-apple-darwin": "cb4ce550b4ce5e37a8f575280536b5983042572d6e83854c0e67a5c9eee0a030",
3
+ "aarch64-unknown-linux-musl": "27ac0333d512f9cdff5901852b629c9c845e5998807c5be7474d3b5d152fb94a",
4
+ "x86_64-apple-darwin": "db3920a2b802ff637f6e6b7f857aec5db825fc90159adca78fa2f1bad7c7f284",
5
+ "x86_64-unknown-linux-musl": "31351ff121ee16e70825379b81398fb23d3614e27e7cc59cf7c0385ae98e1a1d"
6
6
  }
Binary file
Binary file
package/genetics.mjs CHANGED
@@ -2441,12 +2441,14 @@ const TOOLS = [
2441
2441
  + '언제 부르는가: 작업을 시작할 때(「내가 붙을 일이 이미 있나」 — 새로 벌이기 전에 먼저) · '
2442
2442
  + '사람이 「지금 뭐가 진행 중이지」라고 물을 때 · 세션 요지에 「어느 일에도 속해 있지 않다」가 왔을 때.\n'
2443
2443
  + '「계획」 = 사람이 착수 전에 세운 일(세션 0) — 이 목록에서 이름을 보고 그 방향의 작업이면 '
2444
- + '거기 붙는 것이 맞다(소속 확정은 사람이 화면에서 한다 — 이 도구는 읽기 전용이다).\n'
2444
+ + 'claim 으로 **착수를 선언**한다(즉시 잠정 효력 — 세션 요지·화면에 「선언(잠정)」이 선다. '
2445
+ + '사실이 되는 것은 사람이 화면에서 확정할 때고, 판정기는 증거로 따로 검증한다).\n'
2445
2446
  + '요지 전문은 get_case(tenant, "work/<slug>.md") 로 읽는다. **0 이면 0 이라고 말한다.**',
2446
2447
  inputSchema: {
2447
2448
  type: 'object',
2448
2449
  properties: {
2449
2450
  tenant: { type: 'string', description: '대상 소속처 slug(이름도 받는다 — list_my_tenants 참조).' },
2451
+ claim: { type: 'string', description: '이 일(slug)에 붙겠다고 선언한다 — 잠정이며, 다른 일을 선언하면 앞 선언은 대체된다. 비우면 목록만 읽는다.' },
2450
2452
  },
2451
2453
  required: ['tenant'],
2452
2454
  },
@@ -2909,9 +2911,25 @@ function tenantNotice() {
2909
2911
  const now = Date.now();
2910
2912
  if (now - tenantSaidAt < TENANT_NOTICE_MS) return '';
2911
2913
  tenantSaidAt = now;
2914
+ // 관측 밖 자백(2026-08-31) — 비-git·비앵커 폴더는 훅이 자동으로 안 걸리는데 그 침묵의 값을
2915
+ // HNL 모노폴더에서 치렀다(소속처 전체 세션 0건이 사람이 물어봐서야 드러났다). 조용히 건너뛰는
2916
+ // 것이 가장 나쁘다 — 같은 알림에 한 문장으로 잇는다(앵커되면 다음 부팅에 저절로 걸린다).
2917
+ let tail = '';
2918
+ try {
2919
+ const cwd = process.cwd();
2920
+ if (!fs.existsSync(path.join(cwd, '.git'))) {
2921
+ let hooked = false;
2922
+ try { hooked = fs.readFileSync(path.join(cwd, '.claude/settings.json'), 'utf8').includes('gcell'); }
2923
+ catch { /* 파일이 없으면 안 걸린 것 */ }
2924
+ if (!hooked) {
2925
+ tail = ' 지금 이 폴더는 세포 관측 밖이기도 하다(비-git·비앵커 폴더는 훅이 자동으로 안 걸린다) — '
2926
+ + '앵커되면 다음 부팅부터 훅·메일·트리거가 자동으로 돈다.';
2927
+ }
2928
+ }
2929
+ } catch { /* 알림은 최선일 뿐 — 실패해도 본문은 나간다 */ }
2912
2930
  return 'genetics: 이 세션은 아직 어느 소속처에도 안 붙어 있다 — 이 폴더에 앞 세션이 없어 '
2913
2931
  + '자동 등록이 안 됐다. `push_session` 으로 한 번 정하면 그 뒤는 자동이고, '
2914
- + '그래야 메일·보유자·「이 세션이 속한 일」이 이 저장소에서 돈다.';
2932
+ + '그래야 메일·보유자·「이 세션이 속한 일」이 이 저장소에서 돈다.' + tail;
2915
2933
  }
2916
2934
 
2917
2935
  function worldDelta() {
@@ -3746,15 +3764,25 @@ async function callTool(name, args = {}) {
3746
3764
  return `이 저장소에서 최근에 바뀐 것:\n${facts.map((f) => ` · ${f}`).join('\n')}`;
3747
3765
  }
3748
3766
  case 'works': {
3767
+ if (args.claim) {
3768
+ // 착수 선언(088) — 세션 이름은 이 자리(로컬)가 안다. mail 도구의 그 관용구다.
3769
+ const mine = mySessionId();
3770
+ if (!mine) return '이 자리의 세션 이름을 못 찾아 선언할 수 없다 — 목록만 읽으려면 claim 없이 다시 부른다.';
3771
+ const r = await api('POST', '/api/work/claim', {
3772
+ tenant: args.tenant, work: String(args.claim), session: mine,
3773
+ });
3774
+ return `«${r.work?.name || r.work?.slug}» (${r.work?.slug}) — ${r.says}`;
3775
+ }
3749
3776
  const r = await api('GET', '/api/work/list?tenant=' + encodeURIComponent(args.tenant));
3750
3777
  const rows = r.works || [];
3751
3778
  const lines = [`${r.tenant} — 열린 일 ${r.open ?? rows.length}개` + ((r.closed ?? 0) > 0 ? ` (지난 일 ${r.closed}개)` : '')];
3752
3779
  for (const w of rows) {
3753
3780
  lines.push(` · «${w.name || w.slug}» (${w.slug}) — ${w.word} · 세션 ${w.sessions}`
3781
+ + (w.stale ? ` · 낡음 ${w.stale}일째(AI 관측 — 활동이 멎었다: 사람이 닫거나 다시 살릴 일)` : '')
3754
3782
  + (w.doc ? ` · 요지: get_case(tenant, "${w.doc}")` : ' · 요지 문서 아직 없음'));
3755
3783
  }
3756
3784
  if (!rows.length) lines.push('열린 일이 없다 — 0건은 0건이다. 착수 전에 세우려면 사람이 군체 화면의 「일 열기」로 연다.');
3757
- else lines.push('소속 확정은 사람이 화면에서 한다 — 이 도구는 목록을 읽을 뿐이다.');
3785
+ else lines.push('붙을 일이 보이면 works(tenant, claim: "<slug>") 로 선언한다 — 확정은 사람이 화면에서 한다.');
3758
3786
  return lines.join('\n');
3759
3787
  }
3760
3788
  case 'list_breaks': {
@@ -3788,6 +3816,12 @@ async function callTool(name, args = {}) {
3788
3816
  if (!args.tags || !args.tags.length) {
3789
3817
  lines.push('갈래(tags)가 없어 이 결정은 「일」 후보 계산에 안 들어간다.');
3790
3818
  }
3819
+ // 전체 맥락 정리 줄이 섰는지도 말한다 — 결정 저장이 종합의 박자가 됐다(2026-08-31). 옛 서버(칸 없음)는 침묵.
3820
+ if (r.insights_queued === true) {
3821
+ lines.push('이 결정으로 전체 맥락 정리가 다시 돕니다(몇 분 뒤 지식 화면에).');
3822
+ } else if (r.insights_queued === false) {
3823
+ lines.push('전체 맥락 정리 줄은 안 섰다 — 재료가 아직 문턱 아래(배경 문서 3장 또는 결정·사례 5장)거나 이미 줄이 서 있다.');
3824
+ }
3791
3825
  return lines.join('\n');
3792
3826
  }
3793
3827
  case 'remember_case': {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "genetics-mcp",
3
- "version": "2.16.0",
3
+ "version": "2.16.2",
4
4
  "description": "문서 포털 발행·세션 이식·사례 기억 MCP — 데이터를 주면 규격 문서가 나온다 (짝인 스킬 동봉)",
5
5
  "author": "주식회사 LIM (LIM Inc.)",
6
6
  "license": "SEE LICENSE IN LICENSE",