@damian87/omp 0.10.0 → 0.13.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 (114) hide show
  1. package/.github/copilot-instructions.md +16 -0
  2. package/.github/skills/jira-ticket/SKILL.md +4 -4
  3. package/.github/skills/omp-autopilot/SKILL.md +4 -0
  4. package/.github/skills/research-codebase/SKILL.md +4 -0
  5. package/.github/skills/schedule/SKILL.md +4 -0
  6. package/.github/skills/team/SKILL.md +4 -0
  7. package/.github/skills/ultrawork/SKILL.md +4 -0
  8. package/.github/skills/weighted-consensus/SKILL.md +4 -0
  9. package/README.md +4 -1
  10. package/dist/src/cli.js +134 -4
  11. package/dist/src/cli.js.map +1 -1
  12. package/dist/src/commands/comms.d.ts +2 -0
  13. package/dist/src/commands/comms.js +110 -0
  14. package/dist/src/commands/comms.js.map +1 -0
  15. package/dist/src/commands/council.d.ts +2 -0
  16. package/dist/src/commands/council.js +77 -0
  17. package/dist/src/commands/council.js.map +1 -0
  18. package/dist/src/commands/env.d.ts +2 -0
  19. package/dist/src/commands/env.js +95 -0
  20. package/dist/src/commands/env.js.map +1 -0
  21. package/dist/src/commands/gateway.d.ts +3 -0
  22. package/dist/src/commands/gateway.js +129 -0
  23. package/dist/src/commands/gateway.js.map +1 -0
  24. package/dist/src/commands/memory.d.ts +7 -0
  25. package/dist/src/commands/memory.js +202 -0
  26. package/dist/src/commands/memory.js.map +1 -0
  27. package/dist/src/commands/mode.d.ts +4 -0
  28. package/dist/src/commands/mode.js +119 -0
  29. package/dist/src/commands/mode.js.map +1 -0
  30. package/dist/src/commands/schedule.d.ts +2 -0
  31. package/dist/src/commands/schedule.js +91 -0
  32. package/dist/src/commands/schedule.js.map +1 -0
  33. package/dist/src/commands/team.d.ts +2 -0
  34. package/dist/src/commands/team.js +146 -0
  35. package/dist/src/commands/team.js.map +1 -0
  36. package/dist/src/commands/utils.d.ts +13 -0
  37. package/dist/src/commands/utils.js +68 -0
  38. package/dist/src/commands/utils.js.map +1 -0
  39. package/dist/src/copilot/doctor.d.ts +1 -0
  40. package/dist/src/copilot/doctor.js +226 -27
  41. package/dist/src/copilot/doctor.js.map +1 -1
  42. package/dist/src/copilot/launch.js +13 -5
  43. package/dist/src/copilot/launch.js.map +1 -1
  44. package/dist/src/copilot/setup.js +13 -0
  45. package/dist/src/copilot/setup.js.map +1 -1
  46. package/dist/src/cost/index.d.ts +3 -0
  47. package/dist/src/cost/index.js +4 -0
  48. package/dist/src/cost/index.js.map +1 -0
  49. package/dist/src/cost/ledger.d.ts +21 -0
  50. package/dist/src/cost/ledger.js +72 -0
  51. package/dist/src/cost/ledger.js.map +1 -0
  52. package/dist/src/cost/summary.d.ts +22 -0
  53. package/dist/src/cost/summary.js +68 -0
  54. package/dist/src/cost/summary.js.map +1 -0
  55. package/dist/src/cost/tokenize.d.ts +7 -0
  56. package/dist/src/cost/tokenize.js +24 -0
  57. package/dist/src/cost/tokenize.js.map +1 -0
  58. package/dist/src/goal.js +6 -8
  59. package/dist/src/goal.js.map +1 -1
  60. package/dist/src/instructions-memory.js +26 -3
  61. package/dist/src/instructions-memory.js.map +1 -1
  62. package/dist/src/memory-review/apply.d.ts +7 -0
  63. package/dist/src/memory-review/apply.js +75 -0
  64. package/dist/src/memory-review/apply.js.map +1 -0
  65. package/dist/src/memory-review/config.d.ts +22 -0
  66. package/dist/src/memory-review/config.js +54 -0
  67. package/dist/src/memory-review/config.js.map +1 -0
  68. package/dist/src/memory-review/guard.d.ts +5 -0
  69. package/dist/src/memory-review/guard.js +37 -0
  70. package/dist/src/memory-review/guard.js.map +1 -0
  71. package/dist/src/memory-review/index.d.ts +17 -0
  72. package/dist/src/memory-review/index.js +87 -0
  73. package/dist/src/memory-review/index.js.map +1 -0
  74. package/dist/src/memory-review/prompt.d.ts +18 -0
  75. package/dist/src/memory-review/prompt.js +89 -0
  76. package/dist/src/memory-review/prompt.js.map +1 -0
  77. package/dist/src/memory-review/spawn.d.ts +2 -0
  78. package/dist/src/memory-review/spawn.js +51 -0
  79. package/dist/src/memory-review/spawn.js.map +1 -0
  80. package/dist/src/memory-review/transcript.d.ts +24 -0
  81. package/dist/src/memory-review/transcript.js +212 -0
  82. package/dist/src/memory-review/transcript.js.map +1 -0
  83. package/dist/src/memory-review/trigger.d.ts +21 -0
  84. package/dist/src/memory-review/trigger.js +27 -0
  85. package/dist/src/memory-review/trigger.js.map +1 -0
  86. package/dist/src/project-memory.d.ts +9 -0
  87. package/dist/src/project-memory.js +72 -1
  88. package/dist/src/project-memory.js.map +1 -1
  89. package/dist/src/state.js +25 -37
  90. package/dist/src/state.js.map +1 -1
  91. package/dist/src/utils/fs.d.ts +14 -0
  92. package/dist/src/utils/fs.js +32 -0
  93. package/dist/src/utils/fs.js.map +1 -0
  94. package/dist/src/utils/paths.d.ts +14 -0
  95. package/dist/src/utils/paths.js +21 -0
  96. package/dist/src/utils/paths.js.map +1 -0
  97. package/docs/general-skills.md +1 -0
  98. package/docs/memory-mode.md +94 -0
  99. package/hooks/hooks.json +9 -2
  100. package/package.json +1 -1
  101. package/plugin.json +1 -1
  102. package/scripts/error.mjs +9 -7
  103. package/scripts/lib/cost-ledger.mjs +91 -0
  104. package/scripts/lib/hook-input.mjs +51 -0
  105. package/scripts/lib/hook-output.mjs +53 -11
  106. package/scripts/lib/memory-review-trigger.mjs +59 -0
  107. package/scripts/lib/minify.mjs +80 -0
  108. package/scripts/lib/pending-directives.mjs +36 -0
  109. package/scripts/post-tool-use-failure.mjs +21 -0
  110. package/scripts/post-tool-use.mjs +71 -8
  111. package/scripts/pre-tool-use.mjs +8 -6
  112. package/scripts/prompt-submit.mjs +12 -5
  113. package/scripts/session-end.mjs +15 -5
  114. package/scripts/session-start.mjs +9 -4
