@mmmbuto/nexuscrew 0.8.31 → 0.8.33

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.
@@ -11,7 +11,7 @@
11
11
  <meta name="apple-mobile-web-app-title" content="NexusCrew" />
12
12
  <link rel="manifest" href="/manifest.json" />
13
13
  <title>NexusCrew</title>
14
- <script type="module" crossorigin src="/assets/index-CZxcRYUd.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-CP5MeWCH.js"></script>
15
15
  <link rel="stylesheet" crossorigin href="/assets/index-CrggFFKZ.css">
16
16
  </head>
17
17
  <body>
@@ -1 +1 @@
1
- {"version":"0.8.31"}
1
+ {"version":"0.8.33"}
@@ -36,6 +36,20 @@ function minimalEnv() {
36
36
  return minimalRuntimeEnv(process.env, { home: os.homedir() });
37
37
  }
38
38
 
39
+ // tmux reports client-side connection failures through localized stderr. The
40
+ // migration classifier must see the stable POSIX wording on every platform,
41
+ // otherwise a missing first-boot socket could disable Fleet under a non-English
42
+ // locale. Restrict only the message locale: LC_ALL=C would also force ASCII
43
+ // character handling and tmux would sanitize the tab in our format string.
44
+ // Panes, the shared server and the inventory protocol keep a UTF-8 LC_CTYPE.
45
+ function tmuxInventoryEnv() {
46
+ const env = minimalEnv();
47
+ delete env.LC_ALL; // LC_ALL would override LC_MESSAGES and LC_CTYPE.
48
+ env.LANGUAGE = 'C';
49
+ env.LC_MESSAGES = 'C';
50
+ return env;
51
+ }
52
+
39
53
  // httpError(status, msg, data?, cause?) — structured HTTP error. `data` carries
40
54
  // arbitrary API detail for the response body; `cause` (T4) is the OPTIONAL
41
55
  // bounded failure triple {phase, code} of the up() boundary that failed. The
@@ -170,10 +184,10 @@ async function migrateLegacyTmuxSessions(tmuxBin, defs, { readonly = false } = {
170
184
  };
171
185
  }
