@kvali/cli 0.6.2 → 0.6.4
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/README.md +4 -0
- package/THIRD_PARTY_NOTICES.md +64 -0
- package/dist/claude-plugin/.claude-plugin/marketplace.json +13 -0
- package/dist/claude-plugin/.claude-plugin/plugin.json +9 -0
- package/dist/claude-plugin/LICENSE +21 -0
- package/dist/claude-plugin/README.md +6 -0
- package/dist/kvali.mjs +23 -3
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -33,4 +33,8 @@ kvali watch # hooks and phone notifications only, e.g. in the backgro
|
|
|
33
33
|
|
|
34
34
|
Kvali also comes as an editor extension (VS Code, Antigravity, Cursor, Windsurf): search for "Kvali" in the Extensions view. Source and docs: https://github.com/webGrandpa/kvali
|
|
35
35
|
|
|
36
|
+
Everything stays on your computer, with no telemetry; only phone notifications, when you set them up, go to the ntfy server you choose. [Privacy](https://github.com/webGrandpa/kvali/blob/main/PRIVACY.md) · [Security policy](https://github.com/webGrandpa/kvali/blob/main/SECURITY.md) · [Third-party notices](https://github.com/webGrandpa/kvali/blob/main/THIRD_PARTY_NOTICES.md)
|
|
37
|
+
|
|
36
38
|
MIT © Giorgi Khiladze
|
|
39
|
+
|
|
40
|
+
Kvali is an independent open-source project, not affiliated with or endorsed by Anthropic, OpenAI, Google, Microsoft or the makers of the other tools it works with. Claude Code, Codex, Gemini CLI, Antigravity, VS Code, Cursor, Windsurf and the other product names here are trademarks of their owners, used only to say what Kvali works with.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
Kvali's own code is released under the [MIT License](LICENSE). The editor extension and the `kvali` command (npm package `@kvali/cli`) also bundle the open-source code listed below. Each keeps its own license, reproduced here as its terms require.
|
|
4
|
+
|
|
5
|
+
| Package | Version | License | Where it is used |
|
|
6
|
+
| --- | --- | --- | --- |
|
|
7
|
+
| [Preact](https://github.com/preactjs/preact) | 10.29.8 | MIT | The editor extension's Agents view |
|
|
8
|
+
| [qrcode-generator](https://github.com/kazuhikoarase/qrcode-generator) | 2.0.4 | MIT | The QR code for phone setup, in the extension and the CLI |
|
|
9
|
+
|
|
10
|
+
The release build checks this list: it stops when the bundles contain a package, or a version, that is missing here.
|
|
11
|
+
|
|
12
|
+
## preact 10.29.8
|
|
13
|
+
|
|
14
|
+
The MIT License (MIT)
|
|
15
|
+
|
|
16
|
+
Copyright (c) 2015-present Jason Miller
|
|
17
|
+
|
|
18
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
19
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
20
|
+
in the Software without restriction, including without limitation the rights
|
|
21
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
22
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
23
|
+
furnished to do so, subject to the following conditions:
|
|
24
|
+
|
|
25
|
+
The above copyright notice and this permission notice shall be included in all
|
|
26
|
+
copies or substantial portions of the Software.
|
|
27
|
+
|
|
28
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
29
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
30
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
31
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
32
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
33
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
34
|
+
SOFTWARE.
|
|
35
|
+
|
|
36
|
+
## qrcode-generator 2.0.4
|
|
37
|
+
|
|
38
|
+
QR Code Generator for JavaScript
|
|
39
|
+
|
|
40
|
+
Copyright (c) 2009 Kazuhiko Arase
|
|
41
|
+
|
|
42
|
+
URL: http://www.d-project.com/
|
|
43
|
+
|
|
44
|
+
Licensed under the MIT license:
|
|
45
|
+
|
|
46
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
47
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
48
|
+
in the Software without restriction, including without limitation the rights
|
|
49
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
50
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
51
|
+
furnished to do so, subject to the following conditions:
|
|
52
|
+
|
|
53
|
+
The above copyright notice and this permission notice shall be included in all
|
|
54
|
+
copies or substantial portions of the Software.
|
|
55
|
+
|
|
56
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
57
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
58
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
59
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
60
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
61
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
62
|
+
SOFTWARE.
|
|
63
|
+
|
|
64
|
+
The word "QR Code" is a registered trademark of DENSO WAVE INCORPORATED.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kvali",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "Giorgi Khiladze"
|
|
5
|
+
},
|
|
6
|
+
"plugins": [
|
|
7
|
+
{
|
|
8
|
+
"name": "kvali",
|
|
9
|
+
"source": "./",
|
|
10
|
+
"description": "Live progress for Claude Code: plan progress, the current step and its time, what the agent is doing right now, and tokens, in a pane beside the chat."
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kvali",
|
|
3
|
+
"version": "0.6.4",
|
|
4
|
+
"description": "Live progress for Claude Code: plan progress, the current step and its time, what the agent is doing right now, and tokens, in a pane beside the chat.",
|
|
5
|
+
"author": { "name": "Giorgi Khiladze" },
|
|
6
|
+
"homepage": "https://github.com/webGrandpa/kvali",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"types": "./types/index.d.ts"
|
|
9
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Giorgi Khiladze
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -35,3 +35,9 @@ claude plugin test packages/claude-plugin
|
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
`hooks/model.ts` holds the logic (plan, step timing, the "is it working?" line), `hooks/register.tsx` connects it to Claude Code's events and draws the pane, `types/index.d.ts` declares the state it keeps.
|
|
38
|
+
|
|
39
|
+
## Privacy
|
|
40
|
+
|
|
41
|
+
The plugin keeps its state on your computer and has no telemetry. It sends something only when you set up phone notifications: short status lines to the ntfy server you chose, never code or prompts. [Privacy](https://github.com/webGrandpa/kvali/blob/main/PRIVACY.md) · [Security policy](https://github.com/webGrandpa/kvali/blob/main/SECURITY.md) · MIT License
|
|
42
|
+
|
|
43
|
+
Kvali is an independent open-source project, not affiliated with or endorsed by Anthropic. Claude and Claude Code are trademarks of Anthropic, used only to say what this plugin works with.
|
package/dist/kvali.mjs
CHANGED
|
@@ -905,6 +905,7 @@ var AntigravityAdapter = class {
|
|
|
905
905
|
agentLabel: this.label,
|
|
906
906
|
id: st.id,
|
|
907
907
|
title: st.task?.title || st.firstInput || current?.title || "Antigravity conversation",
|
|
908
|
+
titleFromPrompt: !st.task?.title && !!st.firstInput ? true : void 0,
|
|
908
909
|
projectPath: this.projectOf(st, ctx.home),
|
|
909
910
|
model: st.model,
|
|
910
911
|
turn: st.turnStartedAt !== void 0 ? { steps: st.turnSteps, startedAt: st.turnStartedAt } : void 0,
|
|
@@ -1476,7 +1477,8 @@ var ClaudeCodeAdapter = class {
|
|
|
1476
1477
|
}
|
|
1477
1478
|
const activeSubagents = [...st.subagents.values()].filter((s) => now - s.updatedAt < 6e4).length;
|
|
1478
1479
|
const window = /\[1m\]/i.test(st.model ?? "") || st.maxContext > 2e5 ? 1e6 : 2e5;
|
|
1479
|
-
const
|
|
1480
|
+
const ownTitle = st.customTitle || st.aiTitle || st.summary;
|
|
1481
|
+
const title = ownTitle || st.firstPrompt || "Untitled session";
|
|
1480
1482
|
let activity = status === "working" ? st.activity : void 0;
|
|
1481
1483
|
if (status === "working" && st.phase === "tool" && st.open.size > 0) activity = [...st.open.values()].pop();
|
|
1482
1484
|
return {
|
|
@@ -1485,6 +1487,7 @@ var ClaudeCodeAdapter = class {
|
|
|
1485
1487
|
agentLabel: this.label,
|
|
1486
1488
|
id: st.sessionId,
|
|
1487
1489
|
title: truncate(title, 100),
|
|
1490
|
+
titleFromPrompt: !ownTitle && !!st.firstPrompt ? true : void 0,
|
|
1488
1491
|
projectPath: st.launchCwd ? findGitRoot(st.launchCwd) ?? st.launchCwd : void 0,
|
|
1489
1492
|
cwd: st.launchCwd,
|
|
1490
1493
|
model: st.model,
|
|
@@ -1824,6 +1827,7 @@ var CodexAdapter = class extends JsonlSessionAdapter {
|
|
|
1824
1827
|
agentLabel: this.label,
|
|
1825
1828
|
id: st.id,
|
|
1826
1829
|
title: st.title ?? "Untitled session",
|
|
1830
|
+
titleFromPrompt: st.title !== void 0 ? true : void 0,
|
|
1827
1831
|
projectPath: st.cwd ? findGitRoot(st.cwd) ?? st.cwd : void 0,
|
|
1828
1832
|
cwd: st.cwd,
|
|
1829
1833
|
model: st.model,
|
|
@@ -2106,6 +2110,7 @@ var GeminiCliAdapter = class {
|
|
|
2106
2110
|
agentLabel: this.label,
|
|
2107
2111
|
id: st.sessionId ?? path5.basename(st.file),
|
|
2108
2112
|
title: st.summary ? truncate(st.summary, 100) : title ?? "Untitled session",
|
|
2113
|
+
titleFromPrompt: !st.summary && title !== void 0 ? true : void 0,
|
|
2109
2114
|
projectPath: st.projectPath,
|
|
2110
2115
|
model,
|
|
2111
2116
|
status: phase === "idle" && tasksProg.total > 0 && tasksProg.done === tasksProg.total ? "done" : phase,
|
|
@@ -2444,7 +2449,22 @@ var HookHub = class {
|
|
|
2444
2449
|
this.setHub(true);
|
|
2445
2450
|
});
|
|
2446
2451
|
}
|
|
2452
|
+
/**
|
|
2453
|
+
* A web page can make a browser call this port by pointing its own host name at
|
|
2454
|
+
* 127.0.0.1 (DNS rebinding); such requests name that host, so only local names pass.
|
|
2455
|
+
* Hooks call `http://127.0.0.1:<port>`.
|
|
2456
|
+
*/
|
|
2457
|
+
localHost(req) {
|
|
2458
|
+
const host = req.headers.host?.toLowerCase();
|
|
2459
|
+
if (!host) return true;
|
|
2460
|
+
const port = this.server?.address()?.port ?? this.port;
|
|
2461
|
+
return host === `127.0.0.1:${port}` || host === `localhost:${port}` || host === `[::1]:${port}`;
|
|
2462
|
+
}
|
|
2447
2463
|
async handle(req, res) {
|
|
2464
|
+
if (!this.localHost(req)) {
|
|
2465
|
+
res.writeHead(403).end();
|
|
2466
|
+
return;
|
|
2467
|
+
}
|
|
2448
2468
|
const url = req.url ?? "/";
|
|
2449
2469
|
if (req.method === "GET" && url === "/v1/health") {
|
|
2450
2470
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
@@ -3141,7 +3161,7 @@ function formatPush(kind, s, details, extra = {}) {
|
|
|
3141
3161
|
const stepName = step ? step.activeTitle ?? step.title : void 0;
|
|
3142
3162
|
const nextName = step ? void 0 : s.tasks.find((t) => t.status === "pending")?.title;
|
|
3143
3163
|
const planLine = p2.total ? `${p2.done}/${p2.total} tasks${details && stepName ? ` \xB7 ${clip(stepName, 80)}` : ""}` : void 0;
|
|
3144
|
-
const title = details ? clip(s.title, 120) : void 0;
|
|
3164
|
+
const title = details && !s.titleFromPrompt ? clip(s.title, 120) : void 0;
|
|
3145
3165
|
const lines = (...xs) => xs.filter(Boolean).join("\n");
|
|
3146
3166
|
switch (kind) {
|
|
3147
3167
|
case "needs-you":
|
|
@@ -5123,7 +5143,7 @@ function qrTerminal(text, color = true) {
|
|
|
5123
5143
|
}
|
|
5124
5144
|
|
|
5125
5145
|
// src/index.ts
|
|
5126
|
-
var VERSION = "0.6.
|
|
5146
|
+
var VERSION = "0.6.4";
|
|
5127
5147
|
function parse(argv) {
|
|
5128
5148
|
const opts = {
|
|
5129
5149
|
json: false,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kvali/cli",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"description": "Live progress, tokens and phone alerts for AI coding agents (Claude Code, Codex, Gemini CLI, Antigravity), in your terminal.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Giorgi Khiladze (https://github.com/webGrandpa)",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"kvali": "dist/kvali.mjs"
|
|
18
18
|
},
|
|
19
19
|
"files": [
|
|
20
|
-
"dist"
|
|
20
|
+
"dist",
|
|
21
|
+
"THIRD_PARTY_NOTICES.md"
|
|
21
22
|
],
|
|
22
23
|
"engines": {
|
|
23
24
|
"node": ">=20"
|