@@ -0,0 +1,146 @@
1
+ import { flagValue, hasFlag, parsePositiveIntFlag } from "./utils.js";
2
+ const TEAM_SPEC_RE = /^(\d+):([\w-]+)$/;
3
+ export async function handleTeam(argv) {
4
+ const [, command, value, extra] = argv;
5
+ const json = hasFlag(argv, "--json");
6
+ const cwd = flagValue(argv, "--root") ?? process.cwd();
7
+ if (command && TEAM_SPEC_RE.test(command)) {
8
+ const match = command.match(TEAM_SPEC_RE);
9
+ const workerCount = Number(match[1]);
10
+ const role = match[2];
11
+ if (!value) {
12
+ return { ok: false, exitCode: 1, message: "team <N:role> requires a task description" };
13
+ }
14
+ const name = flagValue(argv, "--name") ?? `${role}-${Date.now().toString(36)}`;
15
+ const { startTeam } = await import("../team/runtime.js");
16
+ try {
17
+ const result = await startTeam({ cwd, name, role, workerCount, task: value });
18
+ return json
19
+ ? { ok: true, output: result }
20
+ : {
21
+ ok: true,
22
+ message: `started team ${name} session=${result.tmuxSession} workers=${result.config.workers
23
+ .map((w) => `${w.name}(${w.paneId ?? "?"})`)
24
+ .join(",")}`,
25
+ };
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ return { ok: false, exitCode: 1, output: json ? { ok: false, error: message } : undefined, message };
30
+ }
31
+ }
32
+ if (command === "status" && value) {
33
+ const { statusTeam, formatStatus } = await import("../team/runtime.js");
34
+ const report = statusTeam({ cwd, name: value });
35
+ return json
36
+ ? { ok: report.ok, output: report }
37
+ : { ok: report.ok, message: formatStatus(report) };
38
+ }
39
+ if (command === "shutdown" && value) {
40
+ const { shutdownTeam } = await import("../team/runtime.js");
41
+ const result = await shutdownTeam({ cwd, name: value });
42
+ return json
43
+ ? { ok: result.ok, output: result }
44
+ : {
45
+ ok: result.ok,
46
+ message: `shutdown team ${value} killedPanes=${result.killedPanes} killedSession=${result.killedSession}`,
47
+ };
48
+ }
49
+ if (command === "monitor-panes") {
50
+ const leaderPaneId = flagValue(argv, "--leader-pane");
51
+ const workerPaneIds = argv
52
+ .flatMap((arg, index) => (arg === "--worker-pane" ? [argv[index + 1]] : []))
53
+ .filter((value) => Boolean(value));
54
+ if (!leaderPaneId || workerPaneIds.length === 0) {
55
+ return { ok: false, exitCode: 1, message: "team monitor-panes requires --leader-pane and at least one --worker-pane" };
56
+ }
57
+ let pollIntervalMs;
58
+ let readySamples;
59
+ let minObservationMs;
60
+ let timeoutMs;
61
+ let captureLines;
62
+ try {
63
+ pollIntervalMs = parsePositiveIntFlag(flagValue(argv, "--poll-interval-ms"), "--poll-interval-ms");
64
+ readySamples = parsePositiveIntFlag(flagValue(argv, "--ready-samples"), "--ready-samples");
65
+ minObservationMs = parsePositiveIntFlag(flagValue(argv, "--min-observation-ms"), "--min-observation-ms");
66
+ timeoutMs = parsePositiveIntFlag(flagValue(argv, "--timeout-ms"), "--timeout-ms");
67
+ captureLines = parsePositiveIntFlag(flagValue(argv, "--capture-lines"), "--capture-lines");
68
+ }
69
+ catch (err) {
70
+ return { ok: false, exitCode: 1, message: String(err instanceof Error ? err.message : err) };
71
+ }
72
+ const { monitorPanes } = await import("../team/pane-monitor.js");
73
+ const result = await monitorPanes({
74
+ leaderPaneId,
75
+ workerPaneIds,
76
+ sessionLabel: flagValue(argv, "--session-label"),
77
+ config: {
78
+ pollIntervalMs,
79
+ readySamples,
80
+ minObservationMs,
81
+ timeoutMs,
82
+ captureLines,
83
+ },
84
+ });
85
+ return json
86
+ ? { ok: result.ok, exitCode: result.ok ? 0 : 1, output: result }
87
+ : { ok: result.ok, exitCode: result.ok ? 0 : 1, message: `team monitor-panes ${result.reason} events=${result.events.length}` };
88
+ }
89
+ if (command === "api") {
90
+ const sub = value;
91
+ const inputRaw = flagValue(argv, "--input");
92
+ if (!sub || !inputRaw) {
93
+ return { ok: false, exitCode: 1, message: "team api <sub> --input '<json>' required" };
94
+ }
95
+ let input;
96
+ try {
97
+ input = JSON.parse(inputRaw);
98
+ }
99
+ catch (error) {
100
+ const message = error instanceof Error ? error.message : String(error);
101
+ return { ok: false, exitCode: 1, message: `invalid --input JSON: ${message}` };
102
+ }
103
+ const api = await import("../team/api.js");
104
+ if (sub === "claim-task") {
105
+ const result = api.apiClaimTask(input);
106
+ return json
107
+ ? { ok: result.ok, exitCode: result.ok ? 0 : 1, output: result }
108
+ : { ok: result.ok, exitCode: result.ok ? 0 : 1, message: JSON.stringify(result) };
109
+ }
110
+ if (sub === "transition-task-status") {
111
+ const result = api.apiTransitionTaskStatus(input);
112
+ return json
113
+ ? { ok: result.ok, exitCode: result.ok ? 0 : 1, output: result }
114
+ : { ok: result.ok, exitCode: result.ok ? 0 : 1, message: JSON.stringify(result) };
115
+ }
116
+ if (sub === "send-message") {
117
+ const result = await api.apiSendMessage(input);
118
+ return json
119
+ ? { ok: result.ok, exitCode: result.ok ? 0 : 1, output: result }
120
+ : { ok: result.ok, exitCode: result.ok ? 0 : 1, message: JSON.stringify(result) };
121
+ }
122
+ if (sub === "broadcast") {
123
+ const result = await api.apiBroadcast(input);
124
+ return json
125
+ ? { ok: result.ok, exitCode: result.ok ? 0 : 1, output: result }
126
+ : { ok: result.ok, exitCode: result.ok ? 0 : 1, message: JSON.stringify(result) };
127
+ }
128
+ if (sub === "mailbox-list") {
129
+ const result = api.apiMailboxList(input);
130
+ return json
131
+ ? { ok: result.ok, exitCode: result.ok ? 0 : 1, output: result }
132
+ : { ok: result.ok, exitCode: result.ok ? 0 : 1, message: JSON.stringify(result) };
133
+ }
134
+ if (sub === "mailbox-mark-delivered") {
135
+ const result = api.apiMailboxMarkDelivered(input);
136
+ return json
137
+ ? { ok: result.ok, exitCode: result.ok ? 0 : 1, output: result }
138
+ : { ok: result.ok, exitCode: result.ok ? 0 : 1, message: JSON.stringify(result) };
139
+ }
140
+ return { ok: false, exitCode: 1, message: `Unknown team api command: ${sub}` };
141
+ }
142
+ // tolerate trailing extras (e.g., '--json')
143
+ void extra;
144
+ return { ok: false, exitCode: 1, message: `Unknown team command. Try: omp team <N:role> "<task>" | status <name> | shutdown <name> | api <sub>` };
145
+ }
146
+ //# sourceMappingURL=team.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team.js","sourceRoot":"","sources":["../../../src/commands/team.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare function hasFlag(args: string[], flag: string): boolean;
2
+ export declare function flagValue(args: string[], flag: string): string | undefined;
3
+ export declare function resolveExistingInputPath(value: string): Promise<string>;
4
+ export declare const DEFAULT_COUNCIL_ROLES: string[];
5
+ /** Parse a --models value: comma-separated `model` or `model:role:weight` tokens. */
6
+ export declare function parseModelsFlag(value: string): {
7
+ model: string;
8
+ role: string;
9
+ weight: number;
10
+ }[];
11
+ /** Parse a numeric flag as a finite positive integer; throw on malformed input. */
12
+ export declare function parsePositiveIntFlag(value: string | undefined, flag: string): number | undefined;
13
+ export declare function readFlagOrFile(value: string | undefined): Promise<string | undefined>;
@@ -0,0 +1,68 @@
1
+ export function hasFlag(args, flag) {
2
+ return args.includes(flag);
3
+ }
4
+ export function flagValue(args, flag) {
5
+ const index = args.indexOf(flag);
6
+ if (index === -1)
7
+ return undefined;
8
+ return args[index + 1];
9
+ }
10
+ export async function resolveExistingInputPath(value) {
11
+ const { existsSync } = await import("node:fs");
12
+ const { isAbsolute, resolve } = await import("node:path");
13
+ const direct = isAbsolute(value) ? value : resolve(process.cwd(), value);
14
+ if (existsSync(direct))
15
+ return direct;
16
+ const parentRelative = isAbsolute(value) ? value : resolve(process.cwd(), "..", value);
17
+ if (existsSync(parentRelative))
18
+ return parentRelative;
19
+ return direct;
20
+ }
21
+ export const DEFAULT_COUNCIL_ROLES = ["critic", "architect", "pragmatist"];
22
+ /** Parse a --models value: comma-separated `model` or `model:role:weight` tokens. */
23
+ export function parseModelsFlag(value) {
24
+ const tokens = value
25
+ .split(",")
26
+ .map((t) => t.trim())
27
+ .filter((t) => t.length > 0);
28
+ if (tokens.length === 0) {
29
+ throw new Error("--models was empty");
30
+ }
31
+ return tokens.map((token, i) => {
32
+ const parts = token.split(":");
33
+ const model = parts[0].trim();
34
+ if (!model)
35
+ throw new Error(`--models token "${token}" has no model`);
36
+ const role = parts[1]?.trim() || DEFAULT_COUNCIL_ROLES[i % DEFAULT_COUNCIL_ROLES.length];
37
+ let weight = 1;
38
+ if (parts[2] !== undefined) {
39
+ const w = Number(parts[2]);
40
+ if (!Number.isFinite(w) || w <= 0) {
41
+ throw new Error(`--models token "${token}" has invalid weight`);
42
+ }
43
+ weight = w;
44
+ }
45
+ return { model, role, weight };
46
+ });
47
+ }
48
+ /** Parse a numeric flag as a finite positive integer; throw on malformed input. */
49
+ export function parsePositiveIntFlag(value, flag) {
50
+ if (value === undefined)
51
+ return undefined;
52
+ const n = Number(value);
53
+ if (!Number.isFinite(n) || n <= 0 || !Number.isInteger(n)) {
54
+ throw new Error(`Invalid ${flag}: expected a positive integer, got "${value}"`);
55
+ }
56
+ return n;
57
+ }
58
+ export async function readFlagOrFile(value) {
59
+ if (value === undefined)
60
+ return undefined;
61
+ if (value.startsWith("@")) {
62
+ const { readFileSync } = await import("node:fs");
63
+ const path = await resolveExistingInputPath(value.slice(1));
64
+ return readFileSync(path, "utf8");
65
+ }
66
+ return value;
67
+ }
68
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/commands/utils.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ export interface DoctorReport {
13
13
  export interface DoctorOptions extends ResolveCopilotPathsOptions {
14
14
  skipCopilot?: boolean;
15
15
  copilotBin?: string;
16
+ checkHooks?: boolean;
16
17
  }
17
18
  export declare function runDoctor(options?: DoctorOptions): DoctorReport;
18
19
  export declare function formatDoctor(report: DoctorReport): string;
@@ -1,6 +1,7 @@
1
- import { existsSync, readFileSync } from "node:fs";
1
+ import { existsSync, mkdtempSync, readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { spawnSync } from "node:child_process";
4
+ import { tmpdir } from "node:os";
4
5
  import { resolveCopilotPaths } from "./paths.js";
5
6
  function checkNodeVersion() {
6
7
  const major = Number(process.version.replace(/^v/, "").split(".")[0]);
@@ -36,50 +37,245 @@ function checkSkillsDiscovery(paths) {
36
37
  detail: `no skills directory: ${paths.projectScopeSkills}`,
37
38
  };
38
39
  }
39
- // Recognized Copilot CLI hook events. `agentStop` powers the omp loop driver.
40
- const COPILOT_HOOK_EVENTS = [
40
+ // Recognized Copilot CLI hook events (camelCase native + VS Code-compatible
41
+ // PascalCase aliases). `agentStop` powers the omp loop driver.
42
+ const SUPPORTED_HOOK_EVENTS = new Set([
41
43
  "sessionStart",
42
- "sessionEnd",
43
44
  "userPromptSubmitted",
44
45
  "preToolUse",
45
46
  "postToolUse",
46
- "errorOccurred",
47
+ "postToolUseFailure",
47
48
  "agentStop",
48
- ];
49
- function checkHooksManifest(paths) {
49
+ "subagentStart",
50
+ "subagentStop",
51
+ "preCompact",
52
+ "sessionEnd",
53
+ "errorOccurred",
54
+ "permissionRequest",
55
+ "notification",
56
+ // VS Code-compatible event names accepted by Copilot CLI.
57
+ "SessionStart",
58
+ "UserPromptSubmit",
59
+ "PreToolUse",
60
+ "PostToolUse",
61
+ "PostToolUseFailure",
62
+ "Stop",
63
+ "SubagentStart",
64
+ "SubagentStop",
65
+ "PreCompact",
66
+ "SessionEnd",
67
+ "ErrorOccurred",
68
+ "PermissionRequest",
69
+ "Notification",
70
+ ]);
71
+ function describeUnsupportedEvent(eventName) {
72
+ if (eventName === "Error")
73
+ return 'unsupported hook event "Error" (use errorOccurred or ErrorOccurred)';
74
+ return `unsupported hook event "${eventName}"`;
75
+ }
76
+ function validateHookEntry(eventName, entry, index) {
77
+ const issues = [];
78
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
79
+ return [`${eventName}[${index}] must be an object`];
80
+ }
81
+ const record = entry;
82
+ const type = record.type ?? "command";
83
+ if (type === "command") {
84
+ if (typeof record.bash !== "string" &&
85
+ typeof record.powershell !== "string" &&
86
+ typeof record.command !== "string") {
87
+ issues.push(`${eventName}[${index}] command hook needs bash, powershell, or command`);
88
+ }
89
+ }
90
+ else if (type === "http") {
91
+ if (typeof record.url !== "string")
92
+ issues.push(`${eventName}[${index}] http hook needs url`);
93
+ }
94
+ else if (type === "prompt") {
95
+ if (eventName !== "sessionStart" && eventName !== "SessionStart") {
96
+ issues.push(`${eventName}[${index}] prompt hooks are only supported on sessionStart`);
97
+ }
98
+ if (typeof record.prompt !== "string")
99
+ issues.push(`${eventName}[${index}] prompt hook needs prompt`);
100
+ }
101
+ else {
102
+ issues.push(`${eventName}[${index}] has unsupported hook type "${String(type)}"`);
103
+ }
104
+ return issues;
105
+ }
106
+ function validateHooksManifestShape(manifest) {
107
+ const issues = [];
108
+ if (!manifest || typeof manifest !== "object" || Array.isArray(manifest)) {
109
+ return ["manifest must be a JSON object with version: 1 and hooks"];
110
+ }
111
+ const record = manifest;
112
+ if (record.version !== 1)
113
+ issues.push("manifest must declare version: 1");
114
+ if (!record.hooks || typeof record.hooks !== "object" || Array.isArray(record.hooks)) {
115
+ issues.push("manifest must declare a hooks object");
116
+ return issues;
117
+ }
118
+ for (const [eventName, entries] of Object.entries(record.hooks)) {
119
+ if (!SUPPORTED_HOOK_EVENTS.has(eventName))
120
+ issues.push(describeUnsupportedEvent(eventName));
121
+ if (!Array.isArray(entries)) {
122
+ issues.push(`${eventName} must be an array of hook entries`);
123
+ continue;
124
+ }
125
+ entries.forEach((entry, index) => issues.push(...validateHookEntry(eventName, entry, index)));
126
+ }
127
+ return issues;
128
+ }
129
+ function sampleHookPayload(eventName, cwd) {
130
+ switch (eventName) {
131
+ case "UserPromptSubmit":
132
+ return { hook_event_name: eventName, session_id: "doctor-smoke", timestamp: new Date().toISOString(), cwd, prompt: "doctor smoke" };
133
+ case "PreToolUse":
134
+ return { hook_event_name: eventName, session_id: "doctor-smoke", timestamp: new Date().toISOString(), cwd, tool_name: "view", tool_input: { path: "README.md" } };
135
+ case "PostToolUse":
136
+ return {
137
+ hook_event_name: eventName,
138
+ session_id: "doctor-smoke",
139
+ timestamp: new Date().toISOString(),
140
+ cwd,
141
+ tool_name: "view",
142
+ tool_input: { path: "README.md" },
143
+ tool_result: { result_type: "success", text_result_for_llm: "doctor smoke" },
144
+ };
145
+ case "PostToolUseFailure":
146
+ return { hook_event_name: eventName, session_id: "doctor-smoke", timestamp: new Date().toISOString(), cwd, tool_name: "edit", tool_input: {}, error: "doctor smoke" };
147
+ case "Stop":
148
+ return { hook_event_name: eventName, session_id: "doctor-smoke", timestamp: new Date().toISOString(), cwd, transcript_path: "", stop_reason: "end_turn" };
149
+ case "SubagentStart":
150
+ case "SubagentStop":
151
+ return { hook_event_name: eventName, session_id: "doctor-smoke", timestamp: new Date().toISOString(), cwd, transcript_path: "", agent_name: "doctor" };
152
+ case "PreCompact":
153
+ return { hook_event_name: eventName, session_id: "doctor-smoke", timestamp: new Date().toISOString(), cwd, transcript_path: "", trigger: "manual", custom_instructions: "" };
154
+ case "SessionStart":
155
+ case "SessionEnd":
156
+ case "ErrorOccurred":
157
+ case "PermissionRequest":
158
+ case "Notification":
159
+ return { hook_event_name: eventName, session_id: "doctor-smoke", timestamp: new Date().toISOString(), cwd, error: "doctor smoke", message: "doctor smoke" };
160
+ default:
161
+ return {
162
+ sessionId: "doctor-smoke",
163
+ timestamp: Date.now(),
164
+ cwd,
165
+ prompt: "doctor smoke",
166
+ toolName: "view",
167
+ toolArgs: { path: "README.md" },
168
+ toolResult: { resultType: "success", textResultForLlm: "doctor smoke" },
169
+ error: "doctor smoke",
170
+ transcriptPath: "",
171
+ stopReason: "end_turn",
172
+ trigger: "manual",
173
+ customInstructions: "",
174
+ };
175
+ }
176
+ }
177
+ function commandForSmoke(entry) {
178
+ const platformPreference = process.platform === "win32"
179
+ ? [entry.powershell, entry.command, entry.bash]
180
+ : [entry.bash, entry.command, entry.powershell];
181
+ const command = platformPreference.find((value) => typeof value === "string" && value.trim().length > 0);
182
+ return command;
183
+ }
184
+ function timeoutMsForSmoke(entry) {
185
+ const timeout = typeof entry.timeoutSec === "number" ? entry.timeoutSec : typeof entry.timeout === "number" ? entry.timeout : 10;
186
+ return Math.max(1, timeout) * 1000;
187
+ }
188
+ function checkHooksSmoke(paths) {
50
189
  if (!existsSync(paths.hooksManifest)) {
51
- return { name: "hooks-manifest", status: "warn", detail: `not present: ${paths.hooksManifest}` };
190
+ return { name: "hooks-smoke", status: "warn", detail: `skipped; no hooks manifest: ${paths.hooksManifest}` };
52
191
  }
53
- let parsed;
192
+ let manifest;
54
193
  try {
55
- parsed = JSON.parse(readFileSync(paths.hooksManifest, "utf8"));
194
+ manifest = JSON.parse(readFileSync(paths.hooksManifest, "utf8"));
56
195
  }
57
- catch {
58
- return { name: "hooks-manifest", status: "fail", detail: `invalid JSON: ${paths.hooksManifest}` };
196
+ catch (error) {
197
+ return { name: "hooks-smoke", status: "fail", detail: `skipped; invalid hooks JSON (${error instanceof Error ? error.message : String(error)})` };
198
+ }
199
+ const schemaIssues = validateHooksManifestShape(manifest);
200
+ if (schemaIssues.length > 0) {
201
+ return { name: "hooks-smoke", status: "fail", detail: `skipped; hooks schema invalid: ${schemaIssues.join("; ")}` };
59
202
  }
60
- const manifest = parsed;
61
- if (manifest.version !== 1 || typeof manifest.hooks !== "object" || manifest.hooks === null) {
203
+ const hooks = manifest.hooks;
204
+ const smokeCwd = mkdtempSync(join(tmpdir(), "omp-hooks-smoke-"));
205
+ const issues = [];
206
+ let ran = 0;
207
+ for (const [eventName, entries] of Object.entries(hooks)) {
208
+ for (const [index, entry] of entries.entries()) {
209
+ const record = entry;
210
+ const type = record.type ?? "command";
211
+ if (type !== "command")
212
+ continue;
213
+ const command = commandForSmoke(record);
214
+ if (!command) {
215
+ issues.push(`${eventName}[${index}] has no runnable command`);
216
+ continue;
217
+ }
218
+ ran += 1;
219
+ const result = spawnSync(command, {
220
+ cwd: smokeCwd,
221
+ env: { ...process.env, OMP_PLUGIN_ROOT: paths.pluginRoot, OMC_PLUGIN_ROOT: paths.pluginRoot },
222
+ input: JSON.stringify(sampleHookPayload(eventName, smokeCwd)),
223
+ encoding: "utf8",
224
+ shell: true,
225
+ timeout: timeoutMsForSmoke(record),
226
+ });
227
+ if (result.error) {
228
+ issues.push(`${eventName}[${index}] failed: ${result.error.message}`);
229
+ continue;
230
+ }
231
+ if (result.status !== 0) {
232
+ issues.push(`${eventName}[${index}] exited ${result.status ?? "?"}: ${(result.stderr || result.stdout).trim()}`);
233
+ continue;
234
+ }
235
+ const stdout = (result.stdout ?? "").trim();
236
+ if (!stdout)
237
+ continue;
238
+ try {
239
+ const parsed = JSON.parse(stdout);
240
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
241
+ issues.push(`${eventName}[${index}] stdout JSON must be an object`);
242
+ continue;
243
+ }
244
+ // Hooks dual-emit Copilot v1 keys AND Claude Code keys (continue /
245
+ // hookSpecificOutput); both vocabularies are valid here.
246
+ }
247
+ catch {
248
+ issues.push(`${eventName}[${index}] invalid stdout JSON: ${stdout.slice(0, 120)}`);
249
+ }
250
+ }
251
+ }
252
+ if (issues.length > 0)
253
+ return { name: "hooks-smoke", status: "fail", detail: issues.join("; ") };
254
+ return { name: "hooks-smoke", status: "pass", detail: `ran ${ran} command hook${ran === 1 ? "" : "s"} with documented sample payloads` };
255
+ }
256
+ function checkHooksManifest(paths) {
257
+ if (!existsSync(paths.hooksManifest)) {
62
258
  return {
63
259
  name: "hooks-manifest",
64
- status: "fail",
65
- detail: `not Copilot v1 format (need {"version":1,"hooks":{…}}): ${paths.hooksManifest}`,
260
+ status: "warn",
261
+ detail: `not present: ${paths.hooksManifest}`,
66
262
  };
67
263
  }
68
- const events = Object.keys(manifest.hooks);
69
- const unknown = events.filter((e) => !COPILOT_HOOK_EVENTS.includes(e));
70
- if (unknown.length > 0) {
264
+ try {
265
+ const manifest = JSON.parse(readFileSync(paths.hooksManifest, "utf8"));
266
+ const issues = validateHooksManifestShape(manifest);
267
+ if (issues.length > 0) {
268
+ return { name: "hooks-manifest", status: "fail", detail: `${paths.hooksManifest}: ${issues.join("; ")}` };
269
+ }
270
+ }
271
+ catch (error) {
71
272
  return {
72
273
  name: "hooks-manifest",
73
- status: "warn",
74
- detail: `unrecognized hook events ${unknown.join(", ")} (Claude-format?): ${paths.hooksManifest}`,
274
+ status: "fail",
275
+ detail: `${paths.hooksManifest}: invalid JSON (${error instanceof Error ? error.message : String(error)})`,
75
276
  };
76
277
  }
77
- const hasLoop = events.includes("agentStop");
78
- return {
79
- name: "hooks-manifest",
80
- status: "pass",
81
- detail: `Copilot v1, ${events.length} events${hasLoop ? " (agentStop loop driver present)" : ""}`,
82
- };
278
+ return { name: "hooks-manifest", status: "pass", detail: paths.hooksManifest };
83
279
  }
84
280
  function checkCopilotCli(bin) {
85
281
  try {
@@ -103,6 +299,9 @@ export function runDoctor(options = {}) {
103
299
  checkSkillsDiscovery(paths),
104
300
  checkHooksManifest(paths),
105
301
  ];
302
+ if (options.checkHooks) {
303
+ checks.push(checkHooksSmoke(paths));
304
+ }
106
305
  if (!options.skipCopilot) {
107
306
  checks.push(checkCopilotCli(options.copilotBin ?? "copilot"));
108
307
  }
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/copilot/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/copilot/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAsD,MAAM,YAAY,CAAC;AAsBrG,SAAS,gBAAgB;IACvB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,OAAO,CAAC,OAAO,cAAc,EAAE,CAAC;AACjG,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAmB;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,QAAQ,EAAE,EAAE,CAAC;IACrF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAmB;IAC5C,IAAI,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,mBAAmB,EAAE,CAAC;IAC7F,CAAC;IACD,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,gCAAgC,KAAK,CAAC,mBAAmB,EAAE;KACpE,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAmB;IAC/C,IAAI,UAAU,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC;IACxF,CAAC;IACD,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,wBAAwB,KAAK,CAAC,kBAAkB,EAAE;KAC3D,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,+DAA+D;AAC/D,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,cAAc;IACd,qBAAqB;IACrB,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,WAAW;IACX,eAAe;IACf,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,mBAAmB;IACnB,cAAc;IACd,0DAA0D;IAC1D,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,MAAM;IACN,eAAe;IACf,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,mBAAmB;IACnB,cAAc;CACf,CAAC,CAAC;AAEH,SAAS,wBAAwB,CAAC,SAAiB;IACjD,IAAI,SAAS,KAAK,OAAO;QAAE,OAAO,qEAAqE,CAAC;IACxG,OAAO,2BAA2B,SAAS,GAAG,CAAC;AACjD,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB,EAAE,KAAc,EAAE,KAAa;IACzE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,CAAC,GAAG,SAAS,IAAI,KAAK,qBAAqB,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC;IACtC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IACE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC/B,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YACrC,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAClC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,KAAK,mDAAmD,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,KAAK,uBAAuB,CAAC,CAAC;IAChG,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,SAAS,KAAK,cAAc,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,KAAK,mDAAmD,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,KAAK,4BAA4B,CAAC,CAAC;IACxG,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,KAAK,gCAAgC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAiB;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,OAAO,CAAC,0DAA0D,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,MAAM,GAAG,QAAmC,CAAC;IACnD,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC1E,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC3F,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,mCAAmC,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB,EAAE,GAAW;IACvD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,kBAAkB;YACrB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QACtI,KAAK,YAAY;YACf,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;QACpK,KAAK,aAAa;YAChB,OAAO;gBACL,eAAe,EAAE,SAAS;gBAC1B,UAAU,EAAE,cAAc;gBAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,GAAG;gBACH,SAAS,EAAE,MAAM;gBACjB,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;gBACjC,WAAW,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE;aAC7E,CAAC;QACJ,KAAK,oBAAoB;YACvB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QACxK,KAAK,MAAM;YACT,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;QAC5J,KAAK,eAAe,CAAC;QACrB,KAAK,cAAc;YACjB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QACzJ,KAAK,YAAY;YACf,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;QAC/K,KAAK,cAAc,CAAC;QACpB,KAAK,YAAY,CAAC;QAClB,KAAK,eAAe,CAAC;QACrB,KAAK,mBAAmB,CAAC;QACzB,KAAK,cAAc;YACjB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QAC9J;YACE,OAAO;gBACL,SAAS,EAAE,cAAc;gBACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,GAAG;gBACH,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;gBAC/B,UAAU,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE;gBACvE,KAAK,EAAE,cAAc;gBACrB,cAAc,EAAE,EAAE;gBAClB,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,QAAQ;gBACjB,kBAAkB,EAAE,EAAE;aACvB,CAAC;IACN,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAA8B;IACrD,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QACrD,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;QAC/C,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1H,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAA8B;IACvD,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACjI,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AACrC,CAAC;AAED,SAAS,eAAe,CAAC,KAAmB;IAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,+BAA+B,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC;IAC/G,CAAC;IACD,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC,CAAY,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACpJ,CAAC;IACD,MAAM,YAAY,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IAC1D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,kCAAkC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACtH,CAAC;IAED,MAAM,KAAK,GAAI,QAAiD,CAAC,KAAK,CAAC;IACvE,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACjE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,KAAgC,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC;YACtC,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS;YACjC,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,KAAK,2BAA2B,CAAC,CAAC;gBAC9D,SAAS;YACX,CAAC;YACD,GAAG,IAAI,CAAC,CAAC;YACT,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE;gBAChC,GAAG,EAAE,QAAQ;gBACb,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,CAAC,UAAU,EAAE,eAAe,EAAE,KAAK,CAAC,UAAU,EAAE;gBAC7F,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC7D,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC;aACnC,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,KAAK,aAAa,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtE,SAAS;YACX,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,KAAK,YAAY,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACjH,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAY,CAAC;gBAC7C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBACnE,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,KAAK,iCAAiC,CAAC,CAAC;oBACpE,SAAS;gBACX,CAAC;gBACD,mEAAmE;gBACnE,yDAAyD;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,KAAK,0BAA0B,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjG,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,kCAAkC,EAAE,CAAC;AAC3I,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAmB;IAC7C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,gBAAgB,KAAK,CAAC,aAAa,EAAE;SAC9C,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC,CAAY,CAAC;QAClF,MAAM,MAAM,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,aAAa,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5G,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,GAAG,KAAK,CAAC,aAAa,mBAAmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG;SAC3G,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YAChG,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACzD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,qBAAqB,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC;IAC5G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,oBAAoB,EAAE,CAAC;IACrF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,UAAyB,EAAE;IACnD,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAkB;QAC5B,gBAAgB,EAAE;QAClB,mBAAmB,CAAC,KAAK,CAAC;QAC1B,iBAAiB,CAAC,KAAK,CAAC;QACxB,oBAAoB,CAAC,KAAK,CAAC;QAC3B,kBAAkB,CAAC,KAAK,CAAC;KAC1B,CAAC;IACF,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACpD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,MAAM,KAAK,GAAG,CAAC,cAAc,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACjF,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -38,22 +38,30 @@ export function resolveCopilotBin(override) {
38
38
  return fromEnv;
39
39
  return "copilot";
40
40
  }
41
- function isInsideTmux() {
42
- return !!process.env.TMUX;
41
+ function isInsideTmux(env) {
42
+ return !!env.TMUX;
43
43
  }
44
44
  function tmuxAvailable() {
45
45
  const r = spawnSync("tmux", ["-V"], { encoding: "utf8", timeout: 3000 });
46
46
  return r.status === 0;
47
47
  }
48
+ function shouldAutoWrapInTmux(env) {
49
+ if (env.OMP_FORCE_TMUX_WRAP === "1")
50
+ return true;
51
+ if (env.OMP_DISABLE_TMUX_WRAP === "1")
52
+ return false;
53
+ return Boolean(process.stdin.isTTY && process.stdout.isTTY);
54
+ }
48
55
  export async function launchCopilot(options) {
49
56
  const bin = resolveCopilotBin(options.bin);
50
57
  const args = normalizeCopilotLaunchArgs(options.args);
51
58
  const cwd = options.cwd ?? process.cwd();
59
+ const env = options.env ?? process.env;
52
60
  // Pre-trust the launch folder so neither this session nor team workers block on
53
61
  // Copilot's folder-trust dialog (which --yolo/--allow-all-paths do NOT skip).
54
62
  ensureFolderTrusted(cwd);
55
63
  // If not already inside tmux and tmux is available, wrap in a tmux session
56
- if (!isInsideTmux() && tmuxAvailable()) {
64
+ if (!isInsideTmux(env) && shouldAutoWrapInTmux(env) && tmuxAvailable()) {
57
65
  const sessionName = `omp-${Date.now()}`;
58
66
  const copilotCmd = [bin, ...args].map(shellEscape).join(" ");
59
67
  // Forward COPILOT_* (BYOK) vars into the new pane: a running tmux server
@@ -64,7 +72,7 @@ export async function launchCopilot(options) {
64
72
  const child = spawn("tmux", ["new-session", "-s", sessionName, "-c", cwd, ...envArgs, copilotCmd], {
65
73
  stdio: "inherit",
66
74
  cwd,
67
- env: options.env ?? process.env,
75
+ env,
68
76
  });
69
77
  child.on("error", () => {
70
78
  if (settled)
@@ -87,7 +95,7 @@ export async function launchCopilot(options) {
87
95
  const child = spawn(bin, args, {
88
96
  stdio: "inherit",
89
97
  cwd,
90
- env: options.env ?? process.env,
98
+ env,
91
99
  });
92
100
  child.on("error", () => {
93
101
  if (settled)