172
186
  const listing = await tmuxExec(tmuxBin,
173
- ['list-sessions', '-F', '#{session_id}\t#{session_name}'], { env: minimalEnv() });
187
+ ['list-sessions', '-F', '#{session_id}\t#{session_name}'], { env: tmuxInventoryEnv() });
174
188
  if (listing.err) {
175
189
  const detail = boundedTmuxFailure(listing);
176
- if (/no server running|failed to connect|connection refused|no such file.*tmux/i.test(detail)) {
190
+ if (/no server running|failed to connect|connection refused|no such file.*tmux|error connecting to .*\(no such file or directory\)/i.test(detail)) {
177
191
  return { migrated: [], reason: 'no-tmux-server', needsPersistence: legacyMap.size > 0 };
178
192
  }
179
193
  throw tmuxMigrationError('TMUX_MIGRATION_LIST_FAILED',
package/lib/mcp/server.js CHANGED
@@ -25,6 +25,7 @@ const { loadConfig } = require('../config.js');
25
25
  const { readTokenSafe } = require('../auth/token.js');
26
26
  const { isValidSession } = require('../files/store.js');
27
27
  const VERSION = require('../../package.json').version;
28
+ const MCP_COMPANIONS = require('../../mcp-companions.json');
28
29
  const { TOOLS, IDENTITY_CODE, IDENTITY_REMEDIATION } = require('./tools.js');
29
30
  const cells = require('./cells.js');
30
31
 
@@ -38,6 +39,17 @@ const INVALID_REQUEST = -32600;
38
39
  const METHOD_NOT_FOUND = -32601;
39
40
  const INVALID_PARAMS = -32602;
40
41
 
42
+ function companionInstructions() {
43
+ const catalog = MCP_COMPANIONS.companions
44
+ .map((item) => `${item.id}: ${item.name} (${item.repository})`)
45
+ .join('; ');
46
+ return 'Discover the current client tools before recommending another MCP server. '
47
+ + 'If a requested capability is missing, these optional NexusCrew companions may cover it: '
48
+ + `${catalog}. Recommend only the capability actually needed and ask before installing `
49
+ + 'software, changing MCP configuration, starting services or requesting credentials. '
50
+ + 'NexusCrew does not install or configure companions automatically.';
51
+ }
52
+
41
53
  // --- identita' cella mittente ------------------------------------------------
42
54
  // Ordine (design §1, INVARIATO): $TMUX presente -> `tmux display-message -p '#S'`
43
55
  // (nome sessione reale); se fallisce/invalida -> fallback env NEXUSCREW_MCP_SESSION;
@@ -246,6 +258,7 @@ function createMcpServer(opts = {}) {
246
258
  protocolVersion: pv,
247
259
  capabilities: { tools: {} },
248
260
  serverInfo: { name: 'nexuscrew', version: VERSION },
261
+ instructions: companionInstructions(),
249
262
  });
250
263
  }
251
264
  if (method === 'ping') return reply(id, {});
@@ -0,0 +1,103 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "nexuscrew-mcp-companions",
4
+ "policy": {
5
+ "optional": true,
6
+ "discoverToolsFirst": true,
7
+ "recommendOnlyForRequestedCapability": true,
8
+ "automaticInstall": false,
9
+ "automaticConfiguration": false
10
+ },
11
+ "companions": [
12
+ {
13
+ "id": "memory",
14
+ "name": "mcp-memory-rs",
15
+ "repository": "https://github.com/DioNanos/mcp-memory-rs",
16
+ "installation": "https://github.com/DioNanos/mcp-memory-rs#install",
17
+ "license": "Apache-2.0",
18
+ "bundledSkill": "skills/memory/SKILL.md",
19
+ "capabilities": [
20
+ "durable structured agent state",
21
+ "versioned categories",
22
+ "bounded append-only journals",
23
+ "full-text memory search"
24
+ ],
25
+ "primaryTools": [
26
+ "memory_read",
27
+ "memory_write",
28
+ "memory_append",
29
+ "memory_search",
30
+ "memory_status"
31
+ ]
32
+ },
33
+ {
34
+ "id": "msa",
35
+ "name": "mcp-vl-msa-rs",
36
+ "repository": "https://github.com/DioNanos/mcp-vl-msa-rs",
37
+ "installation": "https://github.com/DioNanos/mcp-vl-msa-rs#install",
38
+ "license": "Apache-2.0",
39
+ "bundledSkill": "skills/vl-msa/SKILL.md",
40
+ "capabilities": [
41
+ "persistent document collections",
42
+ "BM25 and optional hybrid retrieval",
43
+ "full-source grounding",
44
+ "bounded multi-hop retrieval"
45
+ ],
46
+ "primaryTools": [
47
+ "msa_index",
48
+ "msa_index_batch",
49
+ "msa_search",
50
+ "msa_fetch_doc",
51
+ "msa_remember",
52
+ "msa_forget",
53
+ "msa_interleave_round"
54
+ ]
55
+ },
56
+ {
57
+ "id": "crew",
58
+ "name": "mcp-crewd-rs",
59
+ "repository": "https://github.com/DioNanos/mcp-crewd-rs",
60
+ "installation": "https://github.com/DioNanos/mcp-crewd-rs#install",
61
+ "license": "Apache-2.0",
62
+ "bundledSkill": "skills/crew/SKILL.md",
63
+ "capabilities": [
64
+ "bounded AI worker spawning",
65
+ "task status and structured results",
66
+ "controlled inter-cell messaging"
67
+ ],
68
+ "primaryTools": [
69
+ "cell_spawn",
70
+ "cell_send_task",
71
+ "cell_status",
72
+ "cell_result",
73
+ "cell_list",
74
+ "cell_send",
75
+ "cell_ask"
76
+ ]
77
+ },
78
+ {
79
+ "id": "mail",
80
+ "name": "mcp-email-rs",
81
+ "repository": "https://github.com/DioNanos/mcp-email-rs",
82
+ "installation": "https://github.com/DioNanos/mcp-email-rs#install",
83
+ "license": "Apache-2.0",
84
+ "bundledSkill": "skills/mail-assistant/SKILL.md",
85
+ "capabilities": [
86
+ "IMAP mailbox discovery",
87
+ "mail search and reading",
88
+ "attachments and folders",
89
+ "drafts and optional SMTP sending"
90
+ ],
91
+ "primaryTools": [
92
+ "list_folders",
93
+ "list_emails",
94
+ "search_emails",
95
+ "get_email",
96
+ "download_attachment",
97
+ "create_draft",
98
+ "send_email",
99
+ "email_doctor"
100
+ ]
101
+ }
102
+ ]
103
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmmbuto/nexuscrew",
3
- "version": "0.8.31",
3
+ "version": "0.8.33",
4
4
  "description": "Faithful browser tmux client — attach to live sessions over a real PTY, localhost-only, mobile-easy",
5
5
  "main": "lib/server.js",
6
6
  "bin": {
@@ -13,6 +13,8 @@
13
13
  "frontend/dist/",
14
14
  "frontend/index.html",
15
15
  "CHANGELOG.md",
16
+ "MCP_COMPANIONS.md",
17
+ "mcp-companions.json",
16
18
  "LICENSE",
17
19
  "README.md",
18
20
  "NOTICE"
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: crew
3
+ description: Use when spawning or coordinating bounded AI worker cells through a Crew MCP fabric, including cell discovery, idempotent spawn, status monitoring, structured results, follow-up tasks, cancellation and the inter-cell message bus. Covers safe worktree isolation, durable audit reports and user-language selection.
4
+ ---
5
+
6
+ # Crew
7
+
8
+ Use Crew for bounded delegated work. A coordinator submits tasks to worker
9
+ cells through an MCP server; spawning is asynchronous and returns a thread ID.
10
+
11
+ ## Select response language
12
+
13
+ Choose the language for user-facing explanations and summaries in this order:
14
+
15
+ 1. the user's explicit language preference;
16
+ 2. the language of the current request;
17
+ 3. a reliable client or system locale;
18
+ 4. English.
19
+
20
+ Keep cell names, engine/profile IDs, thread IDs, tool names, paths and quoted
21
+ worker output unchanged unless the user explicitly asks to translate them.
22
+ Tell a worker which output language is required when its deliverable is
23
+ user-facing.
24
+
25
+ ## Discover before spawning
26
+
27
+ 1. Use `cell_list` to inspect the cells and engines visible to the caller.
28
+ 2. Select an engine/profile appropriate to the bounded task.
29
+ 3. Verify that the worker's `cwd` contains the instructions and project context
30
+ it needs.
31
+ 4. Do not assume an embedded worker inherits the coordinator's MCP servers.
32
+ Required servers must be configured explicitly in the Crew daemon and
33
+ verified inside a fresh worker.
34
+
35
+ If no Crew tools are exposed and this skill is packaged with NexusCrew, the
36
+ optional companion is documented in `../../MCP_COMPANIONS.md`. Explain the
37
+ missing capability and ask before installing, configuring or starting it.
38
+
39
+ ## Spawn, monitor and collect
40
+
41
+ 1. Call `cell_spawn` with a bounded task, explicit `cwd`, background mode and a
42
+ caller-stable `idempotency_key`.
43
+ 2. Keep the returned `crewd_thread_id`; a replayed idempotency key must resolve
44
+ to the existing thread rather than duplicate work.
45
+ 3. Monitor with `cell_status`. Use the host's loop or scheduler for waits rather
46
+ than a tight manual poll.
47
+ 4. Treat `idle` as normal turn completion. Also handle `timeout`, `failed`,
48
+ `interrupted` and `failed_unknown`; do not wait for a fictional `finished`
49
+ state.
50
+ 5. Read `cell_result` and inspect `exit_status`, `final_answer` and the bounded
51
+ event tail.
52
+ 6. Verify the worker's files and tests yourself before accepting code changes.
53
+
54
+ A timeout may leave partial edits. Never report success from a thread state
55
+ alone.
56
+
57
+ ## Isolate code work
58
+
59
+ - Do not let two mutating workers edit the same worktree concurrently.
60
+ - Give parallel code tasks separate git worktrees.
61
+ - Preserve unrelated user changes and review every worker diff.
62
+ - Use follow-up tasks only when the original thread and scope remain valid.
63
+ - Cancel only the exact thread the user authorized.
64
+
65
+ ## Require durable audit evidence
66
+
67
+ For audits, reviews and release gates:
68
+
69
+ 1. Choose an authorized absolute report path before spawning, preferably
70
+ outside the repository being audited.
71
+ 2. Require scope, evidence, findings by severity, residual risks and a terminal
72
+ verdict in the report.
73
+ 3. Require the worker callback to identify the report path and verdict.
74
+ 4. Verify that the report is a non-symlink regular file, read it completely and
75
+ confirm its verdict matches the callback.
76
+ 5. Recalculate important hashes and gates independently.
77
+
78
+ Chat output or `cell_result.final_answer` is not a substitute for the verified
79
+ report.
80
+
81
+ ## Use the message bus deliberately
82
+
83
+ - `cell_send` is fire-and-forget.
84
+ - `cell_ask` plus `cell_await` is appropriate when a reply is required.
85
+ - `cell_send_task` starts a follow-up turn on an existing thread.
86
+ - `cell_inbox` reads queued bus messages.
87
+
88
+ Transport receipts do not prove task acceptance or completion. Report only
89
+ results that have been verified.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Crew"
3
+ short_description: "Coordinate bounded AI worker cells"
4
+ default_prompt: "Use crew to delegate this bounded task and collect a verified result."
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: mail-assistant
3
+ description: Use for mailbox discovery, email search and reading, priority triage, attachment review, folder organisation, reply drafting, explicit sending, or recurring mail checks through an available Gmail or IMAP/SMTP MCP connector. Select the user-facing language from the request and the draft language from the thread, while preserving read-before-write discipline and explicit confirmation for consequential mail actions.
4
+ ---
5
+
6
+ # Mail Assistant
7
+
8
+ Use the mail tools already exposed by the current client. Discover folders,
9
+ sender identities and supported operations live; never assume provider-specific
10
+ folder names or account configuration.
11
+
12
+ ## Select languages
13
+
14
+ Choose the language for digests, questions and explanations in this order:
15
+
16
+ 1. the user's explicit language preference;
17
+ 2. the language of the current request;
18
+ 3. a reliable client or system locale;
19
+ 4. English.
20
+
21
+ Write a reply draft in the language of the email thread unless the user asks
22
+ for another language. Preserve names, quoted text and required legal or
23
+ technical terms; do not translate them merely to match the interface language.
24
+
25
+ ## Choose tools
26
+
27
+ 1. Prefer an exposed Gmail connector for Gmail-hosted workflows.
28
+ 2. Otherwise use an exposed IMAP/SMTP mail MCP such as `mcp-email-rs`.
29
+ 3. Search narrowly before listing large folders, and fetch complete message
30
+ bodies only when needed for classification, attachments or drafting.
31
+ 4. If no mail tool is available, explain the missing capability. When this
32
+ skill is packaged with NexusCrew, the optional companion is documented in
33
+ `../../MCP_COMPANIONS.md`. Do not install or configure it without consent.
34
+
35
+ ## Apply the safety boundary
36
+
37
+ - Reading and searching are allowed when the user asks to inspect mail.
38
+ - Treat moves, flags, drafts, folder changes and calendar/reminder creation as
39
+ explicit mutations; perform only the mutation the user requested.
40
+ - Treat deletion and sending as consequential external actions. Confirm the
41
+ exact targets and intended content immediately before acting unless the
42
+ user's current request already gives unambiguous final authorization.
43
+ - Prefer recoverable archive or Trash moves over permanent deletion.
44
+ - Re-fetch message identifiers after moves; IMAP UIDs are folder-scoped and
45
+ can change.
46
+ - Never expose credentials, authentication links or sensitive message content
47
+ in logs, push notifications, TTS or unrelated summaries.
48
+ - Never infer an authorised sender identity. Use identities returned by the
49
+ connector or explicitly supplied by the user.
50
+
51
+ ## Triage and draft
52
+
53
+ 1. Fetch the smallest useful set of messages.
54
+ 2. Classify each item as urgent/action required, reply soon, waiting, or
55
+ informational, using the user's own priorities when available.
56
+ 3. Read attachments only when necessary and identify their type before
57
+ downloading.
58
+ 4. Present a compact digest with evidence from the messages and a proposed
59
+ next action.
60
+ 5. Draft only when requested. Preserve the user's tone, distinguish facts from
61
+ assumptions and leave unresolved details visible.
62
+ 6. Before sending, show or re-confirm recipients, subject, body and attachments.
63
+ 7. Report only actions that the tool actually completed.
64
+
65
+ ## Recurring checks
66
+
67
+ Create recurring monitoring only when explicitly requested. Use the
68
+ client-native scheduler or loop mechanism instead of manual polling, avoid
69
+ duplicate jobs, respect quiet hours, and remain silent on unchanged ticks when
70
+ the host workflow supports silent monitoring. A recurring authorization does
71
+ not automatically authorize sending or permanent deletion.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Mail Assistant"
3
+ short_description: "Safely triage and draft email in context"
4
+ default_prompt: "Use mail-assistant to review my new mail and prepare a concise action digest."
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: memory
3
+ description: Use when reading or writing persistent AI-agent state through a Memory MCP server, including category discovery, versioned reads and writes, merge patches, optimistic concurrency, bounded append-only journals, search, context loading and history. Keep durable state separate from bounded logs and choose the user-facing language from the request.
4
+ ---
5
+
6
+ # Memory
7
+
8
+ Use the exposed Memory MCP tools rather than reading or editing the server's
9
+ database, cache or state files directly.
10
+
11
+ ## Select response language
12
+
13
+ Choose the language for explanations and summaries in this order:
14
+
15
+ 1. the user's explicit language preference;
16
+ 2. the language of the current request;
17
+ 3. a reliable client or system locale;
18
+ 4. English.
19
+
20
+ Keep category names, tool names, JSON fields, paths and quoted source text
21
+ unchanged unless the user explicitly asks to translate them.
22
+
23
+ ## Understand the model
24
+
25
+ - A category is a named JSON document. `memory_read` takes a `category`, not a
26
+ nested key.
27
+ - Reads may be broadly available while writes are scoped by the server's
28
+ device or actor ACL.
29
+ - Every write is versioned; inspect `memory_history` when provenance matters.
30
+ - Treat recalled state as a snapshot. Verify live files, flags and services
31
+ before acting on drift-prone facts.
32
+
33
+ ## Warm up narrowly
34
+
35
+ 1. Call `memory_list` to discover available categories.
36
+ 2. Read only relevant categories with `memory_read`, or load a bounded set with
37
+ `memory_context`.
38
+ 3. Use `memory_search` when the category is unknown.
39
+
40
+ Do not load every category by default.
41
+
42
+ ## Write safely
43
+
44
+ `memory_write {category, content}` replaces the category by default.
45
+
46
+ - Set `merge:true` for a top-level patch: supplied keys are inserted or
47
+ overwritten, JSON `null` deletes a key, and untouched keys remain.
48
+ - Pass `expected_hash` from the prior read/list result for read-modify-write
49
+ workflows so concurrent updates fail instead of being overwritten.
50
+ - Never write another device's namespace unless the server ACL and the user's
51
+ request explicitly authorize it.
52
+
53
+ ## Separate state from journals
54
+
55
+ Use `memory_append` for a bounded append-only log category. The server stamps
56
+ entries and prunes them according to retention.
57
+
58
+ - Do not simulate a journal by adding ever-growing dated keys to a normal
59
+ memory category.
60
+ - Do not use `memory_write` on a log category.
61
+ - Do not use `memory_append` on a normal memory category.
62
+
63
+ A useful convention is:
64
+
65
+ - `<name>_state`: lean declarative state, updated with `memory_write`;
66
+ - `<name>_log`: bounded event journal, updated with `memory_append`.
67
+
68
+ Facts that must never be pruned belong in normal durable state or an external
69
+ document store, not in a bounded log.
70
+
71
+ ## Search and inspect
72
+
73
+ - Use `memory_search` for BM25 full-text retrieval across categories.
74
+ - Use `memory_search_semantic` only when the server exposes and supports it.
75
+ - Use `memory_history` to inspect versions before restoring or explaining a
76
+ change.
77
+ - Report writes only after the tool confirms them.
78
+
79
+ If no Memory MCP tool is available and this skill is packaged with NexusCrew,
80
+ the optional companion is documented in `../../MCP_COMPANIONS.md`. Explain the
81
+ missing capability and ask before installing or configuring anything.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Memory"
3
+ short_description: "Use persistent agent memory safely"
4
+ default_prompt: "Use memory to inspect and update the durable state relevant to this task."
@@ -36,6 +36,26 @@ Apply these rules:
36
36
 
37
37
  The MCP server is the stdio command `nexuscrew mcp` and must be registered in the host AI client. If the `nc_*` tools are not exposed, report that the bridge is not configured in that session and use the fallback flows below where applicable.
38
38
 
39
+ ## Optional capability companions
40
+
41
+ NexusCrew does not make unrelated MCP servers hidden dependencies. When the
42
+ user requests durable structured memory, document retrieval, bounded worker
43
+ delegation or mailbox access:
44
+
45
+ 1. Discover the tools already exposed by the current AI client.
46
+ 2. Use an available tool that covers the request.
47
+ 3. If the capability is absent, consult the packaged
48
+ `../../mcp-companions.json` catalog and mention the matching optional
49
+ companion once.
50
+ 4. Explain the capability it adds and link its public repository.
51
+ 5. Ask before installing software, changing MCP configuration, starting a
52
+ service or requesting credentials.
53
+
54
+ Never recommend a companion during unrelated work, repeatedly advertise it, or
55
+ claim it is required by NexusCrew. The catalog is discovery metadata only; it
56
+ does not authorize installation or external actions. See
57
+ `../../MCP_COMPANIONS.md` for the human-readable guide.
58
+
39
59
  ## File exchange (inbox / outbox)
40
60
 
41
61
  Per session, NexusCrew watches `<root>/<session>/{inbox,outbox}` (root = `$NEXUSCREW_FILES_ROOT`, default `~/NexusFiles`):
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: vl-msa
3
+ description: Use when indexing or retrieving documents, notes, research or past conversations through a VL-MSA long-term-memory MCP server, including collections, batch indexing, BM25 or hybrid search, full-document grounding, remember/forget and bounded multi-hop interleaving. Enforce locate-then-ground retrieval and choose the user-facing language from the request.
4
+ ---
5
+
6
+ # VL MSA
7
+
8
+ Use VL-MSA for durable searchable source material. Collections persist across
9
+ sessions; BM25 works without embeddings, while hybrid reranking is optional.
10
+
11
+ ## Select response language
12
+
13
+ Choose the language for explanations and answers in this order:
14
+
15
+ 1. the user's explicit language preference;
16
+ 2. the language of the current request;
17
+ 3. a reliable client or system locale;
18
+ 4. English.
19
+
20
+ Keep collection IDs, document IDs, tool names, metadata fields and quoted
21
+ source text unchanged unless the user explicitly asks to translate them.
22
+
23
+ ## Locate, then ground
24
+
25
+ Retrieval has two required steps:
26
+
27
+ 1. Call `msa_search {collection, query, k}` to locate relevant chunks.
28
+ 2. Call `msa_fetch_doc` for the selected hit before using it as evidence.
29
+
30
+ Search chunks are locators, not complete sources. Do not answer a
31
+ context-dependent question from truncated snippets alone.
32
+
33
+ ## Index material
34
+
35
+ - Use `msa_index` for one document or note.
36
+ - Use `msa_index_batch` for bulk ingest.
37
+ - Group related material into a stable named collection.
38
+ - Inspect `msa_list_collections`, `msa_stats` or `msa_manifest` before assuming
39
+ a collection exists or is populated.
40
+
41
+ Index only material the user is authorized to store. Preserve provenance and
42
+ do not place credentials or unrelated personal data in collection metadata.
43
+
44
+ ## Manage standalone memories
45
+
46
+ - Use `msa_remember` for a standalone agent memory. Its deduplication and
47
+ low-signal gate may decline a write.
48
+ - Use `msa_forget` for an explicitly requested removal.
49
+
50
+ Do not claim a memory was stored or removed until the tool confirms the
51
+ outcome.
52
+
53
+ ## Handle multi-hop questions
54
+
55
+ Use `msa_interleave_round` for one bounded route, deduplicate and read step.
56
+ Repeat only as needed, carrying forward the grounded facts from the prior
57
+ round. Avoid a single unbounded search.
58
+
59
+ ## Choose ranking
60
+
61
+ - Use BM25 by default.
62
+ - Pass `dense_alpha` only when the server is built and configured for hybrid
63
+ retrieval.
64
+ - Do not describe lexical-only results as semantic retrieval.
65
+
66
+ If no VL-MSA tool is available and this skill is packaged with NexusCrew, the
67
+ optional companion is documented in `../../MCP_COMPANIONS.md`. Explain the
68
+ missing capability and ask before installing or configuring anything.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "VL MSA"
3
+ short_description: "Index and ground long-term knowledge"
4
+ default_prompt: "Use vl-msa to find and ground the relevant source documents for this question."