oh-my-claude-sisyphus 3.5.7 → 3.6.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/agents/executor-high.md +2 -0
- package/agents/executor-low.md +2 -0
- package/agents/executor.md +2 -0
- package/agents/templates/base-agent.md +9 -0
- package/commands/cancel.md +8 -8
- package/commands/swarm.md +350 -148
- package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts +7 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts.map +1 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.js +374 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.js.map +1 -0
- package/dist/__tests__/hooks/learner/bridge.test.d.ts +11 -0
- package/dist/__tests__/hooks/learner/bridge.test.d.ts.map +1 -0
- package/dist/__tests__/hooks/learner/bridge.test.js +199 -0
- package/dist/__tests__/hooks/learner/bridge.test.js.map +1 -0
- package/dist/__tests__/hooks.test.js +10 -9
- package/dist/__tests__/hooks.test.js.map +1 -1
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/agents/codex-agents.d.ts +20 -0
- package/dist/agents/codex-agents.d.ts.map +1 -0
- package/dist/agents/codex-agents.js +36 -0
- package/dist/agents/codex-agents.js.map +1 -0
- package/dist/agents/preamble.d.ts +14 -0
- package/dist/agents/preamble.d.ts.map +1 -0
- package/dist/agents/preamble.js +26 -0
- package/dist/agents/preamble.js.map +1 -0
- package/dist/hooks/autopilot/__tests__/cancel.test.js +14 -4
- package/dist/hooks/autopilot/__tests__/cancel.test.js.map +1 -1
- package/dist/hooks/autopilot/__tests__/state.test.js +1 -0
- package/dist/hooks/autopilot/__tests__/state.test.js.map +1 -1
- package/dist/hooks/autopilot/__tests__/summary.test.js +38 -3
- package/dist/hooks/autopilot/__tests__/summary.test.js.map +1 -1
- package/dist/hooks/autopilot/state.d.ts +1 -1
- package/dist/hooks/autopilot/state.d.ts.map +1 -1
- package/dist/hooks/autopilot/state.js +15 -8
- package/dist/hooks/autopilot/state.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +7 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/learner/bridge.d.ts +71 -0
- package/dist/hooks/learner/bridge.d.ts.map +1 -0
- package/dist/hooks/learner/bridge.js +426 -0
- package/dist/hooks/learner/bridge.js.map +1 -0
- package/dist/hooks/mode-registry/index.d.ts +135 -0
- package/dist/hooks/mode-registry/index.d.ts.map +1 -0
- package/dist/hooks/mode-registry/index.js +445 -0
- package/dist/hooks/mode-registry/index.js.map +1 -0
- package/dist/hooks/mode-registry/types.d.ts +31 -0
- package/dist/hooks/mode-registry/types.d.ts.map +1 -0
- package/dist/hooks/mode-registry/types.js +7 -0
- package/dist/hooks/mode-registry/types.js.map +1 -0
- package/dist/hooks/ralph/loop.js +6 -6
- package/dist/hooks/ralph/loop.js.map +1 -1
- package/dist/hooks/skill-bridge.cjs +349 -0
- package/dist/hooks/swarm/__tests__/claiming.test.d.ts +2 -0
- package/dist/hooks/swarm/__tests__/claiming.test.d.ts.map +1 -0
- package/dist/hooks/swarm/__tests__/claiming.test.js +170 -0
- package/dist/hooks/swarm/__tests__/claiming.test.js.map +1 -0
- package/dist/hooks/swarm/__tests__/index.test.d.ts +2 -0
- package/dist/hooks/swarm/__tests__/index.test.d.ts.map +1 -0
- package/dist/hooks/swarm/__tests__/index.test.js +157 -0
- package/dist/hooks/swarm/__tests__/index.test.js.map +1 -0
- package/dist/hooks/swarm/__tests__/mode-registry.test.d.ts +2 -0
- package/dist/hooks/swarm/__tests__/mode-registry.test.d.ts.map +1 -0
- package/dist/hooks/swarm/__tests__/mode-registry.test.js +177 -0
- package/dist/hooks/swarm/__tests__/mode-registry.test.js.map +1 -0
- package/dist/hooks/swarm/claiming.d.ts +101 -0
- package/dist/hooks/swarm/claiming.d.ts.map +1 -0
- package/dist/hooks/swarm/claiming.js +460 -0
- package/dist/hooks/swarm/claiming.js.map +1 -0
- package/dist/hooks/swarm/index.d.ts +221 -0
- package/dist/hooks/swarm/index.d.ts.map +1 -0
- package/dist/hooks/swarm/index.js +413 -0
- package/dist/hooks/swarm/index.js.map +1 -0
- package/dist/hooks/swarm/state.d.ts +94 -0
- package/dist/hooks/swarm/state.d.ts.map +1 -0
- package/dist/hooks/swarm/state.js +530 -0
- package/dist/hooks/swarm/state.js.map +1 -0
- package/dist/hooks/swarm/types.d.ts +116 -0
- package/dist/hooks/swarm/types.d.ts.map +1 -0
- package/dist/hooks/swarm/types.js +22 -0
- package/dist/hooks/swarm/types.js.map +1 -0
- package/dist/hooks/ultrapilot/decomposer.d.ts +141 -0
- package/dist/hooks/ultrapilot/decomposer.d.ts.map +1 -0
- package/dist/hooks/ultrapilot/decomposer.js +377 -0
- package/dist/hooks/ultrapilot/decomposer.js.map +1 -0
- package/dist/hooks/ultrapilot/index.d.ts +31 -0
- package/dist/hooks/ultrapilot/index.d.ts.map +1 -1
- package/dist/hooks/ultrapilot/index.js +43 -2
- package/dist/hooks/ultrapilot/index.js.map +1 -1
- package/dist/hooks/ultrapilot/state.d.ts +1 -1
- package/dist/hooks/ultrapilot/state.d.ts.map +1 -1
- package/dist/hooks/ultrapilot/state.js +7 -0
- package/dist/hooks/ultrapilot/state.js.map +1 -1
- package/dist/hooks/ultraqa/index.js +5 -5
- package/dist/hooks/ultraqa/index.js.map +1 -1
- package/dist/hooks/ultrawork/index.js +3 -3
- package/dist/hooks/ultrawork/index.js.map +1 -1
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.js +1 -1
- package/package.json +6 -2
- package/scripts/build-skill-bridge.mjs +32 -0
- package/scripts/skill-injector.mjs +77 -26
- package/skills/autopilot/SKILL.md +18 -0
- package/skills/cancel/SKILL.md +166 -141
- package/skills/ecomode/SKILL.md +14 -0
- package/skills/pipeline/SKILL.md +13 -0
- package/skills/ralph/SKILL.md +22 -1
- package/skills/swarm/SKILL.md +521 -197
- package/skills/ultrapilot/SKILL.md +82 -13
- package/skills/ultraqa/SKILL.md +13 -0
- package/skills/ultrawork/SKILL.md +14 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Bridge Module
|
|
3
|
+
*
|
|
4
|
+
* Exports a focused API for skill-injector.mjs to use via esbuild bundle.
|
|
5
|
+
* This module bridges the TypeScript learner infrastructure with the standalone hook script.
|
|
6
|
+
*
|
|
7
|
+
* Bundled to: dist/hooks/skill-bridge.cjs
|
|
8
|
+
* Usage: const bridge = require('../dist/hooks/skill-bridge.cjs');
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, realpathSync } from 'fs';
|
|
11
|
+
import { join, dirname, basename } from 'path';
|
|
12
|
+
import { homedir } from 'os';
|
|
13
|
+
// Re-export constants
|
|
14
|
+
export const USER_SKILLS_DIR = join(homedir(), '.claude', 'skills', 'omc-learned');
|
|
15
|
+
export const PROJECT_SKILLS_SUBDIR = '.omc/skills';
|
|
16
|
+
export const SKILL_EXTENSION = '.md';
|
|
17
|
+
/** Session TTL: 1 hour */
|
|
18
|
+
const SESSION_TTL_MS = 60 * 60 * 1000;
|
|
19
|
+
/** State file path */
|
|
20
|
+
const STATE_FILE = '.omc/state/skill-sessions.json';
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Session Cache (File-Based)
|
|
23
|
+
// =============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* Get state file path for a project.
|
|
26
|
+
*/
|
|
27
|
+
function getStateFilePath(projectRoot) {
|
|
28
|
+
return join(projectRoot, STATE_FILE);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Read session state from file.
|
|
32
|
+
*/
|
|
33
|
+
function readSessionState(projectRoot) {
|
|
34
|
+
const stateFile = getStateFilePath(projectRoot);
|
|
35
|
+
try {
|
|
36
|
+
if (existsSync(stateFile)) {
|
|
37
|
+
const content = readFileSync(stateFile, 'utf-8');
|
|
38
|
+
return JSON.parse(content);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Ignore read/parse errors
|
|
43
|
+
}
|
|
44
|
+
return { sessions: {} };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Write session state to file.
|
|
48
|
+
*/
|
|
49
|
+
function writeSessionState(projectRoot, state) {
|
|
50
|
+
const stateFile = getStateFilePath(projectRoot);
|
|
51
|
+
try {
|
|
52
|
+
mkdirSync(dirname(stateFile), { recursive: true });
|
|
53
|
+
writeFileSync(stateFile, JSON.stringify(state, null, 2), 'utf-8');
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Ignore write errors (non-critical)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get paths of skills already injected in this session.
|
|
61
|
+
*/
|
|
62
|
+
export function getInjectedSkillPaths(sessionId, projectRoot) {
|
|
63
|
+
const state = readSessionState(projectRoot);
|
|
64
|
+
const session = state.sessions[sessionId];
|
|
65
|
+
if (!session)
|
|
66
|
+
return [];
|
|
67
|
+
// Check TTL
|
|
68
|
+
if (Date.now() - session.timestamp > SESSION_TTL_MS) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
return session.injectedPaths;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Mark skills as injected for this session.
|
|
75
|
+
*/
|
|
76
|
+
export function markSkillsInjected(sessionId, paths, projectRoot) {
|
|
77
|
+
const state = readSessionState(projectRoot);
|
|
78
|
+
const now = Date.now();
|
|
79
|
+
// Prune expired sessions
|
|
80
|
+
for (const [id, session] of Object.entries(state.sessions)) {
|
|
81
|
+
if (now - session.timestamp > SESSION_TTL_MS) {
|
|
82
|
+
delete state.sessions[id];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Get existing paths for this session
|
|
86
|
+
const existing = state.sessions[sessionId]?.injectedPaths ?? [];
|
|
87
|
+
// Merge with new paths (dedupe)
|
|
88
|
+
state.sessions[sessionId] = {
|
|
89
|
+
injectedPaths: [...new Set([...existing, ...paths])],
|
|
90
|
+
timestamp: now,
|
|
91
|
+
};
|
|
92
|
+
writeSessionState(projectRoot, state);
|
|
93
|
+
}
|
|
94
|
+
// =============================================================================
|
|
95
|
+
// File Discovery (Recursive)
|
|
96
|
+
// =============================================================================
|
|
97
|
+
/**
|
|
98
|
+
* Recursively find all skill files in a directory.
|
|
99
|
+
*/
|
|
100
|
+
function findSkillFilesRecursive(dir, results) {
|
|
101
|
+
if (!existsSync(dir))
|
|
102
|
+
return;
|
|
103
|
+
try {
|
|
104
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
105
|
+
for (const entry of entries) {
|
|
106
|
+
const fullPath = join(dir, entry.name);
|
|
107
|
+
if (entry.isDirectory()) {
|
|
108
|
+
findSkillFilesRecursive(fullPath, results);
|
|
109
|
+
}
|
|
110
|
+
else if (entry.isFile() && entry.name.endsWith(SKILL_EXTENSION)) {
|
|
111
|
+
results.push(fullPath);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Permission denied or other errors - silently skip
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Resolve symlinks safely with fallback.
|
|
121
|
+
*/
|
|
122
|
+
function safeRealpathSync(filePath) {
|
|
123
|
+
try {
|
|
124
|
+
return realpathSync(filePath);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return filePath;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Find all skill files for a given project.
|
|
132
|
+
* Returns project skills first (higher priority), then user skills.
|
|
133
|
+
* Now supports RECURSIVE discovery (subdirectories included).
|
|
134
|
+
*/
|
|
135
|
+
export function findSkillFiles(projectRoot) {
|
|
136
|
+
const candidates = [];
|
|
137
|
+
const seenRealPaths = new Set();
|
|
138
|
+
// 1. Search project-level skills (higher priority)
|
|
139
|
+
const projectSkillsDir = join(projectRoot, PROJECT_SKILLS_SUBDIR);
|
|
140
|
+
const projectFiles = [];
|
|
141
|
+
findSkillFilesRecursive(projectSkillsDir, projectFiles);
|
|
142
|
+
for (const filePath of projectFiles) {
|
|
143
|
+
const realPath = safeRealpathSync(filePath);
|
|
144
|
+
if (seenRealPaths.has(realPath))
|
|
145
|
+
continue;
|
|
146
|
+
seenRealPaths.add(realPath);
|
|
147
|
+
candidates.push({
|
|
148
|
+
path: filePath,
|
|
149
|
+
realPath,
|
|
150
|
+
scope: 'project',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// 2. Search user-level skills (lower priority)
|
|
154
|
+
const userFiles = [];
|
|
155
|
+
findSkillFilesRecursive(USER_SKILLS_DIR, userFiles);
|
|
156
|
+
for (const filePath of userFiles) {
|
|
157
|
+
const realPath = safeRealpathSync(filePath);
|
|
158
|
+
if (seenRealPaths.has(realPath))
|
|
159
|
+
continue;
|
|
160
|
+
seenRealPaths.add(realPath);
|
|
161
|
+
candidates.push({
|
|
162
|
+
path: filePath,
|
|
163
|
+
realPath,
|
|
164
|
+
scope: 'user',
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return candidates;
|
|
168
|
+
}
|
|
169
|
+
// =============================================================================
|
|
170
|
+
// Parsing
|
|
171
|
+
// =============================================================================
|
|
172
|
+
/**
|
|
173
|
+
* Parse YAML frontmatter and content from a skill file.
|
|
174
|
+
*/
|
|
175
|
+
export function parseSkillFile(content) {
|
|
176
|
+
const frontmatterRegex = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
|
|
177
|
+
const match = content.match(frontmatterRegex);
|
|
178
|
+
if (!match) {
|
|
179
|
+
// No frontmatter - still valid, use filename as name
|
|
180
|
+
return {
|
|
181
|
+
metadata: {},
|
|
182
|
+
content: content.trim(),
|
|
183
|
+
valid: true,
|
|
184
|
+
errors: [],
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const yamlContent = match[1];
|
|
188
|
+
const body = match[2].trim();
|
|
189
|
+
const errors = [];
|
|
190
|
+
try {
|
|
191
|
+
const metadata = parseYamlMetadata(yamlContent);
|
|
192
|
+
return {
|
|
193
|
+
metadata,
|
|
194
|
+
content: body,
|
|
195
|
+
valid: true,
|
|
196
|
+
errors,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
return {
|
|
201
|
+
metadata: {},
|
|
202
|
+
content: body,
|
|
203
|
+
valid: false,
|
|
204
|
+
errors: [`YAML parse error: ${e}`],
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Simple YAML parser for skill frontmatter.
|
|
210
|
+
* Handles: id, name, description, triggers, tags, matching, model, agent
|
|
211
|
+
*/
|
|
212
|
+
function parseYamlMetadata(yamlContent) {
|
|
213
|
+
const lines = yamlContent.split('\n');
|
|
214
|
+
const metadata = {};
|
|
215
|
+
let i = 0;
|
|
216
|
+
while (i < lines.length) {
|
|
217
|
+
const line = lines[i];
|
|
218
|
+
const colonIndex = line.indexOf(':');
|
|
219
|
+
if (colonIndex === -1) {
|
|
220
|
+
i++;
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
const key = line.slice(0, colonIndex).trim();
|
|
224
|
+
const rawValue = line.slice(colonIndex + 1).trim();
|
|
225
|
+
switch (key) {
|
|
226
|
+
case 'id':
|
|
227
|
+
metadata.id = parseStringValue(rawValue);
|
|
228
|
+
break;
|
|
229
|
+
case 'name':
|
|
230
|
+
metadata.name = parseStringValue(rawValue);
|
|
231
|
+
break;
|
|
232
|
+
case 'description':
|
|
233
|
+
metadata.description = parseStringValue(rawValue);
|
|
234
|
+
break;
|
|
235
|
+
case 'model':
|
|
236
|
+
metadata.model = parseStringValue(rawValue);
|
|
237
|
+
break;
|
|
238
|
+
case 'agent':
|
|
239
|
+
metadata.agent = parseStringValue(rawValue);
|
|
240
|
+
break;
|
|
241
|
+
case 'matching':
|
|
242
|
+
metadata.matching = parseStringValue(rawValue);
|
|
243
|
+
break;
|
|
244
|
+
case 'triggers':
|
|
245
|
+
case 'tags': {
|
|
246
|
+
const { value, consumed } = parseArrayValue(rawValue, lines, i);
|
|
247
|
+
if (key === 'triggers') {
|
|
248
|
+
metadata.triggers = Array.isArray(value) ? value : (value ? [value] : []);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
metadata.tags = Array.isArray(value) ? value : (value ? [value] : []);
|
|
252
|
+
}
|
|
253
|
+
i += consumed - 1;
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
i++;
|
|
258
|
+
}
|
|
259
|
+
return metadata;
|
|
260
|
+
}
|
|
261
|
+
function parseStringValue(value) {
|
|
262
|
+
if (!value)
|
|
263
|
+
return '';
|
|
264
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
265
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
266
|
+
return value.slice(1, -1);
|
|
267
|
+
}
|
|
268
|
+
return value;
|
|
269
|
+
}
|
|
270
|
+
function parseArrayValue(rawValue, lines, currentIndex) {
|
|
271
|
+
// Inline array: ["a", "b"]
|
|
272
|
+
if (rawValue.startsWith('[')) {
|
|
273
|
+
const content = rawValue.slice(1, rawValue.lastIndexOf(']')).trim();
|
|
274
|
+
if (!content)
|
|
275
|
+
return { value: [], consumed: 1 };
|
|
276
|
+
const items = content.split(',').map(s => parseStringValue(s.trim())).filter(Boolean);
|
|
277
|
+
return { value: items, consumed: 1 };
|
|
278
|
+
}
|
|
279
|
+
// Multi-line array
|
|
280
|
+
if (!rawValue || rawValue === '') {
|
|
281
|
+
const items = [];
|
|
282
|
+
let consumed = 1;
|
|
283
|
+
for (let j = currentIndex + 1; j < lines.length; j++) {
|
|
284
|
+
const nextLine = lines[j];
|
|
285
|
+
const arrayMatch = nextLine.match(/^\s+-\s*(.*)$/);
|
|
286
|
+
if (arrayMatch) {
|
|
287
|
+
const itemValue = parseStringValue(arrayMatch[1].trim());
|
|
288
|
+
if (itemValue)
|
|
289
|
+
items.push(itemValue);
|
|
290
|
+
consumed++;
|
|
291
|
+
}
|
|
292
|
+
else if (nextLine.trim() === '') {
|
|
293
|
+
consumed++;
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (items.length > 0) {
|
|
300
|
+
return { value: items, consumed };
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Single value
|
|
304
|
+
return { value: parseStringValue(rawValue), consumed: 1 };
|
|
305
|
+
}
|
|
306
|
+
// =============================================================================
|
|
307
|
+
// Matching
|
|
308
|
+
// =============================================================================
|
|
309
|
+
/**
|
|
310
|
+
* Calculate Levenshtein distance between two strings.
|
|
311
|
+
*/
|
|
312
|
+
function levenshteinDistance(str1, str2) {
|
|
313
|
+
const m = str1.length;
|
|
314
|
+
const n = str2.length;
|
|
315
|
+
const dp = Array(m + 1)
|
|
316
|
+
.fill(null)
|
|
317
|
+
.map(() => Array(n + 1).fill(0));
|
|
318
|
+
for (let i = 0; i <= m; i++)
|
|
319
|
+
dp[i][0] = i;
|
|
320
|
+
for (let j = 0; j <= n; j++)
|
|
321
|
+
dp[0][j] = j;
|
|
322
|
+
for (let i = 1; i <= m; i++) {
|
|
323
|
+
for (let j = 1; j <= n; j++) {
|
|
324
|
+
if (str1[i - 1] === str2[j - 1]) {
|
|
325
|
+
dp[i][j] = dp[i - 1][j - 1];
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return dp[m][n];
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Fuzzy match a trigger against prompt text.
|
|
336
|
+
* Returns confidence score 0-100.
|
|
337
|
+
*/
|
|
338
|
+
function fuzzyMatchTrigger(prompt, trigger) {
|
|
339
|
+
const words = prompt.split(/\s+/).filter(w => w.length > 0);
|
|
340
|
+
// Exact word match
|
|
341
|
+
for (const word of words) {
|
|
342
|
+
if (word === trigger)
|
|
343
|
+
return 100;
|
|
344
|
+
if (word.includes(trigger) || trigger.includes(word)) {
|
|
345
|
+
return 80;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Levenshtein distance for each word
|
|
349
|
+
let bestScore = 0;
|
|
350
|
+
for (const word of words) {
|
|
351
|
+
const distance = levenshteinDistance(word, trigger);
|
|
352
|
+
const maxLen = Math.max(word.length, trigger.length);
|
|
353
|
+
const similarity = maxLen > 0 ? ((maxLen - distance) / maxLen) * 100 : 0;
|
|
354
|
+
bestScore = Math.max(bestScore, similarity);
|
|
355
|
+
}
|
|
356
|
+
return Math.round(bestScore);
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Find matching skills for injection based on prompt triggers.
|
|
360
|
+
*
|
|
361
|
+
* Options:
|
|
362
|
+
* - fuzzyThreshold: minimum score for fuzzy match (default: 60)
|
|
363
|
+
* - maxResults: maximum skills to return (default: 5)
|
|
364
|
+
*/
|
|
365
|
+
export function matchSkillsForInjection(prompt, projectRoot, sessionId, options = {}) {
|
|
366
|
+
const { fuzzyThreshold = 60, maxResults = 5 } = options;
|
|
367
|
+
const promptLower = prompt.toLowerCase();
|
|
368
|
+
// Get already injected skills
|
|
369
|
+
const alreadyInjected = new Set(getInjectedSkillPaths(sessionId, projectRoot));
|
|
370
|
+
// Find all skill files
|
|
371
|
+
const candidates = findSkillFiles(projectRoot);
|
|
372
|
+
const matches = [];
|
|
373
|
+
for (const candidate of candidates) {
|
|
374
|
+
// Skip if already injected
|
|
375
|
+
if (alreadyInjected.has(candidate.path))
|
|
376
|
+
continue;
|
|
377
|
+
try {
|
|
378
|
+
const content = readFileSync(candidate.path, 'utf-8');
|
|
379
|
+
const parsed = parseSkillFile(content);
|
|
380
|
+
if (!parsed)
|
|
381
|
+
continue;
|
|
382
|
+
const triggers = parsed.metadata.triggers ?? [];
|
|
383
|
+
if (triggers.length === 0)
|
|
384
|
+
continue;
|
|
385
|
+
const useFuzzy = parsed.metadata.matching === 'fuzzy';
|
|
386
|
+
let totalScore = 0;
|
|
387
|
+
// Check triggers
|
|
388
|
+
for (const trigger of triggers) {
|
|
389
|
+
const triggerLower = trigger.toLowerCase();
|
|
390
|
+
// Exact substring match (default)
|
|
391
|
+
if (promptLower.includes(triggerLower)) {
|
|
392
|
+
totalScore += 10;
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
// Fuzzy match (opt-in only)
|
|
396
|
+
if (useFuzzy) {
|
|
397
|
+
const fuzzyScore = fuzzyMatchTrigger(promptLower, triggerLower);
|
|
398
|
+
if (fuzzyScore >= fuzzyThreshold) {
|
|
399
|
+
totalScore += Math.round(fuzzyScore / 10); // Scale down for consistency
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
if (totalScore > 0) {
|
|
404
|
+
// Get name from metadata or filename
|
|
405
|
+
const name = parsed.metadata.name ||
|
|
406
|
+
basename(candidate.path, SKILL_EXTENSION);
|
|
407
|
+
matches.push({
|
|
408
|
+
path: candidate.path,
|
|
409
|
+
name,
|
|
410
|
+
content: parsed.content,
|
|
411
|
+
score: totalScore,
|
|
412
|
+
scope: candidate.scope,
|
|
413
|
+
triggers,
|
|
414
|
+
matching: parsed.metadata.matching,
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
catch {
|
|
419
|
+
// Ignore file read errors
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
// Sort by score (descending) and limit
|
|
423
|
+
matches.sort((a, b) => b.score - a.score);
|
|
424
|
+
return matches.slice(0, maxResults);
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../src/hooks/learner/bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode Registry - Centralized Mode State Detection
|
|
3
|
+
*
|
|
4
|
+
* CRITICAL: This module uses ONLY file-based detection.
|
|
5
|
+
* It NEVER imports from mode modules to avoid circular dependencies.
|
|
6
|
+
*
|
|
7
|
+
* Mode modules import FROM this registry (unidirectional).
|
|
8
|
+
*
|
|
9
|
+
* All modes store state in `.omc/state/` subdirectory for consistency.
|
|
10
|
+
*/
|
|
11
|
+
import type { ExecutionMode, ModeConfig, ModeStatus, CanStartResult } from './types.js';
|
|
12
|
+
export type { ExecutionMode, ModeConfig, ModeStatus, CanStartResult } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Stale marker threshold (1 hour)
|
|
15
|
+
* Markers older than this are auto-removed to prevent crashed sessions from blocking indefinitely.
|
|
16
|
+
* NOTE: We cannot check database activity here due to circular dependency constraints.
|
|
17
|
+
* Legitimate long-running swarms (>1 hour) may have markers removed - acceptable trade-off.
|
|
18
|
+
*/
|
|
19
|
+
export declare const STALE_MARKER_THRESHOLD: number;
|
|
20
|
+
/**
|
|
21
|
+
* Mode configuration registry
|
|
22
|
+
*
|
|
23
|
+
* Maps each mode to its state file location and detection method.
|
|
24
|
+
* All paths are relative to .omc/state/ directory.
|
|
25
|
+
*/
|
|
26
|
+
declare const MODE_CONFIGS: Record<ExecutionMode, ModeConfig>;
|
|
27
|
+
export { MODE_CONFIGS };
|
|
28
|
+
/**
|
|
29
|
+
* Get the state directory path
|
|
30
|
+
*/
|
|
31
|
+
export declare function getStateDir(cwd: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Ensure the state directory exists
|
|
34
|
+
*/
|
|
35
|
+
export declare function ensureStateDir(cwd: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Get the full path to a mode's state file
|
|
38
|
+
*/
|
|
39
|
+
export declare function getStateFilePath(cwd: string, mode: ExecutionMode): string;
|
|
40
|
+
/**
|
|
41
|
+
* Get the full path to a mode's marker file
|
|
42
|
+
*/
|
|
43
|
+
export declare function getMarkerFilePath(cwd: string, mode: ExecutionMode): string | null;
|
|
44
|
+
/**
|
|
45
|
+
* Get the global state file path (in ~/.claude/) for modes that support it
|
|
46
|
+
*/
|
|
47
|
+
export declare function getGlobalStateFilePath(mode: ExecutionMode): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Check if a specific mode is currently active
|
|
50
|
+
*
|
|
51
|
+
* @param mode - The mode to check
|
|
52
|
+
* @param cwd - Working directory
|
|
53
|
+
* @returns true if the mode is active
|
|
54
|
+
*/
|
|
55
|
+
export declare function isModeActive(mode: ExecutionMode, cwd: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Check if a mode has active state (file exists)
|
|
58
|
+
*/
|
|
59
|
+
export declare function hasModeState(cwd: string, mode: ExecutionMode): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Get all modes that currently have state files
|
|
62
|
+
*/
|
|
63
|
+
export declare function getActiveModes(cwd: string): ExecutionMode[];
|
|
64
|
+
/**
|
|
65
|
+
* Get the currently active exclusive mode (if any)
|
|
66
|
+
*
|
|
67
|
+
* @param cwd - Working directory
|
|
68
|
+
* @returns The active mode or null
|
|
69
|
+
*/
|
|
70
|
+
export declare function getActiveExclusiveMode(cwd: string): ExecutionMode | null;
|
|
71
|
+
/**
|
|
72
|
+
* Check if a new mode can be started
|
|
73
|
+
*
|
|
74
|
+
* @param mode - The mode to start
|
|
75
|
+
* @param cwd - Working directory
|
|
76
|
+
* @returns CanStartResult with allowed status and blocker info
|
|
77
|
+
*/
|
|
78
|
+
export declare function canStartMode(mode: ExecutionMode, cwd: string): CanStartResult;
|
|
79
|
+
/**
|
|
80
|
+
* Get status of all modes
|
|
81
|
+
*
|
|
82
|
+
* @param cwd - Working directory
|
|
83
|
+
* @returns Array of mode statuses
|
|
84
|
+
*/
|
|
85
|
+
export declare function getAllModeStatuses(cwd: string): ModeStatus[];
|
|
86
|
+
/**
|
|
87
|
+
* Clear all state files for a mode
|
|
88
|
+
*
|
|
89
|
+
* Deletes:
|
|
90
|
+
* - Local state file (.omc/state/{mode}-state.json)
|
|
91
|
+
* - Local marker file if applicable
|
|
92
|
+
* - Global state file if applicable (~/.claude/{mode}-state.json)
|
|
93
|
+
*
|
|
94
|
+
* @returns true if all files were deleted successfully (or didn't exist)
|
|
95
|
+
*/
|
|
96
|
+
export declare function clearModeState(mode: ExecutionMode, cwd: string): boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Clear all mode states (force clear)
|
|
99
|
+
*/
|
|
100
|
+
export declare function clearAllModeStates(cwd: string): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Create a marker file to indicate a mode is active
|
|
103
|
+
*
|
|
104
|
+
* Called when starting a SQLite-based mode (like swarm).
|
|
105
|
+
*
|
|
106
|
+
* @param mode - The mode being started
|
|
107
|
+
* @param cwd - Working directory
|
|
108
|
+
* @param metadata - Optional metadata to store in marker
|
|
109
|
+
*/
|
|
110
|
+
export declare function createModeMarker(mode: ExecutionMode, cwd: string, metadata?: Record<string, unknown>): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Remove a marker file to indicate a mode has stopped
|
|
113
|
+
*
|
|
114
|
+
* Called when stopping a SQLite-based mode (like swarm).
|
|
115
|
+
*
|
|
116
|
+
* @param mode - The mode being stopped
|
|
117
|
+
* @param cwd - Working directory
|
|
118
|
+
*/
|
|
119
|
+
export declare function removeModeMarker(mode: ExecutionMode, cwd: string): boolean;
|
|
120
|
+
/**
|
|
121
|
+
* Read metadata from a marker file
|
|
122
|
+
*
|
|
123
|
+
* @param mode - The mode to read
|
|
124
|
+
* @param cwd - Working directory
|
|
125
|
+
*/
|
|
126
|
+
export declare function readModeMarker(mode: ExecutionMode, cwd: string): Record<string, unknown> | null;
|
|
127
|
+
/**
|
|
128
|
+
* Force remove a marker file regardless of staleness
|
|
129
|
+
* Used for manual cleanup by users
|
|
130
|
+
*
|
|
131
|
+
* @param mode - The mode to clean up
|
|
132
|
+
* @param cwd - Working directory
|
|
133
|
+
*/
|
|
134
|
+
export declare function forceRemoveMarker(mode: ExecutionMode, cwd: string): boolean;
|
|
135
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/mode-registry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExF,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,QAAiB,CAAC;AAErD;;;;;GAKG;AACH,QAAA,MAAM,YAAY,EAAE,MAAM,CAAC,aAAa,EAAE,UAAU,CA+CnD,CAAC;AAGF,OAAO,EAAE,YAAY,EAAE,CAAC;AAOxB;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAKhD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAGzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAIjF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAOzE;AAsED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAQtE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAGtE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,CAU3D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAOxE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAgB7E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CAM5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CA+CxE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUvD;AAMD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CA0BT;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAe1E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,MAAM,GACV,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAYhC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAe3E"}
|