patchwork-os 1.1.0-beta.3.canary.409 → 1.1.0-beta.3.canary.411

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.
@@ -25,6 +25,13 @@ export interface LockDiscoveryDeps {
25
25
  */
26
26
  cwd?: string;
27
27
  }
28
+ /**
29
+ * True when `cwd` is the workspace root or a descendant of it. Exported for
30
+ * direct unit testing of the cross-platform (case/slash) comparison rules —
31
+ * `findBridgeLock`'s own tests otherwise depend on non-deterministic
32
+ * `readdir` ordering to observe which candidate wins.
33
+ */
34
+ export declare function cwdInWorkspace(cwd: string, workspace: string): boolean;
28
35
  /**
29
36
  * Scan ~/.claude/ide/*.lock and return one running patchwork bridge
30
37
  * (isBridge:true + live PID). Port is parsed from the lockfile name.
@@ -1,12 +1,29 @@
1
1
  import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
- /** True when `cwd` is the workspace root or a descendant of it. */
5
- function cwdInWorkspace(cwd, workspace) {
4
+ /**
5
+ * Normalize a path for cross-platform comparison: resolve it, convert
6
+ * backslashes to forward slashes, and (on Windows only) lowercase it — NTFS
7
+ * paths are case-insensitive but VS Code / a terminal-spawned process can
8
+ * report the same path with different drive-letter/segment casing.
9
+ */
10
+ function normalizePathForComparison(p) {
11
+ const resolved = path.resolve(p).replace(/\\/g, "/");
12
+ return process.platform === "win32" ? resolved.toLowerCase() : resolved;
13
+ }
14
+ /**
15
+ * True when `cwd` is the workspace root or a descendant of it. Exported for
16
+ * direct unit testing of the cross-platform (case/slash) comparison rules —
17
+ * `findBridgeLock`'s own tests otherwise depend on non-deterministic
18
+ * `readdir` ordering to observe which candidate wins.
19
+ */
20
+ export function cwdInWorkspace(cwd, workspace) {
6
21
  if (!workspace)
7
22
  return false;
8
- const rel = path.relative(workspace, cwd);
9
- return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
23
+ const normCwd = normalizePathForComparison(cwd);
24
+ const normWorkspace = normalizePathForComparison(workspace);
25
+ const rel = path.posix.relative(normWorkspace, normCwd);
26
+ return rel === "" || (!rel.startsWith("..") && !path.posix.isAbsolute(rel));
10
27
  }
11
28
  function defaultIsLive(pid) {
12
29
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"bridgeLockDiscovery.js","sourceRoot":"","sources":["../src/bridgeLockDiscovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridgeLockDiscovery.js","sourceRoot":"","sources":["../src/bridgeLockDiscovery.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "patchwork-os",
3
- "version": "1.1.0-beta.3.canary.409",
3
+ "version": "1.1.0-beta.3.canary.411",
4
4
  "description": "Your personal AI runtime, local-first. Patchwork OS gives any AI model a consistent set of tools, YAML recipes, a delegation policy with approval queue, and a durable trace memory — all on your machine, all under your policy.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -51,14 +51,26 @@ function isAlive(pid) {
51
51
  // rather than on every poll tick.
52
52
  let lastSelectedLockPath = null;
53
53
 
54
+ // Normalize a path for cross-platform comparison: resolve it, convert
55
+ // backslashes to forward slashes, and (on Windows only) lowercase it — NTFS
56
+ // paths are case-insensitive but a VS Code-spawned bridge and a
57
+ // terminal-spawned shim can report the same path with different casing.
58
+ // Mirrors normalizePathForComparison() in src/bridgeLockDiscovery.ts.
59
+ function normalizePathForComparison(p) {
60
+ const resolved = path.resolve(p).replace(/\\/g, "/");
61
+ return process.platform === "win32" ? resolved.toLowerCase() : resolved;
62
+ }
63
+
54
64
  // True when `cwd` is the workspace root or a descendant of it. Used (only when
55
65
  // no --workspace filter is set) to prefer the bridge for the project the shim is
56
66
  // actually running in, rather than whichever lock has the newest mtime. Mirrors
57
67
  // cwdInWorkspace() in src/bridgeLockDiscovery.ts (unit-tested there).
58
68
  function cwdInWorkspace(cwd, workspace) {
59
69
  if (!workspace) return false;
60
- const rel = path.relative(workspace, cwd);
61
- return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
70
+ const normCwd = normalizePathForComparison(cwd);
71
+ const normWorkspace = normalizePathForComparison(workspace);
72
+ const rel = path.posix.relative(normWorkspace, normCwd);
73
+ return rel === "" || (!rel.startsWith("..") && !path.posix.isAbsolute(rel));
62
74
  }
63
75
 
64
76
  function findLockFile() {
@@ -93,7 +105,14 @@ function findLockFile() {
93
105
  // When a workspace filter is set, require an EXACT workspace match — a
94
106
  // lock with a missing/blank workspace field must not be picked under the
95
107
  // filter (otherwise the shim can latch onto an unrelated bridge).
96
- if (workspaceFilter && (!data || data.workspace !== workspaceFilter))
108
+ // Normalized so a --workspace flag with different drive-letter casing
109
+ // than the lock file's recorded path still matches on Windows.
110
+ if (
111
+ workspaceFilter &&
112
+ (!data?.workspace ||
113
+ normalizePathForComparison(data.workspace) !==
114
+ normalizePathForComparison(workspaceFilter))
115
+ )
97
116
  continue;
98
117
  const isBridge = data ? data.isBridge === true : false;
99
118
  const isOrchestrator = data ? data.orchestrator === true : false;