@litfamily/lithermes 1.0.27 → 1.0.29

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.
Files changed (94) hide show
  1. package/README.md +10 -9
  2. package/README_Ko-KR.md +10 -9
  3. package/assets/lithermes-plugin/README.md +28 -9
  4. package/assets/lithermes-plugin/__init__.py +7 -3
  5. package/assets/lithermes-plugin/auto_update.py +17 -3
  6. package/assets/lithermes-plugin/core.py +41 -2
  7. package/assets/lithermes-plugin/core_contexts.py +27 -9
  8. package/assets/lithermes-plugin/core_contract.py +7 -2
  9. package/assets/lithermes-plugin/core_review.py +144 -3
  10. package/assets/lithermes-plugin/core_routing.py +10 -0
  11. package/assets/lithermes-plugin/core_workflow_commands.py +3 -2
  12. package/assets/lithermes-plugin/diagnostics.py +5 -3
  13. package/assets/lithermes-plugin/lit_reentry.py +233 -0
  14. package/assets/lithermes-plugin/payload-version.json +182 -50
  15. package/assets/lithermes-plugin/plugin.yaml +1 -1
  16. package/assets/lithermes-plugin/rules/__init__.py +2 -0
  17. package/assets/lithermes-plugin/rules/engine.py +26 -11
  18. package/assets/lithermes-plugin/skills/deep-interview/SKILL.md +2 -1
  19. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +3 -3
  20. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/hostexec.mjs +118 -0
  21. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe.mjs +6 -5
  22. package/assets/lithermes-plugin/skills/lit-brainstorm/SKILL.md +408 -0
  23. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/doctor.mjs +3 -3
  24. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/export.mjs +5 -5
  25. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/hostexec.mjs +118 -0
  26. package/assets/lithermes-plugin/skills/lit-docx/scripts/convert_md_to_pdf.py +38 -4
  27. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/acs/template.tex +3 -0
  28. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/elsevier/template.tex +3 -0
  29. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/ieee/template.tex +3 -0
  30. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/korean-generic/template.tex +3 -0
  31. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/nature/template.tex +3 -0
  32. package/assets/lithermes-plugin/skills/lit-pptx/bin/hostexec.mjs +118 -0
  33. package/assets/lithermes-plugin/skills/lit-pptx/bin/office.mjs +16 -9
  34. package/assets/lithermes-plugin/skills/lit-typographic-motion/SKILL.md +13 -12
  35. package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/motion.mjs +19 -6
  36. package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/runtime.mjs +25 -19
  37. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/THIRD_PARTY_NOTICES +2 -0
  38. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/browser.mjs +11 -4
  39. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/constants.mjs +29 -0
  40. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/cover-assets.mjs +87 -0
  41. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/cover-capture.mjs +189 -0
  42. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/cover-gate.mjs +263 -0
  43. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/cover-image.mjs +103 -0
  44. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/cover-init.js +36 -0
  45. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/cover-png.mjs +77 -0
  46. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/cover-sheet.mjs +70 -0
  47. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/cover-treatment.mjs +104 -0
  48. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/cover-webp.mjs +112 -0
  49. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/cover-worker.mjs +19 -0
  50. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/cover.mjs +338 -0
  51. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/encode.mjs +1 -1
  52. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/hostexec.mjs +118 -0
  53. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/look.mjs +103 -7
  54. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/loop-kit.js +80 -0
  55. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/sound.mjs +1 -1
  56. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage.mjs +8 -2
  57. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/treatment.mjs +1 -0
  58. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/negatives/card-scenes/expected.json +49 -0
  59. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/negatives/card-scenes/index.html +37 -0
  60. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/negatives/reset-sweep/expected.json +49 -0
  61. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/negatives/reset-sweep/index.html +27 -0
  62. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/negatives/still-glow/expected.json +51 -0
  63. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/negatives/still-glow/index.html +29 -0
  64. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/negatives/title-slam/expected.json +51 -0
  65. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/negatives/title-slam/index.html +37 -0
  66. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/orbit-loop/expected.json +68 -0
  67. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/orbit-loop/index.html +112 -0
  68. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/painted-light/expected.json +96 -0
  69. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/painted-light/index.html +208 -0
  70. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/weight-tide/expected.json +68 -0
  71. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/weight-tide/index.html +81 -0
  72. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/cover.md +458 -0
  73. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/craft-loop.md +4 -1
  74. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/runtime.md +13 -5
  75. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/stage.md +4 -2
  76. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/treatment.md +6 -0
  77. package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/fonts.json +11 -0
  78. package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/requirements.lock +72 -0
  79. package/assets/lithermes-plugin/skills/litgoal/SKILL.md +19 -1
  80. package/assets/lithermes-plugin/skills/lsp-setup/scripts/verify-lsp.ts +16 -3
  81. package/assets/lithermes-plugin/skills/readme-studio/templates/hyperframes/package-lock.json +3 -3
  82. package/assets/lithermes-plugin/skills/readme-studio/templates/remotion/package-lock.json +3 -3
  83. package/assets/lithermes-plugin/skills/review-work/SKILL.md +38 -16
  84. package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +3 -3
  85. package/package.json +2 -1
  86. package/readme-assets/badge-version.svg +1 -1
  87. package/readme-assets/cover-motion-still.webp +0 -0
  88. package/readme-assets/cover-motion.webp +0 -0
  89. package/src/cli.js +2 -2
  90. package/src/lib/check.js +9 -6
  91. package/src/lib/hermesDiscovery.js +2 -2
  92. package/src/lib/hostExec.js +81 -0
  93. package/src/lib/skillPayload.js +1 -1
  94. package/src/lib/updateNotifier.js +14 -4
