@cleocode/paths 2026.9.15 → 2026.9.17

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
@@ -15,6 +15,7 @@
15
15
  * {@link resolveWorktreeRootForHash}, {@link resolveTaskWorktreePath},
16
16
  * {@link getCleoWorktreesRoot}, {@link resolveWorktreeIndexPath}
17
17
  * - {@link isAbsolutePath} — cross-platform abs-path check
18
+ * - Portable identity: {@link readPortableProjectId} (tracked `.cleo/project-id`, T12325)
18
19
  *
19
20
  * @packageDocumentation
20
21
  * @task T1883
@@ -24,5 +25,6 @@ export { isAbsolutePath } from './abs-path.js';
24
25
  export { _resetCleoPlatformPathsCache, canonicalizePath, computeCanonicalProjectId, getCanonicalTemplatesTildePath, getCleoHome, getCleoPlatformPaths, getCleoSystemInfo, getCleoTemplatesTildePath, legacyProjectId, type ResolvedProject, resolveCanonicalCleoDir, resolveLegacyCleoDir, resolveProjectByCwd, } from './cleo-paths.js';
25
26
  export { type EnforceOptions, enforceNodeVersion, evaluateNodeVersion, FALLBACK_MIN_NODE, getRequiredNodeVersion, type NodeManager, type NodeVersionVerdict, parseSemver, type Semver, type UpgradeHint, } from './node-version-gate.js';
26
27
  export { createPlatformPathsResolver, type PlatformPaths, type PlatformPathsResolver, type SystemInfo, } from './platform-paths.js';
28
+ export { formatPortableProjectId, isValidPortableProjectId, PORTABLE_PROJECT_ID_FILE, type PortableProjectIdRead, parsePortableProjectId, portableProjectIdPath, readPortableProjectId, } from './portable-project-id.js';
27
29
  export { computeProjectHash, getCleoWorktreesRoot, resolveTaskWorktreePath, resolveWorktreeIndexPath, resolveWorktreeRootForHash, } from './worktree-paths.js';
28
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,yBAAyB,EACzB,8BAA8B,EAC9B,WAAW,EACX,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,KAAK,eAAe,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,cAAc,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,WAAW,EACX,KAAK,MAAM,EACX,KAAK,WAAW,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,2BAA2B,EAC3B,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,yBAAyB,EACzB,8BAA8B,EAC9B,WAAW,EACX,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,KAAK,eAAe,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,cAAc,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,WAAW,EACX,KAAK,MAAM,EACX,KAAK,WAAW,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,2BAA2B,EAC3B,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -15,6 +15,7 @@
15
15
  * {@link resolveWorktreeRootForHash}, {@link resolveTaskWorktreePath},
16
16
  * {@link getCleoWorktreesRoot}, {@link resolveWorktreeIndexPath}
17
17
  * - {@link isAbsolutePath} — cross-platform abs-path check
18
+ * - Portable identity: {@link readPortableProjectId} (tracked `.cleo/project-id`, T12325)
18
19
  *
19
20
  * @packageDocumentation
20
21
  * @task T1883
@@ -24,5 +25,6 @@ export { isAbsolutePath } from './abs-path.js';
24
25
  export { _resetCleoPlatformPathsCache, canonicalizePath, computeCanonicalProjectId, getCanonicalTemplatesTildePath, getCleoHome, getCleoPlatformPaths, getCleoSystemInfo, getCleoTemplatesTildePath, legacyProjectId, resolveCanonicalCleoDir, resolveLegacyCleoDir, resolveProjectByCwd, } from './cleo-paths.js';
25
26
  export { enforceNodeVersion, evaluateNodeVersion, FALLBACK_MIN_NODE, getRequiredNodeVersion, parseSemver, } from './node-version-gate.js';
26
27
  export { createPlatformPathsResolver, } from './platform-paths.js';
