@thoughtflow/core 0.2.1 → 0.3.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/README.md +284 -225
- package/dist/bin/mcp-server.d.ts +18 -0
- package/dist/bin/mcp-server.d.ts.map +1 -0
- package/dist/bin/mcp-server.js +261 -0
- package/dist/bin/mcp-server.js.map +1 -0
- package/dist/contracts/mcp.types.d.ts +8 -1
- package/dist/contracts/mcp.types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/libs/mcp/mcp-server.class.d.ts +3 -1
- package/dist/libs/mcp/mcp-server.class.d.ts.map +1 -1
- package/dist/libs/mcp/mcp-server.class.js +36 -33
- package/dist/libs/mcp/mcp-server.class.js.map +1 -1
- package/dist/libs/mcp/vision-adapter-resolver.d.ts +15 -0
- package/dist/libs/mcp/vision-adapter-resolver.d.ts.map +1 -0
- package/dist/libs/mcp/vision-adapter-resolver.js +48 -0
- package/dist/libs/mcp/vision-adapter-resolver.js.map +1 -0
- package/dist/tools/mcp/tool-search.tool.d.ts +35 -0
- package/dist/tools/mcp/tool-search.tool.d.ts.map +1 -0
- package/dist/tools/mcp/tool-search.tool.js +186 -0
- package/dist/tools/mcp/tool-search.tool.js.map +1 -0
- package/dist/tools/workspace/browser-session-pool.d.ts +88 -0
- package/dist/tools/workspace/browser-session-pool.d.ts.map +1 -0
- package/dist/tools/workspace/browser-session-pool.js +302 -0
- package/dist/tools/workspace/browser-session-pool.js.map +1 -0
- package/package.json +5 -1
- package/skills/thoughtflow-mcp/SKILL.md +294 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BrowserSessionPool — manages multiple headless browser sessions with
|
|
4
|
+
* isolated pages, console logs, and network activity per session.
|
|
5
|
+
*
|
|
6
|
+
* Auto-cleans up sessions after 5 minutes of inactivity.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.browserPool = exports.BrowserSessionPool = void 0;
|
|
10
|
+
const SESSION_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
11
|
+
class BrowserSessionPool {
|
|
12
|
+
sessions = new Map();
|
|
13
|
+
cleanupTimer = null;
|
|
14
|
+
/** Create or retrieve a session. If sessionId is empty, creates a new one. */
|
|
15
|
+
async getOrCreate(sessionId) {
|
|
16
|
+
if (sessionId && this.sessions.has(sessionId)) {
|
|
17
|
+
const session = this.sessions.get(sessionId);
|
|
18
|
+
session.lastActivity = Date.now();
|
|
19
|
+
const activePage = session.pages.find(p => p.id === session.activePageId);
|
|
20
|
+
if (activePage && !activePage.page.isClosed()) {
|
|
21
|
+
return { sessionId, page: activePage.page };
|
|
22
|
+
}
|
|
23
|
+
// Active page closed — create a new one
|
|
24
|
+
return this.newPage(sessionId);
|
|
25
|
+
}
|
|
26
|
+
// Create new session
|
|
27
|
+
const id = sessionId ?? `br_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
29
|
+
const { chromium } = require("playwright");
|
|
30
|
+
const browser = await chromium.launch({ headless: true });
|
|
31
|
+
const page = await browser.newPage();
|
|
32
|
+
const browserPage = {
|
|
33
|
+
id: `pg_${Date.now()}`,
|
|
34
|
+
page,
|
|
35
|
+
consoleEntries: [],
|
|
36
|
+
networkEntries: [],
|
|
37
|
+
netIdx: 0,
|
|
38
|
+
};
|
|
39
|
+
const session = {
|
|
40
|
+
browser,
|
|
41
|
+
pages: [browserPage],
|
|
42
|
+
activePageId: browserPage.id,
|
|
43
|
+
initUrl: "",
|
|
44
|
+
createdAt: Date.now(),
|
|
45
|
+
lastActivity: Date.now(),
|
|
46
|
+
};
|
|
47
|
+
this.sessions.set(id, session);
|
|
48
|
+
this.startCleanup();
|
|
49
|
+
// Attach listeners
|
|
50
|
+
this.attachListeners(browserPage);
|
|
51
|
+
return { sessionId: id, page };
|
|
52
|
+
}
|
|
53
|
+
/** Navigate the active page of a session. */
|
|
54
|
+
async getPage(sessionId) {
|
|
55
|
+
const session = this.sessions.get(sessionId);
|
|
56
|
+
if (!session)
|
|
57
|
+
return null;
|
|
58
|
+
session.lastActivity = Date.now();
|
|
59
|
+
const active = session.pages.find(p => p.id === session.activePageId);
|
|
60
|
+
if (!active || active.page.isClosed())
|
|
61
|
+
return null;
|
|
62
|
+
return active.page;
|
|
63
|
+
}
|
|
64
|
+
/** Open a new tab in an existing session. */
|
|
65
|
+
async newPage(sessionId) {
|
|
66
|
+
const session = this.sessions.get(sessionId);
|
|
67
|
+
if (!session)
|
|
68
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
69
|
+
session.lastActivity = Date.now();
|
|
70
|
+
const page = await session.browser.newPage();
|
|
71
|
+
const browserPage = {
|
|
72
|
+
id: `pg_${Date.now()}`,
|
|
73
|
+
page,
|
|
74
|
+
consoleEntries: [],
|
|
75
|
+
networkEntries: [],
|
|
76
|
+
netIdx: 0,
|
|
77
|
+
};
|
|
78
|
+
session.pages.push(browserPage);
|
|
79
|
+
session.activePageId = browserPage.id;
|
|
80
|
+
this.attachListeners(browserPage);
|
|
81
|
+
return { sessionId, page };
|
|
82
|
+
}
|
|
83
|
+
/** Switch active tab. */
|
|
84
|
+
switchPage(sessionId, pageId) {
|
|
85
|
+
const session = this.sessions.get(sessionId);
|
|
86
|
+
if (!session)
|
|
87
|
+
return false;
|
|
88
|
+
const exists = session.pages.find(p => p.id === pageId && !p.page.isClosed());
|
|
89
|
+
if (!exists)
|
|
90
|
+
return false;
|
|
91
|
+
session.activePageId = pageId;
|
|
92
|
+
session.lastActivity = Date.now();
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
/** Close a tab (or the active one if pageId omitted). */
|
|
96
|
+
async closePage(sessionId, pageId) {
|
|
97
|
+
const session = this.sessions.get(sessionId);
|
|
98
|
+
if (!session)
|
|
99
|
+
return false;
|
|
100
|
+
session.lastActivity = Date.now();
|
|
101
|
+
const targetId = pageId ?? session.activePageId;
|
|
102
|
+
const idx = session.pages.findIndex(p => p.id === targetId);
|
|
103
|
+
if (idx === -1)
|
|
104
|
+
return false;
|
|
105
|
+
const bp = session.pages[idx];
|
|
106
|
+
await bp.page.close().catch(() => { });
|
|
107
|
+
session.pages.splice(idx, 1);
|
|
108
|
+
// If we closed the active page, switch to another
|
|
109
|
+
if (session.activePageId === targetId && session.pages.length > 0) {
|
|
110
|
+
session.activePageId = session.pages[0].id;
|
|
111
|
+
}
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
/** Destroy a session completely. */
|
|
115
|
+
async destroy(sessionId) {
|
|
116
|
+
const session = this.sessions.get(sessionId);
|
|
117
|
+
if (!session)
|
|
118
|
+
return;
|
|
119
|
+
for (const bp of session.pages) {
|
|
120
|
+
await bp.page.close().catch(() => { });
|
|
121
|
+
}
|
|
122
|
+
await session.browser.close().catch(() => { });
|
|
123
|
+
this.sessions.delete(sessionId);
|
|
124
|
+
}
|
|
125
|
+
/** Destroy all sessions. */
|
|
126
|
+
async destroyAll() {
|
|
127
|
+
let count = 0;
|
|
128
|
+
for (const [id, session] of this.sessions) {
|
|
129
|
+
for (const bp of session.pages) {
|
|
130
|
+
await bp.page.close().catch(() => { });
|
|
131
|
+
}
|
|
132
|
+
await session.browser.close().catch(() => { });
|
|
133
|
+
this.sessions.delete(id);
|
|
134
|
+
count++;
|
|
135
|
+
}
|
|
136
|
+
if (this.cleanupTimer) {
|
|
137
|
+
clearInterval(this.cleanupTimer);
|
|
138
|
+
this.cleanupTimer = null;
|
|
139
|
+
}
|
|
140
|
+
return count;
|
|
141
|
+
}
|
|
142
|
+
/** Set the initial navigation URL for a session. */
|
|
143
|
+
setInitUrl(sessionId, url) {
|
|
144
|
+
const session = this.sessions.get(sessionId);
|
|
145
|
+
if (session && !session.initUrl) {
|
|
146
|
+
session.initUrl = url;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** List all active sessions with metadata. */
|
|
150
|
+
list() {
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
const result = [];
|
|
153
|
+
for (const [id, session] of this.sessions) {
|
|
154
|
+
const active = session.pages.find(p => p.id === session.activePageId && !p.page.isClosed());
|
|
155
|
+
const idleMs = now - session.lastActivity;
|
|
156
|
+
result.push({
|
|
157
|
+
sessionId: id,
|
|
158
|
+
initUrl: session.initUrl || "(no navigation yet)",
|
|
159
|
+
currentUrl: active ? active.page.url() : "(closed)",
|
|
160
|
+
pageCount: session.pages.filter(p => !p.page.isClosed()).length,
|
|
161
|
+
activePageId: session.activePageId,
|
|
162
|
+
createdAt: session.createdAt,
|
|
163
|
+
lastActivity: session.lastActivity,
|
|
164
|
+
status: idleMs > 60_000 ? "idle" : "active",
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
/** Get console logs for active page. */
|
|
170
|
+
getConsole(sessionId) {
|
|
171
|
+
return this.getActivePageData(sessionId)?.consoleEntries ?? [];
|
|
172
|
+
}
|
|
173
|
+
/** Get network entries for active page. */
|
|
174
|
+
getNetwork(sessionId) {
|
|
175
|
+
return this.getActivePageData(sessionId)?.networkEntries ?? [];
|
|
176
|
+
}
|
|
177
|
+
/** Clear console logs for active page. */
|
|
178
|
+
clearConsole(sessionId) {
|
|
179
|
+
const bp = this.getActivePageData(sessionId);
|
|
180
|
+
if (bp)
|
|
181
|
+
bp.consoleEntries = [];
|
|
182
|
+
}
|
|
183
|
+
/** Clear network entries for active page. */
|
|
184
|
+
clearNetwork(sessionId) {
|
|
185
|
+
const bp = this.getActivePageData(sessionId);
|
|
186
|
+
if (bp)
|
|
187
|
+
bp.networkEntries = [];
|
|
188
|
+
}
|
|
189
|
+
/** Cache a screenshot base64 string for the session. */
|
|
190
|
+
cacheScreenshot(sessionId, base64) {
|
|
191
|
+
const session = this.sessions.get(sessionId);
|
|
192
|
+
if (session)
|
|
193
|
+
session.cachedScreenshot = base64;
|
|
194
|
+
}
|
|
195
|
+
/** Get cached screenshot base64 string. */
|
|
196
|
+
getCachedScreenshot(sessionId) {
|
|
197
|
+
const session = this.sessions.get(sessionId);
|
|
198
|
+
return session.cachedScreenshot ?? null;
|
|
199
|
+
}
|
|
200
|
+
/** List all open tabs in a session. */
|
|
201
|
+
listPages(sessionId) {
|
|
202
|
+
const session = this.sessions.get(sessionId);
|
|
203
|
+
if (!session)
|
|
204
|
+
return [];
|
|
205
|
+
return session.pages
|
|
206
|
+
.filter(p => !p.page.isClosed())
|
|
207
|
+
.map(p => ({
|
|
208
|
+
id: p.id,
|
|
209
|
+
url: p.page.url(),
|
|
210
|
+
title: "", // Will be filled by caller if needed
|
|
211
|
+
active: p.id === session.activePageId,
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
// ── Private ────────────────────────────────────────────────────────────────
|
|
215
|
+
getActivePageData(sessionId) {
|
|
216
|
+
const session = this.sessions.get(sessionId);
|
|
217
|
+
if (!session)
|
|
218
|
+
return null;
|
|
219
|
+
session.lastActivity = Date.now();
|
|
220
|
+
return session.pages.find(p => p.id === session.activePageId && !p.page.isClosed()) ?? null;
|
|
221
|
+
}
|
|
222
|
+
attachListeners(bp) {
|
|
223
|
+
// Console
|
|
224
|
+
bp.page.on("console", (msg) => {
|
|
225
|
+
bp.consoleEntries.push({
|
|
226
|
+
type: msg.type(),
|
|
227
|
+
text: msg.text(),
|
|
228
|
+
location: msg.location().url ? `${msg.location().url}:${msg.location().lineNumber}` : "",
|
|
229
|
+
timestamp: Date.now(),
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
// Network
|
|
233
|
+
const timings = new Map();
|
|
234
|
+
bp.page.on("request", (req) => {
|
|
235
|
+
const idx = ++bp.netIdx;
|
|
236
|
+
timings.set(req.url() + req.method(), Date.now());
|
|
237
|
+
let reqBody;
|
|
238
|
+
try {
|
|
239
|
+
reqBody = req.postData() ?? undefined;
|
|
240
|
+
}
|
|
241
|
+
catch { }
|
|
242
|
+
bp.networkEntries.push({
|
|
243
|
+
idx, method: req.method(), url: req.url(),
|
|
244
|
+
reqHeaders: req.headers(),
|
|
245
|
+
reqBody, timestamp: Date.now(),
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
bp.page.on("response", async (resp) => {
|
|
249
|
+
const key = resp.url() + resp.request().method();
|
|
250
|
+
const start = timings.get(key);
|
|
251
|
+
const duration = start ? Date.now() - start : undefined;
|
|
252
|
+
let entry = bp.networkEntries.find(e => e.url === resp.url() && e.method === resp.request().method());
|
|
253
|
+
if (!entry) {
|
|
254
|
+
entry = { idx: ++bp.netIdx, method: resp.request().method(), url: resp.url(), timestamp: Date.now() };
|
|
255
|
+
bp.networkEntries.push(entry);
|
|
256
|
+
}
|
|
257
|
+
entry.status = resp.status();
|
|
258
|
+
entry.statusText = resp.statusText();
|
|
259
|
+
entry.duration = duration;
|
|
260
|
+
entry.resHeaders = resp.headers();
|
|
261
|
+
try {
|
|
262
|
+
const ct = resp.headers()["content-type"] ?? "";
|
|
263
|
+
if (ct.includes("json") || ct.includes("text") || ct.includes("xml") || ct.includes("javascript")) {
|
|
264
|
+
entry.resBody = await resp.text().catch(() => undefined);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch { }
|
|
268
|
+
});
|
|
269
|
+
bp.page.on("requestfailed", (req) => {
|
|
270
|
+
bp.networkEntries.push({
|
|
271
|
+
idx: ++bp.netIdx, method: req.method(), url: req.url(),
|
|
272
|
+
error: req.failure()?.errorText ?? "Unknown error",
|
|
273
|
+
reqHeaders: req.headers(),
|
|
274
|
+
timestamp: Date.now(),
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
startCleanup() {
|
|
279
|
+
if (this.cleanupTimer)
|
|
280
|
+
return;
|
|
281
|
+
this.cleanupTimer = setInterval(() => {
|
|
282
|
+
const now = Date.now();
|
|
283
|
+
for (const [id, session] of this.sessions) {
|
|
284
|
+
if (now - session.lastActivity > SESSION_TTL_MS) {
|
|
285
|
+
for (const bp of session.pages) {
|
|
286
|
+
bp.page.close().catch(() => { });
|
|
287
|
+
}
|
|
288
|
+
session.browser.close().catch(() => { });
|
|
289
|
+
this.sessions.delete(id);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (this.sessions.size === 0 && this.cleanupTimer) {
|
|
293
|
+
clearInterval(this.cleanupTimer);
|
|
294
|
+
this.cleanupTimer = null;
|
|
295
|
+
}
|
|
296
|
+
}, 60_000).unref();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
exports.BrowserSessionPool = BrowserSessionPool;
|
|
300
|
+
/** Singleton instance */
|
|
301
|
+
exports.browserPool = new BrowserSessionPool();
|
|
302
|
+
//# sourceMappingURL=browser-session-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-session-pool.js","sourceRoot":"","sources":["../../../src/tools/workspace/browser-session-pool.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAyCH,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,YAAY;AAEjD,MAAa,kBAAkB;IACrB,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAA;IAC5C,YAAY,GAA0C,IAAI,CAAA;IAElE,8EAA8E;IAC9E,KAAK,CAAC,WAAW,CAAC,SAAkB;QAClC,IAAI,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAA;YAC7C,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACjC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;YACzE,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC9C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAA;YAC7C,CAAC;YACD,wCAAwC;YACxC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAChC,CAAC;QAED,qBAAqB;QACrB,MAAM,EAAE,GAAG,SAAS,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;QACpF,iEAAiE;QACjE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,CAAgC,CAAA;QACzE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QACzD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;QAEpC,MAAM,WAAW,GAAgB;YAC/B,EAAE,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE;YACtB,IAAI;YACJ,cAAc,EAAE,EAAE;YAClB,cAAc,EAAE,EAAE;YAClB,MAAM,EAAE,CAAC;SACV,CAAA;QAED,MAAM,OAAO,GAAmB;YAC9B,OAAO;YACP,KAAK,EAAE,CAAC,WAAW,CAAC;YACpB,YAAY,EAAE,WAAW,CAAC,EAAE;YAC5B,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;SACzB,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAC9B,IAAI,CAAC,YAAY,EAAE,CAAA;QAEnB,mBAAmB;QACnB,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QAEjC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IAChC,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QACzB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;QACrE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE,OAAO,IAAI,CAAA;QAClD,OAAO,MAAM,CAAC,IAAI,CAAA;IACpB,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAA;QAE/D,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACjC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;QAE5C,MAAM,WAAW,GAAgB;YAC/B,EAAE,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE;YACtB,IAAI;YACJ,cAAc,EAAE,EAAE;YAClB,cAAc,EAAE,EAAE;YAClB,MAAM,EAAE,CAAC;SACV,CAAA;QAED,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC/B,OAAO,CAAC,YAAY,GAAG,WAAW,CAAC,EAAE,CAAA;QACrC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QAEjC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IAC5B,CAAC;IAED,yBAAyB;IACzB,UAAU,CAAC,SAAiB,EAAE,MAAc;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC7E,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QACzB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAA;QAC7B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACjC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,MAAe;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;QAC1B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEjC,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAC,YAAY,CAAA;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;QAC3D,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;QAE5B,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAE,CAAA;QAC9B,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACrC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAE5B,kDAAkD;QAClD,IAAI,OAAO,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClE,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAA;QAC7C,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACvC,CAAC;QACD,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC7C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACjC,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,UAAU;QACd,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC/B,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YACvC,CAAC;YACD,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAC7C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACxB,KAAK,EAAE,CAAA;QACT,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAC1B,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,oDAAoD;IACpD,UAAU,CAAC,SAAiB,EAAE,GAAW;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAChC,OAAO,CAAC,OAAO,GAAG,GAAG,CAAA;QACvB,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI;QAUF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,MAAM,MAAM,GASP,EAAE,CAAA;QAEP,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC3F,MAAM,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,YAAY,CAAA;YACzC,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,qBAAqB;gBACjD,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU;gBACnD,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM;gBAC/D,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;aAC5C,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,wCAAwC;IACxC,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,cAAc,IAAI,EAAE,CAAA;IAChE,CAAC;IAED,2CAA2C;IAC3C,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,cAAc,IAAI,EAAE,CAAA;IAChE,CAAC;IAED,0CAA0C;IAC1C,YAAY,CAAC,SAAiB;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,EAAE;YAAE,EAAE,CAAC,cAAc,GAAG,EAAE,CAAA;IAChC,CAAC;IAED,6CAA6C;IAC7C,YAAY,CAAC,SAAiB;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,EAAE;YAAE,EAAE,CAAC,cAAc,GAAG,EAAE,CAAA;IAChC,CAAC;IAED,wDAAwD;IACxD,eAAe,CAAC,SAAiB,EAAE,MAAc;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,OAAO;YAAG,OAAe,CAAC,gBAAgB,GAAG,MAAM,CAAA;IACzD,CAAC;IAED,2CAA2C;IAC3C,mBAAmB,CAAC,SAAiB;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,OAAQ,OAAe,CAAC,gBAAgB,IAAI,IAAI,CAAA;IAClD,CAAC;IAED,uCAAuC;IACvC,SAAS,CAAC,SAAiB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAA;QACvB,OAAO,OAAO,CAAC,KAAK;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACT,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACjB,KAAK,EAAE,EAAE,EAAE,qCAAqC;YAChD,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,YAAY;SACtC,CAAC,CAAC,CAAA;IACP,CAAC;IAED,8EAA8E;IAEtE,iBAAiB,CAAC,SAAiB;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QACzB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACjC,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAA;IAC7F,CAAC;IAEO,eAAe,CAAC,EAAe;QACrC,UAAU;QACV,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5B,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC;gBACrB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE;gBAChB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE;gBAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;gBACxF,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,UAAU;QACV,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;QACzC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5B,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,MAAM,CAAA;YACvB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;YACjD,IAAI,OAA2B,CAAA;YAC/B,IAAI,CAAC;gBAAC,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,SAAS,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACtD,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC;gBACrB,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;gBACzC,UAAU,EAAE,GAAG,CAAC,OAAO,EAA4B;gBACnD,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aAC/B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAA;YAChD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;YACvD,IAAI,KAAK,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;YACrG,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;gBACrG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC/B,CAAC;YACD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;YAC5B,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;YACpC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACzB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,EAA4B,CAAA;YAC3D,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;gBAC/C,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBAClG,KAAK,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;gBAC1D,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE;YAClC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC;gBACrB,GAAG,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;gBACtD,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,IAAI,eAAe;gBAClD,UAAU,EAAE,GAAG,CAAC,OAAO,EAA4B;gBACnD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,YAAY;YAAE,OAAM;QAC7B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACtB,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1C,IAAI,GAAG,GAAG,OAAO,CAAC,YAAY,GAAG,cAAc,EAAE,CAAC;oBAChD,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;wBAC/B,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;oBACjC,CAAC;oBACD,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;oBACvC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBAC1B,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClD,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;gBAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;YAC1B,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;CACF;AApUD,gDAoUC;AAED,yBAAyB;AACZ,QAAA,WAAW,GAAG,IAAI,kBAAkB,EAAE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thoughtflow/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "TypeScript framework for building autonomous AI agents with LLM tool-calling, streaming, plugins, skills, and workspace automation",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"types": "dist/index.d.ts",
|
|
25
25
|
"files": [
|
|
26
26
|
"dist/**/*",
|
|
27
|
+
"skills/thoughtflow-mcp/SKILL.md",
|
|
27
28
|
"README.md",
|
|
28
29
|
"LICENSE"
|
|
29
30
|
],
|
|
@@ -64,5 +65,8 @@
|
|
|
64
65
|
"ts-jest": "^29.2.6",
|
|
65
66
|
"ts-node": "^10.9.2",
|
|
66
67
|
"typescript": "^5.8.3"
|
|
68
|
+
},
|
|
69
|
+
"bin": {
|
|
70
|
+
"thoughtflow-mcp": "dist/bin/mcp-server.js"
|
|
67
71
|
}
|
|
68
72
|
}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: thoughtflow-mcp
|
|
3
|
+
description: "Use when thoughtflow MCP tools (mcp__thoughtflow__*) are available. 100+ coding tools: file ops, git, search, code analysis, refactoring, testing, planning, vision browser. Use tool_search first to discover the right tool and its parameters — never call an unfamiliar tool without checking its schema. The tool list is compressed; call tool_search with a natural language query to get full parameter details."
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
author: thoughtflow
|
|
6
|
+
license: MIT
|
|
7
|
+
metadata:
|
|
8
|
+
hermes:
|
|
9
|
+
tags: [thoughtflow, mcp, tools, coding, autonomous]
|
|
10
|
+
related_skills: []
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# thoughtflow MCP — 100+ Coding Tools
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
thoughtflow exposes 100+ battle-tested coding tools through MCP. Every tool is
|
|
18
|
+
prefixed `mcp__thoughtflow__`. The tool list is **compressed by default** —
|
|
19
|
+
you see names + one-liners, not full schemas. Use `tool_search` to discover
|
|
20
|
+
tools and their parameters on demand.
|
|
21
|
+
|
|
22
|
+
## When to Use
|
|
23
|
+
|
|
24
|
+
This skill activates automatically when `mcp__thoughtflow__tool_search` is in
|
|
25
|
+
your tool list. It guides you to use thoughtflow tools efficiently.
|
|
26
|
+
|
|
27
|
+
**Use thoughtflow tools when you need:**
|
|
28
|
+
- File operations — prefer Hermes built-in tools (`read_file`, `write_file`, `patch`, `search_files`) for speed and session integration. Use MCP workspace tools only for workspace-relative paths or bulk operations.
|
|
29
|
+
- Git operations (status, diff, commit, branch, log)
|
|
30
|
+
- Codebase analysis (search, dependency graphs, impact, cross-references)
|
|
31
|
+
- Code review & quality (neural review, complexity, duplication, security scan)
|
|
32
|
+
- Refactoring (rename, extract, move, split, organize imports)
|
|
33
|
+
- Testing (generate unit/integration tests, fix failures, find gaps)
|
|
34
|
+
- Documentation (generate README, API docs, ADR, diagrams)
|
|
35
|
+
- Planning (problem decomposition, task breakdown, estimation)
|
|
36
|
+
- Terminal commands (shell execution with workspace awareness)
|
|
37
|
+
- Visual page analysis (screenshot + vision model inspection)
|
|
38
|
+
|
|
39
|
+
**Don't use thoughtflow tools for:**
|
|
40
|
+
- Simple one-liner questions that don't need code access
|
|
41
|
+
- Tasks that Hermes's built-in tools handle better (memory, session_search, etc.)
|
|
42
|
+
|
|
43
|
+
## Core Workflow: tool_search → execute
|
|
44
|
+
|
|
45
|
+
**NEVER call a thoughtflow tool without knowing its parameters.** The compressed
|
|
46
|
+
tool list hides input schemas. Always discover first:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
1. tool_search("read and write text files") → find the right tool
|
|
50
|
+
2. read the parameter schemas in the response → learn what params it needs
|
|
51
|
+
3. mcp__thoughtflow__readFile({path: "..."}) → call with correct params
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### tool_search query patterns
|
|
55
|
+
|
|
56
|
+
| Describe what you want | Example query |
|
|
57
|
+
|---|---|
|
|
58
|
+
| By domain | `"workspace tools"`, `"testing tools"`, `"codebase tools"` |
|
|
59
|
+
| By action | `"search for code"`, `"create a migration"`, `"review code quality"` |
|
|
60
|
+
| By file type | `"generate TypeScript tests"`, `"refactor imports"` |
|
|
61
|
+
|
|
62
|
+
### If tool_search returns "no tools found"
|
|
63
|
+
|
|
64
|
+
Broaden the query or search by domain. Every tool belongs to one of these
|
|
65
|
+
domains: workspace, codebase, neural, planning, refactor, testing, quality,
|
|
66
|
+
docs, devops, database, memory.
|
|
67
|
+
|
|
68
|
+
## Domain Quick Reference
|
|
69
|
+
|
|
70
|
+
| Domain | What it provides | Key tools |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| **workspace** | File I/O, terminal, git, browser, HTTP, search | `readFile`, `writeFile`, `grep`, `terminalRun`, `git`, `patchFile` |
|
|
73
|
+
| **codebase** | Repository intelligence | `codebaseSearch`, `codebaseIndex`, `codebaseImpact`, `codebaseFlow` |
|
|
74
|
+
| **neural** | LLM-powered analysis | `neuralReview`, `neuralExplain`, `neuralDebug`, `neuralSecurity` |
|
|
75
|
+
| **planning** | Task decomposition | `solveComplex`, `pmBreakdown`, `pmEstimate`, `problemTree` |
|
|
76
|
+
| **refactor** | Code transformation | `refactorRename`, `refactorExtract`, `refactorImports` |
|
|
77
|
+
| **testing** | Test automation | `testGenUnit`, `testFix`, `testGap`, `testFuzz` |
|
|
78
|
+
| **quality** | Code metrics | `qualityComplexity`, `qualityCoverage`, `qualityDuplication` |
|
|
79
|
+
| **docs** | Documentation | `docGenReadme`, `docGenApi`, `docGenDiagrams` |
|
|
80
|
+
| **devops** | CI/CD & infra | `ciWorkflow`, `deployCheck`, `dockerOptimize` |
|
|
81
|
+
| **database** | DB operations | `dbMigration`, `dbDiagram` |
|
|
82
|
+
| **vision** | Visual analysis | `visionBrowser` — screenshot + vision LLM |
|
|
83
|
+
|
|
84
|
+
## Efficient Usage Patterns
|
|
85
|
+
|
|
86
|
+
These patterns mirror real thoughtflow development workflows. Follow them exactly.
|
|
87
|
+
|
|
88
|
+
### Before ANY code change (mandatory)
|
|
89
|
+
```
|
|
90
|
+
1. grep or codebaseSearch to understand current state
|
|
91
|
+
2. codebaseImpact({files: ["src/target.ts"]}) to check blast radius
|
|
92
|
+
3. Make changes
|
|
93
|
+
4. neuralReview({paths: ["src/"]}) to catch issues
|
|
94
|
+
5. runTsc or terminalRun("bun run build && bun run test") to verify
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Investigating a bug
|
|
98
|
+
```
|
|
99
|
+
1. neuralDebug({error: "...", files: ["src/"]}) → AI-powered root cause
|
|
100
|
+
2. grep({pattern: "offending_symbol"}) → find all occurrences
|
|
101
|
+
3. codebaseFlow({entryFile: "src/app.ts", function: "brokenFn"}) → trace call path
|
|
102
|
+
4. Fix
|
|
103
|
+
5. testGenUnit({target: "src/fixed.ts"}) → add regression test
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Refactoring (rename/extract/move)
|
|
107
|
+
```
|
|
108
|
+
1. refactorRename({oldName: "oldFn", newName: "newFn", paths: ["src/"]})
|
|
109
|
+
2. refactorImports({paths: ["src/"]}) → clean up
|
|
110
|
+
3. qualityComplexity({paths: ["src/"]}) → verify improvement
|
|
111
|
+
4. bun run build && bun run test
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Adding a new feature
|
|
115
|
+
```
|
|
116
|
+
1. solveComplex({problem: "Add pagination to the user list endpoint"})
|
|
117
|
+
→ returns task tree with dependencies
|
|
118
|
+
2. Implement in dependency order (problemTree for progress tracking)
|
|
119
|
+
3. testGenIntegration({target: "src/new-feature.ts"})
|
|
120
|
+
4. neuralReview + build + test
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Visual testing a web page
|
|
124
|
+
```
|
|
125
|
+
1. browser({action:"open"}) → save sessionId
|
|
126
|
+
2. browser({action:"navigate", sessionId, url:"http://localhost:3000"})
|
|
127
|
+
3. browser({action:"snapshot", sessionId}) → find [ref=eN] elements
|
|
128
|
+
4. browser({action:"click", sessionId, selector:"e4"})
|
|
129
|
+
5. browser({action:"vision", sessionId, prompt:"Does the login form look correct?"})
|
|
130
|
+
6. browser({action:"console", sessionId}) → check for JS errors
|
|
131
|
+
7. browser({action:"network", sessionId}) → check for failed API calls
|
|
132
|
+
8. browser({action:"close", sessionId}) when done
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Pre-commit quality gate
|
|
136
|
+
```
|
|
137
|
+
1. qualityComplexity → no function > 10 complexity
|
|
138
|
+
2. qualityDuplication → no new duplications
|
|
139
|
+
3. qualityTypes → no new `any` types
|
|
140
|
+
4. testGap → no uncovered paths
|
|
141
|
+
5. neuralSecurity → no hardcoded secrets
|
|
142
|
+
6. bun run build && bun run test → green
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
## Vision Browser
|
|
146
|
+
|
|
147
|
+
`visionBrowser` takes a URL or HTML and a prompt, renders it with headless
|
|
148
|
+
Chromium, and analyzes the screenshot with a vision model:
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
visionBrowser({
|
|
152
|
+
url: "https://example.com",
|
|
153
|
+
prompt: "Is the login button visible? What color is the header?",
|
|
154
|
+
captureConsole: true,
|
|
155
|
+
captureNetwork: true,
|
|
156
|
+
})
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Console logs and network activity (with full request/response headers and body)
|
|
160
|
+
can be captured by adding `captureConsole: true` and `captureNetwork: true`.
|
|
161
|
+
|
|
162
|
+
Works with any OpenAI-compatible vision model. Requires Playwright
|
|
163
|
+
(`npm install playwright`).
|
|
164
|
+
|
|
165
|
+
## Interactive Browser (Stateful)
|
|
166
|
+
|
|
167
|
+
The `browser` tool maintains state across calls via `sessionId`. Each session
|
|
168
|
+
is an isolated Chromium process. **ALWAYS follow this flow — never improvise:**
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
// 1. Open a session
|
|
172
|
+
browser({action: "open"})
|
|
173
|
+
→ {"sessionId": "br_abc123"}
|
|
174
|
+
|
|
175
|
+
// 2. Navigate
|
|
176
|
+
browser({action: "navigate", sessionId: "br_abc123", url: "https://example.com"})
|
|
177
|
+
→ {"title": "Page Title", "url": "https://example.com"}
|
|
178
|
+
|
|
179
|
+
// 3. Inspect the DOM (accessibility tree, compact, with [ref=eN] markers)
|
|
180
|
+
browser({action: "snapshot", sessionId: "br_abc123"})
|
|
181
|
+
→ - link "Home" [ref=e1]
|
|
182
|
+
- button "Get Started" [ref=e2]
|
|
183
|
+
- textbox "Search..." [ref=e3]
|
|
184
|
+
|
|
185
|
+
// 4. Interact using [ref=eN] from snapshot
|
|
186
|
+
browser({action: "click", sessionId: "br_abc123", selector: "e2"})
|
|
187
|
+
browser({action: "type", sessionId: "br_abc123", selector: "e3", text: "hello"})
|
|
188
|
+
|
|
189
|
+
// 5. Check console for JS errors
|
|
190
|
+
browser({action: "console", sessionId: "br_abc123"})
|
|
191
|
+
→ [error] TypeError: ... — app.js:42
|
|
192
|
+
|
|
193
|
+
// 6. Check network for failed API calls
|
|
194
|
+
browser({action: "network", sessionId: "br_abc123"})
|
|
195
|
+
→ ✗ POST /api/auth → 401 (567ms)
|
|
196
|
+
|
|
197
|
+
// 7. Visual check
|
|
198
|
+
browser({action: "screenshot", sessionId: "br_abc123"})
|
|
199
|
+
→ screenshot:base64:iVBOR...
|
|
200
|
+
|
|
201
|
+
// 8. Close when done
|
|
202
|
+
browser({action: "close", sessionId: "br_abc123"})
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Key rules:**
|
|
206
|
+
- Save `sessionId` from `open` — use it for ALL subsequent calls
|
|
207
|
+
- Use `snapshot` not `get_dom` — the accessibility tree is compact and has `[ref=eN]`
|
|
208
|
+
- `console` and `network` auto-accumulate from session start
|
|
209
|
+
- Sessions auto-expire after 5 min — don't leave them open
|
|
210
|
+
- Use `list` to see all active sessions
|
|
211
|
+
|
|
212
|
+
## Safety Rules
|
|
213
|
+
|
|
214
|
+
### Never do these without user approval:
|
|
215
|
+
- `git checkout <file>` or `git reset --hard` that discards uncommitted changes
|
|
216
|
+
- `git push --force`
|
|
217
|
+
- `rm -rf`, recursive deletion, wiping directories
|
|
218
|
+
- `DROP TABLE`, `TRUNCATE`, `DELETE FROM` without WHERE
|
|
219
|
+
|
|
220
|
+
### Before any destructive operation:
|
|
221
|
+
1. Backup first: `cp file.ts file.ts.bak` or `git stash`
|
|
222
|
+
2. Check impact: `codebaseImpact` on the target
|
|
223
|
+
3. Ask: "Can I undo this in 30 seconds?"
|
|
224
|
+
4. If no → STOP and ask the user
|
|
225
|
+
|
|
226
|
+
## Planning + TODO workflow
|
|
227
|
+
|
|
228
|
+
Always decompose complex tasks into a Hermes TODO list:
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
1. mcp__thoughtflow__solveComplex({problem: "..."}) → dependency tree
|
|
232
|
+
2. Translate into Hermes `todo` items in dependency order
|
|
233
|
+
3. Mark complete as you go — the TODO is your source of truth
|
|
234
|
+
4. Report progress from the TODO list, not from memory
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## Common Pitfalls
|
|
238
|
+
|
|
239
|
+
1. **Calling tools without tool_search first.** The compressed list doesn't show
|
|
240
|
+
parameters. You'll get schema errors. Always `tool_search("what you want")` first.
|
|
241
|
+
|
|
242
|
+
2. **Using Hermes built-in tools when thoughtflow has better ones.** The built-in
|
|
243
|
+
`read_file` is for reading into context; `mcp__thoughtflow__readFile` works on
|
|
244
|
+
the workspace project. Use thoughtflow tools for project operations.
|
|
245
|
+
|
|
246
|
+
3. **Forgetting the `mcp__thoughtflow__` prefix.** All thoughtflow tools are
|
|
247
|
+
prefixed. `readFile` ≠ `mcp__thoughtflow__readFile`.
|
|
248
|
+
|
|
249
|
+
4. **Not checking allowedPaths.** If a file operation fails, the path might be
|
|
250
|
+
outside the configured workspace sandbox. Check `thoughtflow.config.json`.
|
|
251
|
+
|
|
252
|
+
5. **Calling `open` multiple times for the same task.** Each `open` creates a
|
|
253
|
+
new session. Save the `sessionId` and reuse it for all browser actions.
|
|
254
|
+
|
|
255
|
+
6. **Using `get_dom` instead of `snapshot`.** `get_dom` returns raw HTML
|
|
256
|
+
(potentially huge). `snapshot` returns a compact accessibility tree with
|
|
257
|
+
`[ref=eN]` markers that `click` and `type` understand directly.
|
|
258
|
+
|
|
259
|
+
7. **Not checking console/network after interactions.** JS errors and failed
|
|
260
|
+
API calls are auto-captured. Check `console` and `network` after
|
|
261
|
+
clicks/navigation — they often reveal the root cause of UI issues.
|
|
262
|
+
|
|
263
|
+
## Installation & Updates
|
|
264
|
+
|
|
265
|
+
### One-command install
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
npx @thoughtflow/mcp-server install-skill
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Copies the skill to `~/.hermes/skills/thoughtflow-mcp/SKILL.md`.
|
|
272
|
+
Use `--target` for custom locations:
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
npx @thoughtflow/mcp-server install-skill --target ~/.agents/skills/
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Manual install
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
cp skills/thoughtflow-mcp/SKILL.md ~/.hermes/skills/thoughtflow-mcp/
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Updating
|
|
285
|
+
|
|
286
|
+
Re-run `install-skill` after pulling the latest thoughtflow — it overwrites the old skill file. Start a new Hermes session to pick up changes.
|
|
287
|
+
|
|
288
|
+
## Verification Checklist
|
|
289
|
+
|
|
290
|
+
- [ ] `hermes mcp test thoughtflow` returns "Connected" with tools listed
|
|
291
|
+
- [ ] `tool_search("workspace tools")` returns file/git/terminal tools with schemas
|
|
292
|
+
- [ ] `mcp__thoughtflow__readFile({path: "README.md"})` reads a file successfully
|
|
293
|
+
- [ ] In chat, LLM calls `tool_search` before calling unfamiliar tools
|
|
294
|
+
- [ ] Vision browser works when configured: `visionBrowser({url: "...", prompt: "..."})`
|