@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 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 title = st.customTitle || st.aiTitle || st.summary || st.firstPrompt || "Untitled session";
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.2";
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.2",
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"