@cleocode/paths 2026.9.23 → 2026.9.24

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.
@@ -9,6 +9,7 @@
9
9
  * @task T1883
10
10
  */
11
11
  import { type PlatformPaths, type SystemInfo } from './platform-paths.js';
12
+ import { type TrackedIdentityFile } from './portable-project-id.js';
12
13
  /**
13
14
  * Get OS-appropriate paths for CLEO's global directories.
14
15
  *
@@ -151,9 +152,10 @@ export declare function resolveLegacyCleoDir(override?: string): string;
151
152
  */
152
153
  export interface ResolvedProject {
153
154
  /**
154
- * The project's portable identity (ADR-094, T12470): the tracked
155
- * `.cleo/project-id` when valid, otherwise the `projectId` recorded in
156
- * `.cleo/project-info.json`. Never derived from the path. Treat it as an
155
+ * The project's portable identity (ADR-094, T12470, T12716): the tracked
156
+ * `.cleo/project.json` id (or the legacy `.cleo/project-id`) when valid,
157
+ * otherwise the `projectId` cached in `.cleo/project-info.json`. Never
158
+ * derived from the path. Treat it as an
157
159
  * opaque string — ids of every historical shape (UUID, 12-hex, legacy) occur.
158
160
  */
159
161
  projectId: string;
@@ -177,17 +179,28 @@ export interface ResolvedProject {
177
179
  export interface DeclaredProjectIdentity {
178
180
  /** The opaque project id. */
179
181
  readonly projectId: string;
180
- /** `tracked` = `.cleo/project-id`; `project-info` = `.cleo/project-info.json`. */
182
+ /**
183
+ * `tracked` = `.cleo/project.json` or the legacy `.cleo/project-id`;
184
+ * `project-info` = the device-local cache in `.cleo/project-info.json`.
185
+ */
181
186
  readonly source: 'tracked' | 'project-info';
187
+ /** Which tracked file supplied the id, when `source` is `tracked` (T12716). */
188
+ readonly trackedFile?: TrackedIdentityFile;
189
+ /** The committed display name, when `.cleo/project.json` declares one (T12716). */
190
+ readonly name?: string;
182
191
  /** The `projectId` recorded in `project-info.json`, when that file has one. */
183
192
  readonly infoProjectId?: string;
184
193
  }
185
194
  /**
186
- * Read the identity a project root DECLARES, in precedence order (T12470):
195
+ * Read the identity a project root DECLARES, in precedence order (T12470,
196
+ * T12716):
187
197
  *
188
- * 1. the tracked, write-once `.cleo/project-id` (ADR-094);
189
- * 2. the `projectId` in `.cleo/project-info.json`.
198
+ * 1. the tracked, write-once id: `.cleo/project.json`, else the legacy
199
+ * `.cleo/project-id` ({@link readPortableProjectId}, ADR-094);
200
+ * 2. the `projectId` cached in `.cleo/project-info.json`.
190
201
  *
202
+ * The tracked id always wins; a disagreeing cache is reported by
203
+ * `cleo doctor project-identity` and re-keyed only by its `--resolve`.
191
204
  * A malformed tracked file is skipped here (it is reported by
192
205
  * `cleo doctor project-identity`) and never replaced by a derived value.
193
206
  * Nothing about the path — its spelling, realpath, git root or remote — takes
@@ -1 +1 @@
1
- {"version":3,"file":"cleo-paths.d.ts","sourceRoot":"","sources":["../src/cleo-paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cleo-paths.d.ts","sourceRoot":"","sources":["../src/cleo-paths.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@
10
10
  */
11
11
  import { execFileSync } from 'node:child_process';
12
12
  import { createHash } from 'node:crypto';
13
- import { existsSync, readFileSync, realpathSync } from 'node:fs';
13
+ import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
14
14
  import { createRequire } from 'node:module';
15
15
  import { homedir } from 'node:os';
16
16
  import { dirname, join, resolve } from 'node:path';
@@ -221,11 +221,15 @@ function _readProjectInfoId(projectRoot) {
221
221
  }
222
222
  }
223
223
  /**
224
- * Read the identity a project root DECLARES, in precedence order (T12470):
224
+ * Read the identity a project root DECLARES, in precedence order (T12470,
225
+ * T12716):
225
226
  *
226
- * 1. the tracked, write-once `.cleo/project-id` (ADR-094);
227
- * 2. the `projectId` in `.cleo/project-info.json`.
227
+ * 1. the tracked, write-once id: `.cleo/project.json`, else the legacy
228
+ * `.cleo/project-id` ({@link readPortableProjectId}, ADR-094);
229
+ * 2. the `projectId` cached in `.cleo/project-info.json`.
228
230
  *
231
+ * The tracked id always wins; a disagreeing cache is reported by
232
+ * `cleo doctor project-identity` and re-keyed only by its `--resolve`.
229
233
  * A malformed tracked file is skipped here (it is reported by
230
234
  * `cleo doctor project-identity`) and never replaced by a derived value.
231
235
  * Nothing about the path — its spelling, realpath, git root or remote — takes
@@ -249,6 +253,8 @@ export function readDeclaredProjectIdentity(projectRoot) {
249
253
  return {
250
254
  projectId: tracked.projectId,
251
255
  source: 'tracked',
256
+ ...(tracked.file !== undefined && { trackedFile: tracked.file }),
257
+ ...(tracked.name !== undefined && { name: tracked.name }),
252
258
  ...(infoProjectId !== undefined && { infoProjectId }),
253
259
  };
254
260
  }
@@ -257,6 +263,19 @@ export function readDeclaredProjectIdentity(projectRoot) {
257
263
  }
258
264
  return null;
259
265
  }
266
+ /**
267
+ * Whether `<dir>/.git` is a DIRECTORY (a git toplevel). A linked worktree's
268
+ * `.git` is a gitlink FILE: a tracked-only `.cleo/` there is not a project
269
+ * root, matching core's `validateProjectRoot` (T12716 review finding 8).
270
+ */
271
+ function _isGitDirectory(dir) {
272
+ try {
273
+ return statSync(join(dir, '.git')).isDirectory();
274
+ }
275
+ catch {
276
+ return false;
277
+ }
278
+ }
260
279
  // ---------------------------------------------------------------------------
261
280
  // Path fingerprint (alias key only — never an identity, T12470)
262
281
  // ---------------------------------------------------------------------------
@@ -298,6 +317,10 @@ function _findGitRemoteUrlSync(fromPath) {
298
317
  /**
299
318
  * Read the project name from `.cleo/project-info.json` (if present).
300
319
  * Non-fatal on any I/O or parse error.
320
+ *
321
+ * Deliberately NOT the display name (`.cleo/project.json`, T12716): this value
322
+ * is an input to the path fingerprint, a legacy alias KEY that must keep
323
+ * matching the keys older builds recorded. A rename never changes it.
301
324
  */
302
325
  function _readProjectInfoName(repoRoot) {
303
326
  try {
@@ -451,11 +474,12 @@ export function resolveProjectByCwd(cwd) {
451
474
  while (true) {
452
475
  if (existsSync(join(current, '.cleo'))) {
453
476
  const declared = readDeclaredProjectIdentity(current);
454
- // A `.cleo/` holding ONLY a committed project-id (no project-info.json)
455
- // is a project root only at a git toplevel. Otherwise a monorepo
477
+ // A `.cleo/` holding ONLY a committed identity (project.json or the
478
+ // legacy project-id; no project-info.json) is a project root only at a
479
+ // git toplevel — a real `.git/` directory, never a worktree's gitlink. Otherwise a monorepo
456
480
  // subdirectory that carries a committed id would shadow its parent.
457
481
  const trackedOnly = declared?.source === 'tracked' && declared.infoProjectId === undefined;
458
- if (declared !== null && (!trackedOnly || existsSync(join(current, '.git')))) {
482
+ if (declared !== null && (!trackedOnly || _isGitDirectory(current))) {
459
483
  return {
460
484
  projectId: declared.projectId,
461
485
  projectRoot: canonicalizePath(current),
@@ -1 +1 @@
1
- {"version":3,"file":"cleo-paths.js","sourceRoot":"","sources":["../src/cleo-paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cleo-paths.js","sourceRoot":"","sources":["../src/cleo-paths.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -19,7 +19,8 @@
19
19
  * - {@link isAbsolutePath} — cross-platform abs-path check
20
20
  * - Executable search: {@link findOnPath}, {@link prependPathEntry},
21
21
  * {@link splitPathEnv} (PATH delimiter + PATHEXT aware, T12605)
22
- * - Portable identity: {@link readPortableProjectId} (tracked `.cleo/project-id`, T12325)
22
+ * - Portable identity: {@link readPortableProjectId} (tracked `.cleo/project.json`, then the
23
+ * legacy `.cleo/project-id`; T12325 · T12716) and {@link readProjectManifest}
23
24
  *
24
25
  * @packageDocumentation
25
26
  * @task T1883
@@ -30,6 +31,6 @@ export { _resetCleoPlatformPathsCache, canonicalizePath, computeCanonicalProject
30
31
  export { type ExecPathOptions, executableNames, findOnPath, pathDelimiterFor, pathEnvKey, prependPathEntry, quoteCmdArg, resolveSpawnInvocation, type ShellInvocation, type SpawnInvocation, shellInvocation, splitPathEnv, } from './exec-path.js';
31
32
  export { type EnforceOptions, enforceNodeVersion, evaluateNodeVersion, FALLBACK_MIN_NODE, getRequiredNodeVersion, type NodeManager, type NodeVersionVerdict, parseSemver, type Semver, type UpgradeHint, } from './node-version-gate.js';
32
33
  export { createPlatformPathsResolver, expandTildePath, type PlatformPaths, type PlatformPathsResolver, type SystemInfo, } from './platform-paths.js';
33
- export { formatPortableProjectId, isValidPortableProjectId, PORTABLE_PROJECT_ID_FILE, type PortableProjectIdRead, parsePortableProjectId, portableProjectIdPath, readPortableProjectId, } from './portable-project-id.js';
34
+ export { formatPortableProjectId, formatProjectManifest, isValidPortableProjectId, isValidProjectDisplayName, PORTABLE_PROJECT_ID_FILE, type PortableProjectIdRead, PROJECT_DISPLAY_NAME_MAX, PROJECT_MANIFEST_FILE, PROJECT_MANIFEST_SCHEMA_VERSION, type ProjectManifest, type ProjectManifestRead, parsePortableProjectId, parseProjectManifest, portableProjectIdPath, projectManifestPath, readPortableProjectId, readProjectIdFile, readProjectManifest, type TrackedIdentityFile, } from './portable-project-id.js';
34
35
  export { computeProjectHash, getCleoWorktreesRoot, resolveTaskWorktreePath, resolveWorktreeIndexPath, resolveWorktreeRootForHash, resolveWorktreeTaskLockPath, } from './worktree-paths.js';
35
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,8BAA8B,EAC9B,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,2BAA2B,EAC3B,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,eAAe,EACpB,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,eAAe,EACf,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,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,eAAe,EACf,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,EAC1B,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,8BAA8B,EAC9B,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,2BAA2B,EAC3B,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,eAAe,EACpB,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,eAAe,EACf,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,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,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,wBAAwB,EACxB,qBAAqB,EACrB,+BAA+B,EAC/B,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -19,7 +19,8 @@
19
19
  * - {@link isAbsolutePath} — cross-platform abs-path check
20
20
  * - Executable search: {@link findOnPath}, {@link prependPathEntry},
21
21
  * {@link splitPathEnv} (PATH delimiter + PATHEXT aware, T12605)
22
- * - Portable identity: {@link readPortableProjectId} (tracked `.cleo/project-id`, T12325)
22
+ * - Portable identity: {@link readPortableProjectId} (tracked `.cleo/project.json`, then the
23
+ * legacy `.cleo/project-id`; T12325 · T12716) and {@link readProjectManifest}
23
24
  *
24
25
  * @packageDocumentation
25
26
  * @task T1883
@@ -30,6 +31,6 @@ export { _resetCleoPlatformPathsCache, canonicalizePath, computeCanonicalProject
30
31
  export { executableNames, findOnPath, pathDelimiterFor, pathEnvKey, prependPathEntry, quoteCmdArg, resolveSpawnInvocation, shellInvocation, splitPathEnv, } from './exec-path.js';
31
32
  export { enforceNodeVersion, evaluateNodeVersion, FALLBACK_MIN_NODE, getRequiredNodeVersion, parseSemver, } from './node-version-gate.js';
32
33
  export { createPlatformPathsResolver, expandTildePath, } from './platform-paths.js';
33
- export { formatPortableProjectId, isValidPortableProjectId, PORTABLE_PROJECT_ID_FILE, parsePortableProjectId, portableProjectIdPath, readPortableProjectId, } from './portable-project-id.js';
34
+ export { formatPortableProjectId, formatProjectManifest, isValidPortableProjectId, isValidProjectDisplayName, PORTABLE_PROJECT_ID_FILE, PROJECT_DISPLAY_NAME_MAX, PROJECT_MANIFEST_FILE, PROJECT_MANIFEST_SCHEMA_VERSION, parsePortableProjectId, parseProjectManifest, portableProjectIdPath, projectManifestPath, readPortableProjectId, readProjectIdFile, readProjectManifest, } from './portable-project-id.js';
34
35
  export { computeProjectHash, getCleoWorktreesRoot, resolveTaskWorktreePath, resolveWorktreeIndexPath, resolveWorktreeRootForHash, resolveWorktreeTaskLockPath, } from './worktree-paths.js';
35
36
  //# 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;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EAExB,8BAA8B,EAC9B,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EAGf,2BAA2B,EAC3B,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,sBAAsB,EAGtB,eAAe,EACf,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EAGtB,WAAW,GAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,2BAA2B,EAC3B,eAAe,GAIhB,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,EAC1B,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EAExB,8BAA8B,EAC9B,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EAGf,2BAA2B,EAC3B,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,sBAAsB,EAGtB,eAAe,EACf,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EAGtB,WAAW,GAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,2BAA2B,EAC3B,eAAe,GAIhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EAExB,wBAAwB,EACxB,qBAAqB,EACrB,+BAA+B,EAG/B,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GAEpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC"}
@@ -1,23 +1,45 @@
1
1
  /**
2
- * The tracked, write-once portable project identity (`.cleo/project-id`).
2
+ * The tracked, write-once portable project identity.
3
3
  *
4
4
  * Every other project identifier CLEO computes hashes the absolute path, and
5
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).
6
+ * §9), so a fresh clone used to mint a brand-new identity at `cleo init`. The
7
+ * tracked identity travels with the repository instead. Two files carry it:
12
8
  *
13
- * This module only READS. Writing (create-only) and re-linking live in
14
- * `@cleocode/core` (`scaffold/project-identity.ts`).
9
+ * - `.cleo/project.json` — canonical since T12716: `{schemaVersion, id, name}`.
10
+ * The id is write-once; the name is the project's committed display name and
11
+ * changes only through `cleo project rename`.
12
+ * - `.cleo/project-id` — the ADR-094 id-only file (T12325). Kept as a legacy
13
+ * mirror so builds that know only this file keep resolving the same id.
14
+ *
15
+ * {@link readPortableProjectId} is the ONE resolver over both: `project.json`
16
+ * wins, `project-id` is the fallback. Because nothing rewrites the id, git has
17
+ * nothing to overwrite — the geometry that made ADR-013 untrack the mutable
18
+ * state files does not apply (ADR-094, T12325; ADR-096, T12716).
19
+ *
20
+ * This module only READS. Writing (create-only), renaming and migration live
21
+ * in `@cleocode/core` (`scaffold/project-identity.ts`, `project-manifest.ts`,
22
+ * `doctor/project-identity.ts`).
15
23
  *
16
24
  * @packageDocumentation
17
25
  * @task T12325
26
+ * @task T12716
27
+ */
28
+ /**
29
+ * Basename of the legacy id-only identity file inside a project's `.cleo/`
30
+ * (ADR-094). Superseded by {@link PROJECT_MANIFEST_FILE}; still read as a
31
+ * fallback and kept as a mirror for older builds (T12716).
18
32
  */
19
- /** Basename of the tracked portable identity file inside a project's `.cleo/`. */
20
33
  export declare const PORTABLE_PROJECT_ID_FILE = "project-id";
34
+ /** Basename of the canonical tracked identity manifest inside `.cleo/` (T12716). */
35
+ export declare const PROJECT_MANIFEST_FILE = "project.json";
36
+ /** The only `schemaVersion` of `.cleo/project.json` this build understands. */
37
+ export declare const PROJECT_MANIFEST_SCHEMA_VERSION = 1;
38
+ /**
39
+ * Longest accepted display name. Matches the Cleo Nexus project-label limit so
40
+ * a declared name can always be sent as a label unchanged.
41
+ */
42
+ export declare const PROJECT_DISPLAY_NAME_MAX = 120;
21
43
  /**
22
44
  * Outcome of reading `.cleo/project-id`.
23
45
  *
@@ -31,6 +53,42 @@ export type PortableProjectIdRead = {
31
53
  } | {
32
54
  readonly status: 'valid';
33
55
  readonly projectId: string;
56
+ /** File that supplied the id; set by the file readers, not by the parser. */
57
+ readonly file?: TrackedIdentityFile;
58
+ /** Declared display name; only `project.json` carries one. */
59
+ readonly name?: string;
60
+ } | {
61
+ readonly status: 'invalid';
62
+ readonly reason: string;
63
+ /** File that is unusable; set by the file readers, not by the parser. */
64
+ readonly file?: TrackedIdentityFile;
65
+ };
66
+ /** A tracked identity file: the canonical manifest or the legacy id-only file. */
67
+ export type TrackedIdentityFile = typeof PROJECT_MANIFEST_FILE | typeof PORTABLE_PROJECT_ID_FILE;
68
+ /**
69
+ * The committed project manifest, `.cleo/project.json` (T12716).
70
+ *
71
+ * @public
72
+ */
73
+ export interface ProjectManifest {
74
+ /** Manifest format version; always {@link PROJECT_MANIFEST_SCHEMA_VERSION}. */
75
+ readonly schemaVersion: typeof PROJECT_MANIFEST_SCHEMA_VERSION;
76
+ /** Write-once portable project id. */
77
+ readonly id: string;
78
+ /** Display name; renamed only through `cleo project rename`. */
79
+ readonly name: string;
80
+ }
81
+ /**
82
+ * Outcome of reading `.cleo/project.json`. As with the id file, `invalid` is a
83
+ * diagnostic to report, never a reason to mint or regenerate.
84
+ *
85
+ * @public
86
+ */
87
+ export type ProjectManifestRead = {
88
+ readonly status: 'absent';
89
+ } | {
90
+ readonly status: 'valid';
91
+ readonly manifest: ProjectManifest;
34
92
  } | {
35
93
  readonly status: 'invalid';
36
94
  readonly reason: string;
@@ -85,16 +143,114 @@ export declare function formatPortableProjectId(projectId: string): string;
85
143
  */
86
144
  export declare function parsePortableProjectId(content: string): PortableProjectIdRead;
87
145
  /**
88
- * Read the tracked portable identity of a project, synchronously.
146
+ * Read ONLY the legacy `.cleo/project-id` file, synchronously.
147
+ *
148
+ * Callers that need the project's id use {@link readPortableProjectId}, which
149
+ * prefers `project.json`. This is for code that manages the legacy file
150
+ * itself (the doctor, the mirror writer, identity retirement).
151
+ *
152
+ * @param projectRoot - Absolute project root (the directory containing `.cleo/`).
153
+ * @returns `absent`, `valid` with the id, or `invalid` with a reason.
154
+ *
155
+ * @example
156
+ * ```ts
157
+ * readProjectIdFile('/repo'); // { status: 'valid', projectId: 'c78d09c3a8ee', file: 'project-id' }
158
+ * ```
159
+ *
160
+ * @public
161
+ * @task T12716
162
+ */
163
+ export declare function readProjectIdFile(projectRoot: string): PortableProjectIdRead;
164
+ /**
165
+ * Whether a string is an acceptable display name: 1-{@link PROJECT_DISPLAY_NAME_MAX}
166
+ * characters after trimming, no path separator, no leading `~`, no control
167
+ * character. A name is a label, never a path.
168
+ *
169
+ * @param name - Candidate name.
170
+ * @returns `true` when the name is acceptable as-is (already trimmed).
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * isValidProjectDisplayName('cleocode'); // true
175
+ * isValidProjectDisplayName('../x'); // false
176
+ * ```
177
+ *
178
+ * @public
179
+ * @task T12716
180
+ */
181
+ export declare function isValidProjectDisplayName(name: string): boolean;
182
+ /**
183
+ * Absolute path of the canonical identity manifest for a project root.
184
+ *
185
+ * @param projectRoot - Absolute project root (the directory containing `.cleo/`).
186
+ * @returns `<projectRoot>/.cleo/project.json`.
187
+ *
188
+ * @public
189
+ * @task T12716
190
+ */
191
+ export declare function projectManifestPath(projectRoot: string): string;
192
+ /**
193
+ * Render the exact bytes CLEO writes for a manifest: stable key order, two-space
194
+ * indent, trailing newline, so a rename diff touches one line.
195
+ *
196
+ * @param manifest - A manifest with a valid id and name.
197
+ * @returns The file body.
198
+ *
199
+ * @public
200
+ * @task T12716
201
+ */
202
+ export declare function formatProjectManifest(manifest: ProjectManifest): string;
203
+ /**
204
+ * Parse the body of `.cleo/project.json`.
205
+ *
206
+ * Strict on the three fields: `schemaVersion` must be
207
+ * {@link PROJECT_MANIFEST_SCHEMA_VERSION} (a newer format is `invalid`, so an
208
+ * old build never guesses at it), `id` must pass
209
+ * {@link isValidPortableProjectId}, and `name` must pass
210
+ * {@link isValidProjectDisplayName}. Unknown extra keys are ignored.
211
+ *
212
+ * @param content - Raw file content.
213
+ * @returns `valid` with the manifest, or `invalid` with a reason.
214
+ *
215
+ * @public
216
+ * @task T12716
217
+ */
218
+ export declare function parseProjectManifest(content: string): ProjectManifestRead;
219
+ /**
220
+ * Read `.cleo/project.json`, synchronously.
221
+ *
222
+ * @param projectRoot - Absolute project root (the directory containing `.cleo/`).
223
+ * @returns `absent`, `valid` with the manifest, or `invalid` with a reason.
224
+ *
225
+ * @example
226
+ * ```ts
227
+ * const read = readProjectManifest('/repo');
228
+ * if (read.status === 'valid') console.log(read.manifest.name);
229
+ * ```
230
+ *
231
+ * @public
232
+ * @task T12716
233
+ */
234
+ export declare function readProjectManifest(projectRoot: string): ProjectManifestRead;
235
+ /**
236
+ * Read the tracked portable identity of a project, synchronously — the ONE
237
+ * resolver over the tracked files (T12716).
238
+ *
239
+ * Precedence: `.cleo/project.json`, then the legacy `.cleo/project-id`. A
240
+ * malformed `project.json` is `invalid` and does NOT fall through to
241
+ * `project-id`: a broken canonical file is restored from version control,
242
+ * never papered over. When both files are valid and disagree, `project.json`
243
+ * wins here and `cleo doctor project-identity` reports the mirror conflict.
89
244
  *
90
245
  * @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.
246
+ * @returns `absent` when neither file exists, `valid` with the id (and the
247
+ * `file` it came from, plus the `name` when `project.json` supplied it), or
248
+ * `invalid` with a reason and the unusable `file`.
93
249
  *
94
250
  * @example
95
251
  * ```ts
96
252
  * const read = readPortableProjectId('/repo');
97
- * if (read.status === 'valid') console.log(read.projectId);
253
+ * if (read.status === 'valid') console.log(read.projectId, read.file);
98
254
  * ```
99
255
  *
100
256
  * @public
@@ -1 +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"}
1
+ {"version":3,"file":"portable-project-id.d.ts","sourceRoot":"","sources":["../src/portable-project-id.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,47 @@
1
1
  /**
2
- * The tracked, write-once portable project identity (`.cleo/project-id`).
2
+ * The tracked, write-once portable project identity.
3
3
  *
4
4
  * Every other project identifier CLEO computes hashes the absolute path, and
5
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).
6
+ * §9), so a fresh clone used to mint a brand-new identity at `cleo init`. The
7
+ * tracked identity travels with the repository instead. Two files carry it:
12
8
  *
13
- * This module only READS. Writing (create-only) and re-linking live in
14
- * `@cleocode/core` (`scaffold/project-identity.ts`).
9
+ * - `.cleo/project.json` — canonical since T12716: `{schemaVersion, id, name}`.
10
+ * The id is write-once; the name is the project's committed display name and
11
+ * changes only through `cleo project rename`.
12
+ * - `.cleo/project-id` — the ADR-094 id-only file (T12325). Kept as a legacy
13
+ * mirror so builds that know only this file keep resolving the same id.
14
+ *
15
+ * {@link readPortableProjectId} is the ONE resolver over both: `project.json`
16
+ * wins, `project-id` is the fallback. Because nothing rewrites the id, git has
17
+ * nothing to overwrite — the geometry that made ADR-013 untrack the mutable
18
+ * state files does not apply (ADR-094, T12325; ADR-096, T12716).
19
+ *
20
+ * This module only READS. Writing (create-only), renaming and migration live
21
+ * in `@cleocode/core` (`scaffold/project-identity.ts`, `project-manifest.ts`,
22
+ * `doctor/project-identity.ts`).
15
23
  *
16
24
  * @packageDocumentation
17
25
  * @task T12325
26
+ * @task T12716
18
27
  */
19
28
  import { readFileSync } from 'node:fs';
20
29
  import { join } from 'node:path';
21
- /** Basename of the tracked portable identity file inside a project's `.cleo/`. */
30
+ /**
31
+ * Basename of the legacy id-only identity file inside a project's `.cleo/`
32
+ * (ADR-094). Superseded by {@link PROJECT_MANIFEST_FILE}; still read as a
33
+ * fallback and kept as a mirror for older builds (T12716).
34
+ */
22
35
  export const PORTABLE_PROJECT_ID_FILE = 'project-id';
36
+ /** Basename of the canonical tracked identity manifest inside `.cleo/` (T12716). */
37
+ export const PROJECT_MANIFEST_FILE = 'project.json';
38
+ /** The only `schemaVersion` of `.cleo/project.json` this build understands. */
39
+ export const PROJECT_MANIFEST_SCHEMA_VERSION = 1;
40
+ /**
41
+ * Longest accepted display name. Matches the Cleo Nexus project-label limit so
42
+ * a declared name can always be sent as a label unchanged.
43
+ */
44
+ export const PROJECT_DISPLAY_NAME_MAX = 120;
23
45
  /**
24
46
  * Accepted identity shape: every id CLEO has ever minted (UUIDv4, 12-hex,
25
47
  * the 29-char legacy form) fits, and nothing that could smuggle a path
@@ -68,6 +90,7 @@ export function portableProjectIdPath(projectRoot) {
68
90
  */
69
91
  export function formatPortableProjectId(projectId) {
70
92
  return ('# CLEO portable project identity (write-once; ADR-094, T12325).\n' +
93
+ '# Legacy mirror of the id in .cleo/project.json (T12716) for older CLEO builds.\n' +
71
94
  '# Commit this file. Never edit or regenerate it: every checkout, clone and\n' +
72
95
  '# device of this project resolves to the id below.\n' +
73
96
  `${projectId}\n`);
@@ -101,24 +124,195 @@ export function parsePortableProjectId(content) {
101
124
  return { status: 'valid', projectId };
102
125
  }
103
126
  /**
104
- * Read the tracked portable identity of a project, synchronously.
127
+ * Read ONLY the legacy `.cleo/project-id` file, synchronously.
128
+ *
129
+ * Callers that need the project's id use {@link readPortableProjectId}, which
130
+ * prefers `project.json`. This is for code that manages the legacy file
131
+ * itself (the doctor, the mirror writer, identity retirement).
105
132
  *
106
133
  * @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.
134
+ * @returns `absent`, `valid` with the id, or `invalid` with a reason.
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * readProjectIdFile('/repo'); // { status: 'valid', projectId: 'c78d09c3a8ee', file: 'project-id' }
139
+ * ```
140
+ *
141
+ * @public
142
+ * @task T12716
143
+ */
144
+ export function readProjectIdFile(projectRoot) {
145
+ const content = readTextFile(portableProjectIdPath(projectRoot));
146
+ if (content.status !== 'read')
147
+ return withFile(content, PORTABLE_PROJECT_ID_FILE);
148
+ return withFile(parsePortableProjectId(content.content), PORTABLE_PROJECT_ID_FILE);
149
+ }
150
+ /**
151
+ * Whether a string is an acceptable display name: 1-{@link PROJECT_DISPLAY_NAME_MAX}
152
+ * characters after trimming, no path separator, no leading `~`, no control
153
+ * character. A name is a label, never a path.
154
+ *
155
+ * @param name - Candidate name.
156
+ * @returns `true` when the name is acceptable as-is (already trimmed).
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * isValidProjectDisplayName('cleocode'); // true
161
+ * isValidProjectDisplayName('../x'); // false
162
+ * ```
163
+ *
164
+ * @public
165
+ * @task T12716
166
+ */
167
+ export function isValidProjectDisplayName(name) {
168
+ return (name.length > 0 &&
169
+ name === name.trim() &&
170
+ name.length <= PROJECT_DISPLAY_NAME_MAX &&
171
+ !name.startsWith('~') &&
172
+ !/[/\\\u0000-\u001f\u007f]/.test(name));
173
+ }
174
+ /**
175
+ * Absolute path of the canonical identity manifest for a project root.
176
+ *
177
+ * @param projectRoot - Absolute project root (the directory containing `.cleo/`).
178
+ * @returns `<projectRoot>/.cleo/project.json`.
179
+ *
180
+ * @public
181
+ * @task T12716
182
+ */
183
+ export function projectManifestPath(projectRoot) {
184
+ return join(projectRoot, '.cleo', PROJECT_MANIFEST_FILE);
185
+ }
186
+ /**
187
+ * Render the exact bytes CLEO writes for a manifest: stable key order, two-space
188
+ * indent, trailing newline, so a rename diff touches one line.
189
+ *
190
+ * @param manifest - A manifest with a valid id and name.
191
+ * @returns The file body.
192
+ *
193
+ * @public
194
+ * @task T12716
195
+ */
196
+ export function formatProjectManifest(manifest) {
197
+ const ordered = {
198
+ schemaVersion: manifest.schemaVersion,
199
+ id: manifest.id,
200
+ name: manifest.name,
201
+ };
202
+ return `${JSON.stringify(ordered, null, 2)}\n`;
203
+ }
204
+ /**
205
+ * Parse the body of `.cleo/project.json`.
206
+ *
207
+ * Strict on the three fields: `schemaVersion` must be
208
+ * {@link PROJECT_MANIFEST_SCHEMA_VERSION} (a newer format is `invalid`, so an
209
+ * old build never guesses at it), `id` must pass
210
+ * {@link isValidPortableProjectId}, and `name` must pass
211
+ * {@link isValidProjectDisplayName}. Unknown extra keys are ignored.
212
+ *
213
+ * @param content - Raw file content.
214
+ * @returns `valid` with the manifest, or `invalid` with a reason.
215
+ *
216
+ * @public
217
+ * @task T12716
218
+ */
219
+ export function parseProjectManifest(content) {
220
+ let data;
221
+ try {
222
+ data = JSON.parse(content);
223
+ }
224
+ catch (error) {
225
+ return {
226
+ status: 'invalid',
227
+ reason: `not JSON: ${error instanceof Error ? error.message : String(error)}`,
228
+ };
229
+ }
230
+ if (data === null || typeof data !== 'object' || Array.isArray(data)) {
231
+ return { status: 'invalid', reason: 'expected a JSON object' };
232
+ }
233
+ const record = data;
234
+ if (record['schemaVersion'] !== PROJECT_MANIFEST_SCHEMA_VERSION) {
235
+ return {
236
+ status: 'invalid',
237
+ reason: `unsupported schemaVersion ${JSON.stringify(record['schemaVersion'])} (this build reads ${PROJECT_MANIFEST_SCHEMA_VERSION})`,
238
+ };
239
+ }
240
+ const id = record['id'];
241
+ if (typeof id !== 'string' || !isValidPortableProjectId(id)) {
242
+ return { status: 'invalid', reason: `malformed id ${JSON.stringify(id)?.slice(0, 64)}` };
243
+ }
244
+ const name = record['name'];
245
+ if (typeof name !== 'string' || !isValidProjectDisplayName(name)) {
246
+ return { status: 'invalid', reason: `malformed name ${JSON.stringify(name)?.slice(0, 64)}` };
247
+ }
248
+ return {
249
+ status: 'valid',
250
+ manifest: { schemaVersion: PROJECT_MANIFEST_SCHEMA_VERSION, id, name },
251
+ };
252
+ }
253
+ /**
254
+ * Read `.cleo/project.json`, synchronously.
255
+ *
256
+ * @param projectRoot - Absolute project root (the directory containing `.cleo/`).
257
+ * @returns `absent`, `valid` with the manifest, or `invalid` with a reason.
258
+ *
259
+ * @example
260
+ * ```ts
261
+ * const read = readProjectManifest('/repo');
262
+ * if (read.status === 'valid') console.log(read.manifest.name);
263
+ * ```
264
+ *
265
+ * @public
266
+ * @task T12716
267
+ */
268
+ export function readProjectManifest(projectRoot) {
269
+ const content = readTextFile(projectManifestPath(projectRoot));
270
+ if (content.status !== 'read')
271
+ return content;
272
+ return parseProjectManifest(content.content);
273
+ }
274
+ /**
275
+ * Read the tracked portable identity of a project, synchronously — the ONE
276
+ * resolver over the tracked files (T12716).
277
+ *
278
+ * Precedence: `.cleo/project.json`, then the legacy `.cleo/project-id`. A
279
+ * malformed `project.json` is `invalid` and does NOT fall through to
280
+ * `project-id`: a broken canonical file is restored from version control,
281
+ * never papered over. When both files are valid and disagree, `project.json`
282
+ * wins here and `cleo doctor project-identity` reports the mirror conflict.
283
+ *
284
+ * @param projectRoot - Absolute project root (the directory containing `.cleo/`).
285
+ * @returns `absent` when neither file exists, `valid` with the id (and the
286
+ * `file` it came from, plus the `name` when `project.json` supplied it), or
287
+ * `invalid` with a reason and the unusable `file`.
109
288
  *
110
289
  * @example
111
290
  * ```ts
112
291
  * const read = readPortableProjectId('/repo');
113
- * if (read.status === 'valid') console.log(read.projectId);
292
+ * if (read.status === 'valid') console.log(read.projectId, read.file);
114
293
  * ```
115
294
  *
116
295
  * @public
117
296
  */
118
297
  export function readPortableProjectId(projectRoot) {
119
- let content;
298
+ const manifest = readProjectManifest(projectRoot);
299
+ if (manifest.status === 'valid') {
300
+ return {
301
+ status: 'valid',
302
+ projectId: manifest.manifest.id,
303
+ file: PROJECT_MANIFEST_FILE,
304
+ name: manifest.manifest.name,
305
+ };
306
+ }
307
+ if (manifest.status === 'invalid') {
308
+ return { status: 'invalid', reason: manifest.reason, file: PROJECT_MANIFEST_FILE };
309
+ }
310
+ return readProjectIdFile(projectRoot);
311
+ }
312
+ /** Read a small text file; `absent` on ENOENT, `invalid` on any other error. */
313
+ function readTextFile(path) {
120
314
  try {
121
- content = readFileSync(portableProjectIdPath(projectRoot), 'utf-8');
315
+ return { status: 'read', content: readFileSync(path, 'utf-8') };
122
316
  }
123
317
  catch (error) {
124
318
  if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
@@ -129,6 +323,11 @@ export function readPortableProjectId(projectRoot) {
129
323
  reason: `unreadable: ${error instanceof Error ? error.message : String(error)}`,
130
324
  };
131
325
  }
132
- return parsePortableProjectId(content);
326
+ }
327
+ /** Tag a read outcome with the file it came from (absent stays untagged). */
328
+ function withFile(read, file) {
329
+ if (read.status === 'absent')
330
+ return read;
331
+ return { ...read, file };
133
332
  }
134
333
  //# sourceMappingURL=portable-project-id.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"portable-project-id.js","sourceRoot":"","sources":["../src/portable-project-id.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleocode/paths",
3
- "version": "2026.9.23",
3
+ "version": "2026.9.24",
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.",