@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 +12 -0
- package/README.md +8 -11
- package/README_ko-KR.md +8 -11
- package/bin/litclaude-ai.js +3 -4
- package/docs/assets/readme/badge-version.svg +1 -1
- package/docs/hooks.md +63 -101
- package/docs/privacy.md +2 -6
- package/package.json +2 -2
- package/plugins/litclaude/.claude-plugin/plugin.json +1 -1
- package/plugins/litclaude/bin/litclaude-hook.js +45 -76
- package/plugins/litclaude/bin/litclaude-hud.js +1 -40
- package/plugins/litclaude/bin/litclaude-mcp.js +1 -1
- package/plugins/litclaude/commands/autoresearch.md +1 -1
- package/plugins/litclaude/commands/lit-humanizer.md +1 -1
- package/plugins/litclaude/commands/lit-init.md +1 -1
- package/plugins/litclaude/commands/lit-plan.md +1 -1
- package/plugins/litclaude/commands/litresearch.md +1 -1
- package/plugins/litclaude/commands/review-work.md +1 -1
- package/plugins/litclaude/hooks/lit-mod.mjs +10 -16
- package/plugins/litclaude/lib/automatic-update-refresh.mjs +2 -2
- package/plugins/litclaude/lib/automatic-update.mjs +146 -5
- package/plugins/litclaude/lib/canonical-runtime-commitments.mjs +2 -2
- package/plugins/litclaude/lib/canonical-skill-resources.mjs +2 -2
- package/plugins/litclaude/lib/hud-accent-palette.mjs +0 -45
- package/plugins/litclaude/lib/mod/svg-card.mjs +34 -25
- package/plugins/litclaude/skills/visual-qa/SKILL.md +1 -1
- package/scripts/qa-real-surface-lib.mjs +1 -1
- package/plugins/litclaude/lib/jev-skill-hint.mjs +0 -465
- package/plugins/litclaude/lib/mod/native-card.mjs +0 -133
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.
|
|
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.
|
|
8
|
-
<a href="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.
|
|
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.
|
|
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.
|
|
77
|
-
- [Migration and ownership conflicts](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.
|
|
78
|
-
- [Release history](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.
|
|
79
|
-
- [MIT license](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.
|
|
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.
|
|
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.
|
|
8
|
-
<a href="https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.
|
|
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.
|
|
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.
|
|
75
|
-
- [이전과 소유권 충돌](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.
|
|
76
|
-
- [변경 이력](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.
|
|
77
|
-
- [MIT 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litclaude@1.0.
|
|
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)
|
package/bin/litclaude-ai.js
CHANGED
|
@@ -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.
|
|
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;
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
`
|
|
222
|
-
only
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
`
|
|
237
|
-
`
|
|
238
|
-
`
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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.
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
the
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
light
|
|
476
|
-
|
|
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
|
|
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.
|
|
46
|
-
|
|
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.
|
|
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-
|
|
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",
|