oh-my-githubcopilot 1.4.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/.claude-plugin/plugin.json +41 -0
- package/AGENTS.md +107 -0
- package/CHANGELOG.md +104 -0
- package/LICENSE +190 -0
- package/README.de.md +53 -0
- package/README.es.md +53 -0
- package/README.fr.md +53 -0
- package/README.it.md +53 -0
- package/README.ja.md +53 -0
- package/README.ko.md +53 -0
- package/README.md +139 -0
- package/README.pt.md +53 -0
- package/README.ru.md +53 -0
- package/README.tr.md +53 -0
- package/README.vi.md +53 -0
- package/README.zh.md +53 -0
- package/bin/omp.mjs +59 -0
- package/bin/omp.mjs.map +7 -0
- package/dist/hooks/delegation-enforcer.mjs +96 -0
- package/dist/hooks/delegation-enforcer.mjs.map +7 -0
- package/dist/hooks/hud-emitter.mjs +167 -0
- package/dist/hooks/hud-emitter.mjs.map +7 -0
- package/dist/hooks/keyword-detector.mjs +134 -0
- package/dist/hooks/keyword-detector.mjs.map +7 -0
- package/dist/hooks/model-router.mjs +79 -0
- package/dist/hooks/model-router.mjs.map +7 -0
- package/dist/hooks/stop-continuation.mjs +83 -0
- package/dist/hooks/stop-continuation.mjs.map +7 -0
- package/dist/hooks/token-tracker.mjs +181 -0
- package/dist/hooks/token-tracker.mjs.map +7 -0
- package/dist/mcp/server.mjs +28492 -0
- package/dist/mcp/server.mjs.map +7 -0
- package/dist/skills/mcp-setup.mjs +42 -0
- package/dist/skills/mcp-setup.mjs.map +7 -0
- package/dist/skills/setup.mjs +38 -0
- package/dist/skills/setup.mjs.map +7 -0
- package/hooks/hooks.json +47 -0
- package/package.json +70 -0
- package/skills/autopilot/SKILL.md +35 -0
- package/skills/configure-notifications/SKILL.md +35 -0
- package/skills/deep-interview/SKILL.md +35 -0
- package/skills/ecomode/SKILL.md +35 -0
- package/skills/graph-provider/SKILL.md +77 -0
- package/skills/graphify/SKILL.md +51 -0
- package/skills/graphwiki/SKILL.md +66 -0
- package/skills/hud/SKILL.md +35 -0
- package/skills/learner/SKILL.md +35 -0
- package/skills/mcp-setup/SKILL.md +34 -0
- package/skills/note/SKILL.md +35 -0
- package/skills/omp-plan/SKILL.md +35 -0
- package/skills/omp-setup/SKILL.md +37 -0
- package/skills/pipeline/SKILL.md +35 -0
- package/skills/psm/SKILL.md +35 -0
- package/skills/ralph/SKILL.md +35 -0
- package/skills/release/SKILL.md +35 -0
- package/skills/setup/SKILL.md +43 -0
- package/skills/spending/SKILL.md +86 -0
- package/skills/swarm/SKILL.md +35 -0
- package/skills/swe-bench/SKILL.md +35 -0
- package/skills/team/SKILL.md +35 -0
- package/skills/trace/SKILL.md +35 -0
- package/skills/ultrawork/SKILL.md +35 -0
- package/skills/wiki/SKILL.md +35 -0
- package/src/agents/analyst.md +103 -0
- package/src/agents/architect.md +169 -0
- package/src/agents/code-reviewer.md +135 -0
- package/src/agents/critic.md +196 -0
- package/src/agents/debugger.md +132 -0
- package/src/agents/designer.md +103 -0
- package/src/agents/document-specialist.md +111 -0
- package/src/agents/executor.md +120 -0
- package/src/agents/explorer.md +98 -0
- package/src/agents/git-master.md +92 -0
- package/src/agents/orchestrator.md +125 -0
- package/src/agents/planner.md +106 -0
- package/src/agents/qa-tester.md +129 -0
- package/src/agents/researcher.md +102 -0
- package/src/agents/reviewer.md +100 -0
- package/src/agents/scientist.md +150 -0
- package/src/agents/security-reviewer.md +132 -0
- package/src/agents/simplifier.md +109 -0
- package/src/agents/test-engineer.md +124 -0
- package/src/agents/tester.md +102 -0
- package/src/agents/tracer.md +160 -0
- package/src/agents/verifier.md +100 -0
- package/src/agents/writer.md +96 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// src/hooks/token-tracker.mts
|
|
2
|
+
import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, mkdirSync as mkdirSync2 } from "fs";
|
|
3
|
+
import { homedir as homedir2 } from "os";
|
|
4
|
+
import { join as join2 } from "path";
|
|
5
|
+
|
|
6
|
+
// src/spending/tracker.mts
|
|
7
|
+
import { readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
8
|
+
import { homedir } from "os";
|
|
9
|
+
import { join, dirname } from "path";
|
|
10
|
+
var SPENDING_PATH = join(homedir(), ".omp", "state", "spending-monthly.json");
|
|
11
|
+
function currentMonth() {
|
|
12
|
+
const now = /* @__PURE__ */ new Date();
|
|
13
|
+
return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}`;
|
|
14
|
+
}
|
|
15
|
+
function loadSpending(sessionId) {
|
|
16
|
+
let raw;
|
|
17
|
+
try {
|
|
18
|
+
raw = JSON.parse(readFileSync(SPENDING_PATH, "utf-8"));
|
|
19
|
+
} catch {
|
|
20
|
+
return {
|
|
21
|
+
version: 1,
|
|
22
|
+
sessionId,
|
|
23
|
+
sessionPremiumRequests: 0,
|
|
24
|
+
month: currentMonth(),
|
|
25
|
+
monthlyPremiumRequests: 0
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const month = currentMonth();
|
|
29
|
+
if (raw.month !== month) {
|
|
30
|
+
return {
|
|
31
|
+
version: 1,
|
|
32
|
+
sessionId,
|
|
33
|
+
sessionPremiumRequests: 0,
|
|
34
|
+
month,
|
|
35
|
+
monthlyPremiumRequests: 0
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (raw.sessionId !== sessionId) {
|
|
39
|
+
return {
|
|
40
|
+
version: 1,
|
|
41
|
+
sessionId,
|
|
42
|
+
sessionPremiumRequests: 0,
|
|
43
|
+
month,
|
|
44
|
+
monthlyPremiumRequests: raw.monthlyPremiumRequests
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return { ...raw, version: 1 };
|
|
48
|
+
}
|
|
49
|
+
function saveSpending(state) {
|
|
50
|
+
try {
|
|
51
|
+
mkdirSync(dirname(SPENDING_PATH), { recursive: true });
|
|
52
|
+
writeFileSync(SPENDING_PATH, JSON.stringify(state, null, 2), "utf-8");
|
|
53
|
+
} catch (e) {
|
|
54
|
+
console.warn(`[OMP] spending: failed to save state: ${e}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function incrementSpending(sessionId) {
|
|
58
|
+
const state = loadSpending(sessionId);
|
|
59
|
+
state.sessionPremiumRequests += 1;
|
|
60
|
+
state.monthlyPremiumRequests += 1;
|
|
61
|
+
saveSpending(state);
|
|
62
|
+
return state;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// src/hooks/token-tracker.mts
|
|
66
|
+
import { fileURLToPath } from "url";
|
|
67
|
+
var MODEL_CONTEXTS = {
|
|
68
|
+
"claude-sonnet-4.5": 2e5,
|
|
69
|
+
"claude-sonnet-4": 2e5,
|
|
70
|
+
"claude-sonnet-4.6": 2e5,
|
|
71
|
+
"claude-opus-4.6": 2e5,
|
|
72
|
+
"gpt-5": 128e3,
|
|
73
|
+
"gpt-5.4-mini": 128e3,
|
|
74
|
+
"gemini-3-pro": 128e3,
|
|
75
|
+
default: 2e5
|
|
76
|
+
};
|
|
77
|
+
var WARNING_THRESHOLDS = [60, 80, 90];
|
|
78
|
+
function estimateTokens(input) {
|
|
79
|
+
if (!input) return 0;
|
|
80
|
+
try {
|
|
81
|
+
const str = typeof input === "string" ? input : JSON.stringify(input);
|
|
82
|
+
return Math.ceil(str.length / 4);
|
|
83
|
+
} catch {
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function getStatePath(sessionId) {
|
|
88
|
+
const base = join2(homedir2(), ".omp", "state");
|
|
89
|
+
if (sessionId) {
|
|
90
|
+
return join2(base, "sessions", sessionId, "session.json");
|
|
91
|
+
}
|
|
92
|
+
return join2(base, "session.json");
|
|
93
|
+
}
|
|
94
|
+
function ensureDir(path) {
|
|
95
|
+
mkdirSync2(path.substring(0, path.lastIndexOf("/")), { recursive: true });
|
|
96
|
+
}
|
|
97
|
+
function processHook(input) {
|
|
98
|
+
const start = Date.now();
|
|
99
|
+
const log = [];
|
|
100
|
+
try {
|
|
101
|
+
if (input.hook_type !== "PostToolUse") {
|
|
102
|
+
return {
|
|
103
|
+
status: "skip",
|
|
104
|
+
latencyMs: Date.now() - start,
|
|
105
|
+
mutations: [],
|
|
106
|
+
log: []
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const statePath = getStatePath(input.session_id);
|
|
110
|
+
let state;
|
|
111
|
+
try {
|
|
112
|
+
state = JSON.parse(readFileSync2(statePath, "utf-8"));
|
|
113
|
+
} catch {
|
|
114
|
+
state = {
|
|
115
|
+
tokens_estimated: 0,
|
|
116
|
+
token_budget: 2e5,
|
|
117
|
+
context_pct: 0,
|
|
118
|
+
warnings_issued: /* @__PURE__ */ new Set()
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const inputTokens = estimateTokens(input.tool_input);
|
|
122
|
+
const outputTokens = estimateTokens(input.tool_output);
|
|
123
|
+
const delta = inputTokens + outputTokens;
|
|
124
|
+
state.tokens_estimated += delta;
|
|
125
|
+
state.context_pct = Math.min(100, Math.round(state.tokens_estimated / state.token_budget * 100));
|
|
126
|
+
const mutations = [
|
|
127
|
+
{ type: "set_token_budget", budget: state.token_budget }
|
|
128
|
+
];
|
|
129
|
+
for (const threshold of WARNING_THRESHOLDS) {
|
|
130
|
+
const key = `warn_${threshold}`;
|
|
131
|
+
if (state.context_pct >= threshold && !state.warnings_issued.has(key)) {
|
|
132
|
+
state.warnings_issued.add(key);
|
|
133
|
+
const message = threshold >= 90 ? `CRITICAL: Context at ${state.context_pct}%. Tokens near budget limit.` : threshold >= 80 ? `WARNING: Context at ${state.context_pct}%. Consider enabling ecomode.` : `INFO: Context at ${state.context_pct}%.`;
|
|
134
|
+
mutations.push({ type: "log", level: threshold >= 80 ? "warn" : "info", message });
|
|
135
|
+
log.push(message);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
ensureDir(statePath);
|
|
140
|
+
writeFileSync2(statePath, JSON.stringify(state), "utf-8");
|
|
141
|
+
} catch (e) {
|
|
142
|
+
log.push(`Failed to write state: ${e}`);
|
|
143
|
+
}
|
|
144
|
+
const sessionId = input.session_id ?? `omp-${Date.now()}`;
|
|
145
|
+
try {
|
|
146
|
+
incrementSpending(sessionId);
|
|
147
|
+
} catch {
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
status: "ok",
|
|
151
|
+
latencyMs: Date.now() - start,
|
|
152
|
+
mutations,
|
|
153
|
+
log
|
|
154
|
+
};
|
|
155
|
+
} catch (err) {
|
|
156
|
+
return {
|
|
157
|
+
status: "error",
|
|
158
|
+
latencyMs: Date.now() - start,
|
|
159
|
+
mutations: [],
|
|
160
|
+
log: [`Error: ${err}`]
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
165
|
+
const input = JSON.parse(await readStdin());
|
|
166
|
+
const output = processHook(input);
|
|
167
|
+
console.log(JSON.stringify(output));
|
|
168
|
+
}
|
|
169
|
+
async function readStdin() {
|
|
170
|
+
const chunks = [];
|
|
171
|
+
for await (const chunk of process.stdin) {
|
|
172
|
+
chunks.push(chunk);
|
|
173
|
+
}
|
|
174
|
+
return chunks.join("");
|
|
175
|
+
}
|
|
176
|
+
export {
|
|
177
|
+
MODEL_CONTEXTS,
|
|
178
|
+
estimateTokens,
|
|
179
|
+
processHook
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=token-tracker.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/hooks/token-tracker.mts", "../../src/spending/tracker.mts"],
|
|
4
|
+
"sourcesContent": ["/**\n * token-tracker hook\n * Trigger: post-message (PostToolUse equivalent)\n * Priority: 70\n *\n * Estimates token usage from character counts (1 token \u2248 4 chars).\n * Accumulates in session state. Warns at 60%, 80%, 90% thresholds.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { incrementSpending } from \"../spending/tracker.mjs\";\n\nexport interface HookInput {\n hook_type: \"PostToolUse\";\n tool_name?: string;\n tool_input?: unknown;\n tool_output?: unknown;\n session_id?: string;\n}\n\nexport interface HookOutput {\n modifiedResult?: unknown;\n status: \"ok\" | \"skip\" | \"error\";\n latencyMs: number;\n mutations: Array<{ type: \"set_token_budget\"; budget: number } | { type: \"emit_hud\"; hudEmit: unknown } | { type: \"log\"; level: \"info\" | \"warn\" | \"error\"; message: string }>;\n log: string[];\n}\n\ninterface SessionState {\n tokens_estimated: number;\n token_budget: number;\n context_pct: number;\n warnings_issued: Set<string>;\n}\n\n// Model context windows in tokens (for future model-specific budget lookup)\n// Exported for potential external use\nexport const MODEL_CONTEXTS = {\n \"claude-sonnet-4.5\": 200_000,\n \"claude-sonnet-4\": 200_000,\n \"claude-sonnet-4.6\": 200_000,\n \"claude-opus-4.6\": 200_000,\n \"gpt-5\": 128_000,\n \"gpt-5.4-mini\": 128_000,\n \"gemini-3-pro\": 128_000,\n default: 200_000,\n};\n\nconst WARNING_THRESHOLDS = [60, 80, 90];\n\nexport function estimateTokens(input: unknown): number {\n if (!input) return 0;\n try {\n const str = typeof input === \"string\" ? input : JSON.stringify(input);\n return Math.ceil(str.length / 4);\n } catch {\n return 0;\n }\n}\n\nfunction getStatePath(sessionId?: string): string {\n const base = join(homedir(), \".omp\", \"state\");\n if (sessionId) {\n return join(base, \"sessions\", sessionId, \"session.json\");\n }\n return join(base, \"session.json\");\n}\n\nfunction ensureDir(path: string): void {\n mkdirSync(path.substring(0, path.lastIndexOf(\"/\")), { recursive: true });\n}\n\nexport function processHook(input: HookInput): HookOutput {\n const start = Date.now();\n const log: string[] = [];\n\n try {\n if (input.hook_type !== \"PostToolUse\") {\n return {\n status: \"skip\",\n latencyMs: Date.now() - start,\n mutations: [],\n log: [],\n };\n }\n\n const statePath = getStatePath(input.session_id);\n let state: SessionState;\n\n try {\n state = JSON.parse(readFileSync(statePath, \"utf-8\"));\n } catch {\n // Initialize state if not found\n state = {\n tokens_estimated: 0,\n token_budget: 200_000,\n context_pct: 0,\n warnings_issued: new Set(),\n };\n }\n\n const inputTokens = estimateTokens(input.tool_input);\n const outputTokens = estimateTokens(input.tool_output);\n const delta = inputTokens + outputTokens;\n\n state.tokens_estimated += delta;\n state.context_pct = Math.min(100, Math.round((state.tokens_estimated / state.token_budget) * 100));\n\n const mutations: HookOutput[\"mutations\"] = [\n { type: \"set_token_budget\", budget: state.token_budget },\n ];\n\n // Check warning thresholds\n for (const threshold of WARNING_THRESHOLDS) {\n const key = `warn_${threshold}`;\n if (state.context_pct >= threshold && !state.warnings_issued.has(key)) {\n state.warnings_issued.add(key);\n const message =\n threshold >= 90\n ? `CRITICAL: Context at ${state.context_pct}%. Tokens near budget limit.`\n : threshold >= 80\n ? `WARNING: Context at ${state.context_pct}%. Consider enabling ecomode.`\n : `INFO: Context at ${state.context_pct}%.`;\n mutations.push({ type: \"log\", level: threshold >= 80 ? \"warn\" : \"info\", message });\n log.push(message);\n }\n }\n\n // Write state back\n try {\n ensureDir(statePath);\n writeFileSync(statePath, JSON.stringify(state), \"utf-8\");\n } catch (e) {\n log.push(`Failed to write state: ${e}`);\n }\n\n // Track premium request spending\n const sessionId = input.session_id ?? `omp-${Date.now()}`;\n try { incrementSpending(sessionId); } catch { /* non-blocking */ }\n\n return {\n status: \"ok\",\n latencyMs: Date.now() - start,\n mutations,\n log,\n };\n } catch (err) {\n return {\n status: \"error\",\n latencyMs: Date.now() - start,\n mutations: [],\n log: [`Error: ${err}`],\n };\n }\n}\n\n// Main entry point \u2014 only runs when executed directly (not imported)\nimport { fileURLToPath } from \"url\";\n\nif (process.argv[1] === fileURLToPath(import.meta.url)) {\n const input: HookInput = JSON.parse(await readStdin());\n const output = processHook(input);\n console.log(JSON.stringify(output));\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: string[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n return chunks.join(\"\");\n}\n", "/**\n * Spending tracker for OMP.\n * Tracks premium API requests per session and per calendar month.\n * Persists to ~/.omp/state/spending-monthly.json\n *\n * // v1.1 known limitation: no /omp:spending reset command. To reset monthly counter manually: rm ~/.omp/state/spending-monthly.json\n */\n\nimport { readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join, dirname } from \"path\";\nimport type { SpendingState } from \"./types.mjs\";\n\nconst SPENDING_PATH = join(homedir(), \".omp\", \"state\", \"spending-monthly.json\");\n\nfunction currentMonth(): string {\n const now = new Date();\n return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}`;\n}\n\nexport function loadSpending(sessionId: string): SpendingState {\n let raw: SpendingState;\n try {\n raw = JSON.parse(readFileSync(SPENDING_PATH, \"utf-8\")) as SpendingState;\n } catch {\n // Missing or malformed file \u2014 start fresh\n return {\n version: 1,\n sessionId,\n sessionPremiumRequests: 0,\n month: currentMonth(),\n monthlyPremiumRequests: 0,\n };\n }\n\n const month = currentMonth();\n\n // Reset monthly counter when month rolls over\n if (raw.month !== month) {\n return {\n version: 1,\n sessionId,\n sessionPremiumRequests: 0,\n month,\n monthlyPremiumRequests: 0,\n };\n }\n\n // Reset session counter when session changes\n if (raw.sessionId !== sessionId) {\n return {\n version: 1,\n sessionId,\n sessionPremiumRequests: 0,\n month,\n monthlyPremiumRequests: raw.monthlyPremiumRequests,\n };\n }\n\n return { ...raw, version: 1 };\n}\n\nexport function saveSpending(state: SpendingState): void {\n try {\n mkdirSync(dirname(SPENDING_PATH), { recursive: true });\n writeFileSync(SPENDING_PATH, JSON.stringify(state, null, 2), \"utf-8\");\n } catch (e) {\n console.warn(`[OMP] spending: failed to save state: ${e}`);\n }\n}\n\nexport function incrementSpending(sessionId: string): SpendingState {\n const state = loadSpending(sessionId);\n state.sessionPremiumRequests += 1;\n state.monthlyPremiumRequests += 1;\n saveSpending(state);\n return state;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["readFileSync", "writeFileSync", "mkdirSync", "homedir", "join", "join", "homedir", "mkdirSync", "readFileSync", "writeFileSync"]
|
|
7
|
+
}
|