@litfamily/lithermes 1.0.9 → 1.0.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.
- package/README.md +69 -56
- package/README_Ko-KR.md +69 -56
- package/assets/lithermes-plugin/README.md +23 -0
- package/assets/lithermes-plugin/__init__.py +30 -5
- package/assets/lithermes-plugin/diagnostics.py +9 -0
- package/assets/lithermes-plugin/jev_hint.py +461 -0
- package/assets/lithermes-plugin/payload-version.json +12 -8
- package/assets/lithermes-plugin/plugin.yaml +1 -1
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +2 -2
- package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +2 -2
- package/package.json +1 -1
- package/readme-assets/badge-version.svg +1 -1
package/README_Ko-KR.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
<p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
1
|
+
<p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 다섯 로봇 패널이 차례로 켜지고, LitHermes 로봇의 눈과 테두리가 빛난 뒤 LITFAMILY와 KEEP THE WORK LIT. 문구가 밝아지는 영상" /></picture></p>
|
|
2
2
|
|
|
3
|
-
<p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
3
|
+
<p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/ascii-readme.svg" width="480" alt="LIT ASCII B 마크" /></p>
|
|
4
4
|
|
|
5
5
|
<details>
|
|
6
6
|
<summary>ASCII 로고 복사</summary>
|
|
@@ -30,19 +30,19 @@
|
|
|
30
30
|
|
|
31
31
|
</details>
|
|
32
32
|
|
|
33
|
-
<p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
34
|
-
<p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
33
|
+
<p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/lithermes-wordmark.svg" width="480" alt="LITHERMES 디스플레이 서체" /></p>
|
|
34
|
+
<p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/lithermes-clay-icon.png" width="160" alt="LitHermes 클레이 마크" /></p>
|
|
35
35
|
|
|
36
36
|
<p align="center">
|
|
37
|
-
<a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
38
|
-
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
37
|
+
<a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/badge-version.svg" alt="1.0.10" /></a>
|
|
38
|
+
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/badge-license.svg" alt="MIT license" /></a>
|
|
39
39
|
</p>
|
|
40
40
|
|
|
41
41
|
<p align="center">
|
|
42
|
-
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.ko.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
42
|
+
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.ko.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/lucide-book-open.svg" width="16" alt="" /> 문서</a>
|
|
43
43
|
<a href="#설치">설치</a>
|
|
44
|
-
<a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
45
|
-
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
44
|
+
<a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition</a>
|
|
45
|
+
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
|
|
46
46
|
</p>
|
|
47
47
|
|
|
48
48
|
# LitHermes
|
|
@@ -51,11 +51,11 @@
|
|
|
51
51
|
|
|
52
52
|
무엇인가요: LitHermes는 **Hermes Agent**에서 계획, 실행, 검토, 인계를 이어갑니다.
|
|
53
53
|
|
|
54
|
-
[English](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
54
|
+
[English](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/README.md) · [npm](https://www.npmjs.com/package/@litfamily/lithermes) · [GitHub](https://github.com/wjgoarxiv/lithermes)
|
|
55
55
|
|
|
56
56
|
## 설치
|
|
57
57
|
|
|
58
|
-
소스 기준 버전은 `@litfamily/lithermes@1.0.
|
|
58
|
+
소스 기준 버전은 `@litfamily/lithermes@1.0.10`입니다. Hermes Agent와 Node.js 18+가 필요하며, Hermes 홈(기본 `~/.hermes`)에 쓰기 권한이 있어야 합니다.
|
|
59
59
|
|
|
60
60
|
설치기는 Hermes 홈을 대상으로 합니다. 별도 체험을 하려면 설치 전에 `HERMES_HOME`을 새 빈 디렉터리로 지정하고 Hermes를 시작할 때도 같은 값을 사용하세요. 기존 홈과 설정은 보관합니다. `--no-patch-installed-hermes`는 해당 프로필 밖에서 감지된 호스트 설치본에 호환성 패치를 적용하지 못하게 합니다.
|
|
61
61
|
|
|
@@ -153,182 +153,182 @@ LitHermes에서 부를 수 있는 모든 스킬과 그 스킬을 시작하는
|
|
|
153
153
|
<table>
|
|
154
154
|
<tr><th>이렇게 됩니다</th><th>스킬</th><th>얻는 것</th></tr>
|
|
155
155
|
<tr>
|
|
156
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
156
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/litwork.webp" width="240" alt="요청에 lit만 붙이세요. 노트를 열고, 기준마다 실패 테스트·통과·실제 확인·정리 순서를 엄격히 지킵니다." /></td>
|
|
157
157
|
<td><code>litwork</code><br /><sub><code>lit <task></code> · <code>litwork <task></code></sub></td>
|
|
158
158
|
<td>요청에 <code>lit</code>만 붙이세요. 노트를 열고, 기준마다 실패 테스트·통과·실제 확인·정리 순서를 엄격히 지킵니다.</td>
|
|
159
159
|
</tr>
|
|
160
160
|
<tr>
|
|
161
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
161
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-plan.webp" width="240" alt="start-work가 그대로 실행할 수 있는 번호 붙은 작업 목록이 파일로 나옵니다. 코드는 아직 건드리지 않습니다." /></td>
|
|
162
162
|
<td><code>lit-plan</code><br /><sub><code>lit plan <what></code> · <code>/lit-plan</code></sub></td>
|
|
163
163
|
<td><code>start-work</code>가 그대로 실행할 수 있는 번호 붙은 작업 목록이 파일로 나옵니다. 코드는 아직 건드리지 않습니다.</td>
|
|
164
164
|
</tr>
|
|
165
165
|
<tr>
|
|
166
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
166
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/start-work.webp" width="240" alt="계획을 한 줄씩 실행합니다. 다섯 관문을 모두 통과해야 체크 표시가 붙습니다." /></td>
|
|
167
167
|
<td><code>start-work</code><br /><sub><code>/start-work <approved-plan></code></sub></td>
|
|
168
168
|
<td>계획을 한 줄씩 실행합니다. 다섯 관문을 모두 통과해야 체크 표시가 붙습니다.</td>
|
|
169
169
|
</tr>
|
|
170
170
|
<tr>
|
|
171
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
171
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/review-work.webp" width="240" alt="다섯 갈래 리뷰가 같은 변경을 따로 읽고, 발견한 문제부터 보고합니다." /></td>
|
|
172
172
|
<td><code>review-work</code><br /><sub><code>lit review <scope></code> · <code>/review-work</code></sub></td>
|
|
173
173
|
<td>다섯 갈래 리뷰가 같은 변경을 따로 읽고, 발견한 문제부터 보고합니다.</td>
|
|
174
174
|
</tr>
|
|
175
175
|
<tr>
|
|
176
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
176
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/litgoal.webp" width="240" alt="목표 하나와 확인 가능한 기준을 디스크에 남겨, 다음 세션이 이어받을 수 있습니다." /></td>
|
|
177
177
|
<td><code>litgoal</code><br /><sub><code>lit goal <outcome></code> · <code>/litgoal</code></sub></td>
|
|
178
178
|
<td>목표 하나와 확인 가능한 기준을 디스크에 남겨, 다음 세션이 이어받을 수 있습니다.</td>
|
|
179
179
|
</tr>
|
|
180
180
|
<tr>
|
|
181
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
181
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-recap.webp" width="240" alt="읽기 전용 요약입니다. 끝난 일, 진행 중인 일, 막힌 곳, 증거 위치, 다음 단계를 보여줍니다." /></td>
|
|
182
182
|
<td><code>lit-recap</code><br /><sub><code>lit-recap</code></sub></td>
|
|
183
183
|
<td>읽기 전용 요약입니다. 끝난 일, 진행 중인 일, 막힌 곳, 증거 위치, 다음 단계를 보여줍니다.</td>
|
|
184
184
|
</tr>
|
|
185
185
|
<tr>
|
|
186
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
186
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-handoff.webp" width="240" alt="handoff라고 치면 다음 세션이 읽고 이어갈 인수인계 파일이 생깁니다." /></td>
|
|
187
187
|
<td><code>lit-handoff</code><br /><sub><code>handoff</code> · <code>/lit-handoff</code></sub></td>
|
|
188
188
|
<td><code>handoff</code>라고 치면 다음 세션이 읽고 이어갈 인수인계 파일이 생깁니다.</td>
|
|
189
189
|
</tr>
|
|
190
190
|
<tr>
|
|
191
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
191
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/deep-interview.webp" width="240" alt="한 번에 한 질문씩 물어 아이디어를 만들 수 있을 만큼 분명하게 다듬습니다. 남은 모호함은 게이지로 보입니다." /></td>
|
|
192
192
|
<td><code>deep-interview</code><br /><sub><code>deep-interview <idea></code> · <code>/deep-interview</code></sub></td>
|
|
193
193
|
<td>한 번에 한 질문씩 물어 아이디어를 만들 수 있을 만큼 분명하게 다듬습니다. 남은 모호함은 게이지로 보입니다.</td>
|
|
194
194
|
</tr>
|
|
195
195
|
<tr>
|
|
196
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
196
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/litresearch.webp" width="240" alt="조사 질문을 잘게 나누고 여러 검색을 동시에 돌려, 단서를 끝까지 따라간 뒤 출처와 함께 답합니다." /></td>
|
|
197
197
|
<td><code>litresearch</code><br /><sub><code>lit research <question></code></sub></td>
|
|
198
198
|
<td>조사 질문을 잘게 나누고 여러 검색을 동시에 돌려, 단서를 끝까지 따라간 뒤 출처와 함께 답합니다.</td>
|
|
199
199
|
</tr>
|
|
200
200
|
<tr>
|
|
201
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
201
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-crucible.webp" width="240" alt="계획 전에 요구사항을 반박해 봅니다. 반박을 견딘 위험만 계획으로 넘어갑니다." /></td>
|
|
202
202
|
<td><code>lit-crucible</code><br /><sub><code>lit-crucible <brief></code></sub></td>
|
|
203
203
|
<td>계획 전에 요구사항을 반박해 봅니다. 반박을 견딘 위험만 계획으로 넘어갑니다.</td>
|
|
204
204
|
</tr>
|
|
205
205
|
<tr>
|
|
206
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
206
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-init.webp" width="240" alt="저장소를 훑어 루트 AGENTS.md와, 필요한 폴더에만 짧은 안내서를 만듭니다." /></td>
|
|
207
207
|
<td><code>lit-init</code><br /><sub><code>lit-init</code></sub></td>
|
|
208
208
|
<td>저장소를 훑어 루트 AGENTS.md와, 필요한 폴더에만 짧은 안내서를 만듭니다.</td>
|
|
209
209
|
</tr>
|
|
210
210
|
<tr>
|
|
211
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
211
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-comprehend.webp" width="240" alt="에이전트가 쓴 작업을 이해하도록 돕는 설명 페이지입니다. 직관, 흐름 설명, 짧은 퀴즈 순서입니다." /></td>
|
|
212
212
|
<td><code>lit-comprehend</code><br /><sub><code>lit-comprehend</code> · <code>comprehend <range></code></sub></td>
|
|
213
213
|
<td>에이전트가 쓴 작업을 이해하도록 돕는 설명 페이지입니다. 직관, 흐름 설명, 짧은 퀴즈 순서입니다.</td>
|
|
214
214
|
</tr>
|
|
215
215
|
<tr>
|
|
216
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
216
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-humanizer.webp" width="240" alt="딱딱한 AI 문장을 한국어나 영어로 다시 씁니다. 사실과 단서는 남기고, 파일을 멋대로 고치지 않습니다." /></td>
|
|
217
217
|
<td><code>lit-humanizer</code><br /><sub><code>humanizer <text></code> · <code>/lit-humanizer</code></sub></td>
|
|
218
218
|
<td>딱딱한 AI 문장을 한국어나 영어로 다시 씁니다. 사실과 단서는 남기고, 파일을 멋대로 고치지 않습니다.</td>
|
|
219
219
|
</tr>
|
|
220
220
|
<tr>
|
|
221
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
221
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-diagram-drawer.webp" width="240" alt="슬라이드와 문서에 넣을 다이어그램을 편집 가능한 형태로 그리고, 검사한 뒤 PNG와 SVG로 내보냅니다." /></td>
|
|
222
222
|
<td><code>lit-diagram-drawer</code><br /><sub><code>lit-diagram-drawer <brief></code> · <code>/lit-diagram-drawer</code></sub></td>
|
|
223
223
|
<td>슬라이드와 문서에 넣을 다이어그램을 편집 가능한 형태로 그리고, 검사한 뒤 PNG와 SVG로 내보냅니다.</td>
|
|
224
224
|
</tr>
|
|
225
225
|
<tr>
|
|
226
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
226
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-pptx.webp" width="240" alt="lit으로 발표자료를 요청하면 편집 가능한 PowerPoint 파일과 원고 Markdown이 나옵니다. 기본은 AZURE-PRO와 Pretendard이고, 완성된 파일로 품질 검사와 무결성 검사를 돌립니다." /></td>
|
|
227
227
|
<td><code>lit-pptx</code><br /><sub><code>lit-pptx <brief></code> · <code>/lit-pptx</code></sub></td>
|
|
228
228
|
<td><code>lit</code>으로 발표자료를 요청하면 편집 가능한 PowerPoint 파일과 원고 Markdown이 나옵니다. 기본은 AZURE-PRO와 Pretendard이고, 완성된 파일로 품질 검사와 무결성 검사를 돌립니다.</td>
|
|
229
229
|
</tr>
|
|
230
230
|
<tr>
|
|
231
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
231
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-docx.webp" width="240" alt="lit으로 보고서를 요청하면 서식을 갖춘 Word 파일과 원고 Markdown이 나옵니다. 한국어는 korean-generic 서식을 쓰고, 문체 검사와 렌더링된 페이지 확인이 뒤따릅니다." /></td>
|
|
232
232
|
<td><code>lit-docx</code><br /><sub><code>lit-docx <brief></code> · <code>/lit-docx</code></sub></td>
|
|
233
233
|
<td><code>lit</code>으로 보고서를 요청하면 서식을 갖춘 Word 파일과 원고 Markdown이 나옵니다. 한국어는 korean-generic 서식을 쓰고, 문체 검사와 렌더링된 페이지 확인이 뒤따릅니다.</td>
|
|
234
234
|
</tr>
|
|
235
235
|
<tr>
|
|
236
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
236
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/frontend-ui-ux.webp" width="240" alt="실제로 동작하는 화면을 만들고, 설치된 측정 프로브로 일곱 가지 보기를 렌더링합니다. 네 가지 폭, 다크 모드, 모션 줄이기, 200% 확대입니다." /></td>
|
|
237
237
|
<td><code>frontend-ui-ux</code><br /><sub><code>lit design <target></code> · <code>frontend-ui-ux <target></code></sub></td>
|
|
238
238
|
<td>실제로 동작하는 화면을 만들고, 설치된 측정 프로브로 일곱 가지 보기를 렌더링합니다. 네 가지 폭, 다크 모드, 모션 줄이기, 200% 확대입니다.</td>
|
|
239
239
|
</tr>
|
|
240
240
|
<tr>
|
|
241
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
241
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/readme-studio.webp" width="240" alt="사실에 맞는 README와 움직이는 커버를 만들고, 휴대폰과 데스크톱 폭, 라이트와 다크 모드에서 확인합니다." /></td>
|
|
242
242
|
<td><code>readme-studio</code><br /><sub><code>readme-studio <scope></code></sub></td>
|
|
243
243
|
<td>사실에 맞는 README와 움직이는 커버를 만들고, 휴대폰과 데스크톱 폭, 라이트와 다크 모드에서 확인합니다.</td>
|
|
244
244
|
</tr>
|
|
245
245
|
<tr>
|
|
246
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
246
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-typographic-motion.webp" width="240" alt="lit으로 영상을 요청하면 트리트먼트를 먼저 쓰고, 장면을 그리거나 글자를 움직이고, 사운드를 만든 뒤 검사를 거쳐 영상을 넘깁니다." /></td>
|
|
247
247
|
<td><code>lit-typographic-motion</code><br /><sub><code>lit-typographic-motion <request></code> · <code>/lit-typographic-motion</code></sub></td>
|
|
248
248
|
<td><code>lit</code>으로 영상을 요청하면 트리트먼트를 먼저 쓰고, 장면을 그리거나 글자를 움직이고, 사운드를 만든 뒤 검사를 거쳐 영상을 넘깁니다.</td>
|
|
249
249
|
</tr>
|
|
250
250
|
<tr>
|
|
251
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
251
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-scientific-visualization.webp" width="240" alt="학술지 규격 그림을 벡터와 600 DPI로 내보냅니다. 그래프 종류는 데이터 성격에 맞춰 고릅니다." /></td>
|
|
252
252
|
<td><code>lit-scientific-visualization</code><br /><sub><code>lit-scientific-visualization</code> · <code>/lit-scientific-visualization</code></sub></td>
|
|
253
253
|
<td>학술지 규격 그림을 벡터와 600 DPI로 내보냅니다. 그래프 종류는 데이터 성격에 맞춰 고릅니다.</td>
|
|
254
254
|
</tr>
|
|
255
255
|
<tr>
|
|
256
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
256
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/visual-qa.webp" width="240" alt="실제 화면을 폭별로 확인해 결과를 정직하게 돌려줍니다. 막히면 무엇이 막았는지 정확히 알려줍니다." /></td>
|
|
257
257
|
<td><code>visual-qa</code><br /><sub><code>visual-qa <target></code></sub></td>
|
|
258
258
|
<td>실제 화면을 폭별로 확인해 결과를 정직하게 돌려줍니다. 막히면 무엇이 막았는지 정확히 알려줍니다.</td>
|
|
259
259
|
</tr>
|
|
260
260
|
<tr>
|
|
261
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
261
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/browser-drive.webp" width="240" alt="브라우저 드라이버를 먼저 확인한 뒤 실제 페이지를 조작합니다. 드라이버가 없으면 그렇다고 말합니다." /></td>
|
|
262
262
|
<td><code>browser-drive</code><br /><sub><code>browser-drive <task></code></sub></td>
|
|
263
263
|
<td>브라우저 드라이버를 먼저 확인한 뒤 실제 페이지를 조작합니다. 드라이버가 없으면 그렇다고 말합니다.</td>
|
|
264
264
|
</tr>
|
|
265
265
|
<tr>
|
|
266
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
266
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/structural-search.webp" width="240" alt="글자 대신 문법 구조로 코드를 찾고, 바꾸기 전에 결과를 미리 보여줍니다." /></td>
|
|
267
267
|
<td><code>structural-search</code><br /><sub><code>lit structural <pattern></code> · <code>structural-search <pattern></code></sub></td>
|
|
268
268
|
<td>글자 대신 문법 구조로 코드를 찾고, 바꾸기 전에 결과를 미리 보여줍니다.</td>
|
|
269
269
|
</tr>
|
|
270
270
|
<tr>
|
|
271
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
271
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/wikify.webp" width="240" alt="검토를 거친 프로젝트 지식을 디스크에 두고, 나중 질문에 출처와 함께 답합니다." /></td>
|
|
272
272
|
<td><code>wikify</code><br /><sub><code>wikify <mode></code> · <code>lit wikify <mode></code></sub></td>
|
|
273
273
|
<td>검토를 거친 프로젝트 지식을 디스크에 두고, 나중 질문에 출처와 함께 답합니다.</td>
|
|
274
274
|
</tr>
|
|
275
275
|
<tr>
|
|
276
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
276
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/debugging.webp" width="240" alt="버그를 재현하고, 가설을 세 개 이상 세워 확인한 뒤, 확인된 원인만 고칩니다." /></td>
|
|
277
277
|
<td><code>debugging</code><br /><sub><code>lit debug <symptom></code> · <code>debugging <symptom></code></sub></td>
|
|
278
278
|
<td>버그를 재현하고, 가설을 세 개 이상 세워 확인한 뒤, 확인된 원인만 고칩니다.</td>
|
|
279
279
|
</tr>
|
|
280
280
|
<tr>
|
|
281
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
281
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/refactor.webp" width="240" alt="동작을 테스트로 고정한 채 코드 구조를 바꿉니다. 단계마다 확인합니다." /></td>
|
|
282
282
|
<td><code>refactor</code><br /><sub><code>lit refactor <target></code> · <code>refactor <target></code></sub></td>
|
|
283
283
|
<td>동작을 테스트로 고정한 채 코드 구조를 바꿉니다. 단계마다 확인합니다.</td>
|
|
284
284
|
</tr>
|
|
285
285
|
<tr>
|
|
286
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
286
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-burnoff.webp" width="240" alt="테스트로 동작을 먼저 묶어 두고, 변경분에 붙은 AI식 군더더기를 걷어냅니다." /></td>
|
|
287
287
|
<td><code>lit-burnoff</code><br /><sub><code>lit slop <scope></code></sub></td>
|
|
288
288
|
<td>테스트로 동작을 먼저 묶어 두고, 변경분에 붙은 AI식 군더더기를 걷어냅니다.</td>
|
|
289
289
|
</tr>
|
|
290
290
|
<tr>
|
|
291
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
291
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-burnoff-file.webp" width="240" alt="파일 하나만 정리합니다. 설명조 주석과 과한 방어 코드를 줄이고 중첩을 펴줍니다." /></td>
|
|
292
292
|
<td><code>lit-burnoff-file</code><br /><sub><code>ask to clean one file</code></sub></td>
|
|
293
293
|
<td>파일 하나만 정리합니다. 설명조 주석과 과한 방어 코드를 줄이고 중첩을 펴줍니다.</td>
|
|
294
294
|
</tr>
|
|
295
295
|
<tr>
|
|
296
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
296
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-code.webp" width="240" alt="엄격한 구현 규칙입니다. 테스트 먼저, 경계에서 타입 확인, 작은 파일." /></td>
|
|
297
297
|
<td><code>lit-code</code><br /><sub><code>ask for strict implementation</code></sub></td>
|
|
298
298
|
<td>엄격한 구현 규칙입니다. 테스트 먼저, 경계에서 타입 확인, 작은 파일.</td>
|
|
299
299
|
</tr>
|
|
300
300
|
<tr>
|
|
301
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
301
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lit-commit.webp" width="240" alt="변경을 저장소 스타일에 맞는 작은 커밋으로 나눕니다. 관계없는 작업은 건드리지 않습니다." /></td>
|
|
302
302
|
<td><code>lit-commit</code><br /><sub><code>lit git <task></code></sub></td>
|
|
303
303
|
<td>변경을 저장소 스타일에 맞는 작은 커밋으로 나눕니다. 관계없는 작업은 건드리지 않습니다.</td>
|
|
304
304
|
</tr>
|
|
305
305
|
<tr>
|
|
306
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
306
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lsp-setup.webp" width="240" alt="사용하는 언어의 언어 서버를 설치하고, 진단이 실제로 도는지 확인합니다." /></td>
|
|
307
307
|
<td><code>lsp-setup</code><br /><sub><code>lsp-setup <language></code></sub></td>
|
|
308
308
|
<td>사용하는 언어의 언어 서버를 설치하고, 진단이 실제로 도는지 확인합니다.</td>
|
|
309
309
|
</tr>
|
|
310
310
|
<tr>
|
|
311
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
311
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/lsp.webp" width="240" alt="요청할 때 Hermes 언어 서버로 진단, 참조, 이름 바꾸기 안전성을 확인합니다." /></td>
|
|
312
312
|
<td><code>lsp</code><br /><sub><code>lsp <request></code></sub></td>
|
|
313
313
|
<td>요청할 때 Hermes 언어 서버로 진단, 참조, 이름 바꾸기 안전성을 확인합니다.</td>
|
|
314
314
|
</tr>
|
|
315
315
|
<tr>
|
|
316
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
316
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/rules.webp" width="240" alt="Hermes가 어떤 규칙 파일을 언제 읽는지 설명합니다." /></td>
|
|
317
317
|
<td><code>rules</code><br /><sub><code>rules <question></code></sub></td>
|
|
318
318
|
<td>Hermes가 어떤 규칙 파일을 언제 읽는지 설명합니다.</td>
|
|
319
319
|
</tr>
|
|
320
320
|
<tr>
|
|
321
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
321
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/comment-checker.webp" width="240" alt="수정으로 추가된 주석을 검토합니다. 이유는 남기고, 되풀이하는 주석은 뺍니다. 소스 파일을 고친 뒤에도 알아서 돕니다." /></td>
|
|
322
322
|
<td><code>comment-checker</code><br /><sub><code>comment-checker</code></sub></td>
|
|
323
323
|
<td>수정으로 추가된 주석을 검토합니다. 이유는 남기고, 되풀이하는 주석은 뺍니다. 소스 파일을 고친 뒤에도 알아서 돕니다.</td>
|
|
324
324
|
</tr>
|
|
325
325
|
<tr>
|
|
326
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
326
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/autoresearch.webp" width="240" alt="승인된 예산 안에서 실험을 반복합니다. 한 번에 하나만 바꾸고, 결과에 따라 남기거나 되돌립니다." /></td>
|
|
327
327
|
<td><code>autoresearch</code><br /><sub><code>autoresearch <mode></code></sub></td>
|
|
328
328
|
<td>승인된 예산 안에서 실험을 반복합니다. 한 번에 하나만 바꾸고, 결과에 따라 남기거나 되돌립니다.</td>
|
|
329
329
|
</tr>
|
|
330
330
|
<tr>
|
|
331
|
-
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
331
|
+
<td><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.10/readme-assets/skills/autoconference.webp" width="240" alt="예산을 정한 연구 회의입니다. 연구자와 리뷰어가 따로 일하고, 종합에는 반대 의견도 남깁니다." /></td>
|
|
332
332
|
<td><code>autoconference</code><br /><sub><code>autoconference <mode></code></sub></td>
|
|
333
333
|
<td>예산을 정한 연구 회의입니다. 연구자와 리뷰어가 따로 일하고, 종합에는 반대 의견도 남깁니다.</td>
|
|
334
334
|
</tr>
|
|
@@ -366,23 +366,23 @@ S3·S4·S11은 이후의 UI 라운드, S5·S8·S9는 `lit-pptx`와 `lit-docx`를
|
|
|
366
366
|
|
|
367
367
|
| 기준선 | LitHermes |
|
|
368
368
|
|---|---|
|
|
369
|
-
|  |  |
|
|
370
370
|
|
|
371
371
|
**S4 · LitHermes 승.** LitHermes는 품목과 가격이 있는 탭 메뉴, 서로 다른 사진 6장, 아치형 첫 화면을 만들었습니다. 기준선 메뉴는 분위기 카드 3장이었고 같은 실내 사진을 두 번 썼습니다. 위치와 영업시간은 기준선에만 있었고, 페이지 검사에서 잘리거나 화면 밖으로 나간 글자 상자가 LitHermes 쪽에서 7개, 기준선에서 0개 나왔습니다.
|
|
372
372
|
|
|
373
373
|
| 기준선 | LitHermes |
|
|
374
374
|
|---|---|
|
|
375
|
-
|  |  |
|
|
376
376
|
|
|
377
377
|
**S5 · LitHermes 승.** 두 쪽 모두 확인 대상 사실 12개를 모두 맞혔습니다. LitHermes는 2026년 점검과 의회 보고 기한이 이미 지났다는 점을 짚었고, 기준선은 이를 앞으로 할 일로 적었습니다. LitHermes는 주말 거점과 평일 승합차 이용의 차이처럼 자료가 뒷받침하는 분석도 더했습니다. 슬라이드 디자인은 기준선이 낫고, LitHermes 발표자료는 기본 템플릿 그대로입니다.
|
|
378
378
|
|
|
379
379
|
기준선:
|
|
380
380
|
|
|
381
|
-

|
|
382
382
|
|
|
383
383
|
LitHermes:
|
|
384
384
|
|
|
385
|
-

|
|
386
386
|
|
|
387
387
|
**S6 · LitHermes 승 (판정자: 무승부).** LitHermes는 기준 사실 10개 중 3개를 찾았고(기준선 1개), 링크는 모두 공식 출처였습니다(기준선은 4분의 1). npm 11에서 `--ignore-scripts`가 `prepare`에도 적용되는 점, Undici 7, ARMv7 빌드 중단도 다뤘습니다. 기준선은 API 세부 사항을 더 많이 적었지만 권한 플래그 이름 변경을 24의 새 변화처럼 소개해, 판정자가 오해 소지가 있다고 봤습니다.
|
|
388
388
|
|
|
@@ -390,29 +390,29 @@ LitHermes:
|
|
|
390
390
|
|
|
391
391
|
| 기준선 | LitHermes |
|
|
392
392
|
|---|---|
|
|
393
|
-
| 채팅 속 ASCII 상자만 있고 렌더링된 파일 없음 |  |
|
|
394
394
|
|
|
395
395
|
**S8 · LitHermes 승 (판정자: 기준선 승).** 요청에는 회사도 실적 수치도 없었습니다. 기준선은 빈칸을 둔 7장짜리 템플릿을, LitHermes는 가상 기업의 8장짜리 발표자료와 차트 3개를 만들고 모든 수치에 가정 예시라고 표시했습니다. 판정자는 바로 채워 쓸 수 있는 기준선 템플릿을 골랐고, LitHermes 차트는 데이터 라벨이 없어 빈약하다고 봤습니다. 메인테이너는 LitHermes 발표자료를 골랐습니다.
|
|
396
396
|
|
|
397
397
|
기준선:
|
|
398
398
|
|
|
399
|
-

|
|
400
400
|
|
|
401
401
|
LitHermes:
|
|
402
402
|
|
|
403
|
-

|
|
404
404
|
|
|
405
405
|
**S9 · LitHermes 승.** 기준선은 어떤 제품인지 되묻기만 하고 문서를 쓰지 않았습니다. LitHermes는 가상의 모듈형 책상 정리 트레이를 대상으로 고객 문제, 가격 가정, 검증 일정, 생산 결정 기준을 담은 3쪽짜리 Word 기획서를 썼고, 판정자는 손익분기 계산이 맞다고 봤습니다.
|
|
406
406
|
|
|
407
407
|
| 기준선 | LitHermes |
|
|
408
408
|
|---|---|
|
|
409
|
-
| 문서 없음. 어떤 제품인지 되물음 |  |
|
|
410
410
|
|
|
411
411
|
**S11 · LitHermes 승 (판정자: 무승부).** LitHermes는 날짜별 현황, 인원 필터와 검색, 30분 단위 예약을 갖추고 로직 테스트 4개가 통과하는 앱을 냈습니다. 판정자는 모든 회의실을 한 타임라인에 보여 주는 기준선이 더 알아보기 쉽고 `index.html`만 열면 된다고 봤습니다. LitHermes 앱은 npm과 로컬 서버가 필요하고, 일러스트 배너가 일정표 위를 차지합니다. 메인테이너는 LitHermes 앱을 골랐습니다.
|
|
412
412
|
|
|
413
413
|
| 기준선 | LitHermes |
|
|
414
414
|
|---|---|
|
|
415
|
-
|  |  |
|
|
416
416
|
|
|
417
417
|
그림 URL은 현재 후보 버전에 고정된 출시 대상 경로이며, 별도 승인된 패키지 배포 전에는 공개 접근을 뜻하지 않습니다.
|
|
418
418
|
|
|
@@ -439,6 +439,19 @@ LitHermes:
|
|
|
439
439
|
|
|
440
440
|
Telegram gateway에서는 `/lit_loop`와 `/lit_plan` 별칭을 사용합니다. 전체 명령 예시와 훅 동작은 [운영 안내](https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.ko.md)에 있습니다. 경로 확인 메시지는 호스트 메시지이며 작업이나 화면 검토가 끝났다는 증거가 아닙니다.
|
|
441
441
|
|
|
442
|
+
### Jev 스킬 힌트(선택)
|
|
443
|
+
|
|
444
|
+
LitHermes는 TypeSafe가 호스팅하는 결정 모델 Jev에게 평범한 프롬프트에 맞는 LitHermes 스킬을 물어볼 수 있습니다. 답은 그 턴의 컨텍스트에 조언 한 줄로만 들어갑니다. 스킬을 불러올지는 여전히 Hermes 모델이 정하며, 힌트는 권한을 주거나 도구를 실행하지 않습니다. 슬래시 명령과 기존 LitHermes 경로가 이미 처리하는 프롬프트에는 관여하지 않습니다.
|
|
445
|
+
|
|
446
|
+
기본값은 꺼짐입니다. 켜려면 Hermes가 실행되는 환경에 두 변수를 모두 설정하고, 키는 본인의 TypeSafe 키를 사용하세요.
|
|
447
|
+
|
|
448
|
+
```sh
|
|
449
|
+
export LITHERMES_JEV=1
|
|
450
|
+
export TYPESAFE_API_KEY=<your key>
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
켜 두면 조건에 맞는 프롬프트마다 2,000자로 자르고 홈 경로, 이메일 주소, 토큰 형태의 문자열을 가린 뒤 TypeSafe(typesafe.ai)로 보냅니다. 토큰 형태가 아닌 내용은 쓴 그대로 전송됩니다. 호스트 이름, 고객 이름, `password=...` 형식이 아닌 비밀번호가 그렇습니다. Hermes 게이트웨이 모드에서는 대화방의 다른 참여자가 보낸 메시지도 전송 대상입니다. 세션의 다른 내용은 보내지 않습니다. `TYPESAFE_API_KEY`는 Hermes를 시작하는 셸에 export되어 있으므로 에이전트의 도구도 이 값을 읽을 수 있습니다. 이 기능 전용 키를 쓰고 사용 한도를 낮게 잡으세요. 비용은 TypeSafe가 본인 계정에 청구하며, 입력 토큰 100만 개당 약 0.04달러입니다. 요청마다 1.5초 제한이 있고 재시도하지 않습니다. 실패하면 턴은 그대로 진행되고, 짧은 안내가 세션마다 한 번만 표시됩니다. 켜져 있는 동안에는 세션의 첫 답변 맨 위에 `✦ Jev skill hint ON` 한 줄이 표시되어, 기능이 켜져 있다는 것을 바로 알 수 있습니다. 힌트는 `hermes lithermes status`와 `hermes lithermes doctor`에서 확인합니다. `Jev skill hint: on — last hint lit-humanizer (0.43s)`는 마지막으로 힌트한 스킬과 Jev의 응답 시간을, `on — no hint yet`은 아직 힌트가 없다는 뜻이며, 그 밖에는 `off` 또는 `flag on but TYPESAFE_API_KEY missing`이 표시됩니다. 끄려면 `LITHERMES_JEV`를 해제하거나 `1`이 아닌 값으로 바꾸세요.
|
|
454
|
+
|
|
442
455
|
## 문제 해결
|
|
443
456
|
|
|
444
457
|
### 안전 모델과 호스트 한계
|
|
@@ -110,6 +110,29 @@ CLI/plugin name, not the npm package name.
|
|
|
110
110
|
path. Noninteractive, CI, JSON, dry-run, HUD/help/version/uninstall, and
|
|
111
111
|
delegate sessions remain no-op. The update bridge never receives npm
|
|
112
112
|
credentials and never uses the unsupported `--home` option.
|
|
113
|
+
- Optional Jev skill hint (`jev_hint.py`), off by default. When
|
|
114
|
+
`LITHERMES_JEV=1` and `TYPESAFE_API_KEY` are both set in the environment,
|
|
115
|
+
`pre_llm_call` sends a top-level prompt that no LitHermes route claimed (not a
|
|
116
|
+
slash command, not a command envelope, at least 4 non-space characters) to
|
|
117
|
+
TypeSafe's Jev: one POST that refuses redirects, redacted over an
|
|
118
|
+
8,000-character window and then cut to 2,000, with the `PORTED_SKILLS`
|
|
119
|
+
catalog plus `none`, a 1.5 s deadline and no retry. A hook failure there
|
|
120
|
+
never costs the turn its other context. Only an exact catalog id
|
|
121
|
+
at confidence 0.35 or higher becomes one fixed advisory line naming
|
|
122
|
+
`lithermes:<id>`; response text never enters context. Failures leave the turn
|
|
123
|
+
unchanged, and `transform_llm_output` prefixes one short note per session.
|
|
124
|
+
While both switches are on, the same transform also opens the first reply of
|
|
125
|
+
each session with the plain line `✦ Jev skill hint ON` (banner first, note on
|
|
126
|
+
the next line when both are due); it is released with the session.
|
|
127
|
+
`LITHERMES_JEV_MODEL`, `_TIMEOUT_MS` (max 3000), `_MAX_CALLS` (default 200
|
|
128
|
+
per session) and `_MIN_CONFIDENCE` tune it; `LITHERMES_JEV_TRACE=1` appends
|
|
129
|
+
the redacted prompt's hash, ids and timings (no text, key or body) to Hermes home
|
|
130
|
+
`lithermes/jev-trace.jsonl`. Status and doctor print `Jev skill hint: ...`;
|
|
131
|
+
when on, they add the last hinted skill id and latency (`on — last hint
|
|
132
|
+
lit-humanizer (0.43s)`) or `on — no hint yet`. The CLI runs in its own
|
|
133
|
+
process, so an accepted hint also writes only that id, the latency and a
|
|
134
|
+
timestamp to Hermes home `lithermes/jev-last.json` (mode 0600, atomic).
|
|
135
|
+
Neither file is written through a symlink.
|
|
113
136
|
- The `post_tool_call` hook is an observer — Hermes discards its return value — so
|
|
114
137
|
it records the paths a completed `write_file` / `patch` call mutated and
|
|
115
138
|
`pre_llm_call` renders them on the next turn. A source-code edit names
|
|
@@ -12,6 +12,7 @@ from . import bounded_work
|
|
|
12
12
|
from . import bounded_work_tools
|
|
13
13
|
from . import deliverable_hedge_guard
|
|
14
14
|
from . import handoff
|
|
15
|
+
from . import jev_hint
|
|
15
16
|
from . import knowledge
|
|
16
17
|
from . import knowledge_tools
|
|
17
18
|
from . import scientific_visualization
|
|
@@ -367,9 +368,24 @@ def _pre_llm_call(**kwargs: Any) -> dict[str, str] | None:
|
|
|
367
368
|
parts.append(str(base["context"]))
|
|
368
369
|
elif isinstance(base, str) and base.strip():
|
|
369
370
|
parts.append(base)
|
|
371
|
+
routed = bool(parts)
|
|
370
372
|
snapshot = litgoal_hook.snapshot_context(**kwargs)
|
|
371
373
|
if snapshot:
|
|
372
374
|
parts.append(snapshot)
|
|
375
|
+
if not routed:
|
|
376
|
+
# No deterministic route claimed this turn; the optional Jev hint may
|
|
377
|
+
# add one advisory line. It is inert unless LITHERMES_JEV and the key are set,
|
|
378
|
+
# and an unexpected failure there never costs the turn its other context.
|
|
379
|
+
try:
|
|
380
|
+
skill_hint = jev_hint.pre_llm_call(
|
|
381
|
+
session_id=str(kwargs.get("session_id") or ""),
|
|
382
|
+
user_message=str(kwargs.get("user_message") or ""),
|
|
383
|
+
catalog=PORTED_SKILLS,
|
|
384
|
+
)
|
|
385
|
+
except Exception: # noqa: BLE001 - advisory only
|
|
386
|
+
skill_hint = ""
|
|
387
|
+
if skill_hint:
|
|
388
|
+
parts.append(skill_hint)
|
|
373
389
|
if not parts:
|
|
374
390
|
return _merge_knowledge(_merge_post_edit(None, post_edit), knowledge_context)
|
|
375
391
|
return _merge_knowledge(
|
|
@@ -527,12 +543,20 @@ def _command_handler(ctx, handler, route=None):
|
|
|
527
543
|
|
|
528
544
|
def _transform_llm_output(**kwargs: Any) -> str | None:
|
|
529
545
|
named = handoff.transform_llm_output(**kwargs)
|
|
530
|
-
if named is
|
|
531
|
-
|
|
532
|
-
named
|
|
533
|
-
|
|
546
|
+
if named is None:
|
|
547
|
+
named = scientific_visualization.transform_llm_output(**kwargs)
|
|
548
|
+
if named is None:
|
|
549
|
+
named = core.transform_llm_output(**kwargs)
|
|
550
|
+
# The reply transform is the plugin's only user-visible channel, so the
|
|
551
|
+
# once-per-session Jev banner and fallback note are prefixed here, banner
|
|
552
|
+
# first; the reply stays intact.
|
|
553
|
+
session_id = str(kwargs.get("session_id") or "")
|
|
554
|
+
lines = (jev_hint.consume_banner(session_id), jev_hint.consume_note(session_id))
|
|
555
|
+
prefix = "\n".join(line for line in lines if line)
|
|
556
|
+
if not prefix:
|
|
534
557
|
return named
|
|
535
|
-
|
|
558
|
+
reply = named if named is not None else str(kwargs.get("response_text") or "")
|
|
559
|
+
return f"{prefix}\n\n{reply}"
|
|
536
560
|
|
|
537
561
|
|
|
538
562
|
def _pre_tool_call(**kwargs: Any) -> dict[str, str] | None:
|
|
@@ -568,6 +592,7 @@ def _release_bounded_session(**kwargs: Any) -> None:
|
|
|
568
592
|
core.release_browser_drive_state(raw_session_id)
|
|
569
593
|
session_id = raw_session_id if isinstance(raw_session_id, str) else ""
|
|
570
594
|
bounded_work.release_bounded_session(session_id)
|
|
595
|
+
jev_hint.release_session(session_id)
|
|
571
596
|
# A finalized/reset session must not leave its rule dedup ledger behind: the
|
|
572
597
|
# next session reusing the id would see every rule as "already injected".
|
|
573
598
|
core.release_rules_session(session_id)
|
|
@@ -21,6 +21,11 @@ try:
|
|
|
21
21
|
except (ImportError, ModuleNotFoundError):
|
|
22
22
|
import provider_metrics as _provider_metrics # type: ignore
|
|
23
23
|
|
|
24
|
+
try:
|
|
25
|
+
from . import jev_hint as _jev_hint
|
|
26
|
+
except (ImportError, ModuleNotFoundError):
|
|
27
|
+
import jev_hint as _jev_hint # type: ignore
|
|
28
|
+
|
|
24
29
|
try:
|
|
25
30
|
from .core_contract import KOREAN_PROSE_ALIASES, KOREAN_PROSE_COMMANDS
|
|
26
31
|
except (ImportError, ModuleNotFoundError):
|
|
@@ -477,6 +482,7 @@ def status_report(host_version: str | None = None) -> str:
|
|
|
477
482
|
"litgoal state: .hermes/lithermes/litgoal/ (drive via: hermes lithermes goal status)",
|
|
478
483
|
_knowledge.status_line(Path.cwd()),
|
|
479
484
|
_provider_metrics.capability_line(),
|
|
485
|
+
_jev_hint.status_line(),
|
|
480
486
|
f"litgoal evidence kinds: {', '.join(_evidence_kinds())}",
|
|
481
487
|
f"scientific visualization: {_science.dependency_summary()}",
|
|
482
488
|
*_motion_runtime_lines(),
|
|
@@ -562,6 +568,9 @@ def doctor_report(host_version: str | None = None) -> tuple[list[str], int]:
|
|
|
562
568
|
)
|
|
563
569
|
healthy = healthy and knowledge_ok
|
|
564
570
|
lines.append(f"[NOTE] {_provider_metrics.capability_line()}")
|
|
571
|
+
jev_state = _jev_hint.status()
|
|
572
|
+
jev_tag = {"on": "OK", "off": "NOTE"}.get(jev_state, "WARN")
|
|
573
|
+
lines.append(f"[{jev_tag}] {_jev_hint.status_line()}")
|
|
565
574
|
if version != "unknown":
|
|
566
575
|
lines.append(f"[OK] Hermes host detected (v{version})")
|
|
567
576
|
else:
|