litclaude-ai 0.4.4 → 0.4.5
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 +9 -0
- package/README.md +5 -5
- package/README_ko-KR.md +5 -5
- package/RELEASE_CHECKLIST.md +7 -7
- package/package.json +1 -1
- package/plugins/litclaude/.claude-plugin/plugin.json +1 -1
- package/plugins/litclaude/bin/litclaude-mcp.js +1 -1
- package/plugins/litclaude/hooks/hooks.json +1 -1
- package/plugins/litclaude/lib/canonical-skill-resources.mjs +1 -1
- package/plugins/litclaude/lib/skill-loop/hook-runtime.mjs +16 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.5 - 2026-09-02 — vendored-corpus companions and Skill-id namespace
|
|
4
|
+
|
|
5
|
+
- Record Claude Code plugin-namespaced Skill tool ids (`plugin:skill`) as the
|
|
6
|
+
unprefixed skill id so skill-loop consultations match `SKILL_ID`.
|
|
7
|
+
- Count vendor license, provenance, and NOTICE companions in family
|
|
8
|
+
payload-parity so packed skills keep the material they name after the
|
|
9
|
+
sibling vendor-layout moves.
|
|
10
|
+
- This is a local release candidate only; no publish, tag, or push was performed.
|
|
11
|
+
|
|
3
12
|
## 0.4.4 - 2026-09-02 — inode-reuse hardening and Linux rotation safety
|
|
4
13
|
|
|
5
14
|
- Bind regular-file reads and state transitions to ctime/birthtime-aware identities,
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<p align="center"><img src="https://cdn.jsdelivr.net/npm/litclaude-ai@0.4.
|
|
1
|
+
<p align="center"><img src="https://cdn.jsdelivr.net/npm/litclaude-ai@0.4.5/cover.png" width="100%" alt="LitClaude — Claude Code-native workflow package" /></p>
|
|
2
2
|
|
|
3
3
|
```text
|
|
4
4
|
██╗ ██╗████████╗
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
</p>
|
|
23
23
|
<p align="center">
|
|
24
24
|
<img src="https://img.shields.io/badge/npm-litclaude--ai-cb3837" alt="npm: litclaude-ai" />
|
|
25
|
-
<img src="https://img.shields.io/badge/version-0.4.
|
|
25
|
+
<img src="https://img.shields.io/badge/version-0.4.5-2ea44f" alt="version 0.4.5" />
|
|
26
26
|
<img src="https://img.shields.io/badge/Claude%20Code-plugin-blueviolet" alt="Claude Code plugin" />
|
|
27
27
|
<img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT license" />
|
|
28
28
|
</p>
|
|
@@ -92,13 +92,13 @@ npx --yes litclaude-ai@latest install
|
|
|
92
92
|
For a reproducible install, pin the current package version:
|
|
93
93
|
|
|
94
94
|
```bash
|
|
95
|
-
npm view litclaude-ai@0.4.
|
|
95
|
+
npm view litclaude-ai@0.4.5 version
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
-
If that lookup returns `0.4.
|
|
98
|
+
If that lookup returns `0.4.5`, the exact install is available:
|
|
99
99
|
|
|
100
100
|
```bash
|
|
101
|
-
npx --yes litclaude-ai@0.4.
|
|
101
|
+
npx --yes litclaude-ai@0.4.5 install
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
Otherwise, wait for explicit human publication before using that pin. Check the
|
package/README_ko-KR.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<p align="center"><img src="https://cdn.jsdelivr.net/npm/litclaude-ai@0.4.
|
|
1
|
+
<p align="center"><img src="https://cdn.jsdelivr.net/npm/litclaude-ai@0.4.5/cover.png" width="100%" alt="LitClaude — Claude Code-native workflow package" /></p>
|
|
2
2
|
|
|
3
3
|
```text
|
|
4
4
|
██╗ ██╗████████╗
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
</p>
|
|
23
23
|
<p align="center">
|
|
24
24
|
<img src="https://img.shields.io/badge/npm-litclaude--ai-cb3837" alt="npm: litclaude-ai" />
|
|
25
|
-
<img src="https://img.shields.io/badge/version-0.4.
|
|
25
|
+
<img src="https://img.shields.io/badge/version-0.4.5-2ea44f" alt="version 0.4.5" />
|
|
26
26
|
<img src="https://img.shields.io/badge/Claude%20Code-plugin-blueviolet" alt="Claude Code plugin" />
|
|
27
27
|
<img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT license" />
|
|
28
28
|
</p>
|
|
@@ -94,13 +94,13 @@ npx --yes litclaude-ai@latest install
|
|
|
94
94
|
뒤 고정합니다.
|
|
95
95
|
|
|
96
96
|
```bash
|
|
97
|
-
npm view litclaude-ai@0.4.
|
|
97
|
+
npm view litclaude-ai@0.4.5 version
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
-
조회 결과가 `0.4.
|
|
100
|
+
조회 결과가 `0.4.5`이면 exact install을 사용할 수 있습니다.
|
|
101
101
|
|
|
102
102
|
```bash
|
|
103
|
-
npx --yes litclaude-ai@0.4.
|
|
103
|
+
npx --yes litclaude-ai@0.4.5 install
|
|
104
104
|
```
|
|
105
105
|
|
|
106
106
|
그렇지 않으면 명시적인 human publication을 기다립니다. Pin은 그 뒤에 사용합니다.
|
package/RELEASE_CHECKLIST.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# LitClaude Release Checklist
|
|
2
2
|
|
|
3
|
-
Status: `litclaude-ai@0.4.
|
|
3
|
+
Status: `litclaude-ai@0.4.5` is the current release candidate — exact canonical
|
|
4
4
|
frontend corpus plus Claude-native `autoresearch`, `autoconference`, and `wikify`
|
|
5
5
|
workflow-family integration. It byte-pins the frontend library, legal companions,
|
|
6
6
|
family source closures, and adapters through independent commitments and package
|
|
@@ -45,9 +45,9 @@ side-effect-free, the launcher starts only a separate Claude Code
|
|
|
45
45
|
print/background worker, and the release preserves the Korean polishing
|
|
46
46
|
command, strict multi-agent review pipeline, fidelity guardrails, package
|
|
47
47
|
hygiene checks, native route gates, and safe start-work handoff behavior.
|
|
48
|
-
`package.json` is aligned to `0.4.
|
|
49
|
-
`plugins/litclaude/.claude-plugin/plugin.json` is aligned to `0.4.
|
|
50
|
-
plugin-local MCP server reports `0.4.
|
|
48
|
+
`package.json` is aligned to `0.4.5`,
|
|
49
|
+
`plugins/litclaude/.claude-plugin/plugin.json` is aligned to `0.4.5`, and the
|
|
50
|
+
plugin-local MCP server reports `0.4.5`.
|
|
51
51
|
|
|
52
52
|
This candidate adds an approval-gated skill learning loop. Validated
|
|
53
53
|
consultations, bounded corrections, iteration signals, and coverage gaps may
|
|
@@ -295,9 +295,9 @@ checkout and from an isolated install of the packed tarball:
|
|
|
295
295
|
Before requesting publication approval, confirm these artifacts from the current
|
|
296
296
|
checkout:
|
|
297
297
|
|
|
298
|
-
- `package.json` version is `0.4.
|
|
299
|
-
- `plugins/litclaude/.claude-plugin/plugin.json` version is `0.4.
|
|
300
|
-
- `plugins/litclaude/bin/litclaude-mcp.js` reports server version `0.4.
|
|
298
|
+
- `package.json` version is `0.4.5`.
|
|
299
|
+
- `plugins/litclaude/.claude-plugin/plugin.json` version is `0.4.5`.
|
|
300
|
+
- `plugins/litclaude/bin/litclaude-mcp.js` reports server version `0.4.5`.
|
|
301
301
|
- Prompt-hook tests cover bundled `SKILL.md` body injection for bare `hyperplan`, `litresearch`, `lit research`, `init-deep`, and explicit leading `$start-work`; diagnostic/copy mentions stay inert while leading natural-language `lit start work` stays BLOCKED.
|
|
302
302
|
- `lit search` and `lit query` route to `/litclaude:litresearch` without activating on slash mentions, code spans, or non-lit prompts.
|
|
303
303
|
- Litresearch web lanes require public API/feed preference, validator-first checks, route traces, prompt-injection quarantine, and honest auth/paywall/private-data stop reasons.
|
package/package.json
CHANGED
|
@@ -29,7 +29,7 @@ export const canonicalSkillResourceManifest = Object.freeze(
|
|
|
29
29
|
["lib/skill-loop/common.mjs", "c65eec46eaad369b989337876960dcba9a0f25f40320862dc1c4a298a7e7a730"],
|
|
30
30
|
["lib/skill-loop/config.mjs", "833e73f74ffdf43068a95aa6c50dc29e9080b0549871bdc0a5669a01c752cba6"],
|
|
31
31
|
["lib/skill-loop/curator.mjs", "6776eb46fb0c1f79a2a217f495b2195e54cac044f61dfe9298447c9b2bd2de76"],
|
|
32
|
-
["lib/skill-loop/hook-runtime.mjs", "
|
|
32
|
+
["lib/skill-loop/hook-runtime.mjs", "34af32eb44e04aed2f452dcc01556f4f113b9e4896bcdb633402c4e273763006"],
|
|
33
33
|
["lib/skill-loop/hook-state.mjs", "cbe544247069ee004acb389f70ef7d9f25f0afd8a5df9c5567c365bf47989938"],
|
|
34
34
|
["lib/skill-loop/ledger.mjs", "5367b62c21f8bad2e8efb34caa9e2a5c79de85d9d762d7a583cc66ea9da325e5"],
|
|
35
35
|
["lib/skill-loop/mutation-transaction.mjs", "485b871b3cc5e8c3234df9bf0a84f240fddc4f91dbff94607d1e046248bf33f9"],
|
|
@@ -4,6 +4,7 @@ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
|
4
4
|
|
|
5
5
|
import { containsSecret } from "../secret-shapes.mjs";
|
|
6
6
|
import { recordObservation } from "../skill-observer.mjs";
|
|
7
|
+
import { SKILL_ID } from "./common.mjs";
|
|
7
8
|
import { readSkillLoopConfig } from "./config.mjs";
|
|
8
9
|
import { runCurator, SESSION_START_CURATOR_LIMITS } from "./curator.mjs";
|
|
9
10
|
import {
|
|
@@ -73,7 +74,20 @@ function resolveInsideSkillRoot(skillRoot, requested) {
|
|
|
73
74
|
return /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(skillId) ? skillId : null;
|
|
74
75
|
}
|
|
75
76
|
|
|
76
|
-
|
|
77
|
+
function skillIdFromSkillTool(raw) {
|
|
78
|
+
if (typeof raw !== "string") return null;
|
|
79
|
+
const separator = raw.indexOf(":");
|
|
80
|
+
if (separator === -1) return SKILL_ID.test(raw) ? raw : null;
|
|
81
|
+
const plugin = raw.slice(0, separator);
|
|
82
|
+
const name = raw.slice(separator + 1);
|
|
83
|
+
if (plugin.length === 0 || name.length === 0 || name.includes(":")) return null;
|
|
84
|
+
return SKILL_ID.test(name) ? name : null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function skillIdFromToolUse(input, workspaceRoot, pluginRoot) {
|
|
88
|
+
if (input?.tool_name === "Skill") {
|
|
89
|
+
return skillIdFromSkillTool(input?.tool_input?.skill);
|
|
90
|
+
}
|
|
77
91
|
if (input?.tool_name !== "Read" || typeof input?.tool_input?.file_path !== "string"
|
|
78
92
|
|| input.tool_input.file_path.length < 1 || input.tool_input.file_path.length > MAX_READ_PATH_CHARS) return null;
|
|
79
93
|
const requested = isAbsolute(input.tool_input.file_path)
|
|
@@ -85,7 +99,7 @@ export function skillIdFromRead(input, workspaceRoot, pluginRoot) {
|
|
|
85
99
|
|
|
86
100
|
export function observePreToolUse(root, input, pluginRoot) {
|
|
87
101
|
if (typeof input?.session_id !== "string") return null;
|
|
88
|
-
const skillId =
|
|
102
|
+
const skillId = skillIdFromToolUse(input, root, pluginRoot);
|
|
89
103
|
const recorded = recordToolIteration(root, input.session_id, skillId ?? undefined);
|
|
90
104
|
if (recorded && skillId) recordSkillConsult(root, skillId);
|
|
91
105
|
return recorded ? skillId : null;
|