d48cda4081
CI / Test (ubuntu-latest, Node 18.x, bun) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, npm) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, pnpm) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, yarn) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 20.x, bun) (push) Failing after 17m13s
CI / Test (ubuntu-latest, Node 20.x, npm) (push) Failing after 18m42s
CI / Test (ubuntu-latest, Node 20.x, pnpm) (push) Failing after 15m0s
CI / Test (ubuntu-latest, Node 20.x, yarn) (push) Failing after 49m44s
CI / Test (ubuntu-latest, Node 22.x, bun) (push) Failing after 51m55s
CI / Test (ubuntu-latest, Node 22.x, pnpm) (push) Failing after 21m57s
CI / Test (ubuntu-latest, Node 22.x, npm) (push) Failing after 37m39s
CI / Test (ubuntu-latest, Node 22.x, yarn) (push) Failing after 34m7s
CI / Validate Components (push) Failing after 37m15s
CI / Python Tests (push) Failing after 10m1s
CI / Security Scan (push) Failing after 10m1s
CI / Lint (push) Failing after 17m12s
CI / Coverage (push) Failing after 20m19s
CI / Test (macos-latest, Node 18.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, yarn) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, yarn) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, yarn) (push) Has been cancelled
91 lines
2.6 KiB
JavaScript
91 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const { collectSessionSnapshot } = require('../orchestration-session');
|
|
const { normalizeDmuxSnapshot, persistCanonicalSnapshot } = require('./canonical-session');
|
|
|
|
function isPlanFileTarget(target, cwd) {
|
|
if (typeof target !== 'string' || target.length === 0) {
|
|
return false;
|
|
}
|
|
|
|
const absoluteTarget = path.resolve(cwd, target);
|
|
return fs.existsSync(absoluteTarget)
|
|
&& fs.statSync(absoluteTarget).isFile()
|
|
&& path.extname(absoluteTarget) === '.json';
|
|
}
|
|
|
|
function isSessionNameTarget(target, cwd) {
|
|
if (typeof target !== 'string' || target.length === 0) {
|
|
return false;
|
|
}
|
|
|
|
const coordinationDir = path.resolve(cwd, '.claude', 'orchestration', target);
|
|
return fs.existsSync(coordinationDir) && fs.statSync(coordinationDir).isDirectory();
|
|
}
|
|
|
|
function buildSourceTarget(target, cwd) {
|
|
if (isPlanFileTarget(target, cwd)) {
|
|
return {
|
|
type: 'plan',
|
|
value: path.resolve(cwd, target)
|
|
};
|
|
}
|
|
|
|
return {
|
|
type: 'session',
|
|
value: target
|
|
};
|
|
}
|
|
|
|
function createDmuxTmuxAdapter(options = {}) {
|
|
const collectSessionSnapshotImpl = options.collectSessionSnapshotImpl || collectSessionSnapshot;
|
|
const persistCanonicalSnapshotImpl = options.persistCanonicalSnapshotImpl || persistCanonicalSnapshot;
|
|
|
|
return {
|
|
id: 'dmux-tmux',
|
|
description: 'Tmux/worktree orchestration snapshots from plan files or session names',
|
|
targetTypes: ['plan', 'session'],
|
|
canOpen(target, context = {}) {
|
|
if (context.adapterId && context.adapterId !== 'dmux-tmux') {
|
|
return false;
|
|
}
|
|
|
|
if (context.adapterId === 'dmux-tmux') {
|
|
return true;
|
|
}
|
|
|
|
const cwd = context.cwd || process.cwd();
|
|
return isPlanFileTarget(target, cwd) || isSessionNameTarget(target, cwd);
|
|
},
|
|
open(target, context = {}) {
|
|
const cwd = context.cwd || process.cwd();
|
|
|
|
return {
|
|
adapterId: 'dmux-tmux',
|
|
getSnapshot() {
|
|
const snapshot = collectSessionSnapshotImpl(target, cwd);
|
|
const canonicalSnapshot = normalizeDmuxSnapshot(snapshot, buildSourceTarget(target, cwd));
|
|
|
|
persistCanonicalSnapshotImpl(canonicalSnapshot, {
|
|
loadStateStoreImpl: options.loadStateStoreImpl,
|
|
persist: context.persistSnapshots !== false && options.persistSnapshots !== false,
|
|
recordingDir: context.recordingDir || options.recordingDir,
|
|
stateStore: options.stateStore
|
|
});
|
|
|
|
return canonicalSnapshot;
|
|
}
|
|
};
|
|
}
|
|
};
|
|
}
|
|
|
|
module.exports = {
|
|
createDmuxTmuxAdapter,
|
|
isPlanFileTarget,
|
|
isSessionNameTarget
|
|
};
|