package/README.md CHANGED
@@ -1,14 +1,14 @@
1
- <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitHermes 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/lithermes@1.0.29/readme-assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: seven armored robots power on one by one, the LitHermes robot wakes with glowing eyes and a lit frame, then LITFAMILY and KEEP THE WORK LIT. light up." /></picture></p>
2
2
 
3
3
  <p align="center">
4
- <a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/badge-version.svg" alt="1.0.27" /></a>
5
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/badge-license.svg" alt="MIT license" /></a>
4
+ <a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/badge-version.svg" alt="1.0.29" /></a>
5
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/badge-license.svg" alt="MIT license" /></a>
6
6
  </p>
7
7
 
8
8
  <p align="center">
9
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/lucide-book-open.svg" width="16" alt="" /> Guide</a> &nbsp;
10
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition film</a> &nbsp;
11
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
9
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/lucide-book-open.svg" width="16" alt="" /> Guide</a> &nbsp;
10
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition film</a> &nbsp;
11
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
12
12
  </p>
13
13
 
14
14
  # LitHermes
@@ -17,7 +17,7 @@
17
17
 
18
18
  A plugin for **Hermes Agent**. Put `lit` in front of a request, and Hermes plans the task, does it, checks the result and writes down where things stand, so the next session can pick up where this one stopped.
19
19
 
