@askmesh/mcp 0.10.5 → 0.10.7
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/dist/agent/auto_responder.js +8 -1
- package/dist/index.js +1 -1
- package/dist/statusline/cache.d.ts +3 -0
- package/dist/statusline/cache.js +11 -2
- package/dist/tools/askmesh.js +19 -4
- package/package.json +1 -1
- package/statusline.sh +7 -0
|
@@ -6,7 +6,14 @@ Use this context to answer accurately and concisely.
|
|
|
6
6
|
Reference specific files, conventions, or decisions when relevant.
|
|
7
7
|
If the context doesn't contain enough info, say so honestly.
|
|
8
8
|
Answer in the same language as the question.
|
|
9
|
-
Keep responses under 500 words unless more detail is needed
|
|
9
|
+
Keep responses under 500 words unless more detail is needed.
|
|
10
|
+
|
|
11
|
+
SECURITY RULES:
|
|
12
|
+
- READ-ONLY: Never suggest or execute destructive operations (DELETE, DROP, rm, reset --hard, etc.)
|
|
13
|
+
- NO SECRETS: Never include passwords, API keys, tokens, or credentials in your responses
|
|
14
|
+
- NO SENSITIVE DATA: Never expose personal data, database connection strings, or internal URLs
|
|
15
|
+
- If asked for sensitive information, respond: "I can't share this information via AskMesh for security reasons."
|
|
16
|
+
- You may share: code patterns, architecture decisions, file structures, conventions, public configs`;
|
|
10
17
|
export class AutoResponder {
|
|
11
18
|
client;
|
|
12
19
|
mcpServer = null;
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@ const TOKEN = process.env.ASKMESH_TOKEN;
|
|
|
11
11
|
const URL = process.env.ASKMESH_URL || 'https://api.askmesh.dev';
|
|
12
12
|
const server = new McpServer({
|
|
13
13
|
name: 'askmesh',
|
|
14
|
-
version: '0.10.
|
|
14
|
+
version: '0.10.7',
|
|
15
15
|
});
|
|
16
16
|
if (!TOKEN) {
|
|
17
17
|
// No token — start in setup-only mode
|
|
@@ -2,6 +2,7 @@ interface StatusCache {
|
|
|
2
2
|
pending: number;
|
|
3
3
|
active: number;
|
|
4
4
|
unread_replies: number;
|
|
5
|
+
loop_active: boolean;
|
|
5
6
|
last_update: string;
|
|
6
7
|
}
|
|
7
8
|
/** Call once at startup with the agent token to isolate the cache file per agent */
|
|
@@ -13,4 +14,6 @@ export declare function onReplyAdded(): void;
|
|
|
13
14
|
export declare function onThreadClosed(): void;
|
|
14
15
|
export declare function onPendingFetched(count: number): void;
|
|
15
16
|
export declare function syncFromApi(pending: number, active: number): void;
|
|
17
|
+
export declare function setLoopActive(active: boolean): void;
|
|
18
|
+
export declare function isLoopActive(): boolean;
|
|
16
19
|
export {};
|
package/dist/statusline/cache.js
CHANGED
|
@@ -3,7 +3,7 @@ import { createHash } from 'crypto';
|
|
|
3
3
|
import { tmpdir } from 'os';
|
|
4
4
|
import { join } from 'path';
|
|
5
5
|
let CACHE_FILE = join(tmpdir(), 'askmesh_status.json');
|
|
6
|
-
let cache = { pending: 0, active: 0, unread_replies: 0, last_update: '' };
|
|
6
|
+
let cache = { pending: 0, active: 0, unread_replies: 0, loop_active: false, last_update: '' };
|
|
7
7
|
/** Call once at startup with the agent token to isolate the cache file per agent */
|
|
8
8
|
export function init(token) {
|
|
9
9
|
const hash = createHash('md5').update(token).digest('hex').slice(0, 8);
|
|
@@ -25,7 +25,7 @@ export function load() {
|
|
|
25
25
|
cache = JSON.parse(raw);
|
|
26
26
|
}
|
|
27
27
|
catch {
|
|
28
|
-
cache = { pending: 0, active: 0, unread_replies: 0, last_update: '' };
|
|
28
|
+
cache = { pending: 0, active: 0, unread_replies: 0, loop_active: false, last_update: '' };
|
|
29
29
|
}
|
|
30
30
|
return cache;
|
|
31
31
|
}
|
|
@@ -58,3 +58,12 @@ export function syncFromApi(pending, active) {
|
|
|
58
58
|
cache.unread_replies = 0;
|
|
59
59
|
flush();
|
|
60
60
|
}
|
|
61
|
+
export function setLoopActive(active) {
|
|
62
|
+
load();
|
|
63
|
+
cache.loop_active = active;
|
|
64
|
+
flush();
|
|
65
|
+
}
|
|
66
|
+
export function isLoopActive() {
|
|
67
|
+
load();
|
|
68
|
+
return cache.loop_active;
|
|
69
|
+
}
|
package/dist/tools/askmesh.js
CHANGED
|
@@ -35,8 +35,10 @@ Actions disponibles :
|
|
|
35
35
|
- "broadcast" : envoyer un message à toute ton équipe (notification Telegram/Slack, sans créer de thread)
|
|
36
36
|
- "context" : partager ton contexte projet avec ton équipe
|
|
37
37
|
- "setup" : installer les slash commands (/ask-inbox, /ask-broadcast, etc.) et la status line dans le projet courant
|
|
38
|
-
- "update" : vérifier les mises à jour du MCP, mettre à jour les skills et la status line
|
|
39
|
-
|
|
38
|
+
- "update" : vérifier les mises à jour du MCP, mettre à jour les skills et la status line
|
|
39
|
+
- "loop-start" : marquer le loop comme actif (utilisé par /ask-loop)
|
|
40
|
+
- "loop-stop" : arrêter le loop (utilisé par /ask-loop-stop)`, {
|
|
41
|
+
action: z.enum(['ask', 'list', 'status', 'pending', 'inbox', 'answer', 'reply', 'thread', 'close', 'my-threads', 'board', 'progress', 'broadcast', 'context', 'setup', 'update', 'loop-start', 'loop-stop']).describe('Action à effectuer'),
|
|
40
42
|
username: z.string().optional().describe("Username de l'agent cible (pour ask/status)"),
|
|
41
43
|
question: z.string().optional().describe('Question à poser (pour ask)'),
|
|
42
44
|
requestId: z.number().optional().describe('ID de la requête (pour answer/reply/thread/close/progress)'),
|
|
@@ -233,8 +235,19 @@ Actions disponibles :
|
|
|
233
235
|
case 'update': {
|
|
234
236
|
return await checkUpdateAndSetup();
|
|
235
237
|
}
|
|
238
|
+
case 'loop-start': {
|
|
239
|
+
if (statusCache.isLoopActive()) {
|
|
240
|
+
return text('Un loop est déjà actif. Utilise /ask-loop-stop pour l\'arrêter avant d\'en lancer un nouveau.');
|
|
241
|
+
}
|
|
242
|
+
statusCache.setLoopActive(true);
|
|
243
|
+
return text('Loop activé. La status line affiche maintenant l\'indicateur "loop".');
|
|
244
|
+
}
|
|
245
|
+
case 'loop-stop': {
|
|
246
|
+
statusCache.setLoopActive(false);
|
|
247
|
+
return text('Loop arrêté.');
|
|
248
|
+
}
|
|
236
249
|
default:
|
|
237
|
-
return text('Action inconnue.
|
|
250
|
+
return text('Action inconnue.');
|
|
238
251
|
}
|
|
239
252
|
});
|
|
240
253
|
}
|
|
@@ -264,7 +277,7 @@ Si l'utilisateur n'a pas encore de compte, dirige-le vers https://askmesh.dev po
|
|
|
264
277
|
return text('Action inconnue.');
|
|
265
278
|
});
|
|
266
279
|
}
|
|
267
|
-
const CURRENT_VERSION = '0.10.
|
|
280
|
+
const CURRENT_VERSION = '0.10.7';
|
|
268
281
|
async function checkUpdateAndSetup() {
|
|
269
282
|
const lines = [];
|
|
270
283
|
lines.push(`Version actuelle : ${CURRENT_VERSION}`);
|
|
@@ -319,6 +332,8 @@ function setupSkillsAndStatusLine(token, pollInterval, url) {
|
|
|
319
332
|
'ask-status.md': `Utilise l'outil MCP askmesh avec l'action "list" pour voir qui est connecté sur le réseau.\n\nAffiche la liste des membres de l'équipe avec leur statut (online/offline) de manière claire et concise.`,
|
|
320
333
|
'ask-setup.md': `Utilise l'outil MCP askmesh avec l'action "setup" pour installer ou mettre à jour la configuration AskMesh dans ce projet.\n\nCela va :\n- Créer ou vérifier le .env avec le token AskMesh\n- Installer les slash commands (/ask-inbox, /ask-broadcast, etc.)\n- Configurer la status line\n- Ajouter .env au .gitignore\n\nSi l'utilisateur fournit un token dans les arguments ($ARGUMENTS), passe-le en paramètre "token".`,
|
|
321
334
|
'ask-update.md': `Utilise l'outil MCP askmesh avec l'action "update" pour vérifier les mises à jour et mettre à jour les skills et la status line.\n\nCela va :\n- Vérifier si une nouvelle version du MCP est disponible sur npm\n- Mettre à jour les slash commands\n- Mettre à jour le script de status line\n\nSi une mise à jour est disponible, indique à l'utilisateur comment l'installer (relancer Claude Code ou npx clear-npx-cache).`,
|
|
335
|
+
'ask-loop.md': `Lance une boucle de vérification périodique des messages AskMesh.\n\nÉtapes :\n1. D'abord, utilise l'outil MCP askmesh avec l'action "loop-start" pour vérifier qu'aucun loop n'est déjà actif et marquer le loop comme actif\n2. Si le loop-start réussit, lance : /loop <intervalle ou 2m> /ask-inbox\n\nArguments optionnels : $ARGUMENTS (intervalle, ex: "2m", "5m", "30s")\nPar défaut : 2m\n\nSi un loop est déjà actif, préviens l'utilisateur et propose /ask-loop-stop.`,
|
|
336
|
+
'ask-loop-stop.md': `Arrête la boucle de vérification périodique des messages AskMesh.\n\nÉtapes :\n1. Utilise l'outil MCP askmesh avec l'action "loop-stop" pour marquer le loop comme inactif\n2. Indique à l'utilisateur que le loop est arrêté\n\nNote : cela met à jour la status line pour retirer l'indicateur "loop".`,
|
|
322
337
|
};
|
|
323
338
|
// Create commands directory
|
|
324
339
|
try {
|
package/package.json
CHANGED
package/statusline.sh
CHANGED
|
@@ -11,6 +11,7 @@ hash="$1"
|
|
|
11
11
|
pending=0
|
|
12
12
|
active=0
|
|
13
13
|
replies=0
|
|
14
|
+
loop="false"
|
|
14
15
|
|
|
15
16
|
if [ -n "$hash" ]; then
|
|
16
17
|
# Read specific agent cache
|
|
@@ -19,6 +20,7 @@ if [ -n "$hash" ]; then
|
|
|
19
20
|
pending=$(jq -r '.pending // 0' "$f" 2>/dev/null)
|
|
20
21
|
active=$(jq -r '.active // 0' "$f" 2>/dev/null)
|
|
21
22
|
replies=$(jq -r '.unread_replies // 0' "$f" 2>/dev/null)
|
|
23
|
+
loop=$(jq -r '.loop_active // false' "$f" 2>/dev/null)
|
|
22
24
|
fi
|
|
23
25
|
else
|
|
24
26
|
# Fallback: aggregate all agent caches
|
|
@@ -27,14 +29,19 @@ else
|
|
|
27
29
|
p=$(jq -r '.pending // 0' "$f" 2>/dev/null)
|
|
28
30
|
a=$(jq -r '.active // 0' "$f" 2>/dev/null)
|
|
29
31
|
r=$(jq -r '.unread_replies // 0' "$f" 2>/dev/null)
|
|
32
|
+
l=$(jq -r '.loop_active // false' "$f" 2>/dev/null)
|
|
30
33
|
pending=$((pending + p))
|
|
31
34
|
active=$((active + a))
|
|
32
35
|
replies=$((replies + r))
|
|
36
|
+
[ "$l" = "true" ] && loop="true"
|
|
33
37
|
done
|
|
34
38
|
fi
|
|
35
39
|
|
|
36
40
|
parts=()
|
|
37
41
|
|
|
42
|
+
if [ "$loop" = "true" ]; then
|
|
43
|
+
parts+=("\033[35mloop\033[0m")
|
|
44
|
+
fi
|
|
38
45
|
if [ "$pending" -gt 0 ] 2>/dev/null; then
|
|
39
46
|
parts+=("\033[33m${pending} pending\033[0m")
|
|
40
47
|
fi
|