@litfamily/litclaude 1.0.31 → 1.0.33

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
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.33 - 2026-10-18
4
+
5
+ - Automatic updates no longer roll back on a slow link. The 18 MB package used to download inside the 30-second install limit, so on a slow connection the install timed out, rolled back and waited a day. The background refresh now downloads a newer version into the npm cache ahead of time, and the install only unpacks it. `litclaude doctor` prints `AUTO_UPDATE` lines that say whether an installed update is already running or takes effect in the next session, what the registry last answered, and one remedy per reason an update did not apply (offline, backoff, install timeout, ownership conflict, opted out, directory marketplace).
6
+ - Each prompt route now fits inside what Claude Code shows inline. Claude Code shows a hook's context in full only below 10,000 characters, and a bare `lit` prompt carried about 26 KB, so Claude saw only the first line and a pointer to a saved file. Routes now name the installed `SKILL.md` instead of pasting it, and put the activation, reply language and mode first. A bare `lit` prompt is now about 3 KB, and `lit-plan` and `litresearch` are similar.
7
+ - When a request matches no route, the hook now asks Claude to load the matching skill before reading the workspace. The descriptions of `review-work`, `litresearch`, `autoresearch`, `lit-humanizer`, `lit-init`, `lit-plan` and `visual-qa` now say when each one applies, so Claude picks the right one more often.
8
+ - The optional Jev skill hint is gone. In a side-by-side test it did not improve results, and in real sessions the model followed none of the skills it suggested. The prompt hook no longer sends anything to TypeSafe, the status line no longer shows a `✦Jev` badge and `litclaude doctor` no longer prints a `Jev skill hint` line. `LITCLAUDE_JEV`, the other `LITCLAUDE_JEV_*` variables and `TYPESAFE_API_KEY` are now ignored, so you can delete them from your shell. Anything left in a project's `.litclaude/jev/` folder is no longer read and can be deleted too.
9
+ - New tests cover guard paths that a deliberate break used to leave green: the humanizer guard, the LIT card chip history, the installer and doctor, the version guard and automatic update. Each one fails when its guard is broken on purpose.
10
+
11
+ ## 1.0.32 - 2026-10-17
12
+
13
+ - The desktop mod card has its look and motion back. 1.0.31 drew it with the app's plain boxes and text to stop it blinking, but that also took away its design and all of its animation. This release restores the animated card from 1.0.30. Its animations now start already visible, so when the app reloads the card after a real change, the card no longer fades in from blank or restarts its border light from the corner. The clock stays off the desktop card, so a running tool alone does not reload it. The terminal and phone cards are unchanged.
14
+
3
15
  ## 1.0.31 - 2026-10-17
4
16
 
5
17
  - In the Claude Code desktop app, the mod card used to blink: every real change, such as a new step, tool or skill, swapped in a whole new page, so the card went blank for a moment and its animations started over. The desktop card is now built from the app's own boxes and text, and a change updates only what moved. It looks the same but no longer animates. The terminal and phone cards are unchanged.
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/litclaude@1.0.31/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/docs/assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitClaude 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/litclaude@1.0.33/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/docs/assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitClaude robot wakes with glowing eyes and a lit frame, then LITFAMILY and KEEP THE WORK LIT. light up." /></picture></p>
2
2
 
3
3
  <h1 align="center">LitClaude</h1>
4
4
  <p align="center"><strong>Keep the work lit.</strong></p>
5
5
  <p align="center">A Claude Code plugin that helps every session plan the work, build it, check it, and leave a note the next session can pick up.</p>
6
6
  <p align="center">
7
- <img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/docs/assets/readme/badge-version.svg" alt="1.0.31" />
8
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
7
+ <img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/docs/assets/readme/badge-version.svg" alt="1.0.33" />
8
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
9
9
  </p>
10
10
  <p align="center">
11
- <a href="https://github.com/wjgoarxiv/litclaude#readme">Full guide and skills gallery on GitHub</a> · <a href="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/README_ko-KR.md">한국어</a>
11
+ <a href="https://github.com/wjgoarxiv/litclaude#readme">Full guide and skills gallery on GitHub</a> · <a href="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/README_ko-KR.md">한국어</a>
12
12
  </p>
13
13
 
14
14
  Add `lit` to a Claude Code prompt and Claude pins the goal, writes a failing test first,
@@ -53,9 +53,6 @@ Then open the file and try the three actions yourself. That is how you find out
53
53
  | `handoff` | A continuation file for the next session |
54
54
  | `<make slides …> lit`, `<write a report …> lit` | Editable `.pptx` and `.docx` files |
55
55
 