20
- **[README and docs on GitHub](https://github.com/wjgoarxiv/lithermes#readme)** · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/README_Ko-KR.md)
20
+ **[README and docs on GitHub](https://github.com/wjgoarxiv/lithermes#readme)** · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/README_Ko-KR.md)
21
21
 
22
22
  ## Install
23
23
 
@@ -46,7 +46,8 @@ The reply opens with a `🔥 **LIT IGNITED · <discipline>** 🔥` line once the
46
46
  | `lit <request>` or `/lit` | `litwork` | A task that ends with checked results |
47
47
  | `lit-plan` or `/lit-plan` | `lit-plan` | A plan, before anything is edited |
48
48
  | `/start-work <approved-plan>` | `start-work` | Running a plan you approved |
49
- | `lit review <target>` or `/review-work` | `review-work` | Reviewing a plan or a result |
49
+ | `lit review [plan\|work] <target>` or `/review-work` | `review-work` | Reviewing a plan before `start-work`, or finished work after it |
50
+ | `lit brainstorm <ask>` | `lit-brainstorm` | Many options for an open ask, then a short list to pick from |
50
51
  | `lit research <question>` | `litresearch` | Research with source notes |
51
52
  | `/lit-humanizer` | `lit-humanizer` | Revising Korean or English prose, meaning kept |
52
53
  | `/lit-diagram-drawer <brief>` | `lit-diagram-drawer` | A checked, editable diagram |
@@ -54,7 +55,7 @@ The reply opens with a `🔥 **LIT IGNITED · <discipline>** 🔥` line once the
54
55
  | `/lit-docx <brief>` | `lit-docx` | A restrained Word document in one of six named shapes, with its Markdown source |
55
56
  | `/lit-typographic-motion <brief>` | `lit-typographic-motion` | A short film, treatment first |
56
57
 
57
- On a Telegram gateway, use `/lit_loop` and `/lit_plan`. Every skill also loads by name as `lithermes:<name>`, for example `lithermes:lit-pptx` or `lithermes:lit-docx`. [Skills and commands](https://github.com/wjgoarxiv/lithermes/blob/main/docs/skills.md) shows all 36 with pictures.
58
+ On a Telegram gateway, use `/lit_loop` and `/lit_plan`. Every skill also loads by name as `lithermes:<name>`, for example `lithermes:lit-pptx` or `lithermes:lit-docx`. [Skills and commands](https://github.com/wjgoarxiv/lithermes/blob/main/docs/skills.md) shows all 37 with pictures.
58
59
 
59
60
  ## Check, update, remove
60
61
 
package/README_Ko-KR.md CHANGED
@@ -1,14 +1,14 @@
1
- <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 다섯 로봇 패널이 차례로 켜지고, LitHermes 로봇의 눈과 테두리가 빛난 뒤 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/lithermes@1.0.29/readme-assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 일곱 로봇 패널이 차례로 켜지고, LitHermes 로봇의 눈과 테두리가 빛난 뒤 LITFAMILY와 KEEP THE WORK LIT. 문구가 밝아지는 영상" /></picture></p>
2
2
 
3
3
  <p align="center">
4
- <a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/badge-version.svg" alt="1.0.27" /></a>
5
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/badge-license.svg" alt="MIT license" /></a>
4
+ <a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/badge-version.svg" alt="1.0.29" /></a>
5
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/badge-license.svg" alt="MIT license" /></a>
6
6
  </p>
7
7
 
8
8
  <p align="center">
9
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.ko.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/lucide-book-open.svg" width="16" alt="" /> 안내</a> &nbsp;
10
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition 영상</a> &nbsp;
11
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
9
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.ko.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/lucide-book-open.svg" width="16" alt="" /> 안내</a> &nbsp;
10
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition 영상</a> &nbsp;
11
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
12
12
  </p>
13
13
 
14
14
  # LitHermes
@@ -17,7 +17,7 @@
17
17
 
18
18
  **Hermes Agent**용 플러그인입니다. 요청 앞에 `lit`을 붙이면 Hermes가 작업을 계획하고, 해내고, 결과를 확인한 뒤 어디까지 왔는지 적어 둡니다. 그래서 다음 세션이 그 기록을 읽고 멈춘 자리에서 이어 갈 수 있습니다.
19
19
 
20
- **[GitHub의 README와 문서](https://github.com/wjgoarxiv/lithermes/blob/main/README_Ko-KR.md)** · [English](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.27/README.md)
20
+ **[GitHub의 README와 문서](https://github.com/wjgoarxiv/lithermes/blob/main/README_Ko-KR.md)** · [English](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.29/README.md)
21
21
 
22
22
  ## 설치
23
23
 
@@ -46,7 +46,8 @@ lit 외부 의존성 없이 HTML 파일 하나로 할 일 목록을 만들어줘
46
46
  | `lit <요청>` 또는 `/lit` | `litwork` | 범위를 정한 작업을 확인 결과까지 |
47
47
  | `lit-plan` 또는 `/lit-plan` | `lit-plan` | 아무것도 고치기 전에 계획부터 |
48
48
  | `/start-work <승인된 계획>` | `start-work` | 승인한 계획 실행 |
49
- | `lit review <대상>` 또는 `/review-work` | `review-work` | 계획이나 결과 검토 |
49
+ | `lit review [plan\|work] <대상>` 또는 `/review-work` | `review-work` | `start-work` 전의 계획 검토, 또는 끝난 작업 검토 |
50
+ | `lit brainstorm <요청>` | `lit-brainstorm` | 열린 요청에 대한 여러 선택지와, 고를 수 있는 짧은 목록 |
50
51
  | `lit research <질문>` | `litresearch` | 출처 메모가 있는 조사 |
51
52
  | `/lit-humanizer` | `lit-humanizer` | 의미를 지키며 한국어·영어 문장 다듬기 |
52
53
  | `/lit-diagram-drawer <brief>` | `lit-diagram-drawer` | 검사를 거친, 편집 가능한 다이어그램 |
@@ -54,7 +55,7 @@ lit 외부 의존성 없이 HTML 파일 하나로 할 일 목록을 만들어줘
54
55
  | `/lit-docx <brief>` | `lit-docx` | 여섯 가지 문서 형식 가운데 하나로 짠 절제된 Word 문서와 Markdown 원본 |
55
56
  | `/lit-typographic-motion <brief>` | `lit-typographic-motion` | 트리트먼트부터 쓰는 짧은 영상 |
56
57
 
57
- Telegram gateway에서는 `/lit_loop`와 `/lit_plan`을 쓰세요. 모든 스킬은 `lithermes:<이름>`으로도 불러올 수 있습니다. 예를 들어 `lithermes:lit-pptx`, `lithermes:lit-docx`처럼 씁니다. 스킬 36개 전체는 [스킬과 명령](https://github.com/wjgoarxiv/lithermes/blob/main/docs/skills.ko.md)에서 그림과 함께 볼 수 있습니다.
58
+ Telegram gateway에서는 `/lit_loop`와 `/lit_plan`을 쓰세요. 모든 스킬은 `lithermes:<이름>`으로도 불러올 수 있습니다. 예를 들어 `lithermes:lit-pptx`, `lithermes:lit-docx`처럼 씁니다. 스킬 37개 전체는 [스킬과 명령](https://github.com/wjgoarxiv/lithermes/blob/main/docs/skills.ko.md)에서 그림과 함께 볼 수 있습니다.
58
59
 
59
60
  ## 확인, 업데이트, 삭제
60
61
 
@@ -81,7 +81,7 @@ CLI/plugin name, not the npm package name.
81
81
  `DEGRADED`; its exact first line, once and before any other reply content, is
82
82
  `🔥 **LIT IGNITED · lit-scientific-visualization** 🔥`.
83
83
  - `/lit-pptx <brief>` and `/lit-docx <brief>` load `lithermes:lit-pptx` and `lithermes:lit-docx`. Bare `lit` with report or slide authoring wording routes to the corresponding skill; a combined request creates both formats. The packaged `skills/lit-pptx/bin/office.mjs` installs pinned dependencies in the LitHermes cache on first use and exposes deck QA, integrity, DOCX conversion, editing, lint, and visual audit.
84
- - `/lit-typographic-motion <brief>` loads `lithermes:lit-typographic-motion`. Bare `lit` with a film-creation request writes a treatment first, then renders a stage film (a model-authored page captured frame by frame) or a type film on the installed WebGL2 engine. Pre-warm with `lithermes motion-runtime install`; check the five runtime probes with `lithermes motion-runtime status`. The render gate records measurements and withholds exports on flash failure. Typographic-motion engine adapted from mexicat/pdoom-video (MIT, Giacomo Magnanini), commit `ca251e3`.
84
+ - `/lit-typographic-motion <brief>` loads `lithermes:lit-typographic-motion`. Bare `lit` with a film-creation request writes a treatment first, then renders a stage film (a model-authored page captured frame by frame) or a type film on the installed WebGL2 engine. A README, hero or banner loop takes cover mode (`$M cover`): a silent, seamless loop encoded as animated WebP and gated on the decoded file. Pre-warm with `lithermes motion-runtime install`; check the six runtime probes (the sixth is the cover encoder) with `lithermes motion-runtime status`. The render gate records measurements and withholds exports on flash failure. Typographic-motion engine adapted from mexicat/pdoom-video (MIT, Giacomo Magnanini), commit `ca251e3`.
85
85
  - `/lit-diagram-drawer <brief>` and the exact `lit-diagram-drawer` route load the
86
86
  installed diagram skill. Its Python checks cover source geometry, accessibility,
87
87
  content requirements, motion source rules, and visible-text findings; actual
@@ -96,6 +96,7 @@ CLI/plugin name, not the npm package name.
96
96
  `lit team` does not claim a literal native team mode.
97
97
  Intent-shaped skills route the same way from a bare leading token or after `lit`:
98
98
  `autoresearch`, `autoconference`, `wikify`, `lit-comprehend`, `refactor`, `debugging`, `lit-commit`,
99
+ `lit-brainstorm` (after `lit`: `brainstorm`, `brainstorming`, `ideation`, `ideate`, `idea`, `ideas`),
99
100
  `lit-burnoff`, `lit-burnoff-file`, `comment-checker`, `lsp`, `lsp-setup`, and
100
101
  `rules`.
101
102
  - On the first interactive top-level `pre_llm_call`, the payload runs one
@@ -172,7 +173,7 @@ CLI/plugin name, not the npm package name.
172
173
  keep the live-hit claim `UNPROVEN` until a real receipt arrives.
173
174
  - Explicit skills are available as:
174
175
  `lithermes:lit-burnoff-file`, `lithermes:autoresearch`, `lithermes:autoconference`,
175
- `lithermes:lit-comprehend`,
176
+ `lithermes:lit-comprehend`, `lithermes:lit-brainstorm`,
176
177
  `lithermes:lit-humanizer`, `lithermes:comment-checker`,
177
178
  `lithermes:debugging`, `lithermes:deep-interview`,
178
179
  `lithermes:frontend-ui-ux`, `lithermes:readme-studio`, `lithermes:lit-commit`,
@@ -300,10 +301,14 @@ CLI/plugin name, not the npm package name.
300
301
  real status command from the installed plugin directory both succeed.
301
302
  The npm `doctor` surface also inspects generated bytecode without deleting it;
302
303
  package-payload cleanup belongs only to explicit test/pack preparation.
303
- - `/review-work` has a draft-plan mode and the existing completion mode. Plan
304
+ - `/review-work` has two named modes: plan review (after `lit-plan`, before `start-work`) and
305
+ work review (after `lit-loop` or `start-work`). It auto-picks from what exists (a diff, changed
306
+ files outside `plans/` or ticked plan rows mean work; an unticked plan alone means plan; neither
307
+ means ask), `plan` or `work` after `lit review` or `/review-work` forces one, and the first report
308
+ line names the mode. Plan
304
309
  review audits scope/objective achievability, dependencies, atomic checklist
305
310
  items, acceptance/evidence, and failure/decision/cleanup, returning `PASS`,
306
- `ITERATE`, or `NEEDS-CONTEXT` without implementation. Completion review remains
311
+ `ITERATE`, or `NEEDS-CONTEXT` without implementation. Work review remains
307
312
  the five-lane no-rubber-stamp gate: scope/diff, tests/evidence, package/payload,
308
313
  security/provenance, and real-surface/docs. A DoneClaim is blocked unless each
309
314
  falsifier has evidence and every generated or runtime artifact has a cleanup receipt.
@@ -350,12 +355,20 @@ npm --prefix packages/lithermes-installer run sync-plugin -- --in-place
350
355
  carries the static rules at 4,096 bytes and spills later hook results above
351
356
  10,000 characters). It names the ledger, the mode rules and the loop, and loads
352
357
  the `litwork` and `lit-code` skills through `skill_view` when they are needed.
358
+ - Repeating `lit`: the first `lit` of a session sends the full activation above. While the
359
+ same discipline stays active, `lit ...` sends a note under 600 bytes (no skill reload, no new
360
+ run, plan file or goal). `lit <other discipline>` switches with that discipline's full
361
+ activation. A bare `lit` or `lit continue` continues whichever discipline is active, or with none
362
+ active resumes an unfinished start-work run or bounded work, and `lit new ...` or `lit restart ...` starts over. Only a bare `lit` with nothing active asks
363
+ what to start. The session record is in memory (`lit_reentry.py`); a missing, stale or
364
+ compacted record falls back to the full activation.
353
365
  - `lit plan`: planning-only. Do not implement or start work; create/refine a
354
366
  proportionate objective-achievable plan first. The route keeps the planning
355
367
  guard and plan path in view and loads `lithermes:lit-plan` through `skill_view`.
356
- - `lit review`: review-work audits a draft plan with `PASS` / `ITERATE` /
357
- `NEEDS-CONTEXT`, or verifies completed work through the existing 5-lane
358
- all-or-nothing gate. Review never implements the plan.
368
+ - `lit review [plan|work]`: review-work audits a draft plan with `PASS` / `ITERATE` /
369
+ `NEEDS-CONTEXT` (plan review), or verifies completed work through the existing 5-lane
370
+ all-or-nothing gate (work review). The wrapper states `Review mode: plan|work (forced by the
371
+ user)` or the auto-pick rule. Review never implements the plan.
359
372
  - `lit research`: separate verified facts, hypotheses, sources, and uncertainty;
360
373
  journals live under `.hermes/lithermes/litresearch/<slug>/`. Public retrieval
361
374
  hardening tries public endpoint/feed routes first, records a structured
@@ -369,8 +382,14 @@ npm --prefix packages/lithermes-installer run sync-plugin -- --in-place
369
382
  `lit-scientific-visualization`, and `lit-diagram-drawer`: bounded bare or exact natural routes load the bundled
370
383
  skill body for the matching explicit skill; they do not fall back to generic
371
384
  Litwork.
372
- - `lit goal`: bind one objective plus checkable criteria in
373
- `.hermes/lithermes/litgoal/`.
385
+ - `lit goal`: litgoal sets and keeps the finish line; lit-loop and start-work run toward it.
386
+ Bind one objective plus checkable criteria in `.hermes/lithermes/litgoal/`.
387
+ - `lit brainstorm` / `lit ideation` / `lit idea`: brainstorm-only. Diverge into many different
388
+ options, cluster, score against stated criteria, converge to a short list, ask the user to
389
+ pick or combine, then hand off to `deep-interview` (pick still vague) or `lit-plan` (pick
390
+ concrete). It never implements, creates no run or plan file, and keeps optional notes under
391
+ `.hermes/lithermes/brainstorm/<slug>/`. The route loads `lithermes:lit-brainstorm` through
392
+ `skill_view`.
374
393
  - `lit workflow` / `lit kanban`: durable-workflow setup/proposal mode through
375
394
  Hermes Kanban. Probe `hermes version`, `hermes kanban --help`, and
376
395
  `hermes profile list`; initialize/start gateway if missing; create/propose a
@@ -97,7 +97,7 @@ PORTED_SKILLS = [
97
97
  ),
98
98
  ("lit-pptx", "Create and inspect PowerPoint decks with the installed Office engine and QA gate."),
99
99
  ("lit-docx", "Create, edit, convert, and audit styled Word documents."),
100
- ("lit-typographic-motion", "Direct an original film from a treatment: a drawn stage film or a type film, gated before delivery."),
100
+ ("lit-typographic-motion", "Direct an original film from a treatment, or a seamless README cover loop, gated before delivery."),
101
101
  (
102
102
  "readme-studio",
103
103
  "Write factual READMEs and compose local covers with outlined type, honest image capability and verified motion.",
@@ -106,6 +106,10 @@ PORTED_SKILLS = [
106
106
  "lit-commit",
107
107
  "Run the LitHermes git-history specialist for commits, rebases, blame, and bisect.",
108
108
  ),
109
+ (
110
+ "lit-brainstorm",
111
+ "Many options for an open ask, then a short list",
112
+ ),
109
113
  (
110
114
  "lit-crucible",
111
115
  "Stress-test a plan with Hermes-native delegate_task lanes before handing off to /lit-plan.",
@@ -132,7 +136,7 @@ PORTED_SKILLS = [
132
136
  ),
133
137
  (
134
138
  "review-work",
135
- "Use when a patch, diff, branch or open changes need a defect or merge-readiness review with evidence per finding.",
139
+ "Use when a plan needs review before start-work, or finished work needs defect review with evidence per finding.",
136
140
  ),
137
141
  (
138
142
  "rules",
@@ -148,7 +152,7 @@ PORTED_SKILLS = [
148
152
  ),
149
153
  (
150
154
  "litgoal",
151
- "Drive the LitHermes litgoal durable runtime (criteria, evidence, gates).",
155
+ "Sets and keeps the finish line that lit-loop and start-work run toward.",
152
156
  ),
153
157
  (
154
158
  "litwork",
@@ -22,6 +22,7 @@ import calendar
22
22
  import json
23
23
  import os
24
24
  import re
25
+ import shutil
25
26
  import stat
26
27
  import subprocess
27
28
  import sys
@@ -215,7 +216,11 @@ def sanitized_environment(home: Path | None = None, source: dict[str, str] | Non
215
216
  home = (home or resolve_hermes_home()).resolve()
216
217
  source = source if source is not None else dict(os.environ)
217
218
  safe: dict[str, str] = {}
218
- for key in ("PATH", "HOME", "USERPROFILE", "TMPDIR", "TEMP", "TMP", "LANG", "LC_ALL", "LC_CTYPE", "TERM"):
219
+ # The Windows keys carry no secrets and npx cannot start without them.
220
+ for key in (
221
+ "PATH", "HOME", "USERPROFILE", "TMPDIR", "TEMP", "TMP", "LANG", "LC_ALL", "LC_CTYPE", "TERM",
222
+ "SYSTEMROOT", "WINDIR", "PATHEXT", "COMSPEC", "APPDATA", "LOCALAPPDATA",
223
+ ):
219
224
  value = source.get(key)
220
225
  if isinstance(value, str) and value:
221
226
  safe[key] = value
@@ -227,6 +232,14 @@ def sanitized_environment(home: Path | None = None, source: dict[str, str] | Non
227
232
  return safe
228
233
 
229
234
 
235
+ def resolve_command(name: str, env: dict[str, str] | None = None, *, platform: str | None = None, which: Any = shutil.which) -> str:
236
+ """Return the launchable path of a PATH command; on Windows npx is npx.cmd and a bare name is not found."""
237
+
238
+ if (platform or sys.platform) != "win32":
239
+ return name
240
+ return which(name, path=(env or {}).get("PATH")) or name
241
+
242
+
230
243
  def _read_install_receipt(home: Path) -> dict[str, Any] | None:
231
244
  return _read_state_json(home, "auto-update-receipt.json")
232
245
 
@@ -357,8 +370,9 @@ def run_auto_update(*, kwargs: dict[str, Any] | None = None, env: dict[str, str]
357
370
  previous_failure = _recent_failure(home, latest)
358
371
  if previous_failure is not None:
359
372
  return outcome({"status": "skipped", "reason": "backoff-after-failure", "latestVersion": latest}, previous_failure)
373
+ install_env = sanitized_environment(home, environment)
360
374
  command = [
361
- "npx",
375
+ resolve_command("npx", install_env),
362
376
  "--yes",
363
377
  "--package",
364
378
  f"{PACKAGE_NAME}@{latest}",
@@ -375,7 +389,7 @@ def run_auto_update(*, kwargs: dict[str, Any] | None = None, env: dict[str, str]
375
389
  result = runner(
376
390
  command,
377
391
  cwd=str(Path.cwd()),
378
- env=sanitized_environment(home, environment),
392
+ env=install_env,
379
393
  stdin=subprocess.DEVNULL,
380
394
  stdout=subprocess.PIPE,
381
395
  stderr=subprocess.PIPE,
@@ -106,6 +106,11 @@ try:
106
106
  except (ImportError, ModuleNotFoundError):
107
107
  import deliverable_hedge_guard as _deliverable_hedges
108
108
 
109
+ try:
110
+ from . import lit_reentry as _lit_reentry
111
+ except (ImportError, ModuleNotFoundError):
112
+ import lit_reentry as _lit_reentry
113
+
109
114
  # Current-turn state stays in the compatibility facade because tests and the
110
115
  # plugin register surface intentionally inspect it directly.
111
116
  _PENDING_IGNITE: set[str] = set()
@@ -204,6 +209,7 @@ def on_session_start(**kwargs: Any) -> None:
204
209
  """
205
210
  release_browser_drive_state(kwargs.get("session_id"))
206
211
  _deliverable_hedges.release_session(kwargs.get("session_id"))
212
+ _lit_reentry.forget(kwargs.get("session_id"))
207
213
  _rules.begin_session(str(kwargs.get("session_id") or ""))
208
214
  _auto_handoff.begin_session(kwargs.get("session_id"))
209
215
  _print_agents_nudge(str(kwargs.get("platform") or ""))
@@ -261,6 +267,7 @@ def consume_rules_context(**kwargs: Any) -> str:
261
267
  def release_rules_session(session_id: Any) -> None:
262
268
  _rules.end_session(str(session_id or ""))
263
269
  _deliverable_hedges.release_session(session_id)
270
+ _lit_reentry.forget(session_id)
264
271
 
265
272
  def ignite(result: str | dict[str, str], route: str = "litwork") -> str | dict[str, str]:
266
273
  """Draw a command acknowledgement and require a separate model probe."""
@@ -1700,6 +1707,11 @@ def pre_llm_call(**kwargs: Any) -> dict[str, str] | None:
1700
1707
  route = detect_lit_mode(user_message)
1701
1708
  if route is None:
1702
1709
  return None
1710
+ restart_rest = _lit_reentry.restart_rest(route.objective) if route.mode == "litwork" else None
1711
+ if restart_rest is not None:
1712
+ # `lit new ...` / `lit restart ...` drops the active mode and routes what follows it.
1713
+ _lit_reentry.forget(session_id)
1714
+ route = detect_lit_mode(f"lit {restart_rest}".strip()) or route
1703
1715
  _deliverable_hedges.activate_skill(session_id, route.mode)
1704
1716
 
1705
1717
  record_event(
@@ -1719,6 +1731,28 @@ def pre_llm_call(**kwargs: Any) -> dict[str, str] | None:
1719
1731
  _evict_pending_browser_state()
1720
1732
  return with_reader_contract(build_natural_mode_context(route), compact=True)
1721
1733
 
1734
+ active = discipline(route.mode) if session_id else ""
1735
+ compacted = _rules.compaction_stamp(kwargs.get("conversation_history"))
1736
+ step = _lit_reentry.decide(
1737
+ session_id,
1738
+ active,
1739
+ route.objective,
1740
+ workspace=Path.cwd().resolve(),
1741
+ compacted=compacted,
1742
+ review_required=detect_review_modifier(user_message),
1743
+ )
1744
+ if step.kind != "first":
1745
+ if step.discipline and session_id:
1746
+ _PENDING_DISCIPLINE[session_id] = step.discipline
1747
+ # The activation is already in this conversation; only a requested reader
1748
+ # mode is request-scoped and has to ride along.
1749
+ contract = (
1750
+ reader_facing_contract_block(requested_reader_mode, authority="current_user_request", compact=True)
1751
+ if requested_reader_mode is not None
1752
+ else ""
1753
+ )
1754
+ return {"context": "\n\n".join(part for part in (step.note, contract) if part)}
1755
+
1722
1756
  browser_report = None
1723
1757
  if route.mode == "browser-drive":
1724
1758
  # Measure once. The same structured report goes to the context and the guard.
@@ -1727,12 +1761,14 @@ def pre_llm_call(**kwargs: Any) -> dict[str, str] | None:
1727
1761
  arm_browser_drive_guard(session_id, browser_report)
1728
1762
  if route.mode == "lit-plan" and route.objective:
1729
1763
  planned = command_lit_plan(shlex.quote(route.objective))
1764
+ _lit_reentry.remember(session_id, active, plan=planned["plan"], compacted=compacted)
1730
1765
  return with_reader_contract(
1731
1766
  f"{build_natural_mode_context(route)}\n\n"
1732
1767
  f"Durable plan: {planned['plan']}",
1733
1768
  compact=True,
1734
1769
  )
1735
1770
  if route.mode != "litwork":
1771
+ _lit_reentry.remember(session_id, active, compacted=compacted)
1736
1772
  if route.mode in _SKILL_ROUTE_CONTRACTS:
1737
1773
  compact_contract = reader_facing_contract_block(
1738
1774
  requested_reader_mode,
@@ -1765,7 +1801,10 @@ def pre_llm_call(**kwargs: Any) -> dict[str, str] | None:
1765
1801
  command="lit",
1766
1802
  )
1767
1803
  run_binding = build_run_binding(load_run_state(run_dir))
1804
+ _lit_reentry.remember(session_id, active, run=str(run_dir), compacted=compacted)
1768
1805
  ui_handoff = litwork_ui_handoff(route.objective)
1806
+ # A bare `lit` with nothing active asks what to start; every other activation is unchanged.
1807
+ idle_note = f"\n\n{_lit_reentry.IDLE_NOTE}" if not run_binding and step.idle else ""
1769
1808
  if requested_reader_mode is None:
1770
1809
  if run_binding:
1771
1810
  return {
@@ -1774,8 +1813,8 @@ def pre_llm_call(**kwargs: Any) -> dict[str, str] | None:
1774
1813
  f"{reader_facing_contract_block(compact=True)}"
1775
1814
  )
1776
1815
  }
1777
- return {"context": LIT_CONTEXT + ui_handoff}
1778
- return with_reader_contract(build_litwork_context(run_binding) + ui_handoff)
1816
+ return {"context": LIT_CONTEXT + ui_handoff + idle_note}
1817
+ return with_reader_contract(build_litwork_context(run_binding) + ui_handoff + idle_note)
1779
1818
 
1780
1819
 
1781
1820
  def transform_llm_output(**kwargs: Any) -> str | None:
@@ -5,11 +5,13 @@ from pathlib import Path
5
5
 
6
6
  try:
7
7
  from .core_commands import build_korean_prose_cleanup_agent_message, build_lit_humanizer_agent_message
8
- from .core_contract import LIT_CONTEXT, _skill_body_block, contract_route_block, skill_view_reference, installed_web_probe_command, installed_motion_cli, MOTION_FILM_CONTEXT, MOTION_SUBCOMMANDS
8
+ from .core_contract import LIT_CONTEXT, LITGOAL_MEANING, _skill_body_block, contract_route_block, skill_view_reference, installed_web_probe_command, installed_motion_cli, MOTION_FILM_CONTEXT, MOTION_SUBCOMMANDS
9
+ from .core_review import review_mode_line, review_target
9
10
  from .core_routing import NaturalLitRoute, detect_ui_mode, motion_cue
10
11
  except (ImportError, ModuleNotFoundError):
11
12
  from core_commands import build_korean_prose_cleanup_agent_message, build_lit_humanizer_agent_message
12
- from core_contract import LIT_CONTEXT, _skill_body_block, contract_route_block, skill_view_reference, installed_web_probe_command, installed_motion_cli, MOTION_FILM_CONTEXT, MOTION_SUBCOMMANDS
13
+ from core_contract import LIT_CONTEXT, LITGOAL_MEANING, _skill_body_block, contract_route_block, skill_view_reference, installed_web_probe_command, installed_motion_cli, MOTION_FILM_CONTEXT, MOTION_SUBCOMMANDS
14
+ from core_review import review_mode_line, review_target
13
15
  from core_routing import NaturalLitRoute, detect_ui_mode, motion_cue
14
16
 
15
17
  # Intent-shaped skill routes: one wrapper each, same shape as the hand-written
@@ -453,6 +455,20 @@ def _build_natural_mode_context(
453
455
  "</lithermes-natural-route>",
454
456
  ]
455
457
  )
458
+ if route.mode == "lit-brainstorm":
459
+ return "\n".join(
460
+ [
461
+ "<lithermes-natural-route mode=\"lit-brainstorm\">",
462
+ contract_route_block("lit-brainstorm", surface="natural-route", compact=True),
463
+ "Natural routing: standalone lit brainstorm, lit ideation or lit idea -> lithermes:lit-brainstorm.",
464
+ f"Open ask: {escape(objective, quote=True)}",
465
+ "Mode Contract: brainstorm-only. Diverge into many different options (quantity before judgment), cluster, score against stated criteria, converge to a short list with trade-offs, ask the user to pick or combine. Do not implement, write a plan, run start-work, or start a run.",
466
+ "Handoff: a still-vague pick goes to deep-interview, a concrete pick goes to lit-plan; end with READY FOR deep-interview, READY FOR lit-plan, or NOT READY.",
467
+ "Notes, only when the session spans turns: .hermes/lithermes/brainstorm/<slug>/notes.md. Ask in plain text, at most one blocking question.",
468
+ skill_view_reference("lit-brainstorm", "for the lenses, scoring matrix, and handoff rules"),
469
+ "</lithermes-natural-route>",
470
+ ]
471
+ )
456
472
  if route.mode == "lit-crucible":
457
473
  return "\n".join(
458
474
  [
@@ -479,12 +495,13 @@ def _build_natural_mode_context(
479
495
  return "\n".join(
480
496
  [
481
497
  "<lithermes-natural-route mode=\"review-work\">",
482
- contract_route_block("review-work", surface="natural-route"),
498
+ contract_route_block("review-work", surface="natural-route", compact=True),
483
499
  "Natural routing: standalone lit review -> lithermes:review-work.",
484
- f"Review target: {objective}",
485
- "Mode Contract: verify only. Run the 5-lane review: goal/constraints, real-surface QA, code quality, security/safety, and context/docs/package readiness.",
486
- "All lanes must pass; timeout, missing evidence, inconclusive output, or cleanup gaps block approval.",
487
- _skill_body_block("review-work"),
500
+ review_mode_line(route.objective),
501
+ f"Review target: {review_target(route.objective) or objective}",
502
+ "Mode Contract: verify only. Plan review audits a draft plan before start-work; work review runs the 5-lane review: goal/constraints, real-surface QA, code quality, security/safety, and context/docs/package readiness.",
503
+ "Name the picked mode on the first line of the report. All work-review lanes must pass; timeout, missing evidence, inconclusive output, or cleanup gaps block approval.",
504
+ skill_view_reference("review-work", "for the plan review lanes, the five work-review lane prompts, and the verdict contracts"),
488
505
  "</lithermes-natural-route>",
489
506
  ]
490
507
  )
@@ -526,12 +543,13 @@ def _build_natural_mode_context(
526
543
  return "\n".join(
527
544
  [
528
545
  "<lithermes-natural-route mode=\"litgoal\">",
529
- contract_route_block("litgoal", surface="natural-route"),
546
+ contract_route_block("litgoal", surface="natural-route", compact=True),
530
547
  "Natural routing: standalone lit goal -> lithermes:litgoal.",
531
548
  f"Objective: {objective}",
549
+ LITGOAL_MEANING,
532
550
  "Mode Contract: bind one objective plus checkable criteria. Use goal_set with happy/edge/regression criteria before work proceeds.",
533
551
  "Durable state: .hermes/lithermes/litgoal/ via goal_* tools or `hermes lithermes goal status`.",
534
- _skill_body_block("litgoal"),
552
+ skill_view_reference("litgoal", "for the criteria, evidence, gate and steering procedure"),
535
553
  "</lithermes-natural-route>",
536
554
  ]
537
555
  )
@@ -36,7 +36,7 @@ def installed_web_probe_command() -> str:
36
36
  return f'node {shlex.quote(str(probe))} --url "$UI_URL" --out "$UIUX_EVIDENCE_DIR" --static "$PWD"'
37
37
 
38
38
 
39
- MOTION_SUBCOMMANDS = "stage|run|sound|look|gate|complete"
39
+ MOTION_SUBCOMMANDS = "stage|cover|run|sound|look|gate|cover-gate|complete"
40
40
  # The neutral film context every motion surface shares. It states the path rule
41
41
  # without choosing a path; the skill and the treatment decide.
42
42
  MOTION_FILM_CONTEXT = (
@@ -45,7 +45,7 @@ MOTION_FILM_CONTEXT = (
45
45
  "quote video, a title sequence, or supplied words with no other subject) at 16:9; stage for "
46
46
  "every other film, and for any 9:16. Hand-encoded films are not the deliverable. Bare lit asks "
47
47
  "nothing; label every invention and a generated sound bed. View stills with vision_analyze; "
48
- "done when $M complete exits 0."
48
+ "done when $M complete exits 0. A README cover loop takes cover mode (references/cover.md)."
49
49
  )
50
50
 
51
51
 
@@ -233,6 +233,11 @@ def _skill_body_block(name: str) -> str:
233
233
  return f"<lithermes-skill-body name=\"{name}\">\n{body}\n</lithermes-skill-body>"
234
234
 
235
235
 
236
+ # The one-line meaning of litgoal. The skill, the route, the slash command and the
237
+ # skill index all quote it, so the sentence is written once.
238
+ LITGOAL_MEANING = "litgoal sets and keeps the finish line; lit-loop and start-work run toward it."
239
+
240
+
236
241
  def skill_view_reference(name: str, when: str) -> str:
237
242
  """Point a per-turn route at a registered skill instead of inlining its body.
238
243