@spool-lab/core 0.6.1 → 0.6.2

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/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ export * from './parsers/spool-prelude.js';
12
12
  export * from './sync/syncer.js';
13
13
  export * from './sync/watcher.js';
14
14
  export * from './projects/groups.js';
15
+ export * from './projects/local-identity.js';
15
16
  export * from './projects/sessions.js';
16
17
  export { resolveSystemBinary, resolveSystemBinaryAsync, cachedResolve, cachedResolveAsync, clearResolveCache, hydrateResolveCache, getResolveCacheSnapshot, } from './util/resolve-bin.js';
17
18
  export * from './doctor/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,uBAAuB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,wBAAwB,CAAA;AACtC,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,uBAAuB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA"}
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ export * from './parsers/spool-prelude.js';
12
12
  export * from './sync/syncer.js';
13
13
  export * from './sync/watcher.js';
14
14
  export * from './projects/groups.js';
15
+ export * from './projects/local-identity.js';
15
16
  export * from './projects/sessions.js';
16
17
  export { resolveSystemBinary, resolveSystemBinaryAsync, cachedResolve, cachedResolveAsync, clearResolveCache, hydrateResolveCache, getResolveCacheSnapshot, } from './util/resolve-bin.js';
17
18
  export * from './doctor/index.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,uBAAuB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,wBAAwB,CAAA;AACtC,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,uBAAuB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"display-name.d.ts","sourceRoot":"","sources":["../../src/projects/display-name.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKzD"}
1
+ {"version":3,"file":"display-name.d.ts","sourceRoot":"","sources":["../../src/projects/display-name.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOzD"}
@@ -1,7 +1,10 @@
1
1
  export function fallbackDisplayName(input) {
2
2
  if (input === '/')
3
3
  return '(root)';
4
- const trimmed = input.replace(/\/+$/, '');
4
+ let end = input.length;
5
+ while (end > 0 && input[end - 1] === '/')
6
+ end -= 1;
7
+ const trimmed = input.slice(0, end);
5
8
  const parts = trimmed.split('/').filter(Boolean);
6
9
  return parts[parts.length - 1] ?? trimmed;
7
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"display-name.js","sourceRoot":"","sources":["../../src/projects/display-name.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,QAAQ,CAAA;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAChD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAA;AAC3C,CAAC"}
1
+ {"version":3,"file":"display-name.js","sourceRoot":"","sources":["../../src/projects/display-name.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,QAAQ,CAAA;IAClC,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAA;IACtB,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG;QAAE,GAAG,IAAI,CAAC,CAAA;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAChD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { ProjectIdentity } from '../types.js';
3
+ /** Match a live cwd to an identity already present in the local index. */
4
+ export declare function resolveLocalProjectIdentity(db: Database.Database, cwd: string): ProjectIdentity;
5
+ //# sourceMappingURL=local-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-identity.d.ts","sourceRoot":"","sources":["../../src/projects/local-identity.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAKlD,0EAA0E;AAC1E,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAiC/F"}
@@ -0,0 +1,68 @@
1
+ import { realpathSync } from 'node:fs';
2
+ import { isAbsolute, relative, resolve, sep } from 'node:path';
3
+ import { realFs } from './fs.js';
4
+ import { listProjectGroups } from './groups.js';
5
+ import { computeIdentity } from './identity.js';
6
+ /** Match a live cwd to an identity already present in the local index. */
7
+ export function resolveLocalProjectIdentity(db, cwd) {
8
+ const computed = computeIdentity(cwd, realFs);
9
+ const groups = listProjectGroups(db, { withPaths: true });
10
+ const direct = groups.find((group) => group.identityKind === computed.kind && group.identityKey === computed.key);
11
+ if (direct)
12
+ return identityFromGroup(direct);
13
+ if (isAbsolute(computed.key)) {
14
+ const canonicalKey = canonicalPath(computed.key);
15
+ const canonical = groups.find((group) => group.identityKind === computed.kind &&
16
+ isAbsolute(group.identityKey) &&
17
+ canonicalPath(group.identityKey) === canonicalKey);
18
+ if (canonical)
19
+ return identityFromGroup(canonical);
20
+ }
21
+ const canonicalCwd = canonicalPath(cwd);
22
+ const nearby = groups
23
+ .map((group) => ({
24
+ group,
25
+ distance: closestPathDistance(canonicalCwd, [...group.displayPaths, ...group.cwds]),
26
+ }))
27
+ .filter((candidate) => candidate.distance !== null)
28
+ .sort((a, b) => a.distance - b.distance)[0];
29
+ return nearby ? identityFromGroup(nearby.group) : computed;
30
+ }
31
+ function identityFromGroup(group) {
32
+ return {
33
+ kind: group.identityKind,
34
+ key: group.identityKey,
35
+ displayName: group.displayName,
36
+ };
37
+ }
38
+ function closestPathDistance(cwd, paths) {
39
+ let closest = null;
40
+ for (const path of paths) {
41
+ if (!isAbsolute(path))
42
+ continue;
43
+ const candidate = canonicalPath(path);
44
+ const distance = containingPathDistance(cwd, candidate);
45
+ if (distance !== null && (closest === null || distance < closest))
46
+ closest = distance;
47
+ }
48
+ return closest;
49
+ }
50
+ function containingPathDistance(cwd, projectPath) {
51
+ const projectToCwd = relative(projectPath, cwd);
52
+ return isContainedRelativePath(projectToCwd) ? pathDepth(projectToCwd) : null;
53
+ }
54
+ function isContainedRelativePath(path) {
55
+ return path === '' || (path !== '..' && !path.startsWith(`..${sep}`) && !isAbsolute(path));
56
+ }
57
+ function pathDepth(path) {
58
+ return path === '' ? 0 : path.split(sep).filter(Boolean).length;
59
+ }
60
+ function canonicalPath(path) {
61
+ try {
62
+ return realpathSync(path);
63
+ }
64
+ catch {
65
+ return resolve(path);
66
+ }
67
+ }
68
+ //# sourceMappingURL=local-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-identity.js","sourceRoot":"","sources":["../../src/projects/local-identity.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spool-lab/core",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "private": false,
5
5
  "homepage": "https://github.com/spool-lab/spool#readme",
6
6
  "bugs": {
@@ -40,8 +40,8 @@
40
40
  "@opentelemetry/semantic-conventions": "^1.43.0",
41
41
  "better-sqlite3": "12.11.1",
42
42
  "effect": "^3.22.0",
43
- "@spool-lab/redact": "0.6.1",
44
- "@spool-lab/session-kit": "^0.6.1"
43
+ "@spool-lab/redact": "0.6.2",
44
+ "@spool-lab/session-kit": "^0.6.2"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@effect/vitest": "^0.30.0",