@damian87/omp 0.1.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.
- package/.github/agents/architect.md +25 -0
- package/.github/agents/code-reviewer.md +25 -0
- package/.github/agents/designer.md +26 -0
- package/.github/agents/executor.md +24 -0
- package/.github/agents/planner.md +26 -0
- package/.github/agents/researcher.md +26 -0
- package/.github/agents/verifier.md +26 -0
- package/.github/copilot-instructions.md +20 -0
- package/.github/plugin/marketplace.json +30 -0
- package/.github/skills/caveman/SKILL.md +20 -0
- package/.github/skills/code-review/SKILL.md +22 -0
- package/.github/skills/codebase-research/SKILL.md +20 -0
- package/.github/skills/create-skill/SKILL.md +78 -0
- package/.github/skills/create-skill/references/best-practices.md +449 -0
- package/.github/skills/create-skill/references/examples.md +69 -0
- package/.github/skills/create-skill/references/progressive-disclosure.md +25 -0
- package/.github/skills/create-skill/references/skill-structure.md +55 -0
- package/.github/skills/debug/SKILL.md +22 -0
- package/.github/skills/grill-me/SKILL.md +16 -0
- package/.github/skills/jira-ticket/SKILL.md +21 -0
- package/.github/skills/omp-autopilot/SKILL.md +20 -0
- package/.github/skills/prototype/SKILL.md +21 -0
- package/.github/skills/ralph/SKILL.md +20 -0
- package/.github/skills/ralplan/SKILL.md +21 -0
- package/.github/skills/self-evolve/SKILL.md +157 -0
- package/.github/skills/tdd/SKILL.md +19 -0
- package/.github/skills/team/SKILL.md +20 -0
- package/.github/skills/ultraqa/SKILL.md +20 -0
- package/.github/skills/ultrawork/SKILL.md +20 -0
- package/.github/skills/verify/SKILL.md +20 -0
- package/LICENSE +21 -0
- package/README.md +214 -0
- package/catalog/capabilities.json +729 -0
- package/catalog/skills-general.json +427 -0
- package/dist/src/catalog.d.ts +79 -0
- package/dist/src/catalog.js +113 -0
- package/dist/src/catalog.js.map +1 -0
- package/dist/src/cli.d.ts +9 -0
- package/dist/src/cli.js +475 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/copilot/config.d.ts +7 -0
- package/dist/src/copilot/config.js +24 -0
- package/dist/src/copilot/config.js.map +1 -0
- package/dist/src/copilot/doctor.d.ts +18 -0
- package/dist/src/copilot/doctor.js +85 -0
- package/dist/src/copilot/doctor.js.map +1 -0
- package/dist/src/copilot/launch.d.ts +14 -0
- package/dist/src/copilot/launch.js +64 -0
- package/dist/src/copilot/launch.js.map +1 -0
- package/dist/src/copilot/list.d.ts +17 -0
- package/dist/src/copilot/list.js +82 -0
- package/dist/src/copilot/list.js.map +1 -0
- package/dist/src/copilot/paths.d.ts +21 -0
- package/dist/src/copilot/paths.js +36 -0
- package/dist/src/copilot/paths.js.map +1 -0
- package/dist/src/copilot/setup.d.ts +20 -0
- package/dist/src/copilot/setup.js +90 -0
- package/dist/src/copilot/setup.js.map +1 -0
- package/dist/src/copilot/version.d.ts +13 -0
- package/dist/src/copilot/version.js +34 -0
- package/dist/src/copilot/version.js.map +1 -0
- package/dist/src/jira.d.ts +149 -0
- package/dist/src/jira.js +492 -0
- package/dist/src/jira.js.map +1 -0
- package/dist/src/lint.d.ts +11 -0
- package/dist/src/lint.js +85 -0
- package/dist/src/lint.js.map +1 -0
- package/dist/src/mcp/server.d.ts +10 -0
- package/dist/src/mcp/server.js +44 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools/index.d.ts +9 -0
- package/dist/src/mcp/tools/index.js +15 -0
- package/dist/src/mcp/tools/index.js.map +1 -0
- package/dist/src/mcp/tools/notepad.d.ts +2 -0
- package/dist/src/mcp/tools/notepad.js +135 -0
- package/dist/src/mcp/tools/notepad.js.map +1 -0
- package/dist/src/mcp/tools/project-memory.d.ts +2 -0
- package/dist/src/mcp/tools/project-memory.js +91 -0
- package/dist/src/mcp/tools/project-memory.js.map +1 -0
- package/dist/src/mcp/tools/shared-memory.d.ts +2 -0
- package/dist/src/mcp/tools/shared-memory.js +148 -0
- package/dist/src/mcp/tools/shared-memory.js.map +1 -0
- package/dist/src/mcp/tools/state.d.ts +2 -0
- package/dist/src/mcp/tools/state.js +107 -0
- package/dist/src/mcp/tools/state.js.map +1 -0
- package/dist/src/mcp/tools/trace.d.ts +10 -0
- package/dist/src/mcp/tools/trace.js +102 -0
- package/dist/src/mcp/tools/trace.js.map +1 -0
- package/dist/src/mcp/types.d.ts +29 -0
- package/dist/src/mcp/types.js +7 -0
- package/dist/src/mcp/types.js.map +1 -0
- package/dist/src/mode-state/index.d.ts +4 -0
- package/dist/src/mode-state/index.js +5 -0
- package/dist/src/mode-state/index.js.map +1 -0
- package/dist/src/mode-state/paths.d.ts +5 -0
- package/dist/src/mode-state/paths.js +29 -0
- package/dist/src/mode-state/paths.js.map +1 -0
- package/dist/src/mode-state/ralph.d.ts +25 -0
- package/dist/src/mode-state/ralph.js +44 -0
- package/dist/src/mode-state/ralph.js.map +1 -0
- package/dist/src/mode-state/ultraqa.d.ts +26 -0
- package/dist/src/mode-state/ultraqa.js +51 -0
- package/dist/src/mode-state/ultraqa.js.map +1 -0
- package/dist/src/mode-state/ultrawork.d.ts +20 -0
- package/dist/src/mode-state/ultrawork.js +34 -0
- package/dist/src/mode-state/ultrawork.js.map +1 -0
- package/dist/src/project.d.ts +29 -0
- package/dist/src/project.js +101 -0
- package/dist/src/project.js.map +1 -0
- package/dist/src/skills.d.ts +17 -0
- package/dist/src/skills.js +61 -0
- package/dist/src/skills.js.map +1 -0
- package/dist/src/sync.d.ts +6 -0
- package/dist/src/sync.js +27 -0
- package/dist/src/sync.js.map +1 -0
- package/dist/src/team/api.d.ts +20 -0
- package/dist/src/team/api.js +55 -0
- package/dist/src/team/api.js.map +1 -0
- package/dist/src/team/heartbeat.d.ts +4 -0
- package/dist/src/team/heartbeat.js +27 -0
- package/dist/src/team/heartbeat.js.map +1 -0
- package/dist/src/team/idle-nudge.d.ts +27 -0
- package/dist/src/team/idle-nudge.js +60 -0
- package/dist/src/team/idle-nudge.js.map +1 -0
- package/dist/src/team/inbox.d.ts +3 -0
- package/dist/src/team/inbox.js +16 -0
- package/dist/src/team/inbox.js.map +1 -0
- package/dist/src/team/index.d.ts +11 -0
- package/dist/src/team/index.js +12 -0
- package/dist/src/team/index.js.map +1 -0
- package/dist/src/team/outbox.d.ts +14 -0
- package/dist/src/team/outbox.js +82 -0
- package/dist/src/team/outbox.js.map +1 -0
- package/dist/src/team/runtime.d.ts +84 -0
- package/dist/src/team/runtime.js +243 -0
- package/dist/src/team/runtime.js.map +1 -0
- package/dist/src/team/state-paths.d.ts +31 -0
- package/dist/src/team/state-paths.js +54 -0
- package/dist/src/team/state-paths.js.map +1 -0
- package/dist/src/team/task-store.d.ts +41 -0
- package/dist/src/team/task-store.js +153 -0
- package/dist/src/team/task-store.js.map +1 -0
- package/dist/src/team/tmux.d.ts +26 -0
- package/dist/src/team/tmux.js +87 -0
- package/dist/src/team/tmux.js.map +1 -0
- package/dist/src/team/types.d.ts +45 -0
- package/dist/src/team/types.js +2 -0
- package/dist/src/team/types.js.map +1 -0
- package/dist/src/team/worker-bootstrap.d.ts +8 -0
- package/dist/src/team/worker-bootstrap.js +52 -0
- package/dist/src/team/worker-bootstrap.js.map +1 -0
- package/docs/copilot-distribution.md +100 -0
- package/docs/general-skills.md +76 -0
- package/docs/jira.md +64 -0
- package/docs/self-evolve.md +22 -0
- package/hooks/hooks.json +74 -0
- package/package.json +58 -0
- package/plugin.json +14 -0
- package/scripts/error.mjs +31 -0
- package/scripts/lib/hook-output.mjs +30 -0
- package/scripts/lib/stdin.mjs +29 -0
- package/scripts/post-tool-use.mjs +31 -0
- package/scripts/pre-tool-use.mjs +30 -0
- package/scripts/prompt-submit.mjs +66 -0
- package/scripts/session-end.mjs +29 -0
- package/scripts/session-start.mjs +33 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./state-paths.js";
|
|
3
|
+
export * from "./heartbeat.js";
|
|
4
|
+
export * from "./inbox.js";
|
|
5
|
+
export * from "./outbox.js";
|
|
6
|
+
export * from "./task-store.js";
|
|
7
|
+
export * from "./tmux.js";
|
|
8
|
+
export * from "./idle-nudge.js";
|
|
9
|
+
export * from "./worker-bootstrap.js";
|
|
10
|
+
export * from "./api.js";
|
|
11
|
+
export * from "./runtime.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/team/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { OutboxMessage } from "./types.js";
|
|
2
|
+
export declare function appendOutbox(path: string, msg: OutboxMessage): void;
|
|
3
|
+
/**
|
|
4
|
+
* Read new outbox messages and advance the cursor. Use this when you intend
|
|
5
|
+
* to consume the messages (monitorTeam tick).
|
|
6
|
+
*/
|
|
7
|
+
export declare function readNewOutbox(outboxPath: string, offsetPath: string): OutboxMessage[];
|
|
8
|
+
/**
|
|
9
|
+
* Read new outbox messages WITHOUT advancing the cursor. Use this for
|
|
10
|
+
* read-only operations like `omp team status` — calling this never
|
|
11
|
+
* affects what a concurrent monitor will read next.
|
|
12
|
+
*/
|
|
13
|
+
export declare function peekNewOutbox(outboxPath: string, offsetPath: string): OutboxMessage[];
|
|
14
|
+
export declare function resetOutboxCursor(offsetPath: string): void;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { appendFileSync, closeSync, existsSync, mkdirSync, openSync, readFileSync, readSync, statSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
export function appendOutbox(path, msg) {
|
|
4
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
5
|
+
appendFileSync(path, `${JSON.stringify(msg)}\n`, "utf8");
|
|
6
|
+
}
|
|
7
|
+
function readCursorBytes(offsetPath) {
|
|
8
|
+
if (!existsSync(offsetPath))
|
|
9
|
+
return 0;
|
|
10
|
+
try {
|
|
11
|
+
const data = JSON.parse(readFileSync(offsetPath, "utf8"));
|
|
12
|
+
return Number(data.bytesRead) || 0;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function writeCursorBytes(offsetPath, bytes) {
|
|
19
|
+
mkdirSync(dirname(offsetPath), { recursive: true });
|
|
20
|
+
writeFileSync(offsetPath, JSON.stringify({ bytesRead: bytes }), "utf8");
|
|
21
|
+
}
|
|
22
|
+
function scanFromCursor(outboxPath, offsetPath) {
|
|
23
|
+
if (!existsSync(outboxPath))
|
|
24
|
+
return undefined;
|
|
25
|
+
const stats = statSync(outboxPath);
|
|
26
|
+
const cursor = readCursorBytes(offsetPath);
|
|
27
|
+
if (cursor >= stats.size)
|
|
28
|
+
return { messages: [], newCursor: cursor, cursor };
|
|
29
|
+
const remaining = stats.size - cursor;
|
|
30
|
+
const fd = openSync(outboxPath, "r");
|
|
31
|
+
const buf = Buffer.alloc(remaining);
|
|
32
|
+
try {
|
|
33
|
+
readSync(fd, buf, 0, remaining, cursor);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
closeSync(fd);
|
|
37
|
+
}
|
|
38
|
+
const text = buf.toString("utf8");
|
|
39
|
+
const lastNewline = text.lastIndexOf("\n");
|
|
40
|
+
if (lastNewline === -1)
|
|
41
|
+
return { messages: [], newCursor: cursor, cursor }; // no complete line yet
|
|
42
|
+
const consumed = text.slice(0, lastNewline + 1);
|
|
43
|
+
const newCursor = cursor + Buffer.byteLength(consumed, "utf8");
|
|
44
|
+
const messages = [];
|
|
45
|
+
for (const line of consumed.split("\n")) {
|
|
46
|
+
if (!line.trim())
|
|
47
|
+
continue;
|
|
48
|
+
try {
|
|
49
|
+
messages.push(JSON.parse(line));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// ignore unparseable line; advance past it anyway
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return { messages, newCursor, cursor };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Read new outbox messages and advance the cursor. Use this when you intend
|
|
59
|
+
* to consume the messages (monitorTeam tick).
|
|
60
|
+
*/
|
|
61
|
+
export function readNewOutbox(outboxPath, offsetPath) {
|
|
62
|
+
const scan = scanFromCursor(outboxPath, offsetPath);
|
|
63
|
+
if (!scan)
|
|
64
|
+
return [];
|
|
65
|
+
if (scan.newCursor !== scan.cursor)
|
|
66
|
+
writeCursorBytes(offsetPath, scan.newCursor);
|
|
67
|
+
return scan.messages;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Read new outbox messages WITHOUT advancing the cursor. Use this for
|
|
71
|
+
* read-only operations like `omp team status` — calling this never
|
|
72
|
+
* affects what a concurrent monitor will read next.
|
|
73
|
+
*/
|
|
74
|
+
export function peekNewOutbox(outboxPath, offsetPath) {
|
|
75
|
+
const scan = scanFromCursor(outboxPath, offsetPath);
|
|
76
|
+
return scan?.messages ?? [];
|
|
77
|
+
}
|
|
78
|
+
export function resetOutboxCursor(offsetPath) {
|
|
79
|
+
if (existsSync(offsetPath))
|
|
80
|
+
writeCursorBytes(offsetPath, 0);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=outbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../../src/team/outbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { type TeamStatePaths } from "./state-paths.js";
|
|
2
|
+
import { type TmuxApi } from "./tmux.js";
|
|
3
|
+
import { type NudgeAttempt, type NudgeConfig, type NudgeSummaryEntry } from "./idle-nudge.js";
|
|
4
|
+
import type { Task, TeamConfig, WorkerRole } from "./types.js";
|
|
5
|
+
export declare function resolveWorkerBin(role: WorkerRole): string;
|
|
6
|
+
export interface StartTeamOptions {
|
|
7
|
+
cwd?: string;
|
|
8
|
+
name: string;
|
|
9
|
+
role: WorkerRole;
|
|
10
|
+
workerCount: number;
|
|
11
|
+
task: string;
|
|
12
|
+
tmux?: TmuxApi;
|
|
13
|
+
workerBinOverride?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface StartTeamResult {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
config: TeamConfig;
|
|
18
|
+
tmuxSession: string;
|
|
19
|
+
paths: TeamStatePaths;
|
|
20
|
+
}
|
|
21
|
+
export declare function startTeam(opts: StartTeamOptions): Promise<StartTeamResult>;
|
|
22
|
+
export interface MonitorOptions {
|
|
23
|
+
cwd?: string;
|
|
24
|
+
name: string;
|
|
25
|
+
tmux?: TmuxApi;
|
|
26
|
+
pollIntervalMs?: number;
|
|
27
|
+
timeoutMs?: number;
|
|
28
|
+
onTick?: (snapshot: MonitorSnapshot) => void;
|
|
29
|
+
maxTicks?: number;
|
|
30
|
+
nudge?: Partial<NudgeConfig> & {
|
|
31
|
+
enabled?: boolean;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export interface WorkerSnapshot {
|
|
35
|
+
name: string;
|
|
36
|
+
paneId?: string;
|
|
37
|
+
paneDead: boolean;
|
|
38
|
+
heartbeatStale: boolean;
|
|
39
|
+
outboxNewCount: number;
|
|
40
|
+
}
|
|
41
|
+
export interface MonitorSnapshot {
|
|
42
|
+
tasks: Task[];
|
|
43
|
+
workers: WorkerSnapshot[];
|
|
44
|
+
allDone: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface MonitorResult {
|
|
47
|
+
ok: boolean;
|
|
48
|
+
finalSnapshot: MonitorSnapshot;
|
|
49
|
+
reason: "all-done" | "timeout" | "shutdown";
|
|
50
|
+
ticks: number;
|
|
51
|
+
nudges: NudgeSummaryEntry[];
|
|
52
|
+
nudgeAttempts: NudgeAttempt[];
|
|
53
|
+
}
|
|
54
|
+
export declare function loadTeamConfig(paths: TeamStatePaths): TeamConfig | undefined;
|
|
55
|
+
export interface PollSnapshotOptions {
|
|
56
|
+
consumeOutbox?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare function pollSnapshot(paths: TeamStatePaths, config: TeamConfig, tmux: TmuxApi, options?: PollSnapshotOptions): MonitorSnapshot;
|
|
59
|
+
export declare function monitorTeam(opts: MonitorOptions): Promise<MonitorResult>;
|
|
60
|
+
export interface ShutdownOptions {
|
|
61
|
+
cwd?: string;
|
|
62
|
+
name: string;
|
|
63
|
+
tmux?: TmuxApi;
|
|
64
|
+
}
|
|
65
|
+
export interface ShutdownResult {
|
|
66
|
+
ok: boolean;
|
|
67
|
+
killedPanes: number;
|
|
68
|
+
killedSession: boolean;
|
|
69
|
+
clearedLocks: number;
|
|
70
|
+
}
|
|
71
|
+
export declare function shutdownTeam(opts: ShutdownOptions): Promise<ShutdownResult>;
|
|
72
|
+
export interface StatusOptions {
|
|
73
|
+
cwd?: string;
|
|
74
|
+
name: string;
|
|
75
|
+
tmux?: TmuxApi;
|
|
76
|
+
}
|
|
77
|
+
export interface StatusReport {
|
|
78
|
+
ok: boolean;
|
|
79
|
+
config?: TeamConfig;
|
|
80
|
+
snapshot?: MonitorSnapshot;
|
|
81
|
+
reason?: string;
|
|
82
|
+
}
|
|
83
|
+
export declare function statusTeam(opts: StatusOptions): StatusReport;
|
|
84
|
+
export declare function formatStatus(report: StatusReport): string;
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { ensureTeamDirs, ensureWorkerDirs, resolveTeamPaths, resolveWorkerPaths, } from "./state-paths.js";
|
|
4
|
+
import { clearAllLocks, listTasks, taskFilePath, writeTask } from "./task-store.js";
|
|
5
|
+
import { writeInbox } from "./inbox.js";
|
|
6
|
+
import { buildInboxMarkdown } from "./worker-bootstrap.js";
|
|
7
|
+
import { peekNewOutbox, readNewOutbox } from "./outbox.js";
|
|
8
|
+
import { isHeartbeatStale, readHeartbeat } from "./heartbeat.js";
|
|
9
|
+
import { makeTmux } from "./tmux.js";
|
|
10
|
+
import { NudgeTracker } from "./idle-nudge.js";
|
|
11
|
+
const ROLE_BIN = {
|
|
12
|
+
claude: "claude",
|
|
13
|
+
codex: "codex",
|
|
14
|
+
gemini: "gemini",
|
|
15
|
+
};
|
|
16
|
+
export function resolveWorkerBin(role) {
|
|
17
|
+
return ROLE_BIN[role] ?? role;
|
|
18
|
+
}
|
|
19
|
+
function sleep(ms) {
|
|
20
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
21
|
+
}
|
|
22
|
+
export async function startTeam(opts) {
|
|
23
|
+
const cwd = resolve(opts.cwd ?? process.cwd());
|
|
24
|
+
const tmux = opts.tmux ?? makeTmux();
|
|
25
|
+
const paths = resolveTeamPaths(cwd, opts.name);
|
|
26
|
+
ensureTeamDirs(paths);
|
|
27
|
+
const tasks = [];
|
|
28
|
+
for (let i = 0; i < opts.workerCount; i++) {
|
|
29
|
+
const id = String(i + 1);
|
|
30
|
+
const description = opts.workerCount === 1 ? opts.task : `${opts.task} (part ${i + 1}/${opts.workerCount})`;
|
|
31
|
+
const task = {
|
|
32
|
+
id,
|
|
33
|
+
description,
|
|
34
|
+
status: "pending",
|
|
35
|
+
createdAt: new Date().toISOString(),
|
|
36
|
+
};
|
|
37
|
+
writeTask(taskFilePath(paths.tasksDir, id), task);
|
|
38
|
+
tasks.push(task);
|
|
39
|
+
}
|
|
40
|
+
const sessionName = `omp-team-${opts.name}`;
|
|
41
|
+
if (tmux.sessionExists(sessionName)) {
|
|
42
|
+
throw new Error(`tmux session ${sessionName} already exists; run \`omp team shutdown ${opts.name}\` first`);
|
|
43
|
+
}
|
|
44
|
+
const newSess = tmux.newSession(sessionName, cwd);
|
|
45
|
+
if (newSess.status !== 0) {
|
|
46
|
+
throw new Error(`tmux new-session failed: ${newSess.stderr || newSess.stdout}`);
|
|
47
|
+
}
|
|
48
|
+
// From this point on, the tmux session exists. Any failure must kill it
|
|
49
|
+
// before propagating, or the next startTeam will refuse with "session
|
|
50
|
+
// already exists" and the user can't recover via `omp team shutdown`
|
|
51
|
+
// (which reads config.json that we haven't written yet).
|
|
52
|
+
try {
|
|
53
|
+
const leaderPaneMatch = newSess.stdout.match(/(%\d+)/);
|
|
54
|
+
let lastTarget = leaderPaneMatch?.[1] ?? sessionName;
|
|
55
|
+
const workers = [];
|
|
56
|
+
const bin = opts.workerBinOverride ?? resolveWorkerBin(opts.role);
|
|
57
|
+
for (let i = 0; i < opts.workerCount; i++) {
|
|
58
|
+
const workerName = `worker-${i + 1}`;
|
|
59
|
+
const split = tmux.splitWindow(lastTarget, cwd);
|
|
60
|
+
if (split.status !== 0) {
|
|
61
|
+
throw new Error(`tmux split-window failed: ${split.stderr || split.stdout}`);
|
|
62
|
+
}
|
|
63
|
+
const paneId = split.stdout.trim();
|
|
64
|
+
lastTarget = paneId;
|
|
65
|
+
const task = tasks[i];
|
|
66
|
+
workers.push({ name: workerName, role: opts.role, paneId, taskId: task.id });
|
|
67
|
+
const wp = resolveWorkerPaths(paths, workerName);
|
|
68
|
+
ensureWorkerDirs(wp);
|
|
69
|
+
writeInbox(wp.inboxFile, buildInboxMarkdown({ teamName: opts.name, workerName, task, cwd }));
|
|
70
|
+
tmux.sendText(paneId, bin);
|
|
71
|
+
tmux.sendKeys(paneId, "C-m");
|
|
72
|
+
}
|
|
73
|
+
const config = {
|
|
74
|
+
name: opts.name,
|
|
75
|
+
task: opts.task,
|
|
76
|
+
role: opts.role,
|
|
77
|
+
workerCount: opts.workerCount,
|
|
78
|
+
tmuxSession: sessionName,
|
|
79
|
+
workers,
|
|
80
|
+
cwd,
|
|
81
|
+
createdAt: new Date().toISOString(),
|
|
82
|
+
};
|
|
83
|
+
writeFileSync(paths.configFile, `${JSON.stringify(config, null, 2)}\n`, "utf8");
|
|
84
|
+
return { ok: true, config, tmuxSession: sessionName, paths };
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
try {
|
|
88
|
+
tmux.killSession(sessionName);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// best effort — surface the original error to the caller
|
|
92
|
+
}
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function loadTeamConfig(paths) {
|
|
97
|
+
if (!existsSync(paths.configFile))
|
|
98
|
+
return undefined;
|
|
99
|
+
try {
|
|
100
|
+
return JSON.parse(readFileSync(paths.configFile, "utf8"));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export function pollSnapshot(paths, config, tmux, options = {}) {
|
|
107
|
+
const reader = options.consumeOutbox === true ? readNewOutbox : peekNewOutbox;
|
|
108
|
+
const tasks = listTasks(paths.tasksDir);
|
|
109
|
+
const workers = config.workers.map((w) => {
|
|
110
|
+
const wp = resolveWorkerPaths(paths, w.name);
|
|
111
|
+
const paneDead = w.paneId ? tmux.paneDead(w.paneId) : false;
|
|
112
|
+
const heartbeatStale = isHeartbeatStale(readHeartbeat(wp.heartbeatFile));
|
|
113
|
+
const newMessages = reader(wp.outboxFile, wp.outboxOffsetFile);
|
|
114
|
+
return {
|
|
115
|
+
name: w.name,
|
|
116
|
+
paneId: w.paneId,
|
|
117
|
+
paneDead,
|
|
118
|
+
heartbeatStale,
|
|
119
|
+
outboxNewCount: newMessages.length,
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
const allDone = tasks.length > 0 && tasks.every((t) => t.status === "completed" || t.status === "failed");
|
|
123
|
+
return { tasks, workers, allDone };
|
|
124
|
+
}
|
|
125
|
+
export async function monitorTeam(opts) {
|
|
126
|
+
const cwd = resolve(opts.cwd ?? process.cwd());
|
|
127
|
+
const tmux = opts.tmux ?? makeTmux();
|
|
128
|
+
const paths = resolveTeamPaths(cwd, opts.name);
|
|
129
|
+
const config = loadTeamConfig(paths);
|
|
130
|
+
if (!config)
|
|
131
|
+
throw new Error(`team ${opts.name} not found at ${paths.configFile}`);
|
|
132
|
+
const pollInterval = opts.pollIntervalMs ?? 1000;
|
|
133
|
+
const timeoutMs = opts.timeoutMs ?? 600_000;
|
|
134
|
+
const deadline = Date.now() + timeoutMs;
|
|
135
|
+
const nudgeEnabled = opts.nudge?.enabled !== false; // default on; opt-out via { enabled: false }
|
|
136
|
+
const nudgeTracker = nudgeEnabled ? new NudgeTracker(opts.nudge) : undefined;
|
|
137
|
+
const nudgeAttempts = [];
|
|
138
|
+
let snapshot = pollSnapshot(paths, config, tmux, { consumeOutbox: true });
|
|
139
|
+
let ticks = 0;
|
|
140
|
+
while (Date.now() < deadline && (opts.maxTicks == null || ticks < opts.maxTicks)) {
|
|
141
|
+
snapshot = pollSnapshot(paths, config, tmux, { consumeOutbox: true });
|
|
142
|
+
ticks++;
|
|
143
|
+
opts.onTick?.(snapshot);
|
|
144
|
+
if (nudgeTracker) {
|
|
145
|
+
const panes = config.workers.map((w) => w.paneId).filter((id) => Boolean(id));
|
|
146
|
+
const attempts = await nudgeTracker.checkAndNudge(tmux, config.tmuxSession, panes);
|
|
147
|
+
nudgeAttempts.push(...attempts);
|
|
148
|
+
}
|
|
149
|
+
if (existsSync(paths.shutdownFile)) {
|
|
150
|
+
return {
|
|
151
|
+
ok: snapshot.allDone,
|
|
152
|
+
finalSnapshot: snapshot,
|
|
153
|
+
reason: "shutdown",
|
|
154
|
+
ticks,
|
|
155
|
+
nudges: nudgeTracker?.getSummary() ?? [],
|
|
156
|
+
nudgeAttempts,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (snapshot.allDone) {
|
|
160
|
+
return {
|
|
161
|
+
ok: true,
|
|
162
|
+
finalSnapshot: snapshot,
|
|
163
|
+
reason: "all-done",
|
|
164
|
+
ticks,
|
|
165
|
+
nudges: nudgeTracker?.getSummary() ?? [],
|
|
166
|
+
nudgeAttempts,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
await sleep(pollInterval);
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
ok: false,
|
|
173
|
+
finalSnapshot: snapshot,
|
|
174
|
+
reason: "timeout",
|
|
175
|
+
ticks,
|
|
176
|
+
nudges: nudgeTracker?.getSummary() ?? [],
|
|
177
|
+
nudgeAttempts,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
export async function shutdownTeam(opts) {
|
|
181
|
+
const cwd = resolve(opts.cwd ?? process.cwd());
|
|
182
|
+
const tmux = opts.tmux ?? makeTmux();
|
|
183
|
+
const paths = resolveTeamPaths(cwd, opts.name);
|
|
184
|
+
const config = loadTeamConfig(paths);
|
|
185
|
+
// Fallback: even if config.json is missing or corrupt, still try to kill
|
|
186
|
+
// the conventionally-named session — recovers from a startTeam that
|
|
187
|
+
// crashed before writing config (pre-cleanup behaviour from the
|
|
188
|
+
// try/catch above).
|
|
189
|
+
if (!config) {
|
|
190
|
+
const conventional = `omp-team-${opts.name}`;
|
|
191
|
+
const exists = tmux.sessionExists(conventional);
|
|
192
|
+
const session = exists ? tmux.killSession(conventional) : { status: 1, stdout: "", stderr: "" };
|
|
193
|
+
const clearedLocks = clearAllLocks(paths.tasksDir);
|
|
194
|
+
return {
|
|
195
|
+
ok: exists || clearedLocks > 0,
|
|
196
|
+
killedPanes: 0,
|
|
197
|
+
killedSession: exists && session.status === 0,
|
|
198
|
+
clearedLocks,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
let killedPanes = 0;
|
|
202
|
+
for (const w of config.workers) {
|
|
203
|
+
if (w.paneId) {
|
|
204
|
+
const r = tmux.killPane(w.paneId);
|
|
205
|
+
if (r.status === 0)
|
|
206
|
+
killedPanes++;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const session = tmux.killSession(config.tmuxSession);
|
|
210
|
+
const clearedLocks = clearAllLocks(paths.tasksDir);
|
|
211
|
+
writeFileSync(paths.shutdownFile, `${JSON.stringify({ shutdownAt: new Date().toISOString() })}\n`, "utf8");
|
|
212
|
+
return { ok: true, killedPanes, killedSession: session.status === 0, clearedLocks };
|
|
213
|
+
}
|
|
214
|
+
export function statusTeam(opts) {
|
|
215
|
+
const cwd = resolve(opts.cwd ?? process.cwd());
|
|
216
|
+
const tmux = opts.tmux ?? makeTmux();
|
|
217
|
+
const paths = resolveTeamPaths(cwd, opts.name);
|
|
218
|
+
const config = loadTeamConfig(paths);
|
|
219
|
+
if (!config)
|
|
220
|
+
return { ok: false, reason: `team ${opts.name} not found` };
|
|
221
|
+
const snapshot = pollSnapshot(paths, config, tmux);
|
|
222
|
+
return { ok: true, config, snapshot };
|
|
223
|
+
}
|
|
224
|
+
export function formatStatus(report) {
|
|
225
|
+
if (!report.ok || !report.config || !report.snapshot)
|
|
226
|
+
return `team status: ${report.reason ?? "unknown"}`;
|
|
227
|
+
const lines = [
|
|
228
|
+
`team ${report.config.name} (${report.config.role}, ${report.config.workerCount} workers)`,
|
|
229
|
+
`session ${report.config.tmuxSession}`,
|
|
230
|
+
"",
|
|
231
|
+
"Tasks:",
|
|
232
|
+
];
|
|
233
|
+
for (const t of report.snapshot.tasks) {
|
|
234
|
+
lines.push(` ${t.id} ${t.status} ${t.owner ?? "-"} ${t.result ?? ""}`);
|
|
235
|
+
}
|
|
236
|
+
lines.push("", "Workers:");
|
|
237
|
+
for (const w of report.snapshot.workers) {
|
|
238
|
+
lines.push(` ${w.name} pane=${w.paneId ?? "-"} dead=${w.paneDead} hbStale=${w.heartbeatStale} new=${w.outboxNewCount}`);
|
|
239
|
+
}
|
|
240
|
+
lines.push("", `allDone=${report.snapshot.allDone}`);
|
|
241
|
+
return lines.join("\n");
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/team/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface TeamStatePaths {
|
|
2
|
+
cwd: string;
|
|
3
|
+
teamName: string;
|
|
4
|
+
teamRoot: string;
|
|
5
|
+
configFile: string;
|
|
6
|
+
manifestFile: string;
|
|
7
|
+
shutdownFile: string;
|
|
8
|
+
tasksDir: string;
|
|
9
|
+
workersDir: string;
|
|
10
|
+
mailboxDir: string;
|
|
11
|
+
dispatchDir: string;
|
|
12
|
+
eventsFile: string;
|
|
13
|
+
monitorSnapshotFile: string;
|
|
14
|
+
phaseStateFile: string;
|
|
15
|
+
approvalsDir: string;
|
|
16
|
+
}
|
|
17
|
+
export interface WorkerStatePaths {
|
|
18
|
+
workerRoot: string;
|
|
19
|
+
inboxFile: string;
|
|
20
|
+
outboxFile: string;
|
|
21
|
+
outboxOffsetFile: string;
|
|
22
|
+
heartbeatFile: string;
|
|
23
|
+
readySentinel: string;
|
|
24
|
+
statusFile: string;
|
|
25
|
+
shutdownRequestFile: string;
|
|
26
|
+
shutdownAckFile: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function resolveTeamPaths(cwd: string, teamName: string): TeamStatePaths;
|
|
29
|
+
export declare function resolveWorkerPaths(team: TeamStatePaths, workerName: string): WorkerStatePaths;
|
|
30
|
+
export declare function ensureTeamDirs(paths: TeamStatePaths): void;
|
|
31
|
+
export declare function ensureWorkerDirs(worker: WorkerStatePaths): void;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
export function resolveTeamPaths(cwd, teamName) {
|
|
4
|
+
const root = resolve(cwd);
|
|
5
|
+
const teamRoot = join(root, ".omp", "state", "team", teamName);
|
|
6
|
+
return {
|
|
7
|
+
cwd: root,
|
|
8
|
+
teamName,
|
|
9
|
+
teamRoot,
|
|
10
|
+
configFile: join(teamRoot, "config.json"),
|
|
11
|
+
manifestFile: join(teamRoot, "manifest.json"),
|
|
12
|
+
shutdownFile: join(teamRoot, "shutdown.json"),
|
|
13
|
+
tasksDir: join(teamRoot, "tasks"),
|
|
14
|
+
workersDir: join(teamRoot, "workers"),
|
|
15
|
+
mailboxDir: join(teamRoot, "mailbox"),
|
|
16
|
+
dispatchDir: join(teamRoot, "dispatch"),
|
|
17
|
+
eventsFile: join(teamRoot, "events.jsonl"),
|
|
18
|
+
monitorSnapshotFile: join(teamRoot, "monitor-snapshot.json"),
|
|
19
|
+
phaseStateFile: join(teamRoot, "phase-state.json"),
|
|
20
|
+
approvalsDir: join(teamRoot, "approvals"),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function resolveWorkerPaths(team, workerName) {
|
|
24
|
+
const workerRoot = join(team.workersDir, workerName);
|
|
25
|
+
return {
|
|
26
|
+
workerRoot,
|
|
27
|
+
inboxFile: join(workerRoot, "inbox.md"),
|
|
28
|
+
outboxFile: join(workerRoot, "outbox.jsonl"),
|
|
29
|
+
outboxOffsetFile: join(workerRoot, ".outbox-offset"),
|
|
30
|
+
heartbeatFile: join(workerRoot, "heartbeat.json"),
|
|
31
|
+
readySentinel: join(workerRoot, ".ready"),
|
|
32
|
+
statusFile: join(workerRoot, "status.json"),
|
|
33
|
+
shutdownRequestFile: join(workerRoot, "shutdown-request.json"),
|
|
34
|
+
shutdownAckFile: join(workerRoot, "shutdown-ack.json"),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function ensureTeamDirs(paths) {
|
|
38
|
+
for (const dir of [
|
|
39
|
+
paths.teamRoot,
|
|
40
|
+
paths.tasksDir,
|
|
41
|
+
paths.workersDir,
|
|
42
|
+
paths.mailboxDir,
|
|
43
|
+
paths.dispatchDir,
|
|
44
|
+
paths.approvalsDir,
|
|
45
|
+
]) {
|
|
46
|
+
if (!existsSync(dir))
|
|
47
|
+
mkdirSync(dir, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function ensureWorkerDirs(worker) {
|
|
51
|
+
if (!existsSync(worker.workerRoot))
|
|
52
|
+
mkdirSync(worker.workerRoot, { recursive: true });
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=state-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-paths.js","sourceRoot":"","sources":["../../../src/team/state-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+B1C,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAgB;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/D,OAAO;QACL,GAAG,EAAE,IAAI;QACT,QAAQ;QACR,QAAQ;QACR,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC;QACzC,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC;QAC7C,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC;QAC7C,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;QACjC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;QACrC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;QACrC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;QACvC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC;QAC1C,mBAAmB,EAAE,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC;QAC5D,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC;QAClD,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAoB,EAAE,UAAkB;IACzE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrD,OAAO;QACL,UAAU;QACV,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;QACvC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC;QAC5C,gBAAgB,EAAE,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC;QACpD,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC;QACjD,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;QACzC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC;QAC3C,mBAAmB,EAAE,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC;QAC9D,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAqB;IAClD,KAAK,MAAM,GAAG,IAAI;QAChB,KAAK,CAAC,QAAQ;QACd,KAAK,CAAC,QAAQ;QACd,KAAK,CAAC,UAAU;QAChB,KAAK,CAAC,UAAU;QAChB,KAAK,CAAC,WAAW;QACjB,KAAK,CAAC,YAAY;KACnB,EAAE,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;QAAE,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Task, TaskStatus } from "./types.js";
|
|
2
|
+
export declare function taskFilePath(tasksDir: string, taskId: string): string;
|
|
3
|
+
export declare function taskLockPath(tasksDir: string, taskId: string): string;
|
|
4
|
+
export declare function writeTask(taskPath: string, task: Task): void;
|
|
5
|
+
export declare function readTask(taskPath: string): Task | undefined;
|
|
6
|
+
export declare function listTasks(tasksDir: string): Task[];
|
|
7
|
+
export interface ClaimOptions {
|
|
8
|
+
tasksDir: string;
|
|
9
|
+
taskId: string;
|
|
10
|
+
worker: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ClaimResult {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
task?: Task;
|
|
15
|
+
claimToken?: string;
|
|
16
|
+
reason?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function tryClaimTask(opts: ClaimOptions): ClaimResult;
|
|
19
|
+
export interface ClearLocksResult {
|
|
20
|
+
removed: number;
|
|
21
|
+
failures: Array<{
|
|
22
|
+
path: string;
|
|
23
|
+
error: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export declare function clearAllLocks(tasksDir: string): number;
|
|
27
|
+
export declare function clearAllLocksDetailed(tasksDir: string): ClearLocksResult;
|
|
28
|
+
export interface TransitionOptions {
|
|
29
|
+
tasksDir: string;
|
|
30
|
+
taskId: string;
|
|
31
|
+
from: TaskStatus;
|
|
32
|
+
to: TaskStatus;
|
|
33
|
+
claimToken: string;
|
|
34
|
+
result?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface TransitionResult {
|
|
37
|
+
ok: boolean;
|
|
38
|
+
task?: Task;
|
|
39
|
+
reason?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function transitionTask(opts: TransitionOptions): TransitionResult;
|