mancode 0.3.17 → 0.3.18

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/README.en.md CHANGED
@@ -17,7 +17,7 @@
17
17
  <p align="center">
18
18
  <a href="./LICENSE"><img src="https://img.shields.io/badge/License-AGPL--3.0-blue.svg?style=flat-square" alt="License: AGPL-3.0" /></a>
19
19
  <a href="https://www.npmjs.com/package/mancode"><img src="https://img.shields.io/npm/v/mancode?style=flat-square" alt="npm version" /></a>
20
- <img src="https://img.shields.io/badge/status-Continuity%20v0.3.17-2f855a?style=flat-square" alt="Status: mancode Continuity v0.3.17" />
20
+ <img src="https://img.shields.io/badge/status-Continuity%20v0.3.18-2f855a?style=flat-square" alt="Status: mancode Continuity v0.3.18" />
21
21
  <img src="https://img.shields.io/badge/platforms-Claude%20Code%20%7C%20Cursor%20%7C%20Codex%20%7C%20Copilot%20%7C%20ZCode-5865F2?style=flat-square" alt="Platforms: Claude Code, Cursor, Codex in ChatGPT desktop and CLI, GitHub Copilot, ZCode" />
22
22
  </p>
23
23
 
@@ -353,7 +353,7 @@ it should behave, and why previous decisions were made.
353
353
 
354
354
  ## Installation
355
355
 
356
- **Status**: mancode Continuity v0.3.17. Claude Code, Cursor, Codex in the ChatGPT
356
+ **Status**: mancode Continuity v0.3.18. Claude Code, Cursor, Codex in the ChatGPT
357
357
  desktop app and CLI, GitHub Copilot, and ZCode adapters are included.
358
358
 
359
359
  Requires Node.js 20 or newer. macOS, Linux, Windows CMD, PowerShell, and Git Bash
@@ -452,7 +452,7 @@ mancode version
452
452
  Simplified output:
453
453
 
454
454
  ```text
455
- mancode v0.3.17
455
+ mancode v0.3.18
456
456
 
457
457
  Project: my-app
458
458
  Runtime: ready
package/README.md CHANGED
@@ -17,7 +17,7 @@
17
17
  <p align="center">
18
18
  <a href="./LICENSE"><img src="https://img.shields.io/badge/License-AGPL--3.0-blue.svg?style=flat-square" alt="许可证:AGPL-3.0" /></a>
19
19
  <a href="https://www.npmjs.com/package/mancode"><img src="https://img.shields.io/npm/v/mancode?style=flat-square" alt="npm 版本" /></a>
20
- <img src="https://img.shields.io/badge/status-Continuity%20v0.3.17-2f855a?style=flat-square" alt="状态:mancode Continuity v0.3.17" />
20
+ <img src="https://img.shields.io/badge/status-Continuity%20v0.3.18-2f855a?style=flat-square" alt="状态:mancode Continuity v0.3.18" />
21
21
  <img src="https://img.shields.io/badge/platforms-Claude%20Code%20%7C%20Cursor%20%7C%20Codex%20%7C%20Copilot%20%7C%20ZCode-5865F2?style=flat-square" alt="平台:Claude Code、Cursor、ChatGPT 桌面端 Codex、Codex CLI、GitHub Copilot、ZCode" />
22
22
  </p>
23
23
 
@@ -307,7 +307,7 @@ src/components/
307
307
 
308
308
  ## 安装
309
309
 
310
- **状态**:mancode Continuity v0.3.17。Claude Code、Cursor、ChatGPT 桌面端中的
310
+ **状态**:mancode Continuity v0.3.18。Claude Code、Cursor、ChatGPT 桌面端中的
311
311
  Codex、Codex CLI、GitHub Copilot 和 ZCode adapter 均已接入。
312
312
 
313
313
  需要 Node.js 20 或更高版本。原生支持 macOS、Linux、Windows CMD、
@@ -404,7 +404,7 @@ mancode version
404
404
  以下是简化输出示例:
405
405
 
406
406
  ```text
407
- mancode v0.3.17
407
+ mancode v0.3.18
408
408
 
409
409
  Project: my-app
410
410
  Runtime: ready
