@litfamily/litopencode 1.0.15 → 1.0.16

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/CHANGELOG.md CHANGED
@@ -5,6 +5,10 @@ are tracked separately from this product history.
5
5
 
6
6
  ## Unreleased
7
7
 
8
+ ## 1.0.16 - 2026-10-01
9
+
10
+ - Automatic handoff now finds the handoff it asked for after compaction even when the model formats the marker line, for example as a bullet, in backticks or in bold. A handoff written by another session is still ignored.
11
+
8
12
  ## 1.0.15 - 2026-09-30
9
13
 
10
14
  - `gpt-6.1-sol` is now the recommended coding-lead alternative, because OpenAI lists `gpt-6-sol` as the previous generation. The installer model menu offers it as the coding lead and keeps `gpt-6-sol` listed as the previous generation, and the reference describes both. Routes that already use `gpt-6-sol` keep working, and `litopencode doctor` still accepts them.
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/litopencode@1.0.15/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 다섯 로봇 패널이 차례로 켜지고, LitOpenCode 로봇의 눈과 테두리가 빛난 뒤 LITFAMILY와 KEEP THE WORK LIT. 문구가 밝아지는 영상" /></picture></p>
1
+ <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 다섯 로봇 패널이 차례로 켜지고, LitOpenCode 로봇의 눈과 테두리가 빛난 뒤 LITFAMILY와 KEEP THE WORK LIT. 문구가 밝아지는 영상" /></picture></p>
2
2
 
3
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/assets/readme/ascii-readme.svg" width="480" alt="LIT ASCII B 마크" /></p>
3
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/readme/ascii-readme.svg" width="480" alt="LIT ASCII B 마크" /></p>
4
4
 
5
5
  <details>
6
6
  <summary>ASCII 로고 복사</summary>
@@ -32,14 +32,14 @@
32
32
 
33
33
  # LitOpenCode
34
34
 
35
- [English](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/README.md) · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/README-Ko-KR.md)
35
+ [English](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/README.md) · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/README-Ko-KR.md)
36
36
 
37
37
  > **불씨를 건네받았다.**<br>
38
38
  > **이제, 당신의 작업에 옮길 차례다.**
39
39
 
40
40
  <p align="center">
41
- <a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/assets/readme/badge-version.svg" alt="1.0.15" /></a>
42
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/assets/readme/badge-license.svg" alt="MIT 라이선스" /></a>
41
+ <a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/readme/badge-version.svg" alt="1.0.16" /></a>
42
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/readme/badge-license.svg" alt="MIT 라이선스" /></a>
43
43
  </p>
44
44
 
45
45
  LitOpenCode는 OpenCode에 워크플로 agent, 슬래시 명령, 로컬 근거 기록을 더합니다.
@@ -99,7 +99,7 @@ OpenAI 제공자를 쓰면 새로 설치했을 때 계획과 검토는 GPT-6 Ast
99
99
  - planner는 계획만 세웁니다. `lit-plan`은 `edit`, `bash`, `task` 권한이 거부되어 있고, 더 느슨한 `balanced`나 `yolo` 모드를 직접 골라도 그대로입니다.
100
100
  - LitOpenCode는 대화형으로 시작할 때와 install이나 doctor가 성공한 뒤에 스스로 업데이트할 수 있습니다. 끄려면 `--no-auto-update`를 붙이거나 `LITOPENCODE_NO_AUTO_UPDATE=1`을 설정하세요.
101
101
  - 스킬 학습 기능은 제거되었습니다. 이전 릴리스가 프로젝트의 `.litopencode` 폴더에 남긴 학습 기록은 더 이상 쓰이지 않으니, 남겨 두든 지우든 편한 대로 하면 됩니다.
