@djolex999/vir-cli 0.18.2 → 0.20.0

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.
Files changed (40) hide show
  1. package/README.md +17 -8
  2. package/assets/Vir.app/Contents/Info.plist +27 -0
  3. package/assets/Vir.app/Contents/MacOS/vir-notifier +0 -0
  4. package/assets/Vir.app/Contents/Resources/vir.icns +0 -0
  5. package/assets/Vir.app/Contents/_CodeSignature/CodeResources +128 -0
  6. package/dist/cli/notificationsSetup.js +33 -0
  7. package/dist/cli/notificationsSetup.js.map +1 -0
  8. package/dist/cli/reconcile.js +2 -1
  9. package/dist/cli/reconcile.js.map +1 -1
  10. package/dist/cli/review.js +69 -1
  11. package/dist/cli/review.js.map +1 -1
  12. package/dist/cli.js +22 -3
  13. package/dist/cli.js.map +1 -1
  14. package/dist/diagnostics/doctor.js +30 -0
  15. package/dist/diagnostics/doctor.js.map +1 -1
  16. package/dist/lint/strayFiles.js +49 -2
  17. package/dist/lint/strayFiles.js.map +1 -1
  18. package/dist/pipeline/distiller.js +65 -1
  19. package/dist/pipeline/distiller.js.map +1 -1
  20. package/dist/pipeline/parser.js +12 -2
  21. package/dist/pipeline/parser.js.map +1 -1
  22. package/dist/pipeline/projects.js +28 -7
  23. package/dist/pipeline/projects.js.map +1 -1
  24. package/dist/pipeline/run.js +14 -3
  25. package/dist/pipeline/run.js.map +1 -1
  26. package/dist/pipeline/vaultDirs.js +6 -0
  27. package/dist/pipeline/vaultDirs.js.map +1 -0
  28. package/dist/pipeline/writer.js +43 -34
  29. package/dist/pipeline/writer.js.map +1 -1
  30. package/dist/prune/prune.js +1 -21
  31. package/dist/prune/prune.js.map +1 -1
  32. package/dist/state/db.js +49 -14
  33. package/dist/state/db.js.map +1 -1
  34. package/dist/state/rejections.js +40 -0
  35. package/dist/state/rejections.js.map +1 -0
  36. package/dist/ui/macNotifier.js +85 -0
  37. package/dist/ui/macNotifier.js.map +1 -0
  38. package/dist/ui/notify.js +6 -1
  39. package/dist/ui/notify.js.map +1 -1
  40. package/package.json +3 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rejections.js","sourceRoot":"","sources":["../../src/state/rejections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,0EAA0E;AAC1E,SAAS,gBAAgB,CAAC,OAAe,EAAE,GAAW;IACpD,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;AAC5D,CAAC;AAED,yEAAyE;AACzE,6EAA6E;AAC7E,2EAA2E;AAC3E,2EAA2E;AAC3E,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAAC,EAAW,EAAE,SAAiB;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC1D,IAAI,UAAU,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI;YAAE,SAAS;QACxD,MAAM,IAAI,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { cpSync, readFileSync, rmSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { VIR_DIR } from "../config.js";
6
+ // dist/ui/macNotifier.js → <package root>/assets/Vir.app
7
+ const BUNDLED_APP = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "assets", "Vir.app");
8
+ export const INSTALLED_APP = join(VIR_DIR, "Vir.app");
9
+ const EXECUTABLE = join(INSTALLED_APP, "Contents", "MacOS", "vir-notifier");
10
+ const LSREGISTER = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister";
11
+ export function bundleVersion(infoPlist) {
12
+ const m = /<key>CFBundleVersion<\/key>\s*<string>([^<]+)<\/string>/.exec(infoPlist);
13
+ return m?.[1] ?? null;
14
+ }
15
+ export function parsePermission(stdout) {
16
+ const s = stdout.trim();
17
+ return s === "allowed" || s === "denied" || s === "undetermined" ? s : null;
18
+ }
19
+ function readBundleVersion(app) {
20
+ try {
21
+ return bundleVersion(readFileSync(join(app, "Contents", "Info.plist"), "utf8"));
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ /**
28
+ * Installs (or upgrades) ~/.vir/Vir.app from the copy shipped in the package
29
+ * and registers it with LaunchServices. Without registration the notification
30
+ * daemon can't resolve dev.vir.app and rejects it as "not allowed", so this
31
+ * re-registers on every call (~30ms): cheap insurance against a rebuilt
32
+ * LaunchServices database. Returns false off macOS or when the package has no
33
+ * helper (a source checkout that never ran npm run build:notifier).
34
+ */
35
+ export function ensureNotifierApp() {
36
+ if (process.platform !== "darwin")
37
+ return false;
38
+ const bundled = readBundleVersion(BUNDLED_APP);
39
+ if (bundled === null)
40
+ return false;
41
+ if (readBundleVersion(INSTALLED_APP) !== bundled) {
42
+ rmSync(INSTALLED_APP, { recursive: true, force: true });
43
+ cpSync(BUNDLED_APP, INSTALLED_APP, { recursive: true });
44
+ }
45
+ spawnSync(LSREGISTER, ["-f", INSTALLED_APP], { stdio: "ignore" });
46
+ return true;
47
+ }
48
+ /**
49
+ * Posts through Vir.app. False means "use the fallback": no helper, or the
50
+ * user hasn't allowed vir yet. Never prompts for permission (see main.swift).
51
+ */
52
+ export function notifyViaApp(title, message) {
53
+ if (!ensureNotifierApp())
54
+ return false;
55
+ const r = spawnSync(EXECUTABLE, ["notify", title, message], {
56
+ stdio: "ignore",
57
+ timeout: 15_000,
58
+ });
59
+ return r.status === 0;
60
+ }
61
+ export function notifierPermission() {
62
+ if (!ensureNotifierApp())
63
+ return null;
64
+ const r = spawnSync(EXECUTABLE, ["status"], {
65
+ encoding: "utf8",
66
+ timeout: 15_000,
67
+ });
68
+ return r.status === 0 ? parsePermission(r.stdout) : null;
69
+ }
70
+ /**
71
+ * Shows the macOS "vir would like to send notifications" prompt and blocks
72
+ * until the user answers (the helper gives up after 10 minutes). Interactive
73
+ * commands only: an unanswered prompt is withdrawn when the helper exits and
74
+ * macOS then records a denial.
75
+ */
76
+ export function requestNotifierPermission() {
77
+ if (!ensureNotifierApp())
78
+ return null;
79
+ const r = spawnSync(EXECUTABLE, ["request"], {
80
+ encoding: "utf8",
81
+ stdio: ["ignore", "pipe", "inherit"],
82
+ });
83
+ return r.status === 0 ? parsePermission(r.stdout) : null;
84
+ }
85
+ //# sourceMappingURL=macNotifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macNotifier.js","sourceRoot":"","sources":["../../src/ui/macNotifier.ts"],"names":[],"mappings":"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"}
package/dist/ui/notify.js CHANGED
@@ -1,11 +1,16 @@
1
1
  import { spawnSync } from "node:child_process";
2
- // Desktop notification, platform-aware and best-effort. macOS uses osascript;
2
+ import { notifyViaApp } from "./macNotifier.js";
3
+ // Desktop notification, platform-aware and best-effort. macOS posts through
4
+ // Vir.app (shown as "vir" with the vir icon) and falls back to osascript
5
+ // (shown as "Script Editor") until the user has allowed vir's notifications;
3
6
  // Linux uses notify-send when present; every other platform silently skips.
4
7
  // All paths use spawnSync arg-arrays (no shell, no injection) and the whole
5
8
  // thing is wrapped so a notification failure never crashes the pipeline.
6
9
  export function notify(title, message) {
7
10
  try {
8
11
  if (process.platform === "darwin") {
12
+ if (notifyViaApp(title, message))
13
+ return;
9
14
  const safeTitle = escapeAppleScript(title);
10
15
  const safeMessage = escapeAppleScript(message);
11
16
  spawnSync("osascript", [
@@ -1 +1 @@
1
- {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/ui/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,8EAA8E;AAC9E,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,OAAe;IACnD,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC/C,SAAS,CACP,WAAW,EACX;gBACE,IAAI;gBACJ,yBAAyB,WAAW,iBAAiB,SAAS,sBAAsB;aACrF,EACD,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,SAAS,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QACD,qEAAqE;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/ui/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,4EAA4E;AAC5E,yEAAyE;AACzE,6EAA6E;AAC7E,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,OAAe;IACnD,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;gBAAE,OAAO;YACzC,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC/C,SAAS,CACP,WAAW,EACX;gBACE,IAAI;gBACJ,yBAAyB,WAAW,iBAAiB,SAAS,sBAAsB;aACrF,EACD,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,SAAS,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QACD,qEAAqE;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@djolex999/vir-cli",
3
- "version": "0.18.2",
3
+ "version": "0.20.0",
4
4
  "description": "An LLM Wiki for Claude Code, in your Obsidian vault.",
5
5
  "author": "Djordje Markovi\u0107 <djordje@growthq.rs>",
6
6
  "license": "MIT",
@@ -31,11 +31,13 @@
31
31
  "files": [
32
32
  "dist",
33
33
  "assets/vir_graph_spiral.svg",
34
+ "assets/Vir.app",
34
35
  "README.md",
35
36
  "LICENSE"
36
37
  ],
37
38
  "scripts": {
38
39
  "build": "tsc",
40
+ "build:notifier": "native/notifier/build.sh",
39
41
  "prepublishOnly": "npm run build && npm test",
40
42
  "dev": "tsc --watch",
41
43
  "start": "node dist/cli.js",