56
- The optional Jev skill hint is off by default; turning it on sends your prompts to a third
57
- party, TypeSafe, so read [its page](https://github.com/wjgoarxiv/litclaude/blob/main/docs/jev.md) first.
58
-
59
56
  ## Check, update and remove
60
57
 
61
58
  ```bash
@@ -73,7 +70,7 @@ the `/plugin` menu.
73
70
  ## More
74
71
 
75
72
  - [Full guide and skills gallery on GitHub](https://github.com/wjgoarxiv/litclaude#readme)
76
- - [Privacy and network behavior](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/docs/privacy.md)
77
- - [Migration and ownership conflicts](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/docs/migration.md)
78
- - [Release history](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/CHANGELOG.md)
79
- - [MIT license](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/LICENSE)
73
+ - [Privacy and network behavior](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/docs/privacy.md)
74
+ - [Migration and ownership conflicts](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/docs/migration.md)
75
+ - [Release history](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/CHANGELOG.md)
76
+ - [MIT license](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/LICENSE)
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/litclaude@1.0.31/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/docs/assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 다섯 로봇 패널이 차례로 켜지고, LitClaude 로봇의 눈과 테두리가 빛난 뒤 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/litclaude@1.0.33/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/docs/assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 다섯 로봇 패널이 차례로 켜지고, LitClaude 로봇의 눈과 테두리가 빛난 뒤 LITFAMILY와 KEEP THE WORK LIT. 문구가 밝아지는 영상" /></picture></p>
2
2
 
3
3
  <h1 align="center">LitClaude</h1>
4
4
  <p align="center"><strong>Keep the work lit.</strong></p>
5
5
  <p align="center">Claude Code에서 세션마다 계획하고, 만들고, 확인한 뒤 다음 세션이 이어받을 기록을 남기게 돕는 플러그인입니다.</p>
6
6
  <p align="center">
7
- <img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/docs/assets/readme/badge-version.svg" alt="1.0.31" />
8
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
7
+ <img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/docs/assets/readme/badge-version.svg" alt="1.0.33" />
8
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
9
9
  </p>
10
10
  <p align="center">
11
- <a href="https://github.com/wjgoarxiv/litclaude/blob/main/README_ko-KR.md">전체 안내와 스킬 갤러리는 GitHub에서</a> · <a href="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/README.md">English</a>
11
+ <a href="https://github.com/wjgoarxiv/litclaude/blob/main/README_ko-KR.md">전체 안내와 스킬 갤러리는 GitHub에서</a> · <a href="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/README.md">English</a>
12
12
  </p>
13
13
 
14
14
  Claude Code 프롬프트에 `lit`을 붙이면 Claude가 목표를 고정하고, 실패하는 테스트를 먼저 쓰고,
@@ -52,9 +52,6 @@ npx @litfamily/litclaude@latest install
52
52
  | `handoff` | 다음 세션을 위한 이어가기 파일 |
53
53
  | `<발표자료 만들어줘 …> lit`, `<보고서 써줘 …> lit` | 편집할 수 있는 `.pptx`, `.docx` 파일 |
54
54
 
55
- 선택 기능인 Jev 스킬 힌트는 기본으로 꺼져 있습니다. 켜면 프롬프트가 외부 서비스 TypeSafe로
56
- 전송되니 [설명 페이지](https://github.com/wjgoarxiv/litclaude/blob/main/docs/jev_ko-KR.md)를 먼저 읽어 주세요.
57
-
58
55
  ## 확인, 업데이트, 제거
59
56
 
60
57
  ```bash
@@ -71,7 +68,7 @@ LitClaude는 프로젝트 상태를 `.litclaude/`에 두고, 그 안의 `.gitign
71
68
  ## 더 보기
72
69
 
73
70
  - [전체 안내와 스킬 갤러리 (GitHub)](https://github.com/wjgoarxiv/litclaude/blob/main/README_ko-KR.md)
74
- - [개인정보와 네트워크 동작](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/docs/privacy.md)
75
- - [이전과 소유권 충돌](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/docs/migration.md)
76
- - [변경 이력](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/CHANGELOG.md)
77
- - [MIT 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.31/LICENSE)
71
+ - [개인정보와 네트워크 동작](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/docs/privacy.md)
72
+ - [이전과 소유권 충돌](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/docs/migration.md)
73
+ - [변경 이력](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/CHANGELOG.md)
74
+ - [MIT 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.33/LICENSE)
@@ -41,8 +41,7 @@ import { runLitgoalCli } from "../plugins/litclaude/lib/litgoal/cli.mjs";
41
41
  import { runWorkflowCheckCli } from "../plugins/litclaude/lib/workflow-check.mjs";
42
42
  import { runWorkflowStageCli } from "../plugins/litclaude/lib/workflow-stage.mjs";
43
43
  import { runWikifyKnowledgeCli } from "../plugins/litclaude/lib/wikify-knowledge-cli.mjs";
44
- import { automaticUpdateRoot, runAutomaticUpdate } from "../plugins/litclaude/lib/automatic-update.mjs";
45
- import { jevStatusLine } from "../plugins/litclaude/lib/jev-skill-hint.mjs";
44
+ import { automaticUpdateDoctorLines, automaticUpdateRoot, runAutomaticUpdate } from "../plugins/litclaude/lib/automatic-update.mjs";
46
45
  import { autoHandoffDoctorLines } from "../plugins/litclaude/lib/auto-handoff.mjs";
47
46
  import { resolveProjectStateRoot } from "../plugins/litclaude/lib/project-state-root.mjs";
48
47
  import { runUpdateNotifier } from "./update-notifier.mjs";
@@ -1495,11 +1494,11 @@ const doctor = ({ dryRun }) => {
1495
1494
  process.stdout.write(`Would check Claude statusLine HUD: ${hudCommandForPlugin(pluginPath)}\n`);
1496
1495
  process.stdout.write("Would check global Claude settings permissions.allow/deny and LitClaude ownership-safe removal metadata\n");
1497
1496
  process.stdout.write(`Would inspect automatic-update receipt/journal under: ${join(automaticUpdateRoot(litHome()), "receipt.json")}\n`);
1497
+ for (const line of automaticUpdateDoctorLines({ env: process.env, litHome: litHome(), claudeHome: claudeHome() })) process.stdout.write(`${line}\n`);
1498
1498
  process.stdout.write(`Would run: node ${join(pluginPath, "bin", "litclaude-scientific-visualization-doctor.js")}\n`);
1499
1499
  process.stdout.write(`Would report: node ${join(pluginPath, "lib", "office-runtime.mjs")} status\n`);
1500
1500
  process.stdout.write(`Would report: node ${join(pluginPath, "skills", "lit-typographic-motion", "scripts", "motion-doctor.mjs")} (Chrome, ffmpeg, WebGL2 renderer, software-GL warning, motion pre-warm)\n`);
1501
1501
  process.stdout.write("Would verify exact canonical frontend corpus bytes, legal companions, no extras, and three canonical runtime closures\n");
1502
- process.stdout.write(`${jevStatusLine(process.env)}\n`);
1503
1502
  writeAutoHandoffDoctorLines();
1504
1503
  process.stdout.write(`${iconFontDoctorLine()}\n`);
1505
1504
  return;
@@ -1590,7 +1589,6 @@ const doctor = ({ dryRun }) => {
1590
1589
  for (const line of `${officeRuntime.stdout || officeRuntime.stderr || ""}`.trim().split("\n").filter(Boolean)) {
1591
1590
  process.stdout.write(`OFFICE_RUNTIME: ${line}\n`);
1592
1591
  }
1593
- process.stdout.write(`${jevStatusLine(process.env)}\n`);
1594
1592
  writeAutoHandoffDoctorLines();
1595
1593
  process.stdout.write(`${iconFontDoctorLine()}\n`);
1596
1594
  process.stdout.write(`MOD_OPTIONS: ${modOptionsLine(readClaudeSettings())}\n`);
@@ -1629,6 +1627,7 @@ const doctor = ({ dryRun }) => {
1629
1627
  if (existsSync(automaticReceiptPath)) {
1630
1628
  process.stdout.write(`AUTOMATIC_UPDATE_RECEIPT: ${automaticReceiptPath}\n`);
1631
1629
  }
1630
+ for (const line of automaticUpdateDoctorLines({ env: process.env, litHome: litHome(), claudeHome: claudeHome() })) process.stdout.write(`${line}\n`);
1632
1631
  const settings = readClaudeSettings();
1633
1632
  const permissionFailures = permissionIntegrityFailures(settings);
1634
1633
  if (permissionFailures.length > 0) {
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="release: 1.0.31"><title>release: 1.0.31</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.31</text></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="release: 1.0.33"><title>release: 1.0.33</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.33</text></g></svg>
package/docs/hooks.md CHANGED
@@ -103,7 +103,7 @@ silent no-op for callers that still invoke it directly.
103
103
  | Event | Runner | Purpose |
104
104
  | --- | --- | --- |
105
105
  | `SessionStart` | `plugins/litclaude/bin/litclaude-hook.js session-start` | Runs the bounded foreground automatic-update barrier on a fresh session (or starts the detached version-cache refresh when the cache is stale), discovers repo-local rule files, names the newest valid `plans/<slug>.md`, and on `source: compact` spends one of two durable re-injection reservations at reduced caps and, with automatic handoff on, reloads the fresh handoff once. |
106
- | `UserPromptSubmit` | `plugins/litclaude/bin/litclaude-hook.js user-prompt-submit` | Detects prompt routes and injects workflow context; independently delivers static rules not already recorded for this session; with `LITCLAUDE_JEV=1` and `TYPESAFE_API_KEY` set, adds at most one Jev skill hint line to an unrouted turn; answers the exact prompts `lit-handoff auto on <percent>`, `lit-handoff auto off` and `lit-handoff auto status` by changing or reporting the automatic handoff setting. |
106
+ | `UserPromptSubmit` | `plugins/litclaude/bin/litclaude-hook.js user-prompt-submit` | Detects prompt routes and injects workflow context; independently delivers static rules not already recorded for this session; answers the exact prompts `lit-handoff auto on <percent>`, `lit-handoff auto off` and `lit-handoff auto status` by changing or reporting the automatic handoff setting. |
107
107
  | `PreToolUse` | `plugins/litclaude/bin/litclaude-hook.js pre-tool-use` | Enforces semantic action/root grants before Write, Edit, MultiEdit, NotebookEdit, Bash, Agent, and bounded read tools execute; denies supported reader-facing text writes with a humanizer block-tier finding. |
108
108
  | `PostToolUse` | `plugins/litclaude/bin/litclaude-hook.js post-tool-use` | Moves the LIT card's stage record on from what the tool did (plan saved, task checked, lit-loop step, a reviewer's verdict from an `Agent` result). Names the post-edit checks the edit actually earned, injects any glob-scoped rule matching the edited paths, and checks successfully created DOCX/PPTX/PDF files for humanizer findings, including paths reported by Bash output. |
109
109
  | `PostToolUseFailure` | `plugins/litclaude/bin/litclaude-hook.js post-tool-use-failure` | For a Bash command that exits non-zero, such as a bare failing `npm test`, moves the LIT card's lit-loop map from what the command wrote and from its failing test run, which never counts as VERIFY. Nothing else runs on a failed tool. |
@@ -205,87 +205,44 @@ under `update-notifier/automatic/` is `rolled-back` or `failed` and less than 24
205
205
  so a version that just failed is retried once a day, not on every session. A newer version
206
206
  is tried at once.
207
207
 
208
- ### Jev skill hint (optional)
209
-
210
- `plugins/litclaude/lib/jev-skill-hint.mjs` is off unless both `LITCLAUDE_JEV=1` and a
211
- non-empty `TYPESAFE_API_KEY` are in the hook's environment. The key is read from the
212
- environment only; the hook never reads a key file and never writes, prints, or traces the key.
213
-
214
- A turn is eligible only when the deterministic router chose no route, the prompt is not a
215
- slash command, a `!` shell line, or a host-expanded command, it names no skill (a
216
- `litclaude:` name or a hyphenated or `lit`-prefixed catalog ID), and at least four
217
- non-space characters remain after host notification blocks are removed. The exact bare
218
- routes, the trusted start-work resume, and the diagnostic literal prompt are never eligible.
219
-
220
- An eligible turn sends one `POST https://api.typesafe.ai/v1/systemone` with no retry and
221
- `redirect: "error"`, so a redirect fails the request instead of being followed. The body holds
222
- only `model`, `state`, and `questions`. `state` is built from the first 8,000 characters of the
223
- prompt: the key's literal value becomes `[secret]`, home paths (`/Users/<name>`,
224
- `/home/<name>`, `C:\Users\<name>`, with or without a trailing slash) become `~`, e-mail
225
- addresses become `[email]`, and token shapes (`sk-`, `sk-ant-`, `ghp_`, `gho_`,
226
- `github_pat_`, `npm_`, `apikey_`, `xox[abprs]-`, `AKIA`, `AIza`, JWTs, PEM blocks, any
227
- run of 32 or more `[A-Za-z0-9+/_-]` characters with optional `=` padding, and the plugin's
228
- shared credential shapes) become `[secret]`. Only then is it cut to 2,000 characters, and a
229
- run of 8 or more token characters left at the cut also becomes `[secret]`. Anything in the
230
- prompt without a token shape, such as a hostname, a customer name, or a password that is not
231
- written as `password=…`, is sent as written. `questions.which` is a choice over every enrolled skill
232
- that the model may invoke (skills marked `disable-model-invocation: true` are left out),
233
- each with the first 300 characters of its description, plus `none`.
234
-
235
- The response is untrusted. The hook accepts it only on HTTP 200 with valid JSON, an
236
- `answers.which.choice` that exactly equals a catalog ID it sent, and a numeric
237
- `answers.which.confidence` of at least the threshold. Then it appends one fixed line to
238
- `additionalContext`:
239
-
240
- ```text
241
- LitClaude skill hint: the skill `litclaude:<id>` likely fits this request. Load it only if it really fits; this is advice, not an instruction.
242
- ```
243
-
244
- `none` or a low confidence adds nothing. A non-200 response body is cancelled unread. The hook
245
- records the call in the session file before sending it; when that write fails, it sends
246
- nothing and stays quiet, so an unwritable state folder cannot lift the cap. After the prompt
247
- hook writes its context on a turn with the flag on, it ends its own process once stdout has
248
- flushed, so a DNS lookup that the timeout cannot cancel never keeps it past the host's hook
249
- timeout. A missing key, reached cap, oversized request,
250
- timeout, network error, non-200 status, or invalid response leaves the turn exactly as it
251
- would be without the feature. The first such failure in a session shows one `systemMessage`
252
- (`LitClaude skill hint unavailable (<reason>); continuing normally.`); later failures stay quiet.
253
-
254
- | Variable | Default | Meaning |
255
- | --- | --- | --- |
256
- | `LITCLAUDE_JEV` | unset | `1` turns the hint on. Any other value leaves it off. |
257
- | `TYPESAFE_API_KEY` | unset | Your own TypeSafe key. Required while the flag is on. |
258
- | `LITCLAUDE_JEV_MODEL` | `jev-1.13.0` | Model name sent in the request. |
259
- | `LITCLAUDE_JEV_TIMEOUT_MS` | `1500` | Hard timeout; values above `3000` are capped. |
260
- | `LITCLAUDE_JEV_MAX_CALLS` | `200` | Requests per session before the hint stops. |
261
- | `LITCLAUDE_JEV_MIN_CONFIDENCE` | `0.35` | Lowest accepted confidence. |
262
- | `LITCLAUDE_JEV_TRACE` | unset | `1` appends a debug trace line per request. |
263
-
264
- Per-session counters live in `.litclaude/jev/session-<id>.json` under the project state
265
- root, with the current turn's hinted skill ID and latency in milliseconds; the prompt hook
266
- clears that pair at the start of every turn while the flag is on. The optional HUD status line
267
- (`plugins/litclaude/bin/litclaude-hud.js`) reads it and puts a badge right after the model
268
- label: `✦Jev` while the hint is on, `✦Jev → <skill>` on a hinted turn, or `✦Jev ⚠ key` when
269
- the flag is on without a key; it shows nothing while the flag is off, never shows the latency,
270
- and never shows the key or its length. While on, the HUD paints `✦` gold, the hinted skill green
271
- and the missing-key badge amber, and paints `Jev` as a rainbow whose starting hue follows the
272
- clock, so each refresh shifts it slightly (truecolor, 256- and 16-colour tiers; plain under
273
- `NO_COLOR` or the HUD's no-colour switch; a light or unknown appearance keeps the words on the
274
- default foreground and colours only the marks). The session file also records that the
275
- once-per-session `✦ Jev skill hint ON ✦` `systemMessage` was shown; the prompt hook writes that
276
- mark before it emits the line on the first turn with the flag and key set, puts the line ahead
277
- of any other visible message that turn, and shows no line when the mark cannot be written. The opt-in trace, `.litclaude/jev/trace.jsonl`, records the timestamp, the SHA-256 of the
278
- redacted `state` (never of the raw prompt), chosen ID, confidence, latency, HTTP status, and fallback reason; it holds no prompt text,
279
- key, or response body. Session and trace files are opened with `O_NOFOLLOW` (an `lstat` check
280
- where the platform lacks it), so a symlink planted at either path is refused rather than written
281
- through. The `.litclaude` and `.litclaude/jev` folders must be real folders too: when either one
282
- is a symlink, the hint reads and writes nothing there, sends no request, and shows no hint or note. Because `TYPESAFE_API_KEY` is exported in the shell that starts Claude Code, the
283
- agent's own tools can read it too; use a key dedicated to this feature, with a low spend limit.
284
- `litclaude doctor` prints `Jev skill hint: off`, `Jev skill hint: on`,
285
- or `Jev skill hint: flag on but TYPESAFE_API_KEY missing`. The Jev page shows each
286
- visible state in sample output under
287
- [What you will see](https://github.com/wjgoarxiv/litclaude/blob/main/docs/jev.md#what-you-will-see). The offline regression tests,
288
- which replace `fetch` in the real hook process, live in `test/jev-skill-hint.test.mjs`.
208
+ When the refresh child learns of a version newer than the one the session runs, it also
209
+ downloads that version with `npm cache add`, with the same HOME and the same empty npmrc
210
+ the install uses, so both read one npm cache. The package is about 18 MB. Over a 500 kB/s
211
+ link a cold download alone outlasts the 30-second install limit, and the install then rolls
212
+ back and waits a day; with the tarball already cached, the install only unpacks it. The
213
+ download has a 10-minute limit, nothing waits for it, and it records `prefetch-finished` in
214
+ `journal.jsonl`. If it has not finished, the install downloads the package as before.
215
+
216
+ An update takes three sessions: one learns of the version, the next installs it, and the
217
+ one after that is the first to run it, because Claude Code keeps running the plugin folder a
218
+ session started with. The first session that runs the installed version writes
219
+ `firstSessionAt` into the receipt.
220
+
221
+ `litclaude doctor` (and `--dry-run doctor`) reports this as `AUTO_UPDATE:` lines, read from
222
+ files only:
223
+
224
+ | Line | Meaning |
225
+ |---|---|
226
+ | `AUTO_UPDATE: installed <new>, running <old>: takes effect in the next session` | The receipt names the install and no session has run it yet. |
227
+ | `AUTO_UPDATE: running <new> since <time>` | A session has started on the installed version. |
228
+ | `AUTO_UPDATE: <version> was not applied (<status> at <time>)` | The last attempt rolled back or failed. |
229
+ | `AUTO_UPDATE_CHECK:` | The last registry answer and when the next check may run. |
230
+ | `AUTO_UPDATE_REMEDY: <cause>: <remedy>` | One row per cause that applies. |
231
+ | `AUTO_UPDATE_LIMIT:` | The doctor cannot see which version an open session has loaded. |
232
+
233
+ | Cause | When | Remedy |
234
+ |---|---|---|
235
+ | `next-session` | installed, not yet run | Start a new Claude Code session. |
236
+ | `offline` | the last registry check got no answer | Check the network or `npm_config_registry`, or update by hand. |
237
+ | `backoff` | the target failed less than 24 hours ago | Wait for the time shown, or update by hand. |
238
+ | `install-timeout` | npm did not finish in 30 seconds | Update by hand; it has no time limit. |
239
+ | `ownership-conflict` | the install met a file LitClaude did not write | Update by hand to see the path, move the file aside, retry. |
240
+ | `install-failed` | npm or the post-install doctor failed | Update by hand to see the error. |
241
+ | `rollback-failed` | the old install could not be restored | Update by hand before relying on the install. |
242
+ | `opted-out` | one of the opt-out names is set | Unset it, or update by hand after a release. |
243
+ | `directory-source` | the marketplace is a local directory | Informational: Claude Code does not update it, so this hook is the only automatic path. |
244
+
245
+ "Update by hand" is `npx @litfamily/litclaude@latest update`.
289
246
 
290
247
  ## Automatic handoff
291
248
 
@@ -462,22 +419,19 @@ step's spinner (`- \ | /`) and clock are ASCII, and a glyph swaps only together
462
419
 
463
420
  The desktop app's Code tab, and the other surfaces that are not a terminal, draw a mod's `Text` in
464
421
  a proportional font and cut each span to the cells it was laid out for, so the card above comes
465
- apart there. In the desktop app the mod builds the same five rows from the app's own boxes and
466
- text instead (`lib/mod/native-card.mjs`): a dark card with a rounded border, the LIT pill, the
467
- stage pills, the running tool, the skill chips and the usage figures, each row laid out by the app
468
- in its monospaced face. The app updates that card in place when something changes, so a new stage,
469
- tool or skill no longer blanks it. It holds still: the app's boxes and text have no animation, and
470
- the card shows the settled state with no entrances or crossfades.
471
-
472
- On a phone the card is one `Svg` drawing (`lib/mod/svg-card.mjs`): monospace text placed by
473
- counted cells, real pills and a rounded border. While LitClaude works it moves with SMIL animation
474
- inside the drawing: the pill and the border breathe and the step's spinner turns, and on `full` a
475
- light crosses the current stage and the current chips, a head runs the rail leaving it, the count
476
- bar's head shimmers and a comet runs around the border. An idle card is a still image.
477
-
478
- Neither the desktop card nor the phone drawing has the step clock or the loop countdown: a new
479
- drawing restarts the phone's animation, and the desktop card would only show a frozen clock. Both
480
- name the running tool and show the loop round, and are redrawn only when something you would
422
+ apart there. On those surfaces the mod draws the same five rows as one `Svg` element instead
423
+ (`lib/mod/svg-card.mjs`): monospace text placed by counted cells, real pills and a rounded border.
424
+ It shows the settled state, with no entrances or crossfades. While LitClaude works it moves with
425
+ SMIL animation inside the drawing, which the surface runs in a script-less sandboxed frame: the
426
+ pill and the border breathe and the step's spinner turns, and on `full` a light crosses the
427
+ current stage and the current chips, a head runs the rail leaving it, the count bar's head
428
+ shimmers and a comet runs around the border. An idle card is a still image. The app loads each new
429
+ drawing from scratch and restarts its animation, so this card names the running tool without its
430
+ clock and shows the loop round without its countdown. Each animation starts part way through its
431
+ cycle, so a freshly loaded card already looks like the running one: the border and the pill are
432
+ lit, the light sits on its pill and the comet is part way round, not parked at the top-left
433
+ corner. The app still blanks the card for a moment while it loads a new drawing; the mod cannot
434
+ prevent that. It is redrawn only when something you would
481
435
  notice changes, such as the stage, the tool, a skill, a usage figure or the goal. While the card
482
436
  shows in a terminal and the app at once, the terminal's loop countdown and lane times wait for such
483
437
  a change too; its step clock keeps counting on its own.
@@ -806,9 +760,7 @@ host-dependent and need fallbacks.
806
760
 
807
761
  Hooks parse JSON from stdin and return JSON to Claude Code. The hook does not
808
762
  execute prompt text and does not echo prompt text into the returned context;
809
- prompt text is not executed or echoed. The optional Jev skill hint is the one network
810
- call on this path: it is off by default, sends only redacted prompt text, and returns a fixed
811
- sentence rather than any response text. The litwork detector returns constant
763
+ prompt text is not executed or echoed. The litwork detector returns constant
812
764
  workflow guidance, so a prompt cannot become a shell command through the hook
813
765
  response. Malformed hook input and malformed litgoal JSON should surface a controlled error instead of a misleading success response.
814
766
 
@@ -844,6 +796,16 @@ Activated UserPromptSubmit routes render the plain mark
844
796
  `🔥 **LIT IGNITED · <discipline>** 🔥` line. The system mark and reply probe are
845
797
  separate outputs; the model must not draw ASCII art or emit a second probe.
846
798
 
799
+ Claude Code shows a hook's `additionalContext` inline only while it stays under 10,000
800
+ characters; a longer block reaches the model as a saved-file stub with a preview of about
801
+ 2 KB. Each activated route therefore keeps its whole context under that limit and puts the
802
+ probe line, the activation-word note, the reply language, the `Skill(<route>)` request and
803
+ the mode contract first. The route's SKILL.md is named by its installed path inside
804
+ `<litclaude-skill-body>`, and the model loads it from there. `lit-recap` keeps its skill
805
+ body inline because it fits; the exact bare `handoff` and `lit-scientific-visualization`
806
+ prompts still carry their canonical sources inline. The per-route byte budgets live in
807
+ `test/prompt-context-budget.test.mjs`.
808
+
847
809
  Hook JSON uses uncolored rows. CLI output uses the 44×20 Ignition B banner and
848
810
  native product column inside the existing installer frame; `--help` and doctor
849
811
  share that mark. The micro envelope remains 16×5, with eleven active columns.
package/docs/privacy.md CHANGED
@@ -13,7 +13,6 @@ transcript, model request, or diagnostic report contains no sensitive informatio
13
13
  | Package installation | npm and its configured registry retrieve package metadata and package bytes; ordinary package-manager connection metadata is visible to those services. Global installation can run LitClaude's postinstall setup. | `LITCLAUDE_AUTO_INSTALL=0` or `LITCLAUDE_POSTINSTALL_SKIP=1` skips automatic plugin/HUD setup. It does not stop npm from fetching the package. |
14
14
  | Update notice | Interactive `install`, `update`, and `doctor` can schedule an HTTPS GET to `registry.npmjs.org` for the package's latest-version metadata. A fresh Claude Code session (`SessionStart`) does the same in a detached background process when the cached result is missing or older than 24 hours; that request goes to `npm_config_registry` when it is set to a plain origin. The request identifies the package and sends an update-notifier user-agent; the request body does not contain project files or prompts. | Attempts are throttled using a 24-hour local cache. `NO_UPDATE_NOTIFIER` or `LITCLAUDE_NO_UPDATE_CHECK` disables the notice/check path, even when the variable is empty. CI, JSON, dry-run, and non-TTY management calls are gated. |
15
15
  | Automatic update | An eligible cached newer version can trigger npm to fetch and run the installer, then doctor. This can occur on `SessionStart` or interactive management commands. | `LITCLAUDE_NO_AUTO_UPDATE` disables automatic installation and the SessionStart check that feeds it, but leaves the interactive update notice eligible. An install is skipped when Claude Code already lists that version or a newer one. `LITCLAUDE_NO_UPDATE_CHECK` or `NO_UPDATE_NOTIFIER` disables both paths. SessionStart is a piped host hook, so it does not use the management TTY requirement. |
16
- | Jev skill hint | Off by default. With `LITCLAUDE_JEV=1` and your own `TYPESAFE_API_KEY`, the `UserPromptSubmit` hook sends one HTTPS POST per eligible prompt to `api.typesafe.ai`. The body holds the prompt truncated to 2,000 characters with home paths, e-mail addresses, and token-shaped strings redacted, plus the list of LitClaude skill names and descriptions. Anything in the prompt without a token shape, such as a hostname, a customer name, or a password not written as `password=…`, is sent as written. No files, tool output, or history are sent. TypeSafe bills the request to your account (about $0.04 per million input tokens). | Unset `LITCLAUDE_JEV` to turn it off. Slash commands, routed prompts, and prompts that name a skill are never sent. Each request has a 1.5-second timeout, no retry, no redirect, and a per-session cap of 200. Because `TYPESAFE_API_KEY` is exported in the shell that starts Claude Code, the agent's own tools can read it; use a key dedicated to this feature, with a low spend limit. |
17
16
  | Public source reader | `litclaude public-read` resolves DNS and sends HTTP(S) GET requests to the supplied public URL and validated redirects. Plain search text becomes a query to `duckduckgo.com/html/`. Requests use a LitClaude user-agent and Accept header. The destination sees the requested path and query, plus normal connection metadata. | The reader rejects credential-bearing URLs and private-network targets, revalidates redirects, and stops at detected authentication/paywall barriers. It does not use a browser login or cookie jar. Redacting a URL in returned evidence does not remove query values from the actual request. |
18
17
 
19
18
  For a process that should avoid LitClaude background update traffic, set
@@ -42,10 +41,8 @@ the features used, it contains session/rule receipts, plan and goal state, work
42
41
  ledgers, saved knowledge, and other feature-specific records. SessionStart
43
42
  context-pressure detection can inspect a supplied transcript path up to 256 KiB
44
43
  for a fixed set of pressure markers; it returns only a bounded advisory. No skill
45
- review reads transcript excerpts or sends them to a model. The optional Jev skill hint keeps
46
- per-session request counts, the current turn's hinted skill ID (shown by the HUD) and
47
- latency, and whether the once-per-session "on" line was shown in `.litclaude/jev/` and, only with `LITCLAUDE_JEV_TRACE=1`, a trace
48
- of hashes of the redacted prompt, timings, and status codes without prompt text. Existing
44
+ review reads transcript excerpts or sends them to a model. Files that the removed Jev skill
45
+ hint left in `.litclaude/jev/` are no longer read or written and may be deleted. Existing
49
46
  `pending-review.json` and `skill-loop-state.json` files are inert after the
50
47
  automatic review feature's removal and may be deleted. The opt-in automatic handoff keeps `settings.json` (on or off, and the percent you chose), one `context-<session>.json` per session (the context percent and window size the status line last saw) and one `session-<session>.json` per session (whether this session's crossing was spent, when, and the random id the handoff must carry) in `.litclaude/auto-handoff/`. It reads a handoff file named `HANDOFF.md` or `.handoff/HANDOFF.md` only after compaction, up to 256 KiB, and puts the path and its first 4,000 characters into the model context; nothing is sent anywhere else. With no status line and `LITCLAUDE_AUTO_HANDOFF_WINDOW` set, the Stop hook reads the last usage entry of the transcript to compute a percent and keeps only that number. No other state is affected.