102
- - Jev 스킬 힌트는 선택 기능이고 기본값은 꺼짐입니다. 켜면 조건에 맞는 프롬프트가 TypeSafe로 전송되니, 먼저 [Jev 스킬 힌트 참조 문서](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/reference-Ko-KR.md#jev-스킬-힌트-선택)를 읽어 보세요. 알림과 doctor 줄이 어떻게 보이는지는 [GitHub 페이지](https://github.com/wjgoarxiv/litopencode/blob/master/README-Ko-KR.md#화면에서-보이는-것)에서 볼 수 있습니다.
102
+ - Jev 스킬 힌트는 선택 기능이고 기본값은 꺼짐입니다. 켜면 조건에 맞는 프롬프트가 TypeSafe로 전송되니, 먼저 [Jev 스킬 힌트 참조 문서](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/reference-Ko-KR.md#jev-스킬-힌트-선택)를 읽어 보세요. 알림과 doctor 줄이 어떻게 보이는지는 [GitHub 페이지](https://github.com/wjgoarxiv/litopencode/blob/master/README-Ko-KR.md#화면에서-보이는-것)에서 볼 수 있습니다.
103
103
  - 뭔가 이상하면 `npm exec --package @litfamily/litopencode@latest -- litopencode doctor`로 패키지와 설정 상태를 확인하세요.
104
104
 
105
105
  ## 제거
@@ -110,11 +110,11 @@ OpenAI 제공자를 쓰면 새로 설치했을 때 계획과 검토는 GPT-6 Ast
110
110
  npm uninstall -g @litfamily/litopencode
111
111
  ```
112
112
 
113
- 남겨 둘 만한 설치 파일과 기록은 [제거 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/reference-Ko-KR.md#제거)에 정리되어 있습니다.
113
+ 남겨 둘 만한 설치 파일과 기록은 [제거 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/reference-Ko-KR.md#제거)에 정리되어 있습니다.
114
114
 
115
115
  ## 더 보기
116
116
 
117
117
  - [GitHub 전체 안내](https://github.com/wjgoarxiv/litopencode/blob/master/README-Ko-KR.md)
118
- - [워크플로 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/reference-Ko-KR.md) · [English reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/reference.md)
119
- - [마이그레이션 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/migration.md) · [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/CHANGELOG.md) · [개인정보와 네트워크 동작](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/privacy.md)
120
- - [MIT 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/LICENSE) · [ASCII 글꼴 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/assets/readme/JetBrainsMono-OFL.txt)
118
+ - [워크플로 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/reference-Ko-KR.md) · [English reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/reference.md)
119
+ - [마이그레이션 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/migration.md) · [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/CHANGELOG.md) · [개인정보와 네트워크 동작](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/privacy.md)
120
+ - [MIT 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/LICENSE) · [ASCII 글꼴 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/readme/JetBrainsMono-OFL.txt)
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitOpenCode robot wakes with glowing eyes and a lit frame, then LITFAMILY and KEEP THE WORK LIT. light up." /></picture></p>
1
+ <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitOpenCode robot wakes with glowing eyes and a lit frame, then LITFAMILY and KEEP THE WORK LIT. light up." /></picture></p>
2
2
 
3
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/assets/readme/ascii-readme.svg" width="480" alt="LIT ASCII B mark" /></p>
3
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/readme/ascii-readme.svg" width="480" alt="LIT ASCII B mark" /></p>
4
4
 
5
5
  <details>
6
6
  <summary>Copy ASCII logo</summary>
@@ -32,13 +32,13 @@
32
32
 
33
33
  # LitOpenCode
34
34
 
35
- [English](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/README.md) · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/README-Ko-KR.md)
35
+ [English](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/README.md) · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/README-Ko-KR.md)
36
36
 
37
37
  **Keep the work lit.**
38
38
 
39
39
  <p align="center">
40
- <a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/assets/readme/badge-version.svg" alt="1.0.15" /></a>
41
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
40
+ <a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/readme/badge-version.svg" alt="1.0.16" /></a>
41
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
42
42
  </p>
43
43
 
44
44
  LitOpenCode adds workflow agents, slash commands, and a local evidence ledger to OpenCode.
@@ -98,7 +98,7 @@ With the OpenAI provider, a fresh install uses GPT-6 Astra (`gpt-6-astra`) at `x
98
98
  - The planner only plans. `lit-plan` has `edit`, `bash` and `task` denied, and it stays that way even if you choose the looser `balanced` or `yolo` mode.
99
99
  - LitOpenCode can update itself when it starts interactively and after an install or doctor run succeeds. To turn that off, pass `--no-auto-update` or set `LITOPENCODE_NO_AUTO_UPDATE=1`.
100
100
  - Skill learning has been removed. Learning records an earlier release left in a project's `.litopencode` folder are no longer used; keep or delete them as you like.
101
- - The Jev skill hint is optional and off by default. Turning it on sends eligible prompts to TypeSafe, so read the [Jev skill hint reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/reference.md#jev-skill-hint-optional) first. The GitHub page shows [what the toast and the doctor line look like](https://github.com/wjgoarxiv/litopencode#what-you-will-see).
101
+ - The Jev skill hint is optional and off by default. Turning it on sends eligible prompts to TypeSafe, so read the [Jev skill hint reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/reference.md#jev-skill-hint-optional) first. The GitHub page shows [what the toast and the doctor line look like](https://github.com/wjgoarxiv/litopencode#what-you-will-see).
102
102
  - If something seems off, `npm exec --package @litfamily/litopencode@latest -- litopencode doctor` checks the package and your configuration.
103
103
 
104
104
  ## Uninstall
@@ -109,11 +109,11 @@ There's no uninstall command. Remove the `@litfamily/litopencode` entry from the
109
109
  npm uninstall -g @litfamily/litopencode
110
110
  ```
111
111
 
112
- The [removal reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/reference.md#remove) covers the installed files and records you may want to keep.
112
+ The [removal reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/reference.md#remove) covers the installed files and records you may want to keep.
113
113
 
114
114
  ## More
115
115
 
116
116
  - [Full guide on GitHub](https://github.com/wjgoarxiv/litopencode#readme)
117
- - [Workflow reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/reference.md) · [한국어 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/reference-Ko-KR.md)
118
- - [Migration notes](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/migration.md) · [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/CHANGELOG.md) · [Privacy and network behavior](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/privacy.md)
119
- - [MIT license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/LICENSE) · [ASCII font license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.15/docs/assets/readme/JetBrainsMono-OFL.txt)
117
+ - [Workflow reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/reference.md) · [한국어 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/reference-Ko-KR.md)
118
+ - [Migration notes](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/migration.md) · [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/CHANGELOG.md) · [Privacy and network behavior](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/privacy.md)
119
+ - [MIT license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/LICENSE) · [ASCII font license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.16/docs/assets/readme/JetBrainsMono-OFL.txt)
@@ -283,6 +283,39 @@ export function autoHandoffDirective(percent, marker) {
283
283
  const handoffCandidates = Object.freeze(["HANDOFF.md", path.join(".handoff", "HANDOFF.md")]);
284
284
  const handoffSizeLimitBytes = 1_048_576;
285
285
  const mtimeToleranceMs = 2000;
286
+ /**
287
+ * One line with its Markdown decoration removed: list bullet, quote marker, emphasis, backticks and an
288
+ * HTML comment wrapper. Underscores are dropped only where they open or close a word, so the one inside
289
+ * a session id stays.
290
+ */
291
+ function plainLine(line) {
292
+ let text = line.replace(/<!--|-->/gu, " ").replace(/[*`]/gu, "");
293
+ text = text.replace(/(^|\s)_+/gu, "$1").replace(/_+(?=\s|$)/gu, "");
294
+ for (;;) {
295
+ const stripped = text.replace(/^\s*(?:>\s*|[-+]\s+|\d+[.)]\s+)/u, "");
296
+ if (stripped === text)
297
+ break;
298
+ text = stripped;
299
+ }
300
+ return text.replace(/\s+/gu, " ").trim();
301
+ }
302
+ const markerWordCharacter = /[0-9A-Za-z_-]/u;
303
+ /** The exact marker on some line, with no word character glued directly before or after it. */
304
+ function carriesMarker(text, marker) {
305
+ const wanted = plainLine(marker);
306
+ if (wanted === "")
307
+ return false;
308
+ for (const line of text.split(/\r?\n/u)) {
309
+ const plain = plainLine(line);
310
+ for (let at = plain.indexOf(wanted); at !== -1; at = plain.indexOf(wanted, at + 1)) {
311
+ const before = at === 0 ? "" : plain[at - 1];
312
+ const after = plain.slice(at + wanted.length, at + wanted.length + 1);
313
+ if (!markerWordCharacter.test(before) && !markerWordCharacter.test(after))
314
+ return true;
315
+ }
316
+ }
317
+ return false;
318
+ }
286
319
  /**
287
320
  * A handoff counts only when it carries the marker this session's trigger produced and the file was
288
321
  * written after the trigger. A file left by an earlier run, another session, or a person does not.
@@ -297,7 +330,7 @@ export async function readFreshHandoff(projectRoot, marker, firedAt) {
297
330
  if (stat.mtimeMs < firedAt - mtimeToleranceMs)
298
331
  continue;
299
332
  const text = await fs.readFile(file, "utf8");
300
- if (text.includes(marker))
333
+ if (carriesMarker(text, marker))
301
334
  return { relativePath, text };
302
335
  }
303
336
  catch {
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="release: 1.0.15"><title>release: 1.0.15</title><g shape-rendering="crispEdges"><rect width="49" height="20" fill="#080d14"/><rect x="49" width="97" height="20" fill="#ff6337"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text x="255" y="140" textLength="390" transform="scale(.1)">release</text><text x="965" y="140" textLength="870" transform="scale(.1)" fill="#080D14">1.0.15</text></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="release: 1.0.16"><title>release: 1.0.16</title><g shape-rendering="crispEdges"><rect width="49" height="20" fill="#080d14"/><rect x="49" width="97" height="20" fill="#ff6337"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text x="255" y="140" textLength="390" transform="scale(.1)">release</text><text x="965" y="140" textLength="870" transform="scale(.1)" fill="#080D14">1.0.16</text></g></svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litfamily/litopencode",
3
- "version": "1.0.15",
3
+ "version": "1.0.16",
4
4
  "description": "LitOpenCode OpenCode plugin bootstrap package.",
5
5
  "license": "MIT",
6
6
  "repository": {