commandmate 0.42.0 → 0.42.2
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/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +136 -136
- package/.next/app-path-routes-manifest.json +25 -25
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +25 -25
- package/.next/server/chunks/1501.js +3 -3
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/434.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/5775.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/8583.js +1 -1
- package/.next/server/chunks/8728.js +1 -1
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/964.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{1642-767aed8e7c61ef7f.js → 1642-fb2e176aaadbd137.js} +1 -1
- package/.next/static/chunks/{2407-faae66d204748f7b.js → 2407-6b9e12c099fa598c.js} +1 -1
- package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
- package/.next/static/chunks/{8165-235859c6930f01b1.js → 8165-934ee7ff3b4ddfd4.js} +1 -1
- package/.next/static/chunks/app/{layout-9a715043610e4e27.js → layout-5b95e1236dcd9ef6.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/{page-61dd928d635db590.js → page-59f5337e031518c6.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
- package/.next/trace +13 -13
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +9 -0
- package/dist/cli/types/index.d.ts +2 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +56 -16
- package/dist/server/locales/ja/worktree.json +59 -19
- package/dist/server/src/lib/db/worktree-db.js +1 -1
- package/dist/server/src/lib/detection/cli-patterns.js +5 -2
- package/dist/server/src/lib/verification/env-clean-gate.js +141 -4
- package/dist/server/src/lib/verification/env-snapshot.js +65 -1
- package/package.json +1 -1
- package/release-notes/0.42.1.json +16 -0
- package/release-notes/0.42.2.json +20 -0
- /package/.next/static/{EbTDBXcXRpFNH4eom-HVv → MXZXkcFAnpELZnxxHB4iJ}/_buildManifest.js +0 -0
- /package/.next/static/{EbTDBXcXRpFNH4eom-HVv → MXZXkcFAnpELZnxxHB4iJ}/_ssgManifest.js +0 -0
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
* counted, and it is the single failure this gate must not reproduce.
|
|
18
18
|
* 2. **Additions and removals are judged asymmetrically.** Everything that
|
|
19
19
|
* existed at task start must still exist, whoever it belonged to — that is
|
|
20
|
-
* the pkill (#1739) and `kill-server` (#1624) case
|
|
20
|
+
* the pkill (#1739) and `kill-server` (#1624) case — with one exception: a
|
|
21
|
+
* tmux session the baseline recorded as *another CommandMate server's*
|
|
22
|
+
* (#2627), which that server may close whenever it likes. New things are a
|
|
21
23
|
* violation *unless they are attributable to another worker*, because
|
|
22
24
|
* parallel delegations legitimately start their own sessions and servers
|
|
23
25
|
* inside each other's measurement windows — or unless they are the one
|
|
@@ -36,6 +38,10 @@ exports.attributeAnchor = attributeAnchor;
|
|
|
36
38
|
exports.resolveTaskSessionName = resolveTaskSessionName;
|
|
37
39
|
exports.recordTaskSession = recordTaskSession;
|
|
38
40
|
exports.readTaskSession = readTaskSession;
|
|
41
|
+
exports.currentSessionServer = currentSessionServer;
|
|
42
|
+
exports.isOtherServerSession = isOtherServerSession;
|
|
43
|
+
exports.recordOtherServerSessions = recordOtherServerSessions;
|
|
44
|
+
exports.readOtherServerSessions = readOtherServerSessions;
|
|
39
45
|
exports.diffEnvSnapshots = diffEnvSnapshots;
|
|
40
46
|
exports.formatEnvCleanReport = formatEnvCleanReport;
|
|
41
47
|
exports.envCleanNoBaseline = envCleanNoBaseline;
|
|
@@ -166,8 +172,12 @@ function resolveTaskSessionName(task) {
|
|
|
166
172
|
}
|
|
167
173
|
}
|
|
168
174
|
/** A freshly captured baseline, stamped with its task's own agent session. */
|
|
169
|
-
function recordTaskSession(snapshot, task) {
|
|
170
|
-
return {
|
|
175
|
+
function recordTaskSession(snapshot, task, server = currentSessionServer()) {
|
|
176
|
+
return {
|
|
177
|
+
...snapshot,
|
|
178
|
+
taskSession: resolveTaskSessionName(task),
|
|
179
|
+
otherServerSessions: recordOtherServerSessions(snapshot, server),
|
|
180
|
+
};
|
|
171
181
|
}
|
|
172
182
|
/**
|
|
173
183
|
* The session a baseline excuses: its name, `null` when it was recorded as
|
|
@@ -180,6 +190,106 @@ function readTaskSession(baseline) {
|
|
|
180
190
|
const recorded = baseline.taskSession;
|
|
181
191
|
return typeof recorded === 'string' && recorded !== '' ? recorded : null;
|
|
182
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* The identity of the server process this module runs in.
|
|
195
|
+
*
|
|
196
|
+
* The adoption table is read through `resolveSessionName`, which returns the
|
|
197
|
+
* adopted legacy name in place of the new-format one — this module may not
|
|
198
|
+
* reach into `lib/tmux` (#1922).
|
|
199
|
+
*/
|
|
200
|
+
function currentSessionServer() {
|
|
201
|
+
return {
|
|
202
|
+
namespace: (0, session_name_1.getActiveSessionNamespace)(),
|
|
203
|
+
legacyAliasOf: (newName) => {
|
|
204
|
+
const parsed = (0, session_name_1.parseSessionName)(newName);
|
|
205
|
+
if (!parsed)
|
|
206
|
+
return undefined;
|
|
207
|
+
try {
|
|
208
|
+
const resolved = (0, session_name_1.resolveSessionName)(parsed.cliToolId, parsed.rest);
|
|
209
|
+
return resolved !== newName ? resolved : undefined;
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Whether a session name positively belongs to a CommandMate server other than
|
|
219
|
+
* `server`.
|
|
220
|
+
*
|
|
221
|
+
* False whenever that cannot be shown: this server has no namespace (then every
|
|
222
|
+
* name could be its own), or the name is not a CommandMate session name at all.
|
|
223
|
+
*/
|
|
224
|
+
function isOtherServerSession(name, server) {
|
|
225
|
+
if (server.namespace === null)
|
|
226
|
+
return false;
|
|
227
|
+
const parsed = (0, session_name_1.parseSessionName)(name);
|
|
228
|
+
if (!parsed)
|
|
229
|
+
return false;
|
|
230
|
+
if (parsed.namespace !== null)
|
|
231
|
+
return parsed.namespace !== server.namespace;
|
|
232
|
+
let ownName;
|
|
233
|
+
try {
|
|
234
|
+
ownName = (0, session_name_1.resolveNamespacedSessionName)(server.namespace, parsed.cliToolId, parsed.rest);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// A name this server could never have built is not one of its adoptions.
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
return server.legacyAliasOf(ownName) !== name;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* The baseline's `mcbd-*` sessions that belonged to another CommandMate server
|
|
244
|
+
* at task creation.
|
|
245
|
+
*
|
|
246
|
+
* Recorded then, because only then is it knowable: this server's legacy
|
|
247
|
+
* adoptions are dropped when their session goes away, so by verification time
|
|
248
|
+
* a vanished adopted session would look like a stranger's.
|
|
249
|
+
*
|
|
250
|
+
* Why this is the line removals are excused on — the design note for #2627:
|
|
251
|
+
*
|
|
252
|
+
* - A removal is a violation because a worker may have killed someone else's
|
|
253
|
+
* session (#1624) or server (#1739). A session *of this server* — the
|
|
254
|
+
* sibling worktree in #1624, whose name carries this server's namespace —
|
|
255
|
+
* stays guarded exactly as before.
|
|
256
|
+
* - A session of *another server* is closed by that server's own lifecycle:
|
|
257
|
+
* the incident of 2026-09-17 was a global-install server's orchestrate
|
|
258
|
+
* finishing issue-107 and moving on to issue-108, with no kill of any kind
|
|
259
|
+
* in the three workers' transcripts. This task has no way to tell that
|
|
260
|
+
* from a worker's kill, and that server — not this gate — owns the fact.
|
|
261
|
+
* - The namespace is the designed marker of "which server" (#2866); nothing
|
|
262
|
+
* else here needs this server's database or a guess at the other
|
|
263
|
+
* repository's paths.
|
|
264
|
+
*
|
|
265
|
+
* Rejected: counting (`one other session gone is fine`) — that is the #1624
|
|
266
|
+
* shape, a sibling session disappearing while this worktree's stays; ignoring
|
|
267
|
+
* every `other` removal — that drops #1624 outright; the database's worktree
|
|
268
|
+
* table — the other server has a different database and the same worktree ids
|
|
269
|
+
* can exist in both, which is why #2866 exists; timing — the two snapshots do
|
|
270
|
+
* not say *when* inside the window something went away; the worker's command
|
|
271
|
+
* log — not recorded in a form the gate reads, and a kill run through a script
|
|
272
|
+
* would not name the session anyway.
|
|
273
|
+
*
|
|
274
|
+
* @returns the names, or null when `server` has no namespace to judge by
|
|
275
|
+
*/
|
|
276
|
+
function recordOtherServerSessions(snapshot, server) {
|
|
277
|
+
if (server.namespace === null)
|
|
278
|
+
return null;
|
|
279
|
+
const sessions = snapshot.probes['tmux-sessions'];
|
|
280
|
+
if (!sessions || sessions.status !== 'ok')
|
|
281
|
+
return [];
|
|
282
|
+
return sessions.entries
|
|
283
|
+
.map((entry) => entry.key)
|
|
284
|
+
.filter((name) => isOtherServerSession(name, server));
|
|
285
|
+
}
|
|
286
|
+
/** The recorded other-server sessions of a baseline; empty when none was recorded. */
|
|
287
|
+
function readOtherServerSessions(baseline) {
|
|
288
|
+
const recorded = baseline.otherServerSessions;
|
|
289
|
+
if (!Array.isArray(recorded))
|
|
290
|
+
return new Set();
|
|
291
|
+
return new Set(recorded.filter((name) => typeof name === 'string'));
|
|
292
|
+
}
|
|
183
293
|
function toChange(entry, owner) {
|
|
184
294
|
return { key: entry.key, detail: entry.detail, owner };
|
|
185
295
|
}
|
|
@@ -193,6 +303,7 @@ function toChange(entry, owner) {
|
|
|
193
303
|
*/
|
|
194
304
|
function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
195
305
|
const taskSession = readTaskSession(baseline);
|
|
306
|
+
const otherServerSessions = readOtherServerSessions(baseline);
|
|
196
307
|
const ignoredHomeEntries = new Set(options.ignoreHomeEntries ?? []);
|
|
197
308
|
const probes = env_snapshot_1.ENV_PROBE_IDS.map((probeId) => {
|
|
198
309
|
const before = baseline.probes[probeId];
|
|
@@ -206,6 +317,7 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
206
317
|
ignoredAdded: [],
|
|
207
318
|
taskSessionAdded: [],
|
|
208
319
|
removed: [],
|
|
320
|
+
removedByOtherServer: [],
|
|
209
321
|
ignoredByConfig: [],
|
|
210
322
|
};
|
|
211
323
|
}
|
|
@@ -218,6 +330,7 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
218
330
|
ignoredAdded: [],
|
|
219
331
|
taskSessionAdded: [],
|
|
220
332
|
removed: [],
|
|
333
|
+
removedByOtherServer: [],
|
|
221
334
|
ignoredByConfig: [],
|
|
222
335
|
};
|
|
223
336
|
}
|
|
@@ -246,12 +359,29 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
246
359
|
}
|
|
247
360
|
(owner === 'other' ? ignoredAdded : added).push(toChange(entry, owner));
|
|
248
361
|
}
|
|
362
|
+
// An excuse for another server's session presumes the tmux server lived
|
|
363
|
+
// through the task. When nothing from the baseline survived and the task's
|
|
364
|
+
// own session is gone too, the likeliest story is `kill-server` (#1624), and
|
|
365
|
+
// every removal is counted.
|
|
366
|
+
const tmuxServerSurvived = probeId === 'tmux-sessions' &&
|
|
367
|
+
after.entries.some((entry) => beforeKeys.has(entry.key) || (taskSession !== null && entry.key === taskSession));
|
|
249
368
|
const removed = [];
|
|
369
|
+
const removedByOtherServer = [];
|
|
250
370
|
for (const entry of before.entries) {
|
|
251
371
|
if (afterKeys.has(entry.key))
|
|
252
372
|
continue;
|
|
253
373
|
const change = toChange(entry, attributeEntry(probeId, entry, context));
|
|
254
|
-
(isIgnoredByConfig(entry)
|
|
374
|
+
if (isIgnoredByConfig(entry)) {
|
|
375
|
+
ignoredByConfig.push(change);
|
|
376
|
+
}
|
|
377
|
+
else if (tmuxServerSurvived &&
|
|
378
|
+
change.owner !== 'self' &&
|
|
379
|
+
otherServerSessions.has(entry.key)) {
|
|
380
|
+
removedByOtherServer.push(change);
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
removed.push(change);
|
|
384
|
+
}
|
|
255
385
|
}
|
|
256
386
|
return {
|
|
257
387
|
probeId,
|
|
@@ -261,6 +391,7 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
261
391
|
ignoredAdded,
|
|
262
392
|
taskSessionAdded,
|
|
263
393
|
removed,
|
|
394
|
+
removedByOtherServer,
|
|
264
395
|
ignoredByConfig,
|
|
265
396
|
};
|
|
266
397
|
});
|
|
@@ -318,6 +449,10 @@ function formatTaskSessionChanges(changes) {
|
|
|
318
449
|
* session is: a verdict that silently discounted an entry would read exactly
|
|
319
450
|
* like one that never saw it.
|
|
320
451
|
*/
|
|
452
|
+
/** Removals excused as another CommandMate server's sessions (#2627), one line each. */
|
|
453
|
+
function formatRemovedByOtherServer(changes) {
|
|
454
|
+
return changes.map((change) => ` · - ${change.key} (ignored: another CommandMate server's session, recorded at task start)`);
|
|
455
|
+
}
|
|
321
456
|
function formatIgnoredByConfig(changes) {
|
|
322
457
|
if (changes.length === 0)
|
|
323
458
|
return [];
|
|
@@ -350,6 +485,7 @@ function formatEnvCleanReport(diff) {
|
|
|
350
485
|
: '';
|
|
351
486
|
lines.push(` ${probe.probeId} clean (${label})${excused}`);
|
|
352
487
|
lines.push(...formatTaskSessionChanges(probe.taskSessionAdded));
|
|
488
|
+
lines.push(...formatRemovedByOtherServer(probe.removedByOtherServer));
|
|
353
489
|
lines.push(...formatIgnoredByConfig(probe.ignoredByConfig));
|
|
354
490
|
continue;
|
|
355
491
|
}
|
|
@@ -357,6 +493,7 @@ function formatEnvCleanReport(diff) {
|
|
|
357
493
|
lines.push(...formatChanges('+', probe.added));
|
|
358
494
|
lines.push(...formatChanges('-', probe.removed));
|
|
359
495
|
lines.push(...formatTaskSessionChanges(probe.taskSessionAdded));
|
|
496
|
+
lines.push(...formatRemovedByOtherServer(probe.removedByOtherServer));
|
|
360
497
|
lines.push(...formatIgnoredByConfig(probe.ignoredByConfig));
|
|
361
498
|
for (const excused of probe.ignoredAdded) {
|
|
362
499
|
lines.push(` · ${excused.key} (ignored: belongs to another worktree)`);
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
exports.ENV_SNAPSHOT_RETENTION_MS = exports.ENV_SNAPSHOT_DIR_NAME = exports.VOLATILE_ENTRY_PATTERNS = exports.MCBD_SESSION_PREFIX = exports.COMMANDMATE_PROCESS_PATTERN = exports.DEFAULT_ENV_PROBE_DEPS = exports.ENV_PROBE_LABELS = exports.ENV_PROBE_IDS = exports.ENV_SNAPSHOT_VERSION = void 0;
|
|
26
|
+
exports.isCommandMateCommandLine = isCommandMateCommandLine;
|
|
26
27
|
exports.probeListeners = probeListeners;
|
|
27
28
|
exports.probeTmuxSessions = probeTmuxSessions;
|
|
28
29
|
exports.probeHomeEntries = probeHomeEntries;
|
|
@@ -109,8 +110,71 @@ exports.DEFAULT_ENV_PROBE_DEPS = {
|
|
|
109
110
|
* to "CommandMate 関連" for exactly that reason, so relevance is decided from
|
|
110
111
|
* the owning process's command line rather than from the port number — a
|
|
111
112
|
* developer's `commandmate start --port 3179` is as relevant as port 3000.
|
|
113
|
+
*
|
|
114
|
+
* This is only the vocabulary, and a cheap first filter. Matched against the
|
|
115
|
+
* whole command line it also hits a process that merely *mentions* a
|
|
116
|
+
* CommandMate path among its arguments — an editor's language server started
|
|
117
|
+
* with `--workspace_id …_commandmate_issue_2616` was recorded as a CommandMate
|
|
118
|
+
* listener and then read as "killed" when it exited (#2627). The decision is
|
|
119
|
+
* {@link isCommandMateCommandLine}'s, which looks only at the program.
|
|
112
120
|
*/
|
|
113
121
|
exports.COMMANDMATE_PROCESS_PATTERN = /commandmate|dist\/server\/server\.js|next-server|next (dev|start)|server\.ts/i;
|
|
122
|
+
/**
|
|
123
|
+
* Executables that run a script named by a later argument. CommandMate is
|
|
124
|
+
* never a native binary of its own: every shape it runs as is one of these
|
|
125
|
+
* with a CommandMate script, or a process title set by one of them.
|
|
126
|
+
*/
|
|
127
|
+
const SCRIPT_LAUNCHERS = new Set(['node', 'nodejs', 'bun', 'tsx', 'ts-node', 'npx', 'next']);
|
|
128
|
+
/** Executables that are CommandMate by their own name (process title or bin). */
|
|
129
|
+
const COMMANDMATE_EXECUTABLES = /^(commandmate(\.js)?|next-server)$/i;
|
|
130
|
+
/** A script argument that is CommandMate's server or CLI, judged by its path's end. */
|
|
131
|
+
function isCommandMateScript(token) {
|
|
132
|
+
const name = (0, path_1.basename)(token);
|
|
133
|
+
return (/(^|\/)dist\/server\/server\.js$/.test(token) ||
|
|
134
|
+
name === 'server.ts' ||
|
|
135
|
+
/^commandmate(\.js)?$/i.test(name));
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Whether a `ps` command line is a CommandMate process (#2627).
|
|
139
|
+
*
|
|
140
|
+
* Judged on the program, never on free-form arguments:
|
|
141
|
+
*
|
|
142
|
+
* - the executable itself (`next-server (v14…)`, a `commandmate` bin run
|
|
143
|
+
* directly) — its basename, so a directory called `commandmate` in the
|
|
144
|
+
* executable's *path* does not count either;
|
|
145
|
+
* - or, when the executable is a script launcher (`node`, `tsx`, `next`, …),
|
|
146
|
+
* its positional arguments matched as whole paths by their end:
|
|
147
|
+
* `…/dist/server/server.js`, `server.ts`, a `commandmate` bin, or `next`
|
|
148
|
+
* followed by `dev` / `start`.
|
|
149
|
+
*
|
|
150
|
+
* Flags are dropped before matching, `--workspace=/x/commandmate` included,
|
|
151
|
+
* and a positional counts only as a whole token: `/x/commandmate-issue-1` is a
|
|
152
|
+
* path that mentions CommandMate, not CommandMate. Any other executable —
|
|
153
|
+
* `language_server_macos_arm`, Chrome, postgres — is not CommandMate whatever
|
|
154
|
+
* its arguments say.
|
|
155
|
+
*
|
|
156
|
+
* Why not `ps -o comm=` (the executable alone): `node dist/server/server.js` is
|
|
157
|
+
* `node` there, indistinguishable from every other node process, so the
|
|
158
|
+
* production server itself would stop being recorded.
|
|
159
|
+
*/
|
|
160
|
+
function isCommandMateCommandLine(commandLine) {
|
|
161
|
+
if (!exports.COMMANDMATE_PROCESS_PATTERN.test(commandLine))
|
|
162
|
+
return false;
|
|
163
|
+
const [program, ...rest] = commandLine.trim().split(/\s+/);
|
|
164
|
+
if (!program)
|
|
165
|
+
return false;
|
|
166
|
+
const name = (0, path_1.basename)(program);
|
|
167
|
+
if (COMMANDMATE_EXECUTABLES.test(name))
|
|
168
|
+
return true;
|
|
169
|
+
if (!SCRIPT_LAUNCHERS.has(name.toLowerCase()))
|
|
170
|
+
return false;
|
|
171
|
+
const positionals = [name, ...rest.filter((token) => !token.startsWith('-'))];
|
|
172
|
+
return positionals.some((token, index) => {
|
|
173
|
+
if (index > 0 && isCommandMateScript(token))
|
|
174
|
+
return true;
|
|
175
|
+
return (0, path_1.basename)(token) === 'next' && /^(dev|start)$/.test(positionals[index + 1] ?? '');
|
|
176
|
+
});
|
|
177
|
+
}
|
|
114
178
|
/** `ps` line: leading pid, then the full command line. */
|
|
115
179
|
function parseProcessTable(stdout) {
|
|
116
180
|
const table = new Map();
|
|
@@ -213,7 +277,7 @@ async function probeListeners(deps) {
|
|
|
213
277
|
const table = parseProcessTable(processes.stdout);
|
|
214
278
|
const relevant = blocks.filter((block) => {
|
|
215
279
|
const commandLine = table.get(block.pid);
|
|
216
|
-
return commandLine !== undefined &&
|
|
280
|
+
return commandLine !== undefined && isCommandMateCommandLine(commandLine);
|
|
217
281
|
});
|
|
218
282
|
if (relevant.length === 0)
|
|
219
283
|
return ok([]);
|
package/package.json
CHANGED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.42.1",
|
|
3
|
+
"date": "2026-09-28",
|
|
4
|
+
"highlight": {
|
|
5
|
+
"ja": "opencode の新しい版で、起動直後に送信できないことがある問題を直しました。",
|
|
6
|
+
"en": "Sending to a newly started opencode session on recent versions works again."
|
|
7
|
+
},
|
|
8
|
+
"added": [],
|
|
9
|
+
"improved": [],
|
|
10
|
+
"fixed": [
|
|
11
|
+
{
|
|
12
|
+
"ja": "opencode 1.18.31 以降で、起動直後の入力待ちを認識できず送信が拒否されることがある問題を直しました。",
|
|
13
|
+
"en": "Fixed messages sometimes being refused right after opencode 1.18.31 or later started, because its input prompt was not recognized."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.42.2",
|
|
3
|
+
"date": "2026-09-28",
|
|
4
|
+
"highlight": {
|
|
5
|
+
"ja": "ブランチごとに選んだ既定のエージェントが、同期のたびに Claude に戻ってしまう問題を直しました。",
|
|
6
|
+
"en": "Fixed the default agent chosen for a branch switching back to Claude every time branches were synced."
|
|
7
|
+
},
|
|
8
|
+
"added": [],
|
|
9
|
+
"improved": [],
|
|
10
|
+
"fixed": [
|
|
11
|
+
{
|
|
12
|
+
"ja": "ブランチごとに選んだ既定のエージェントが、同期のたびに Claude に戻ってしまう問題を直しました。",
|
|
13
|
+
"en": "Fixed the default agent chosen for a branch switching back to Claude every time branches were synced."
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ja": "commandmate verify でタスクを指定できるようになり、完了済みのタスクを検証し直せるようになりました。",
|
|
17
|
+
"en": "commandmate verify can now take a task, so a finished task can be verified again."
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
File without changes
|
|
File without changes
|