@pennixrv/trellis 0.6.26 → 0.6.27

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.
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": "0.6.26",
3
+ "description": "Adds a task-bound continuation record for safe cross-session handoff state.",
4
+ "breaking": false,
5
+ "recommendMigrate": false,
6
+ "changelog": "**Features:**\n- Adds a bounded Continuation Record projection bound to the direct current Trellis session and task.\n- Fails closed when task identity changes while a continuation record operation is acquiring its lock.\n\n**Internal:**\n- Keeps continuation runtime state outside version-controlled project files.",
7
+ "migrations": [],
8
+ "notes": "No project migration is required. Existing projects can run the normal `trellis update` flow."
9
+ }
@@ -362,10 +362,15 @@ def status(root: Path | None = None) -> dict[str, Any]:
362
362
  def seal(root: Path, request_path: Path, expected: str) -> dict[str, Any]:
363
363
  expected = _expected_digest(expected)
364
364
  request_path = _request_path(root, request_path)
365
- task = _task_source(root)
366
- path = _record_path(root, task["id"])
365
+ initial_task = _task_source(root)
366
+ path = _record_path(root, initial_task["id"])
367
367
  with _record_lock(path):
368
368
  task = _task_source(root)
369
+ if (
370
+ (task["id"], task["path"], task["context_key"])
371
+ != (initial_task["id"], initial_task["path"], initial_task["context_key"])
372
+ ):
373
+ raise ContinuationError("current task changed while acquiring record lock")
369
374
  current_digest: str | None = None
370
375
  current: dict[str, Any] | None = None
371
376
  if path.exists():
@@ -419,9 +424,15 @@ def seal(root: Path, request_path: Path, expected: str) -> dict[str, Any]:
419
424
 
420
425
  def clear(root: Path, expected: str) -> dict[str, Any]:
421
426
  expected = _expected_digest(expected)
422
- task = _task_source(root)
423
- path = _record_path(root, task["id"])
427
+ initial_task = _task_source(root)
428
+ path = _record_path(root, initial_task["id"])
424
429
  with _record_lock(path):
430
+ task = _task_source(root)
431
+ if (
432
+ (task["id"], task["path"], task["context_key"])
433
+ != (initial_task["id"], initial_task["path"], initial_task["context_key"])
434
+ ):
435
+ raise ContinuationError("current task changed while acquiring record lock")
425
436
  if not path.exists():
426
437
  if expected == "absent":
427
438
  return {"status": STATUS_ABSENT}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pennixrv/trellis",
3
- "version": "0.6.26",
3
+ "version": "0.6.27",
4
4
  "description": "AI capabilities grow like ivy — Trellis provides the structure to guide them along a disciplined path",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -34,7 +34,7 @@
34
34
  "inquirer": "^9.3.7",
35
35
  "undici": "^6.21.0",
36
36
  "zod": "^4.4.2",
37
- "@pennixrv/trellis-core": "0.6.26"
37
+ "@pennixrv/trellis-core": "0.6.27"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@eslint/js": "^9.18.0",