28
+ export { formatPortableProjectId, isValidPortableProjectId, PORTABLE_PROJECT_ID_FILE, parsePortableProjectId, portableProjectIdPath, readPortableProjectId, } from './portable-project-id.js';
27
29
  export { computeProjectHash, getCleoWorktreesRoot, resolveTaskWorktreePath, resolveWorktreeIndexPath, resolveWorktreeRootForHash, } from './worktree-paths.js';
28
30
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,yBAAyB,EACzB,8BAA8B,EAC9B,WAAW,EACX,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EAEf,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EAGtB,WAAW,GAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,2BAA2B,GAI5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,yBAAyB,EACzB,8BAA8B,EAC9B,WAAW,EACX,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EAEf,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EAGtB,WAAW,GAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,2BAA2B,GAI5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EAExB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * The tracked, write-once portable project identity (`.cleo/project-id`).
3
+ *
4
+ * Every other project identifier CLEO computes hashes the absolute path, and
5
+ * the random `projectId` in `.cleo/project-info.json` is gitignored (ADR-013
6
+ * §9), so a fresh clone used to mint a brand-new identity at `cleo init`. This
7
+ * file is the one identifier that travels with the repository: CLEO writes it
8
+ * once, commits nothing else beside it, and never rewrites it. Because nothing
9
+ * ever writes it a second time, git has nothing to overwrite — the geometry
10
+ * that made ADR-013 untrack the mutable state files does not apply
11
+ * (ADR-094, T12325).
12
+ *
13
+ * This module only READS. Writing (create-only) and re-linking live in
14
+ * `@cleocode/core` (`scaffold/project-identity.ts`).
15
+ *
16
+ * @packageDocumentation
17
+ * @task T12325
18
+ */
19
+ /** Basename of the tracked portable identity file inside a project's `.cleo/`. */
20
+ export declare const PORTABLE_PROJECT_ID_FILE = "project-id";
21
+ /**
22
+ * Outcome of reading `.cleo/project-id`.
23
+ *
24
+ * `invalid` is distinct from `absent` on purpose: an unreadable or malformed
25
+ * identity file is a diagnostic to report, never a reason to mint a new id.
26
+ *
27
+ * @public
28
+ */
29
+ export type PortableProjectIdRead = {
30
+ readonly status: 'absent';
31
+ } | {
32
+ readonly status: 'valid';
33
+ readonly projectId: string;
34
+ } | {
35
+ readonly status: 'invalid';
36
+ readonly reason: string;
37
+ };
38
+ /**
39
+ * Whether a string is an acceptable portable project id.
40
+ *
41
+ * @param projectId - Candidate identifier.
42
+ * @returns `true` when the id matches the accepted shape.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * isValidPortableProjectId('c78d09c3a8ee'); // true
47
+ * isValidPortableProjectId('../etc'); // false
48
+ * ```
49
+ *
50
+ * @public
51
+ */
52
+ export declare function isValidPortableProjectId(projectId: string): boolean;
53
+ /**
54
+ * Absolute path of the portable identity file for a project root.
55
+ *
56
+ * @param projectRoot - Absolute project root (the directory containing `.cleo/`).
57
+ * @returns `<projectRoot>/.cleo/project-id`.
58
+ *
59
+ * @public
60
+ */
61
+ export declare function portableProjectIdPath(projectRoot: string): string;
62
+ /**
63
+ * Render the file body CLEO writes for a portable id.
64
+ *
65
+ * Comment lines (`#`) are ignored by {@link parsePortableProjectId}, so the
66
+ * header can tell a human reader not to edit the file without being part of
67
+ * the identity.
68
+ *
69
+ * @param projectId - A valid portable id.
70
+ * @returns The exact bytes to write.
71
+ *
72
+ * @public
73
+ */
74
+ export declare function formatPortableProjectId(projectId: string): string;
75
+ /**
76
+ * Parse the body of a portable identity file.
77
+ *
78
+ * Blank lines and `#` comment lines are ignored; exactly one remaining line
79
+ * must hold a valid id.
80
+ *
81
+ * @param content - Raw file content.
82
+ * @returns The parsed read outcome (`valid` or `invalid`).
83
+ *
84
+ * @public
85
+ */
86
+ export declare function parsePortableProjectId(content: string): PortableProjectIdRead;
87
+ /**
88
+ * Read the tracked portable identity of a project, synchronously.
89
+ *
90
+ * @param projectRoot - Absolute project root (the directory containing `.cleo/`).
91
+ * @returns `absent` when no file exists, `valid` with the id, or `invalid`
92
+ * with a reason when the file exists but cannot be used.
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * const read = readPortableProjectId('/repo');
97
+ * if (read.status === 'valid') console.log(read.projectId);
98
+ * ```
99
+ *
100
+ * @public
101
+ */
102
+ export declare function readPortableProjectId(projectRoot: string): PortableProjectIdRead;
103
+ //# sourceMappingURL=portable-project-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-project-id.d.ts","sourceRoot":"","sources":["../src/portable-project-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,eAAe,CAAC;AASrD;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOjE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAgB7E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB,CAchF"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * The tracked, write-once portable project identity (`.cleo/project-id`).
3
+ *
4
+ * Every other project identifier CLEO computes hashes the absolute path, and
5
+ * the random `projectId` in `.cleo/project-info.json` is gitignored (ADR-013
6
+ * §9), so a fresh clone used to mint a brand-new identity at `cleo init`. This
7
+ * file is the one identifier that travels with the repository: CLEO writes it
8
+ * once, commits nothing else beside it, and never rewrites it. Because nothing
9
+ * ever writes it a second time, git has nothing to overwrite — the geometry
10
+ * that made ADR-013 untrack the mutable state files does not apply
11
+ * (ADR-094, T12325).
12
+ *
13
+ * This module only READS. Writing (create-only) and re-linking live in
14
+ * `@cleocode/core` (`scaffold/project-identity.ts`).
15
+ *
16
+ * @packageDocumentation
17
+ * @task T12325
18
+ */
19
+ import { readFileSync } from 'node:fs';
20
+ import { join } from 'node:path';
21
+ /** Basename of the tracked portable identity file inside a project's `.cleo/`. */
22
+ export const PORTABLE_PROJECT_ID_FILE = 'project-id';
23
+ /**
24
+ * Accepted identity shape: every id CLEO has ever minted (UUIDv4, 12-hex,
25
+ * the 29-char legacy form) fits, and nothing that could smuggle a path
26
+ * separator, whitespace or a second line does.
27
+ */
28
+ const PORTABLE_PROJECT_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
29
+ /**
30
+ * Whether a string is an acceptable portable project id.
31
+ *
32
+ * @param projectId - Candidate identifier.
33
+ * @returns `true` when the id matches the accepted shape.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * isValidPortableProjectId('c78d09c3a8ee'); // true
38
+ * isValidPortableProjectId('../etc'); // false
39
+ * ```
40
+ *
41
+ * @public
42
+ */
43
+ export function isValidPortableProjectId(projectId) {
44
+ return PORTABLE_PROJECT_ID_PATTERN.test(projectId);
45
+ }
46
+ /**
47
+ * Absolute path of the portable identity file for a project root.
48
+ *
49
+ * @param projectRoot - Absolute project root (the directory containing `.cleo/`).
50
+ * @returns `<projectRoot>/.cleo/project-id`.
51
+ *
52
+ * @public
53
+ */
54
+ export function portableProjectIdPath(projectRoot) {
55
+ return join(projectRoot, '.cleo', PORTABLE_PROJECT_ID_FILE);
56
+ }
57
+ /**
58
+ * Render the file body CLEO writes for a portable id.
59
+ *
60
+ * Comment lines (`#`) are ignored by {@link parsePortableProjectId}, so the
61
+ * header can tell a human reader not to edit the file without being part of
62
+ * the identity.
63
+ *
64
+ * @param projectId - A valid portable id.
65
+ * @returns The exact bytes to write.
66
+ *
67
+ * @public
68
+ */
69
+ export function formatPortableProjectId(projectId) {
70
+ return ('# CLEO portable project identity (write-once; ADR-094, T12325).\n' +
71
+ '# Commit this file. Never edit or regenerate it: every checkout, clone and\n' +
72
+ '# device of this project resolves to the id below.\n' +
73
+ `${projectId}\n`);
74
+ }
75
+ /**
76
+ * Parse the body of a portable identity file.
77
+ *
78
+ * Blank lines and `#` comment lines are ignored; exactly one remaining line
79
+ * must hold a valid id.
80
+ *
81
+ * @param content - Raw file content.
82
+ * @returns The parsed read outcome (`valid` or `invalid`).
83
+ *
84
+ * @public
85
+ */
86
+ export function parsePortableProjectId(content) {
87
+ const lines = content
88
+ .split(/\r?\n/)
89
+ .map((line) => line.trim())
90
+ .filter((line) => line.length > 0 && !line.startsWith('#'));
91
+ if (lines.length !== 1) {
92
+ return {
93
+ status: 'invalid',
94
+ reason: `expected exactly one identity line, found ${lines.length}`,
95
+ };
96
+ }
97
+ const projectId = lines[0] ?? '';
98
+ if (!isValidPortableProjectId(projectId)) {
99
+ return { status: 'invalid', reason: `malformed identity '${projectId.slice(0, 64)}'` };
100
+ }
101
+ return { status: 'valid', projectId };
102
+ }
103
+ /**
104
+ * Read the tracked portable identity of a project, synchronously.
105
+ *
106
+ * @param projectRoot - Absolute project root (the directory containing `.cleo/`).
107
+ * @returns `absent` when no file exists, `valid` with the id, or `invalid`
108
+ * with a reason when the file exists but cannot be used.
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * const read = readPortableProjectId('/repo');
113
+ * if (read.status === 'valid') console.log(read.projectId);
114
+ * ```
115
+ *
116
+ * @public
117
+ */
118
+ export function readPortableProjectId(projectRoot) {
119
+ let content;
120
+ try {
121
+ content = readFileSync(portableProjectIdPath(projectRoot), 'utf-8');
122
+ }
123
+ catch (error) {
124
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
125
+ return { status: 'absent' };
126
+ }
127
+ return {
128
+ status: 'invalid',
129
+ reason: `unreadable: ${error instanceof Error ? error.message : String(error)}`,
130
+ };
131
+ }
132
+ return parsePortableProjectId(content);
133
+ }
134
+ //# sourceMappingURL=portable-project-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-project-id.js","sourceRoot":"","sources":["../src/portable-project-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,kFAAkF;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAC;AAErD;;;;GAIG;AACH,MAAM,2BAA2B,GAAG,oCAAoC,CAAC;AAezE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,OAAO,2BAA2B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,wBAAwB,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,OAAO,CACL,mEAAmE;QACnE,8EAA8E;QAC9E,sDAAsD;QACtD,GAAG,SAAS,IAAI,CACjB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,KAAK,GAAG,OAAO;SAClB,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,6CAA6C,KAAK,CAAC,MAAM,EAAE;SACpE,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,uBAAuB,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;IACzF,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,qBAAqB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,eAAe,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAChF,CAAC;IACJ,CAAC;IACD,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleocode/paths",
3
- "version": "2026.9.15",
3
+ "version": "2026.9.17",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "CLEO XDG/env-paths SSoT — createPlatformPathsResolver factory, cleo-bound platform paths, project hash + worktree root primitives, isAbsolutePath. Zero-dep leaf package consumed by core, worktree, brain, adapters, and caamp.",