package/dist/cli.js CHANGED
@@ -18954,10 +18954,10 @@ async function materializeGitRefTaskBundle(input) {
18954
18954
  const store = resolveCoordinationEntityHomeStore(
18955
18955
  runtime.entityHomeStoreContext
18956
18956
  );
18957
- const locks = await acquireEntityLocks(
18957
+ const locks = input.taskLockHeld ? [] : await acquireEntityLocks(
18958
18958
  store,
18959
18959
  operationId,
18960
- [`remote_task:${bundle.taskRef.taskId}`],
18960
+ [taskEntityKey(bundle.taskRef)],
18961
18961
  { now }
18962
18962
  );
18963
18963
  try {
@@ -18993,6 +18993,16 @@ async function materializeGitRefTaskBundle(input) {
18993
18993
  throw new Error("MANCODE_SPLIT_BRAIN");
18994
18994
  }
18995
18995
  const materializedPredecessor = status2 === "created" ? null : effectivePredecessor;
18996
+ if (status2 === "unchanged" && currentFence !== null && taskHeadFenceMatchesTarget({
18997
+ currentFence,
18998
+ runtime,
18999
+ remoteRevision,
19000
+ ownershipFence,
19001
+ bundle
19002
+ })) {
19003
+ await recordGitRefTaskRemoteBase(projectRoot, remoteRevision, bundle);
19004
+ return result(status2, bundle, null, currentFence);
19005
+ }
18996
19006
  const targetFence = buildTargetFence({
18997
19007
  runtime,
18998
19008
  remoteRevision,
@@ -19003,7 +19013,12 @@ async function materializeGitRefTaskBundle(input) {
19003
19013
  now
19004
19014
  });
19005
19015
  if (status2 === "unchanged") {
19006
- await writeTargetFence(store, currentFence, targetFence, predecessor);
19016
+ await writeTargetFence(
19017
+ store,
19018
+ currentFence,
19019
+ targetFence,
19020
+ materializedPredecessor
19021
+ );
19007
19022
  await recordGitRefTaskRemoteBase(projectRoot, remoteRevision, bundle);
19008
19023
  return result(status2, bundle, null, targetFence);
19009
19024
  }
@@ -19168,6 +19183,9 @@ function buildTargetFence(input) {
19168
19183
  updatedAt: input.now.toISOString()
19169
19184
  });
19170
19185
  }
19186
+ function taskHeadFenceMatchesTarget(input) {
19187
+ return input.currentFence.workspaceId === input.runtime.workspaceId && sameTaskRef(input.currentFence.taskRef, input.bundle.taskRef) && input.currentFence.taskRevision === input.bundle.taskRevision && input.currentFence.aggregateDigest === input.bundle.aggregateDigest && input.currentFence.ownershipEpoch === input.bundle.ownershipEpoch && input.currentFence.codeRef.head === input.bundle.codeRef.head && input.currentFence.checkoutId === input.runtime.checkoutId && input.currentFence.remoteRevision === input.remoteRevision && input.currentFence.lastOperationId === input.ownershipFence.lastOperationId;
19188
+ }
19171
19189
  async function writeTargetFence(store, current, target, predecessor) {
19172
19190
  if (current !== null && digestCanonicalJson(current) === digestCanonicalJson(target)) {
19173
19191
  return;
@@ -19598,6 +19616,7 @@ async function recoverGitRefWorkflowRepair(projectRoot, operationId, transportRe
19598
19616
  bundle: targetBundle,
19599
19617
  predecessorBundle: journal.prepared.predecessorBundle,
19600
19618
  pendingMetadata: journal.pendingMetadata,
19619
+ taskLockHeld: true,
19601
19620
  operationId: createUlid()
19602
19621
  });
19603
19622
  journal = await transitionJournal(
@@ -32861,6 +32880,7 @@ async function recoverGitRefHandoffRepair(projectRoot, operationId, transportRec
32861
32880
  bundle: journal.prepared.targetBundle,
32862
32881
  predecessorBundle: journal.prepared.predecessorBundle,
32863
32882
  pendingMetadata: journal.pendingMetadata,
32883
+ taskLockHeld: true,
32864
32884
  operationId: createUlid()
32865
32885
  });
32866
32886
  journal = await transitionJournal2(