@damian87/omp 0.9.2 → 0.12.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/copilot-instructions.md +16 -0
- package/.github/skills/create-skill/SKILL.md +3 -3
- package/.github/skills/daily-log/SKILL.md +1 -1
- package/.github/skills/jira-ticket/SKILL.md +6 -3
- package/.github/skills/omp-autopilot/SKILL.md +5 -1
- package/.github/skills/ralph/SKILL.md +6 -4
- package/.github/skills/research-codebase/SKILL.md +10 -6
- package/.github/skills/research-codebase/reference/agent-prompts.md +8 -8
- package/.github/skills/schedule/SKILL.md +4 -0
- package/.github/skills/slack/SKILL.md +1 -0
- package/.github/skills/team/SKILL.md +9 -3
- package/.github/skills/team/scripts/team-launch.sh +11 -5
- package/.github/skills/ultraqa/SKILL.md +5 -2
- package/.github/skills/ultrawork/SKILL.md +9 -5
- package/.github/skills/weighted-consensus/SKILL.md +8 -3
- package/README.md +4 -1
- package/dist/src/cli.js +10 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/comms/index.d.ts +13 -6
- package/dist/src/comms/index.js +65 -10
- package/dist/src/comms/index.js.map +1 -1
- package/dist/src/copilot/doctor.d.ts +1 -0
- package/dist/src/copilot/doctor.js +242 -8
- package/dist/src/copilot/doctor.js.map +1 -1
- package/dist/src/copilot/env-passthrough.d.ts +16 -0
- package/dist/src/copilot/env-passthrough.js +28 -0
- package/dist/src/copilot/env-passthrough.js.map +1 -0
- package/dist/src/copilot/launch.js +22 -6
- package/dist/src/copilot/launch.js.map +1 -1
- package/dist/src/copilot/setup.js +13 -0
- package/dist/src/copilot/setup.js.map +1 -1
- package/dist/src/copilot/trust.d.ts +22 -0
- package/dist/src/copilot/trust.js +62 -0
- package/dist/src/copilot/trust.js.map +1 -0
- package/dist/src/cost/index.d.ts +3 -0
- package/dist/src/cost/index.js +4 -0
- package/dist/src/cost/index.js.map +1 -0
- package/dist/src/cost/ledger.d.ts +21 -0
- package/dist/src/cost/ledger.js +72 -0
- package/dist/src/cost/ledger.js.map +1 -0
- package/dist/src/cost/summary.d.ts +22 -0
- package/dist/src/cost/summary.js +68 -0
- package/dist/src/cost/summary.js.map +1 -0
- package/dist/src/cost/tokenize.d.ts +7 -0
- package/dist/src/cost/tokenize.js +24 -0
- package/dist/src/cost/tokenize.js.map +1 -0
- package/dist/src/gateway/notify.d.ts +1 -1
- package/dist/src/gateway/notify.js +1 -1
- package/dist/src/gateway/notify.js.map +1 -1
- package/dist/src/instructions-memory.js +7 -6
- package/dist/src/instructions-memory.js.map +1 -1
- package/dist/src/team/tmux.d.ts +1 -1
- package/dist/src/team/tmux.js +41 -10
- package/dist/src/team/tmux.js.map +1 -1
- package/docs/general-skills.md +1 -0
- package/docs/plans/copilot-native-hooks.md +119 -0
- package/docs/plans/verification-plan.md +104 -0
- package/hooks/hooks.json +59 -72
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/scripts/agent-stop.mjs +87 -0
- package/scripts/error.mjs +9 -7
- package/scripts/lib/cost-ledger.mjs +91 -0
- package/scripts/lib/hook-input.mjs +51 -0
- package/scripts/lib/hook-output.mjs +77 -6
- package/scripts/lib/loop-driver.mjs +44 -0
- package/scripts/lib/minify.mjs +80 -0
- package/scripts/post-tool-use-failure.mjs +21 -0
- package/scripts/post-tool-use.mjs +71 -8
- package/scripts/pre-tool-use.mjs +8 -6
- package/scripts/prompt-submit.mjs +14 -9
- package/scripts/session-end.mjs +7 -5
- package/scripts/session-start.mjs +8 -11
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { ompRoot } from "../omp-root.js";
|
|
4
|
+
function costDir(cwd) {
|
|
5
|
+
return join(ompRoot(cwd), ".omp", "state", "cost");
|
|
6
|
+
}
|
|
7
|
+
function safeSessionId(sessionId) {
|
|
8
|
+
return (String(sessionId || "unknown")
|
|
9
|
+
.trim()
|
|
10
|
+
.replace(/[^a-zA-Z0-9._-]+/g, "-")
|
|
11
|
+
.replace(/^-+|-+$/g, "") || "unknown");
|
|
12
|
+
}
|
|
13
|
+
export function costLedgerPath(cwd, sessionId) {
|
|
14
|
+
return join(costDir(cwd), `${safeSessionId(sessionId)}.jsonl`);
|
|
15
|
+
}
|
|
16
|
+
function normalizeRecord(record) {
|
|
17
|
+
return {
|
|
18
|
+
ts: record.ts ?? new Date().toISOString(),
|
|
19
|
+
sessionId: record.sessionId || "unknown",
|
|
20
|
+
event: record.event,
|
|
21
|
+
toolName: record.toolName,
|
|
22
|
+
model: record.model,
|
|
23
|
+
inTokens: Number.isFinite(record.inTokens) ? Math.max(0, Number(record.inTokens)) : 0,
|
|
24
|
+
outTokens: Number.isFinite(record.outTokens) ? Math.max(0, Number(record.outTokens)) : 0,
|
|
25
|
+
rawOutTokens: Number.isFinite(record.rawOutTokens) ? Math.max(0, Number(record.rawOutTokens)) : undefined,
|
|
26
|
+
savedTokens: Number.isFinite(record.savedTokens) ? Math.max(0, Number(record.savedTokens)) : undefined,
|
|
27
|
+
rawPath: typeof record.rawPath === "string" ? record.rawPath : undefined,
|
|
28
|
+
estUSD: Number.isFinite(record.estUSD) ? Number(record.estUSD) : undefined,
|
|
29
|
+
note: record.note,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function appendCostRecord(cwd, record) {
|
|
33
|
+
const normalized = normalizeRecord(record);
|
|
34
|
+
const file = costLedgerPath(cwd, normalized.sessionId);
|
|
35
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
36
|
+
appendFileSync(file, `${JSON.stringify(normalized)}\n`, "utf8");
|
|
37
|
+
return file;
|
|
38
|
+
}
|
|
39
|
+
function readFileRecords(file) {
|
|
40
|
+
if (!existsSync(file))
|
|
41
|
+
return [];
|
|
42
|
+
const records = [];
|
|
43
|
+
for (const line of readFileSync(file, "utf8").split("\n")) {
|
|
44
|
+
if (!line.trim())
|
|
45
|
+
continue;
|
|
46
|
+
try {
|
|
47
|
+
const parsed = JSON.parse(line);
|
|
48
|
+
if (parsed && typeof parsed === "object" && typeof parsed.event === "string") {
|
|
49
|
+
records.push(normalizeRecord(parsed));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Ignore corrupt ledger rows; hooks are best-effort and append-only.
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return records;
|
|
57
|
+
}
|
|
58
|
+
export function readCostRecords(cwd, options = {}) {
|
|
59
|
+
const dir = costDir(cwd);
|
|
60
|
+
const todayPrefix = new Date().toISOString().slice(0, 10);
|
|
61
|
+
const files = options.sessionId
|
|
62
|
+
? [costLedgerPath(cwd, options.sessionId)]
|
|
63
|
+
: existsSync(dir)
|
|
64
|
+
? readdirSync(dir)
|
|
65
|
+
.filter((file) => file.endsWith(".jsonl"))
|
|
66
|
+
.sort()
|
|
67
|
+
.map((file) => join(dir, file))
|
|
68
|
+
: [];
|
|
69
|
+
const records = files.flatMap(readFileRecords);
|
|
70
|
+
return options.today ? records.filter((record) => String(record.ts ?? "").startsWith(todayPrefix)) : records;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../src/cost/ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ReadCostOptions } from "./ledger.js";
|
|
2
|
+
export interface CostBucket {
|
|
3
|
+
inTokens: number;
|
|
4
|
+
outTokens: number;
|
|
5
|
+
totalTokens: number;
|
|
6
|
+
records: number;
|
|
7
|
+
}
|
|
8
|
+
export interface CostSink extends CostBucket {
|
|
9
|
+
label: string;
|
|
10
|
+
}
|
|
11
|
+
export interface CostSummary {
|
|
12
|
+
root: string;
|
|
13
|
+
records: number;
|
|
14
|
+
sessions: string[];
|
|
15
|
+
totals: CostBucket;
|
|
16
|
+
byEvent: Record<string, CostBucket>;
|
|
17
|
+
byTool: Record<string, CostBucket>;
|
|
18
|
+
byModel: Record<string, CostBucket>;
|
|
19
|
+
topSinks: CostSink[];
|
|
20
|
+
}
|
|
21
|
+
export declare function summarizeCost(cwd: string, options?: ReadCostOptions): CostSummary;
|
|
22
|
+
export declare function formatCostSummary(summary: CostSummary): string;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { readCostRecords } from "./ledger.js";
|
|
2
|
+
import { ompRoot } from "../omp-root.js";
|
|
3
|
+
function emptyBucket() {
|
|
4
|
+
return { inTokens: 0, outTokens: 0, totalTokens: 0, records: 0 };
|
|
5
|
+
}
|
|
6
|
+
function addTo(bucket, record) {
|
|
7
|
+
const inTokens = record.inTokens ?? 0;
|
|
8
|
+
const outTokens = record.outTokens ?? 0;
|
|
9
|
+
bucket.inTokens += inTokens;
|
|
10
|
+
bucket.outTokens += outTokens;
|
|
11
|
+
bucket.totalTokens += inTokens + outTokens;
|
|
12
|
+
bucket.records += 1;
|
|
13
|
+
}
|
|
14
|
+
function addGroup(groups, key, record) {
|
|
15
|
+
if (!key)
|
|
16
|
+
return;
|
|
17
|
+
groups[key] ??= emptyBucket();
|
|
18
|
+
addTo(groups[key], record);
|
|
19
|
+
}
|
|
20
|
+
export function summarizeCost(cwd, options = {}) {
|
|
21
|
+
const root = ompRoot(cwd);
|
|
22
|
+
const records = readCostRecords(root, options);
|
|
23
|
+
const totals = emptyBucket();
|
|
24
|
+
const byEvent = {};
|
|
25
|
+
const byTool = {};
|
|
26
|
+
const byModel = {};
|
|
27
|
+
const sessions = new Set();
|
|
28
|
+
for (const record of records) {
|
|
29
|
+
sessions.add(record.sessionId);
|
|
30
|
+
addTo(totals, record);
|
|
31
|
+
addGroup(byEvent, record.event, record);
|
|
32
|
+
addGroup(byTool, record.toolName, record);
|
|
33
|
+
addGroup(byModel, record.model, record);
|
|
34
|
+
}
|
|
35
|
+
const toolSinks = Object.entries(byTool).map(([key, bucket]) => ({ label: `tool:${key}`, ...bucket }));
|
|
36
|
+
const eventSinks = Object.entries(byEvent).map(([key, bucket]) => ({ label: `event:${key}`, ...bucket }));
|
|
37
|
+
const topSinks = [...toolSinks, ...eventSinks]
|
|
38
|
+
.sort((a, b) => b.totalTokens - a.totalTokens ||
|
|
39
|
+
Number(b.label.startsWith("tool:")) - Number(a.label.startsWith("tool:")) ||
|
|
40
|
+
a.label.localeCompare(b.label))
|
|
41
|
+
.slice(0, 10);
|
|
42
|
+
return {
|
|
43
|
+
root,
|
|
44
|
+
records: records.length,
|
|
45
|
+
sessions: [...sessions].sort(),
|
|
46
|
+
totals,
|
|
47
|
+
byEvent,
|
|
48
|
+
byTool,
|
|
49
|
+
byModel,
|
|
50
|
+
topSinks,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export function formatCostSummary(summary) {
|
|
54
|
+
const lines = [
|
|
55
|
+
`Cost ledger: ${summary.root}`,
|
|
56
|
+
`records: ${summary.records}`,
|
|
57
|
+
`sessions: ${summary.sessions.length ? summary.sessions.join(", ") : "(none)"}`,
|
|
58
|
+
`tokens: ${summary.totals.totalTokens} (in ${summary.totals.inTokens}, out ${summary.totals.outTokens})`,
|
|
59
|
+
];
|
|
60
|
+
if (summary.topSinks.length > 0) {
|
|
61
|
+
lines.push("top sinks:");
|
|
62
|
+
for (const sink of summary.topSinks.slice(0, 5)) {
|
|
63
|
+
lines.push(` ${sink.label}: ${sink.totalTokens} tokens (${sink.records} record${sink.records === 1 ? "" : "s"})`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return lines.join("\n");
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../../src/cost/summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function normalizeTokenInput(value: unknown): string;
|
|
2
|
+
/**
|
|
3
|
+
* Lightweight local token estimate. It is intentionally deterministic and
|
|
4
|
+
* dependency-free; USD reporting must label this as estimated unless a real
|
|
5
|
+
* provider usage source is added later.
|
|
6
|
+
*/
|
|
7
|
+
export declare function countTokens(value: unknown): number;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function normalizeTokenInput(value) {
|
|
2
|
+
if (value == null)
|
|
3
|
+
return "";
|
|
4
|
+
if (typeof value === "string")
|
|
5
|
+
return value;
|
|
6
|
+
try {
|
|
7
|
+
return JSON.stringify(value) ?? "";
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return String(value);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Lightweight local token estimate. It is intentionally deterministic and
|
|
15
|
+
* dependency-free; USD reporting must label this as estimated unless a real
|
|
16
|
+
* provider usage source is added later.
|
|
17
|
+
*/
|
|
18
|
+
export function countTokens(value) {
|
|
19
|
+
const text = normalizeTokenInput(value);
|
|
20
|
+
if (text.length === 0)
|
|
21
|
+
return 0;
|
|
22
|
+
return Math.ceil(text.length / 4);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=tokenize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../../src/cost/tokenize.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -15,7 +15,7 @@ export interface NotifyOptions {
|
|
|
15
15
|
/** Max total wait incl. retries. Default 10s. */
|
|
16
16
|
timeoutMs?: number;
|
|
17
17
|
}
|
|
18
|
-
export type NotifyErrorCode = "MISSING_TOKEN" | "MISSING_TARGET" | "BAD_TARGET" | "BAD_HOME_CHANNEL" | "OPEN_FAILED" | "POST_FAILED" | "RATE_LIMITED" | "TIMEOUT" | "NETWORK_ERROR";
|
|
18
|
+
export type NotifyErrorCode = "MISSING_TEXT" | "MISSING_TOKEN" | "MISSING_TARGET" | "BAD_TARGET" | "BAD_HOME_CHANNEL" | "OPEN_FAILED" | "POST_FAILED" | "RATE_LIMITED" | "TIMEOUT" | "NETWORK_ERROR";
|
|
19
19
|
export type NotifyResult = {
|
|
20
20
|
ok: true;
|
|
21
21
|
channel: string;
|
|
@@ -28,7 +28,7 @@ export async function notify(opts, deps = {}) {
|
|
|
28
28
|
const sleep = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
29
29
|
const text = (opts.text ?? "").toString();
|
|
30
30
|
if (!text.trim()) {
|
|
31
|
-
return { ok: false, code: "
|
|
31
|
+
return { ok: false, code: "MISSING_TEXT", reason: "text is empty" };
|
|
32
32
|
}
|
|
33
33
|
const token = (env.SLACK_BOT_TOKEN ?? "").trim();
|
|
34
34
|
if (!token) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/gateway/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAoB,MAAM,oBAAoB,CAAC;AAElF,MAAM,cAAc,GAAG,wCAAwC,CAAC;AAChE,MAAM,cAAc,GAAG,0CAA0C,CAAC;AAElE,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,YAAY,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/gateway/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAoB,MAAM,oBAAoB,CAAC;AAElF,MAAM,cAAc,GAAG,wCAAwC,CAAC;AAChE,MAAM,cAAc,GAAG,0CAA0C,CAAC;AAElE,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,YAAY,GAAG,CAAC,CAAC;AAgDvB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAmB,EACnB,OAAmB,EAAE;IAErB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEpF,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IACpF,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAmB,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/E,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EACJ,oGAAoG;aACvG,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,sBAAsB,IAAI,KAAK,MAAM,CAAC,KAAK,EAAE;aACtD,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,uEAAuE;IACvE,wEAAwE;IACxE,2EAA2E;IAC3E,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,aAAa,IAAI,CAAC,QAAQ,qDAAqD;SACxF,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,yEAAyE;IACzE,iCAAiC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC;IAErE,iEAAiE;IACjE,IAAI,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;IAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAC9B,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,WAAW;IACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IAClD,OAAO,MAAM,WAAW,CAAC;QACvB,KAAK;QACL,OAAO,EAAE,SAAS;QAClB,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,KAAK;QACL,QAAQ;QACR,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAWD,KAAK,UAAU,MAAM,CACnB,MAAc,EACd,IAAgB;IAEhB,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC;QACxB,GAAG,EAAE,cAAc;QACnB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;QACvB,GAAG,IAAI;KACR,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACpF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9D,CAAC;IACD,MAAM,OAAO,GAAI,CAAC,CAAC,OAAO,EAAE,OAAuC,EAAE,EAAE,CAAC;IACxE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC;IACjG,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AASD,KAAK,UAAU,WAAW,CAAC,IAAqB;IAC9C,MAAM,IAAI,GAA4B;QACpC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;IACF,IAAI,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;IAElD,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IACpB,MAAM,EAAE,GAAI,CAAC,CAAC,OAAO,EAAE,EAAyB,IAAI,EAAE,CAAC;IACvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC1E,CAAC;AAcD;;;;;GAKG;AACH,KAAK,UAAU,SAAS,CAAC,IAAc;IACrC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7C,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;QAC1E,CAAC;QAED,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,8DAA8D;YAC9D,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,iCAAiC;oBACjD,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;iBACtC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;aACzC,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACjF,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YACrD,CAAC;YACD,8CAA8C;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3F,IAAI,OAAO,GAAG,YAAY,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC3D,CAAC;QAED,uEAAuE;QACvE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC;YACzD,IAAI,OAAO,GAAG,YAAY,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,OAAO,GAAG,CAAC,aAAa,EAAE,CAAC;QAC5F,CAAC;QAED,eAAe;QACf,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3F,IAAI,OAAO,GAAG,YAAY,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,GAAG,CAAC,MAAM,UAAU,OAAO,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3G,CAAC;QAED,qEAAqE;QACrE,IAAI,OAAgC,CAAC;QACrC,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,GAAG,CAAC,MAAM,qBAAqB,EAAE,CAAC;QAC9F,CAAC;QACD,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAEtD,0EAA0E;QAC1E,uEAAuE;QACvE,0DAA0D;QAC1D,MAAM,QAAQ,GAAI,OAAmC,CAAC,KAAK,CAAC;QAC5D,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,0EAA0E;QAC1E,uEAAuE;QACvE,IAAI,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;AACzE,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,GAAY;IACrC,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,yBAAyB,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5E,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,sDAAsD,CAAC;IAChE,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,MAAM,CAAC,CAAS,EAAE,KAAa;IACtC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,EAAE,CAAC;QACV,6CAA6C;QAC7C,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IACD,sEAAsE;IACtE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,gCAAgC,EAAE,mBAAmB,CAAC,CAAC;IACzE,mEAAmE;IACnE,gFAAgF;IAChF,0EAA0E;IAC1E,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,0BAA0B,EAAE,YAAY,CAAC,CAAC;IAC5D,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC;IACxD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,oFAAoF;IACpF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -3,11 +3,12 @@ import { dirname, join } from "node:path";
|
|
|
3
3
|
import { ompRoot } from "./omp-root.js";
|
|
4
4
|
import { readRepoGoal } from "./goal.js";
|
|
5
5
|
import { noteIndex } from "./project-memory.js";
|
|
6
|
-
// Copilot CLI
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
6
|
+
// Copilot CLI can inject memory via the `sessionStart` hook's `additionalContext`
|
|
7
|
+
// (see hooks/hooks.json + scripts/session-start.mjs, ported to Copilot's hook
|
|
8
|
+
// schema). This copilot-instructions.md block remains the always-on fallback: it
|
|
9
|
+
// works even when hooks are disabled or in headless `copilot -p` (which skips
|
|
10
|
+
// hooks). The block keeps the repo goal visible but leaves project memory and
|
|
11
|
+
// daily logs on demand to avoid bloating or over-steering context.
|
|
11
12
|
const START = "<!-- omp:memory:start -->";
|
|
12
13
|
const END = "<!-- omp:memory:end -->";
|
|
13
14
|
function instructionsPath(cwd) {
|
|
@@ -19,7 +20,7 @@ function renderBlock(cwd) {
|
|
|
19
20
|
const lines = [START, "## oh-my-copilot project context"];
|
|
20
21
|
if (goal)
|
|
21
22
|
lines.push("", `**Repo goal:** ${goal}`);
|
|
22
|
-
lines.push("", "Project memory is available on demand:", "- `omp project-memory read` for project hints and the note index", "- `omp project-memory read <id>` for a specific note body", "- `omp daily-log read` for recent daily context", "", `Available note index: ${notes.length} note${notes.length === 1 ? "" : "s"}.`, END);
|
|
23
|
+
lines.push("", "Project memory is available on demand:", "- `omp project-memory read` for project hints and the note index", "- `omp project-memory read <id>` for a specific note body", "- `omp daily-log read --days 7` for recent daily context", "", `Available note index: ${notes.length} note${notes.length === 1 ? "" : "s"}.`, END);
|
|
23
24
|
return lines.join("\n");
|
|
24
25
|
}
|
|
25
26
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions-memory.js","sourceRoot":"","sources":["../../src/instructions-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,
|
|
1
|
+
{"version":3,"file":"instructions-memory.js","sourceRoot":"","sources":["../../src/instructions-memory.ts"],"names":[],"mappings":"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"}
|
package/dist/src/team/tmux.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface TmuxApi {
|
|
|
20
20
|
sessionExists(session: string): boolean;
|
|
21
21
|
listSessions(): string[];
|
|
22
22
|
}
|
|
23
|
-
export declare function makeTmux(runner?: TmuxRunner): TmuxApi;
|
|
23
|
+
export declare function makeTmux(runner?: TmuxRunner, env?: NodeJS.ProcessEnv): TmuxApi;
|
|
24
24
|
export interface WaitForReadyOptions {
|
|
25
25
|
/** Max time to wait in ms (default 60 000). */
|
|
26
26
|
timeoutMs?: number;
|
package/dist/src/team/tmux.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { copilotEnvPassthroughArgs } from "../copilot/env-passthrough.js";
|
|
2
3
|
export function tmuxExec(args) {
|
|
3
4
|
const r = spawnSync("tmux", args, { encoding: "utf8" });
|
|
4
5
|
return {
|
|
@@ -10,6 +11,8 @@ export function tmuxExec(args) {
|
|
|
10
11
|
const PROMPT_RE = /(?:^|\s)(?:[│┃║▌▐▏▕╎┆┊]\s*)?[›>❯$#%]\s*$/;
|
|
11
12
|
const ACTIVE_HINTS = [
|
|
12
13
|
/esc to interrupt/i,
|
|
14
|
+
/esc cancel/i, // Copilot CLI >=1.0.61 working indicator ("◉ Working esc cancel")
|
|
15
|
+
/[◉○◐◑]\s*working/i, // Copilot spinner + "Working"
|
|
13
16
|
/running\s*[…\.]/,
|
|
14
17
|
/background terminal/i,
|
|
15
18
|
/tool call in progress/i,
|
|
@@ -34,13 +37,17 @@ export function paneLooksReady(captured) {
|
|
|
34
37
|
export function paneHasActiveTask(captured) {
|
|
35
38
|
return ACTIVE_HINTS.some((re) => re.test(captured));
|
|
36
39
|
}
|
|
37
|
-
export function makeTmux(runner = tmuxExec) {
|
|
40
|
+
export function makeTmux(runner = tmuxExec, env = process.env) {
|
|
41
|
+
// Forward COPILOT_* (BYOK) vars into worker panes; a running tmux server
|
|
42
|
+
// otherwise seeds new panes from its own global env, so workers fall back to
|
|
43
|
+
// GitHub-hosted models instead of the launcher's BYOK provider.
|
|
44
|
+
const envArgs = copilotEnvPassthroughArgs(env);
|
|
38
45
|
return {
|
|
39
46
|
newSession(session, cwd) {
|
|
40
|
-
return runner(["new-session", "-d", "-P", "-F", "#S:0 #{pane_id}", "-s", session, "-c", cwd]);
|
|
47
|
+
return runner(["new-session", "-d", "-P", "-F", "#S:0 #{pane_id}", "-s", session, "-c", cwd, ...envArgs]);
|
|
41
48
|
},
|
|
42
49
|
splitWindow(target, cwd) {
|
|
43
|
-
return runner(["split-window", "-h", "-t", target, "-d", "-P", "-F", "#{pane_id}", "-c", cwd]);
|
|
50
|
+
return runner(["split-window", "-h", "-t", target, "-d", "-P", "-F", "#{pane_id}", "-c", cwd, ...envArgs]);
|
|
44
51
|
},
|
|
45
52
|
sendKeys(target, ...keys) {
|
|
46
53
|
return runner(["send-keys", "-t", target, ...keys]);
|
|
@@ -102,9 +109,10 @@ export async function waitForReady(api, target, options = {}) {
|
|
|
102
109
|
// Ready: the '/ commands' status bar means the CLI input prompt is active
|
|
103
110
|
if (CLI_READY_RE.test(captured))
|
|
104
111
|
return true;
|
|
105
|
-
// Auto-accept the folder trust dialog (send Enter = accept default)
|
|
112
|
+
// Auto-accept the folder trust dialog (send Enter = accept default).
|
|
113
|
+
// Use the `Enter` key name: Copilot CLI (>=1.0.61) ignores a literal `C-m`.
|
|
106
114
|
if (!acceptedTrust && TRUST_RE.test(captured)) {
|
|
107
|
-
api.sendKeys(target, "
|
|
115
|
+
api.sendKeys(target, "Enter");
|
|
108
116
|
acceptedTrust = true;
|
|
109
117
|
}
|
|
110
118
|
await sleep(poll);
|
|
@@ -112,23 +120,46 @@ export async function waitForReady(api, target, options = {}) {
|
|
|
112
120
|
}
|
|
113
121
|
return false;
|
|
114
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* True if `probe` still sits on the active input line (the last prompt-glyph
|
|
125
|
+
* line plus any wrapped continuation). Checks the input region only — not the
|
|
126
|
+
* whole scrollback — so the echo of an already-submitted message is not
|
|
127
|
+
* mistaken for a still-buffered prompt.
|
|
128
|
+
*/
|
|
129
|
+
function promptStillBuffered(pane, probe) {
|
|
130
|
+
const lines = pane.split(/\r?\n/);
|
|
131
|
+
let idx = -1;
|
|
132
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
133
|
+
if (lines[i].includes("❯")) {
|
|
134
|
+
idx = i;
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (idx === -1)
|
|
139
|
+
return false;
|
|
140
|
+
return lines.slice(idx).join("\n").includes(probe);
|
|
141
|
+
}
|
|
115
142
|
export async function sendToWorker(api, target, text, options = {}) {
|
|
116
143
|
const rounds = options.rounds ?? 6;
|
|
117
144
|
const delayMs = options.delayMs ?? 150;
|
|
118
145
|
const payload = text.length > 200 ? text.slice(0, 200) : text;
|
|
146
|
+
const probe = payload.slice(-Math.min(20, payload.length));
|
|
119
147
|
api.sendText(target, payload);
|
|
120
148
|
for (let i = 0; i < rounds; i++) {
|
|
121
|
-
|
|
149
|
+
// Use the `Enter` key name: Copilot CLI (>=1.0.61) ignores a literal `C-m`,
|
|
150
|
+
// leaving the prompt buffered and unsent.
|
|
151
|
+
api.sendKeys(target, "Enter");
|
|
122
152
|
await sleep(delayMs);
|
|
123
|
-
|
|
124
|
-
|
|
153
|
+
// Submitted once the prompt leaves the input line (the echo in scrollback
|
|
154
|
+
// does not count, so we never retype an already-sent message).
|
|
155
|
+
if (!promptStillBuffered(api.capturePane(target, 5).stdout, probe))
|
|
125
156
|
return true;
|
|
126
157
|
}
|
|
127
|
-
// adaptive fallback: kill-line
|
|
158
|
+
// adaptive fallback: kill-line, retype, submit once more
|
|
128
159
|
api.sendKeys(target, "C-u");
|
|
129
160
|
await sleep(delayMs);
|
|
130
161
|
api.sendText(target, payload);
|
|
131
|
-
api.sendKeys(target, "
|
|
162
|
+
api.sendKeys(target, "Enter");
|
|
132
163
|
return true;
|
|
133
164
|
}
|
|
134
165
|
//# sourceMappingURL=tmux.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../../src/team/tmux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../../src/team/tmux.ts"],"names":[],"mappings":"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"}
|
package/docs/general-skills.md
CHANGED
|
@@ -39,6 +39,7 @@ Rules:
|
|
|
39
39
|
- Keep each `SKILL.md` small: YAML frontmatter (`name`, `description`) plus focused Markdown instructions.
|
|
40
40
|
- Optional `references/`, `scripts/`, or `assets/` may live beside `SKILL.md` when a fetched skill needs progressive disclosure.
|
|
41
41
|
- Do not add runtime state to the lite skills.
|
|
42
|
+
- Do not duplicate global cost/token boilerplate in every skill. The plugin-level hooks and `.github/copilot-instructions.md` provide estimate-only cost visibility; add only concise reminders to genuinely high-cost skills.
|
|
42
43
|
|
|
43
44
|
## Fetched skills
|
|
44
45
|
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Design: Copilot-native hooks + `agentStop` loop driver
|
|
2
|
+
|
|
3
|
+
> Status: PLAN (no code yet). Scoped 2026-06-13. Separate from `fix/skill-cli-wiring`.
|
|
4
|
+
> Suggested branch: `feat/copilot-native-hooks`.
|
|
5
|
+
|
|
6
|
+
## Problem
|
|
7
|
+
|
|
8
|
+
omp ships lifecycle hooks (`hooks/hooks.json` + `scripts/*.mjs`) but **none fire in
|
|
9
|
+
Copilot CLI**. Earlier this was attributed to "Copilot doesn't run hooks." That is
|
|
10
|
+
no longer true — Copilot CLI supports hooks; omp's are simply in the **wrong
|
|
11
|
+
schema**, so Copilot loads the file and matches zero events.
|
|
12
|
+
|
|
13
|
+
### Evidence
|
|
14
|
+
- `node dist/src/cli.js` pane-state probe: omp's `ACTIVE_HINTS` miss Copilot 1.0.61's
|
|
15
|
+
real working indicator (`◉ Working esc cancel`) → busy-gate never fires (separate bug).
|
|
16
|
+
- `hooks/hooks.json` uses Claude Code schema: PascalCase events
|
|
17
|
+
(`SessionStart`, `UserPromptSubmit`, `PreToolUse`, `PostToolUse`, `SessionEnd`,
|
|
18
|
+
`Error`), `matcher`/`command`/`timeout` keys.
|
|
19
|
+
- Copilot expects camelCase events + `version:1` + `bash`/`timeoutSec` keys, and has
|
|
20
|
+
an event omp doesn't define: **`agentStop`**.
|
|
21
|
+
- Docs: https://docs.github.com/en/copilot/reference/hooks-configuration ,
|
|
22
|
+
https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/use-hooks
|
|
23
|
+
|
|
24
|
+
## Copilot hook facts (verified from docs)
|
|
25
|
+
|
|
26
|
+
Load order (all merged, all matching entries run): policy → repo `.github/hooks/*.json`
|
|
27
|
+
→ user `~/.copilot/hooks/*.json` → inline `.github/copilot/settings.json` (and
|
|
28
|
+
`.claude/settings.json` cross-tool) → user `~/.copilot/settings.json` → **plugin
|
|
29
|
+
`hooks.json` or `hooks/hooks.json` in the plugin install dir**. Cloud agents load
|
|
30
|
+
ONLY `.github/hooks/*.json`.
|
|
31
|
+
|
|
32
|
+
Events + interventional outputs:
|
|
33
|
+
| event | input (key fields) | output that matters |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `sessionStart` | `sessionId, cwd, source(startup\|resume\|new), initialPrompt?` | `additionalContext` (injected as user message) |
|
|
36
|
+
| `userPromptSubmitted` | prompt text | output ignored |
|
|
37
|
+
| `preToolUse` | tool name, args (`matcher` supported) | `permissionDecision` allow/deny/ask, `modifiedArgs`, `permissionDecisionReason` (fail-closed) |
|
|
38
|
+
| `postToolUse` | tool, args, result | `modifiedResult`, `additionalContext` |
|
|
39
|
+
| `postToolUseFailure` | tool, args, error | `additionalContext` |
|
|
40
|
+
| `errorOccurred` | error details | output ignored |
|
|
41
|
+
| `agentStop` | `sessionId, cwd, transcriptPath, stopReason:"end_turn"` | `{decision:"block"\|"allow", reason}` — `block` forces another turn, `reason` = next-turn prompt |
|
|
42
|
+
|
|
43
|
+
Hook I/O contract: input JSON on stdin, output JSON on stdout. Hook types:
|
|
44
|
+
`command` (bash/powershell), `http`, `prompt`.
|
|
45
|
+
|
|
46
|
+
## Design
|
|
47
|
+
|
|
48
|
+
### Slice 1 — Port the hook manifest to Copilot format
|
|
49
|
+
Rewrite `hooks/hooks.json` to:
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"version": 1,
|
|
53
|
+
"hooks": {
|
|
54
|
+
"sessionStart": [{ "type": "command", "bash": "node \"$OMP_PLUGIN_ROOT\"/scripts/session-start.mjs", "timeoutSec": 5 }],
|
|
55
|
+
"userPromptSubmitted": [{ "type": "command", "bash": "node \"$OMP_PLUGIN_ROOT\"/scripts/prompt-submit.mjs", "timeoutSec": 5 }],
|
|
56
|
+
"preToolUse": [{ "type": "command", "bash": "node \"$OMP_PLUGIN_ROOT\"/scripts/pre-tool-use.mjs", "timeoutSec": 5 }],
|
|
57
|
+
"postToolUse": [{ "type": "command", "bash": "node \"$OMP_PLUGIN_ROOT\"/scripts/post-tool-use.mjs", "timeoutSec": 5 }],
|
|
58
|
+
"errorOccurred": [{ "type": "command", "bash": "node \"$OMP_PLUGIN_ROOT\"/scripts/error.mjs", "timeoutSec": 5 }],
|
|
59
|
+
"sessionEnd": [{ "type": "command", "bash": "node \"$OMP_PLUGIN_ROOT\"/scripts/session-end.mjs", "timeoutSec": 5 }],
|
|
60
|
+
"agentStop": [{ "type": "command", "bash": "node \"$OMP_PLUGIN_ROOT\"/scripts/agent-stop.mjs", "timeoutSec": 10 }]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
Resolve `$OMP_PLUGIN_ROOT` (the plugin install dir). Keep `hooks/hooks.json` path
|
|
65
|
+
(it is a recognized plugin source). Verify event names load via a throwaway diagnostic.
|
|
66
|
+
|
|
67
|
+
### Slice 2 — Update script I/O contracts to Copilot schema
|
|
68
|
+
Each `scripts/*.mjs` must read Copilot's input JSON from stdin and emit Copilot's
|
|
69
|
+
output JSON to stdout (today they assume Claude shapes / print plain text):
|
|
70
|
+
- `session-start.mjs`: emit `{ "additionalContext": "<memory block>" }` — native
|
|
71
|
+
replacement for the copilot-instructions.md managed block (keep that as fallback).
|
|
72
|
+
- `pre-tool-use.mjs`: emit `{ "permissionDecision": "allow|deny|ask", ... }` only if
|
|
73
|
+
omp wants policy; otherwise no-op (REMEMBER: fail-closed — a crash denies the tool).
|
|
74
|
+
- `post-tool-use.mjs` / `error.mjs` / `session-end.mjs` / `prompt-submit.mjs`: adapt
|
|
75
|
+
fields; note `userPromptSubmitted`/`errorOccurred`/`sessionEnd` outputs are ignored.
|
|
76
|
+
|
|
77
|
+
### Slice 3 — `agentStop` loop driver (the OMC-style loop)
|
|
78
|
+
New `scripts/agent-stop.mjs`:
|
|
79
|
+
1. Read input `{ transcriptPath, cwd, ... }`.
|
|
80
|
+
2. Read loop state `.omp/state/{ralph|ultrawork|ultraqa}.json` (already exists). If no
|
|
81
|
+
loop is active → `{decision:"allow"}` (normal stop).
|
|
82
|
+
3. If active: tick the state machine (reuse `tickRalph`/equivalent) → check completion:
|
|
83
|
+
- completion sentinel present in transcript (e.g. `RALPH_DONE`) OR PRD/criteria met → `omp ralph cancel`, `{decision:"allow"}`.
|
|
84
|
+
- max iterations reached → `{decision:"allow"}` + note "stopped at cap".
|
|
85
|
+
- else → `{decision:"block", reason:"[RALPH ITERATION n/max] Not done. Continue. Output RALPH_DONE only when all acceptance criteria pass."}`.
|
|
86
|
+
4. This makes `/ralph`, `/ultrawork`, `/ultraqa` self-drive without pane-scraping.
|
|
87
|
+
|
|
88
|
+
This supersedes the current in-prompt loop wiring from `fix/skill-cli-wiring`
|
|
89
|
+
(those CLI calls remain valid as the state source the hook reads).
|
|
90
|
+
|
|
91
|
+
### Slice 4 — fix stale `ACTIVE_HINTS` (carry from audit)
|
|
92
|
+
Add Copilot 1.0.61 working markers (`Working esc cancel`, spinner glyphs `◉○◐◑`,
|
|
93
|
+
elapsed timer) so the `commsSend` busy-gate and any fallback pane-state work for
|
|
94
|
+
headless `copilot -p` (which skips hooks). Small; could also land on the fix branch.
|
|
95
|
+
|
|
96
|
+
### Slice 5 — `omp setup` writes/refreshes hooks
|
|
97
|
+
Ensure `omp setup` installs the Copilot-format hooks (plugin dir is automatic;
|
|
98
|
+
optionally also offer `~/.copilot/hooks/omp.json` for non-plugin installs). `omp doctor`
|
|
99
|
+
should check that the manifest parses as Copilot v1 and that `agentStop` is present.
|
|
100
|
+
|
|
101
|
+
## Verification plan
|
|
102
|
+
- Static: a diagnostic hook (absolute path, writes a file) fires on `sessionStart` and
|
|
103
|
+
`agentStop` in a real interactive session (the test the old memory used to prove they
|
|
104
|
+
DON'T fire — now expected to PASS).
|
|
105
|
+
- Unit: `agent-stop.mjs` decision logic (active+incomplete → block; complete → allow;
|
|
106
|
+
cap → allow) with a fake transcript + state file.
|
|
107
|
+
- **Live (post-quota, after Jul 1 or Pro):** run `/ralph` on a small task and confirm it
|
|
108
|
+
iterates via `agentStop` re-prompts until the sentinel, then stops. This is the only
|
|
109
|
+
part that needs model quota.
|
|
110
|
+
|
|
111
|
+
## Risks / open questions
|
|
112
|
+
- `$OMP_PLUGIN_ROOT` resolution inside the bash hook (env availability at hook runtime).
|
|
113
|
+
- `preToolUse` is fail-closed — a buggy omp pre-tool hook would block ALL tools; keep it
|
|
114
|
+
trivially safe or omit until needed.
|
|
115
|
+
- Double memory injection if both `sessionStart` additionalContext AND the
|
|
116
|
+
copilot-instructions.md block are active — pick one as primary, keep the other as fallback.
|
|
117
|
+
- Loop sentinel reliability: model must emit the exact completion token; needs a clear
|
|
118
|
+
contract in the ralph SKILL.md.
|
|
119
|
+
- Cloud agents only load `.github/hooks/` — plugin hooks won't apply there.
|