commandmate 0.10.4 → 0.11.0

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.
Files changed (146) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +145 -145
  3. package/.next/app-path-routes-manifest.json +26 -26
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/app/update/route.js +1 -1
  9. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/update-check/route.js +1 -1
  11. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  107. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  108. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  110. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  111. package/.next/server/app/page_client-reference-manifest.js +1 -1
  112. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  114. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  115. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  116. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  117. package/.next/server/app/worktrees/[id]/page.js +7 -7
  118. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  119. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  120. package/.next/server/app-paths-manifest.json +26 -26
  121. package/.next/server/chunks/2119.js +1 -1
  122. package/.next/server/chunks/2445.js +1 -1
  123. package/.next/server/chunks/5959.js +1 -1
  124. package/.next/server/chunks/9067.js +1 -1
  125. package/.next/server/middleware-manifest.json +5 -5
  126. package/.next/server/pages/500.html +1 -1
  127. package/.next/server/server-reference-manifest.json +1 -1
  128. package/.next/static/chunks/{7347-a013a163a75030ec.js → 7347-7ee39e14be89e508.js} +1 -1
  129. package/.next/static/chunks/app/worktrees/[id]/page-1c311aaa0950db1e.js +1 -0
  130. package/.next/trace +10 -10
  131. package/dist/cli/commands/update.d.ts.map +1 -1
  132. package/dist/cli/commands/update.js +178 -1
  133. package/dist/cli/program.d.ts.map +1 -1
  134. package/dist/cli/program.js +6 -0
  135. package/dist/cli/types/index.d.ts +7 -0
  136. package/dist/cli/types/index.d.ts.map +1 -1
  137. package/dist/cli/utils/npx-runner.d.ts +88 -0
  138. package/dist/cli/utils/npx-runner.d.ts.map +1 -0
  139. package/dist/cli/utils/npx-runner.js +165 -0
  140. package/dist/lib/app-update/update-lock.d.ts +39 -0
  141. package/dist/lib/app-update/update-lock.d.ts.map +1 -0
  142. package/dist/lib/app-update/update-lock.js +116 -0
  143. package/package.json +1 -1
  144. package/.next/static/chunks/app/worktrees/[id]/page-932a52f8d11971f7.js +0 -1
  145. /package/.next/static/{uBCIYS1Hth7V4unroKqGu → 8yp8SRJ9h3Uj75SpHLYpl}/_buildManifest.js +0 -0
  146. /package/.next/static/{uBCIYS1Hth7V4unroKqGu → 8yp8SRJ9h3Uj75SpHLYpl}/_ssgManifest.js +0 -0
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ /**
3
+ * Update Lock
4
+ * Issue #1198: guard `POST /api/app/update` against concurrent self-updates.
5
+ *
6
+ * Design constraints:
7
+ * - Acquisition is a single O_EXCL create (mirrors PidManager.writePid), so two
8
+ * concurrent requests cannot both win.
9
+ * - A successful update restarts the server, so nothing survives to release the
10
+ * lock. Timeout expiry is therefore the primary release path, and
11
+ * releaseUpdateLock() exists only for the spawn-failed case.
12
+ *
13
+ * @module lib/app-update/update-lock
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.UPDATE_LOCK_TIMEOUT_MS = exports.UPDATE_LOCK_FILENAME = void 0;
17
+ exports.getUpdateLockPath = getUpdateLockPath;
18
+ exports.acquireUpdateLock = acquireUpdateLock;
19
+ exports.releaseUpdateLock = releaseUpdateLock;
20
+ const fs_1 = require("fs");
21
+ const path_1 = require("path");
22
+ // Relative (not '@/') so the CLI build (tsconfig.cli.json has no path alias and
23
+ // no tsc-alias step) can pull this module into `commandmate update --relaunch-npx`
24
+ // to release the lock on an npx abort path (Issue #1395 §5.2).
25
+ const install_context_1 = require("../../cli/utils/install-context");
26
+ /** Lock file name inside the config directory */
27
+ exports.UPDATE_LOCK_FILENAME = 'update.lock';
28
+ /**
29
+ * Age after which a lock is considered abandoned.
30
+ * `commandmate update` takes tens of seconds (npm install dominates); 10 minutes
31
+ * is well clear of that while still recovering from a killed update process.
32
+ */
33
+ exports.UPDATE_LOCK_TIMEOUT_MS = 10 * 60 * 1000;
34
+ /**
35
+ * Absolute path of the update lock file.
36
+ */
37
+ function getUpdateLockPath() {
38
+ return (0, path_1.join)((0, install_context_1.ensureConfigDir)(), exports.UPDATE_LOCK_FILENAME);
39
+ }
40
+ /**
41
+ * Whether an existing lock is old enough to reclaim.
42
+ * An unreadable or malformed lock counts as stale: it can never expire on its
43
+ * own, so treating it as held would block updates permanently.
44
+ */
45
+ function isStale(lockPath, now) {
46
+ try {
47
+ const parsed = JSON.parse((0, fs_1.readFileSync)(lockPath, 'utf-8'));
48
+ const startedAt = parsed.startedAt;
49
+ if (typeof startedAt !== 'number' || !Number.isFinite(startedAt)) {
50
+ return true;
51
+ }
52
+ return now - startedAt > exports.UPDATE_LOCK_TIMEOUT_MS;
53
+ }
54
+ catch {
55
+ return true;
56
+ }
57
+ }
58
+ /**
59
+ * Create the lock file, failing if it already exists.
60
+ *
61
+ * @returns true when this call created the file
62
+ */
63
+ function tryCreate(lockPath, now) {
64
+ let fd;
65
+ try {
66
+ fd = (0, fs_1.openSync)(lockPath, fs_1.constants.O_CREAT | fs_1.constants.O_EXCL | fs_1.constants.O_WRONLY, 0o600);
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ try {
72
+ const data = { startedAt: now, pid: process.pid };
73
+ (0, fs_1.writeSync)(fd, JSON.stringify(data));
74
+ return true;
75
+ }
76
+ finally {
77
+ (0, fs_1.closeSync)(fd);
78
+ }
79
+ }
80
+ /**
81
+ * Take the update lock.
82
+ *
83
+ * @param now - Current epoch ms (injectable for tests)
84
+ * @returns true when the caller now holds the lock, false when an update is in progress
85
+ */
86
+ function acquireUpdateLock(now = Date.now()) {
87
+ const lockPath = getUpdateLockPath();
88
+ if (tryCreate(lockPath, now)) {
89
+ return true;
90
+ }
91
+ if (!isStale(lockPath, now)) {
92
+ return false;
93
+ }
94
+ // Reclaim: unlink then re-create. A concurrent reclaimer loses the O_EXCL
95
+ // race and correctly reports "in progress" rather than spawning a second update.
96
+ try {
97
+ (0, fs_1.unlinkSync)(lockPath);
98
+ }
99
+ catch {
100
+ return false;
101
+ }
102
+ return tryCreate(lockPath, now);
103
+ }
104
+ /**
105
+ * Drop the update lock.
106
+ * Only meaningful when the update never started (spawn failure): a started
107
+ * update replaces this process, so the lock outlives it until it expires.
108
+ */
109
+ function releaseUpdateLock() {
110
+ try {
111
+ (0, fs_1.unlinkSync)(getUpdateLockPath());
112
+ }
113
+ catch {
114
+ // Already gone (expired and reclaimed elsewhere) — nothing to do.
115
+ }
116
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "commandmate",
3
- "version": "0.10.4",
3
+ "version": "0.11.0",
4
4
  "description": "A local control plane for agent CLIs — orchestration and visibility for Claude Code, Codex, Gemini CLI, and more across Git worktrees",
5
5
  "keywords": [
6
6
  "claude-code",