51
48
 
@@ -80,7 +77,6 @@ for sensitive reports and [support guidance](../SUPPORT.md) for routine issues.
80
77
  - [Public requests and redirects](../plugins/litclaude/lib/public-source-reader/routes.mjs),
81
78
  [target validation](../plugins/litclaude/lib/public-source-reader/validator.mjs), and
82
79
  [receipt redaction](../plugins/litclaude/lib/public-source-reader/receipts.mjs).
83
- - [Jev skill hint request, redaction, and validation](../plugins/litclaude/lib/jev-skill-hint.mjs).
84
80
  - [Project state-root resolution](../plugins/litclaude/lib/project-state-root.mjs),
85
81
  [rules session receipts](../plugins/litclaude/lib/rules/session-state.mjs), and
86
82
  [litgoal state](../plugins/litclaude/lib/litgoal/state.mjs).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litfamily/litclaude",
3
- "version": "1.0.31",
3
+ "version": "1.0.33",
4
4
  "description": "Claude Code plugin: add lit to a prompt and Claude plans, tests, checks and reviews the work, then leaves a handoff for the next session.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -56,7 +56,7 @@
56
56
  "postpack": "node tools/readme-for-npm.mjs restore",
57
57
  "check:npm-readme": "node tools/readme-for-npm.mjs check",
58
58
  "postinstall": "node scripts/postinstall.mjs",
59
- "test": "node --test --test-concurrency=1 --import ./test/helpers/scrub-ambient-jev-env.mjs --import ./test/helpers/motion-offline-prewarm.mjs test/*.test.mjs",
59
+ "test": "node --test --test-concurrency=1 --import ./test/helpers/scrub-ambient-env.mjs --import ./test/helpers/motion-offline-prewarm.mjs test/*.test.mjs",
60
60
  "validate:plugin": "node scripts/validate-plugin.mjs",
61
61
  "doctor": "node scripts/doctor.mjs",
62
62
  "qa:tmux": "bash scripts/qa-claude-plugin-smoke.sh",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "litclaude",
3
3
  "description": "Claude Code-native workflow plugin with a bounded-authority start-work lifecycle.",
4
- "version": "1.0.31",
4
+ "version": "1.0.33",
5
5
  "author": {
6
6
  "name": "LitClaude contributors"
7
7
  },