trinity-lite 0.5.2__tar.gz → 0.5.3__tar.gz

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.
Files changed (39) hide show
  1. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/PKG-INFO +5 -2
  2. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/README.md +4 -1
  3. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/pyproject.toml +1 -1
  4. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/tests/test_mcp_server.py +10 -0
  5. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/__init__.py +1 -1
  6. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/mcp_server.py +148 -57
  7. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite.egg-info/PKG-INFO +5 -2
  8. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/LICENSE +0 -0
  9. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/setup.cfg +0 -0
  10. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/tests/test_bus.py +0 -0
  11. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/tests/test_cli.py +0 -0
  12. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/tests/test_doctor.py +0 -0
  13. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/tests/test_guard.py +0 -0
  14. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/tests/test_orchestrator.py +0 -0
  15. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/tests/test_pipeline.py +0 -0
  16. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/tests/test_router.py +0 -0
  17. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/tests/test_worker.py +0 -0
  18. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/__main__.py +0 -0
  19. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/adapters.py +0 -0
  20. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/bus.py +0 -0
  21. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/cli.py +0 -0
  22. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/config.py +0 -0
  23. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/doctor.py +0 -0
  24. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/guard.py +0 -0
  25. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/model_autodetect.py +0 -0
  26. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/model_pool_wizard.py +0 -0
  27. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/model_selector.py +0 -0
  28. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/orchestrator.py +0 -0
  29. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/paths.py +0 -0
  30. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/pipeline.py +0 -0
  31. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/py.typed +0 -0
  32. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/router.py +0 -0
  33. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/validation.py +0 -0
  34. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite/worker.py +0 -0
  35. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite.egg-info/SOURCES.txt +0 -0
  36. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite.egg-info/dependency_links.txt +0 -0
  37. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite.egg-info/entry_points.txt +0 -0
  38. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite.egg-info/requires.txt +0 -0
  39. {trinity_lite-0.5.2 → trinity_lite-0.5.3}/trinity_lite.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trinity-lite
3
- Version: 0.5.2
3
+ Version: 0.5.3
4
4
  Summary: The bus that lets your AI agents talk to each other.
5
5
  Author: Yomiracle
6
6
  License-Expression: MIT
@@ -31,10 +31,11 @@ Dynamic: license-file
31
31
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](pyproject.toml)
32
32
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
33
33
  [![PyPI](https://img.shields.io/pypi/v/trinity-lite.svg)](https://pypi.org/project/trinity-lite/)
34
+ [![Yomiracle/trinity-lite MCP server](https://glama.ai/mcp/servers/Yomiracle/trinity-lite/badges/score.svg)](https://glama.ai/mcp/servers/Yomiracle/trinity-lite/score)
34
35
 
35
36
  **Local-first multi-agent orchestration for CLI AI agents.**
36
37
 
37
- [中文 README](README_zh.md)
38
+ [中文 README](README_zh.md) · [Docs](docs/index.md) · [Why Trinity Lite?](docs/WHY_TRINITY_LITE.md) · [Recipes](docs/recipes/generic-cli.md)
38
39
 
39
40
  ## The problem
40
41
 
@@ -217,6 +218,8 @@ Works with 1 model, 2 models, or 10 models. No agent names hardcoded.
217
218
 
218
219
  - [PyPI](https://pypi.org/project/trinity-lite/)
219
220
  - [Documentation](docs/)
221
+ - [Why Trinity Lite?](docs/WHY_TRINITY_LITE.md)
222
+ - [Recipes](docs/recipes/generic-cli.md)
220
223
  - [Changelog](CHANGELOG.md)
221
224
  - [Contributing](CONTRIBUTING.md)
222
225
  - [Architecture](docs/ARCHITECTURE.md)
@@ -4,10 +4,11 @@
4
4
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](pyproject.toml)
5
5
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
6
6
  [![PyPI](https://img.shields.io/pypi/v/trinity-lite.svg)](https://pypi.org/project/trinity-lite/)
7
+ [![Yomiracle/trinity-lite MCP server](https://glama.ai/mcp/servers/Yomiracle/trinity-lite/badges/score.svg)](https://glama.ai/mcp/servers/Yomiracle/trinity-lite/score)
7
8
 
8
9
  **Local-first multi-agent orchestration for CLI AI agents.**
9
10
 
10
- [中文 README](README_zh.md)
11
+ [中文 README](README_zh.md) · [Docs](docs/index.md) · [Why Trinity Lite?](docs/WHY_TRINITY_LITE.md) · [Recipes](docs/recipes/generic-cli.md)
11
12
 
12
13
  ## The problem
13
14
 
@@ -190,6 +191,8 @@ Works with 1 model, 2 models, or 10 models. No agent names hardcoded.
190
191
 
191
192
  - [PyPI](https://pypi.org/project/trinity-lite/)
192
193
  - [Documentation](docs/)
194
+ - [Why Trinity Lite?](docs/WHY_TRINITY_LITE.md)
195
+ - [Recipes](docs/recipes/generic-cli.md)
193
196
  - [Changelog](CHANGELOG.md)
194
197
  - [Contributing](CONTRIBUTING.md)
195
198
  - [Architecture](docs/ARCHITECTURE.md)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "trinity-lite"
7
- version = "0.5.2"
7
+ version = "0.5.3"
8
8
  description = "The bus that lets your AI agents talk to each other."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -107,10 +107,20 @@ class McpServerTest(unittest.TestCase):
107
107
  for t in tools:
108
108
  self.assertIn("name", t)
109
109
  self.assertIn("description", t)
110
+ self.assertGreaterEqual(len(t["description"].split()), 20)
111
+ self.assertIn("annotations", t)
112
+ self.assertIn("readOnlyHint", t["annotations"])
113
+ self.assertIn("destructiveHint", t["annotations"])
114
+ self.assertIn("idempotentHint", t["annotations"])
115
+ self.assertIn("openWorldHint", t["annotations"])
110
116
  self.assertIn("inputSchema", t)
111
117
  self.assertEqual(t["inputSchema"]["type"], "object")
112
118
  self.assertIn("properties", t["inputSchema"])
113
119
  self.assertIn("required", t["inputSchema"])
120
+ by_name = {t["name"]: t for t in tools}
121
+ self.assertTrue(by_name["trinity_status"]["annotations"]["readOnlyHint"])
122
+ self.assertFalse(by_name["trinity_dispatch"]["annotations"]["readOnlyHint"])
123
+ self.assertTrue(by_name["trinity_dispatch"]["annotations"]["openWorldHint"])
114
124
 
115
125
  # ---- resources/list ----
116
126
 
@@ -1,3 +1,3 @@
1
1
  """Trinity Lite: a minimal public multi-agent task bus."""
2
2
 
3
- __version__ = "0.5.2"
3
+ __version__ = "0.5.3"
@@ -76,8 +76,8 @@ SERVER_VERSION = __version__
76
76
  # ---------------------------------------------------------------------------
77
77
 
78
78
 
79
- def _tool_def(name, description, properties, required):
80
- return {
79
+ def _tool_def(name, description, properties, required, annotations=None):
80
+ tool = {
81
81
  "name": name,
82
82
  "description": description,
83
83
  "inputSchema": {
@@ -86,139 +86,230 @@ def _tool_def(name, description, properties, required):
86
86
  "required": required,
87
87
  },
88
88
  }
89
+ if annotations:
90
+ tool["annotations"] = annotations
91
+ return tool
92
+
93
+
94
+ READ_ONLY_TOOL = {
95
+ "readOnlyHint": True,
96
+ "destructiveHint": False,
97
+ "idempotentHint": True,
98
+ "openWorldHint": False,
99
+ }
100
+
101
+
102
+ STATEFUL_LOCAL_TOOL = {
103
+ "readOnlyHint": False,
104
+ "destructiveHint": False,
105
+ "idempotentHint": False,
106
+ "openWorldHint": False,
107
+ }
108
+
109
+
110
+ AGENT_EXECUTION_TOOL = {
111
+ "readOnlyHint": False,
112
+ "destructiveHint": False,
113
+ "idempotentHint": False,
114
+ "openWorldHint": True,
115
+ }
116
+
117
+
118
+ def _desc(*parts):
119
+ return " ".join(part.strip() for part in parts)
89
120
 
90
121
 
91
122
  TOOL_DEFINITIONS = [
92
123
  _tool_def(
93
124
  "trinity_dispatch",
94
- "Dispatch an asynchronous task to a specific Trinity agent.",
125
+ _desc(
126
+ "Create a durable task for one explicit Trinity agent and run one worker cycle for that agent.",
127
+ "Use this when the caller already knows the target agent; use trinity_dispatch_auto when routing should choose the agent.",
128
+ "This writes to the local task database and may execute the configured agent command; with wait=true it returns the final compact task or a timeout error.",
129
+ ),
95
130
  {
96
- "target_agent": {"type": "string", "description": "Agent id to receive the task"},
97
- "task": {"type": "string", "description": "Task prompt"},
98
- "source_agent": {"type": "string", "description": "Originating agent id (default: mcp)"},
99
- "cwd": {"type": "string", "description": "Working directory (default: $HOME)"},
100
- "task_type": {"type": "string", "description": "Task type for routing"},
101
- "wait": {"type": "boolean", "description": "Block until task completes"},
102
- "wait_timeout": {"type": "number", "description": "Timeout in seconds for wait"},
131
+ "target_agent": {"type": "string", "description": "Exact recipient agent id, such as codex, claude_code, or hermes."},
132
+ "task": {"type": "string", "description": "Task prompt to persist and deliver to the target agent."},
133
+ "source_agent": {"type": "string", "description": "Originating agent id recorded on the task; defaults to mcp."},
134
+ "cwd": {"type": "string", "description": "Working directory passed to the task; defaults to the user's home directory."},
135
+ "task_type": {"type": "string", "description": "Optional task type metadata for routing and audit records."},
136
+ "wait": {"type": "boolean", "description": "If true, block until the task reaches a terminal state or wait_timeout expires."},
137
+ "wait_timeout": {"type": "number", "description": "Maximum seconds to wait when wait=true; defaults to the server wait timeout."},
103
138
  },
104
139
  ["target_agent", "task"],
140
+ AGENT_EXECUTION_TOOL,
105
141
  ),
106
142
  _tool_def(
107
143
  "trinity_dispatch_auto",
108
- "Resolve the route automatically then dispatch.",
144
+ _desc(
145
+ "Resolve the best Trinity agent with the local route table, create a durable task, and run one worker cycle.",
146
+ "Use this when the caller has a task but should not pick the agent manually; use trinity_dispatch for an explicit target.",
147
+ "This writes route evidence and task state to the local database and may execute the selected agent command; the result includes compact task and route metadata.",
148
+ ),
109
149
  {
110
- "task": {"type": "string", "description": "Task prompt"},
111
- "source_agent": {"type": "string", "description": "Originating agent id (default: mcp)"},
112
- "cwd": {"type": "string", "description": "Working directory (default: $HOME)"},
113
- "task_type": {"type": "string", "description": "Task type hint"},
114
- "previous_agent": {"type": "string", "description": "Previous agent for avoidance"},
115
- "wait": {"type": "boolean", "description": "Block until task completes"},
116
- "wait_timeout": {"type": "number", "description": "Timeout in seconds for wait"},
150
+ "task": {"type": "string", "description": "Task prompt used for route selection and delivery."},
151
+ "source_agent": {"type": "string", "description": "Originating agent id recorded on the task; defaults to mcp."},
152
+ "cwd": {"type": "string", "description": "Working directory passed to the selected agent; defaults to the user's home directory."},
153
+ "task_type": {"type": "string", "description": "Optional task type hint that can override or narrow route matching."},
154
+ "previous_agent": {"type": "string", "description": "Agent id to avoid when resolving opposite-review or retry routes."},
155
+ "wait": {"type": "boolean", "description": "If true, block until the routed task reaches a terminal state or wait_timeout expires."},
156
+ "wait_timeout": {"type": "number", "description": "Maximum seconds to wait when wait=true; defaults to the server wait timeout."},
117
157
  },
118
158
  ["task"],
159
+ AGENT_EXECUTION_TOOL,
119
160
  ),
120
161
  _tool_def(
121
162
  "trinity_orchestrate",
122
- "Orchestrate a multi-step pipeline from a YAML file or run the default review flow.",
163
+ _desc(
164
+ "Run a multi-step Trinity workflow from a pipeline file or the built-in implement-then-review flow.",
165
+ "Use this for work that needs sequencing, review gates, or multiple task records; use dispatch tools for a single agent task.",
166
+ "This creates and updates local task records and may execute one or more configured agent commands; it returns pipeline or review-flow evidence.",
167
+ ),
123
168
  {
124
- "task": {"type": "string", "description": "Task prompt"},
125
- "source_agent": {"type": "string", "description": "Originating agent id (default: mcp)"},
126
- "cwd": {"type": "string", "description": "Working directory (default: $HOME)"},
127
- "task_type": {"type": "string", "description": "Task type hint"},
128
- "previous_agent": {"type": "string", "description": "Previous agent for avoidance"},
129
- "pipeline": {"type": "string", "description": "Path to pipeline YAML file"},
130
- "wait": {"type": "boolean", "description": "Block until task completes"},
131
- "wait_timeout": {"type": "number", "description": "Timeout in seconds for wait"},
169
+ "task": {"type": "string", "description": "Top-level task prompt for the pipeline or review flow."},
170
+ "source_agent": {"type": "string", "description": "Originating agent id recorded on created tasks; defaults to mcp."},
171
+ "cwd": {"type": "string", "description": "Working directory used by pipeline steps or review flow; defaults to home."},
172
+ "task_type": {"type": "string", "description": "Optional task type hint for the default review flow route."},
173
+ "previous_agent": {"type": "string", "description": "Agent id to avoid when resolving reviewer or retry routes."},
174
+ "pipeline": {"type": "string", "description": "Path to a YAML pipeline file; omit to run the default review flow."},
175
+ "wait": {"type": "boolean", "description": "Reserved for wait-aware clients; pipeline workers run in-process."},
176
+ "wait_timeout": {"type": "number", "description": "Reserved wait timeout in seconds for wait-aware orchestration clients."},
132
177
  },
133
178
  ["task"],
179
+ AGENT_EXECUTION_TOOL,
134
180
  ),
135
181
  _tool_def(
136
182
  "trinity_status",
137
- "Get the current state and result of a task.",
183
+ _desc(
184
+ "Read the current state, result, route evidence, and acceptance metadata for one task id.",
185
+ "Use this after dispatch or orchestration to poll progress or recover a result after a timeout.",
186
+ "This is read-only and does not run workers or mark messages as read; it returns a compact task object or task-not-found error.",
187
+ ),
138
188
  {
139
- "task_id": {"type": "string", "description": "Task identifier"},
189
+ "task_id": {"type": "string", "description": "Task identifier returned by dispatch, orchestration, or task listing."},
140
190
  },
141
191
  ["task_id"],
192
+ READ_ONLY_TOOL,
142
193
  ),
143
194
  _tool_def(
144
195
  "trinity_tasks",
145
- "List recent tasks, optionally filtered by agent.",
196
+ _desc(
197
+ "List recent durable task records, optionally filtered by source or target agent.",
198
+ "Use this to inspect queue history or find a task id before calling trinity_status.",
199
+ "This is read-only, does not run workers, and returns compact task objects in recent-first order.",
200
+ ),
146
201
  {
147
- "agent": {"type": "string", "description": "Filter by agent (source or target)"},
148
- "limit": {"type": "integer", "description": "Maximum tasks to return (default: 20)"},
202
+ "agent": {"type": "string", "description": "Optional agent id to match against source_agent or target_agent."},
203
+ "limit": {"type": "integer", "description": "Maximum tasks to return; defaults to 20 and is capped by the server."},
149
204
  },
150
205
  [],
206
+ READ_ONLY_TOOL,
151
207
  ),
152
208
  _tool_def(
153
209
  "trinity_worker",
154
- "Run one worker cycle for a named agent.",
210
+ _desc(
211
+ "Run one local worker cycle for a named agent and process one queued task if available.",
212
+ "Use this to manually drain the queue or retry a specific queued task; use trinity_worker_daemon for a background worker.",
213
+ "This may execute the agent command and update task state; it returns no_task or the compact processed task.",
214
+ ),
155
215
  {
156
- "agent": {"type": "string", "description": "Agent id to run worker for"},
157
- "task_id": {"type": "string", "description": "Process a specific queued task"},
216
+ "agent": {"type": "string", "description": "Agent id whose queue should be processed."},
217
+ "task_id": {"type": "string", "description": "Optional specific queued task id to process instead of the next task."},
158
218
  },
159
219
  ["agent"],
220
+ AGENT_EXECUTION_TOOL,
160
221
  ),
161
222
  _tool_def(
162
223
  "trinity_worker_daemon",
163
- "Start, stop, or check status of a daemon worker.",
224
+ _desc(
225
+ "Start, stop, or check the local background worker process for one agent.",
226
+ "Use status for a process check, start to keep an agent queue draining, and stop to terminate that daemon.",
227
+ "Start and stop modify local process state and PID files; responses include running, started, stopped, pid, and pid_file fields.",
228
+ ),
164
229
  {
165
- "agent": {"type": "string", "description": "Agent name"},
166
- "action": {"type": "string", "enum": ["start", "stop", "status"], "description": "Action to perform"},
230
+ "agent": {"type": "string", "description": "Agent id whose worker daemon should be controlled."},
231
+ "action": {"type": "string", "enum": ["start", "stop", "status"], "description": "Daemon action: status checks process state, start launches, stop terminates."},
167
232
  },
168
233
  ["agent", "action"],
234
+ STATEFUL_LOCAL_TOOL,
169
235
  ),
170
236
  _tool_def(
171
237
  "trinity_doctor",
172
- "Run health and diagnostic checks.",
238
+ _desc(
239
+ "Run Trinity Lite health, configuration, database, publish-readiness, and runtime hygiene checks.",
240
+ "Use this before release, after setup changes, or when routing and worker behavior looks wrong.",
241
+ "This is read-only: it scans configured files, database state, optional repository roots, and retired ports, then returns a structured health report.",
242
+ ),
173
243
  {
174
- "scan_root": {"type": "string", "description": "Repository root for publish-readiness scan"},
175
- "runtime_root": {"type": "string", "description": "Runtime directory for hygiene checks"},
244
+ "scan_root": {"type": "string", "description": "Optional repository root for publish-readiness and packaging checks."},
245
+ "runtime_root": {"type": "string", "description": "Optional runtime directory to inspect for local hygiene checks."},
176
246
  "retired_ports": {
177
247
  "type": "array",
178
248
  "items": {"type": "integer"},
179
- "description": "Ports that should not be listening",
249
+ "description": "Optional TCP ports that should be unused; listening ports are reported as hygiene issues.",
180
250
  },
181
251
  },
182
252
  [],
253
+ READ_ONLY_TOOL,
183
254
  ),
184
255
  _tool_def(
185
256
  "trinity_inbox",
186
- "Read durable messages addressed to an agent.",
257
+ _desc(
258
+ "Read durable inter-agent messages addressed to one agent from the local Trinity database.",
259
+ "Use this to recover completed work, review notes, or follow-up messages; use trinity_send to create a new message.",
260
+ "By default it reads unread messages, but mark_read=true updates message read state; it returns message records.",
261
+ ),
187
262
  {
188
- "agent": {"type": "string", "description": "Agent whose inbox to read"},
189
- "unread_only": {"type": "boolean", "description": "Return only unread messages (default: true)"},
190
- "mark_read": {"type": "boolean", "description": "Mark returned messages as read"},
191
- "limit": {"type": "integer", "description": "Maximum messages to return (default: 20)"},
263
+ "agent": {"type": "string", "description": "Recipient agent id whose inbox should be read."},
264
+ "unread_only": {"type": "boolean", "description": "When true, return only unread messages; defaults to true."},
265
+ "mark_read": {"type": "boolean", "description": "When true, mark returned messages as read after fetching them."},
266
+ "limit": {"type": "integer", "description": "Maximum messages to return; defaults to 20 and is capped by the server."},
192
267
  },
193
268
  ["agent"],
269
+ STATEFUL_LOCAL_TOOL,
194
270
  ),
195
271
  _tool_def(
196
272
  "trinity_send",
197
- "Send a durable message to another agent.",
273
+ _desc(
274
+ "Write a durable message from one Trinity agent to another agent's inbox.",
275
+ "Use this for follow-up context, review handoffs, or task-linked notes; use trinity_dispatch to create executable work.",
276
+ "This writes to the local message database, does not run a worker, and returns the stored message record.",
277
+ ),
198
278
  {
199
- "target_agent": {"type": "string", "description": "Recipient agent id"},
200
- "message": {"type": "string", "description": "Message body"},
201
- "source_agent": {"type": "string", "description": "Sender agent id (default: mcp)"},
202
- "task_id": {"type": "string", "description": "Associated task id"},
279
+ "target_agent": {"type": "string", "description": "Recipient agent id that will receive the inbox message."},
280
+ "message": {"type": "string", "description": "Message body to persist in the target inbox."},
281
+ "source_agent": {"type": "string", "description": "Sender agent id recorded on the message; defaults to mcp."},
282
+ "task_id": {"type": "string", "description": "Optional associated task id for threading or audit context."},
203
283
  },
204
284
  ["target_agent", "message"],
285
+ STATEFUL_LOCAL_TOOL,
205
286
  ),
206
287
  _tool_def(
207
288
  "trinity_skill_search",
208
- "Search agent-skill-system for relevant skills matching a task description.",
289
+ _desc(
290
+ "Search the optional agent-skill-system index for skills relevant to a task or keyword query.",
291
+ "Use this before loading a full skill when the exact skill name is unknown; use trinity_skill_load after selecting a result.",
292
+ "This is read-only and returns ranked skill metadata, or an installation hint if agent-skill-system is not installed.",
293
+ ),
209
294
  {
210
- "query": {"type": "string", "description": "Task description or keyword query"},
211
- "limit": {"type": "integer", "description": "Maximum results (default: 5, max: 20)"},
295
+ "query": {"type": "string", "description": "Task description or keywords used to rank matching skills."},
296
+ "limit": {"type": "integer", "description": "Maximum results to return; defaults to 5 and is capped at 20."},
212
297
  },
213
298
  ["query"],
299
+ READ_ONLY_TOOL,
214
300
  ),
215
301
  _tool_def(
216
302
  "trinity_skill_load",
217
- "Load the full content (SKILL.md + memory) of a named skill.",
303
+ _desc(
304
+ "Load the full SKILL.md, memory, schema, keywords, and generated system prompt for one exact skill name.",
305
+ "Use this after trinity_skill_search identifies the correct skill; do not use it for broad discovery.",
306
+ "This is read-only and returns the skill bundle, or a not-found response with available skill names when possible.",
307
+ ),
218
308
  {
219
- "skill_name": {"type": "string", "description": "Exact name of the skill to load"},
309
+ "skill_name": {"type": "string", "description": "Exact skill name to load from the local skill bank."},
220
310
  },
221
311
  ["skill_name"],
312
+ READ_ONLY_TOOL,
222
313
  ),
223
314
  ]
224
315
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trinity-lite
3
- Version: 0.5.2
3
+ Version: 0.5.3
4
4
  Summary: The bus that lets your AI agents talk to each other.
5
5
  Author: Yomiracle
6
6
  License-Expression: MIT
@@ -31,10 +31,11 @@ Dynamic: license-file
31
31
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](pyproject.toml)
32
32
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
33
33
  [![PyPI](https://img.shields.io/pypi/v/trinity-lite.svg)](https://pypi.org/project/trinity-lite/)
34
+ [![Yomiracle/trinity-lite MCP server](https://glama.ai/mcp/servers/Yomiracle/trinity-lite/badges/score.svg)](https://glama.ai/mcp/servers/Yomiracle/trinity-lite/score)
34
35
 
35
36
  **Local-first multi-agent orchestration for CLI AI agents.**
36
37
 
37
- [中文 README](README_zh.md)
38
+ [中文 README](README_zh.md) · [Docs](docs/index.md) · [Why Trinity Lite?](docs/WHY_TRINITY_LITE.md) · [Recipes](docs/recipes/generic-cli.md)
38
39
 
39
40
  ## The problem
40
41
 
@@ -217,6 +218,8 @@ Works with 1 model, 2 models, or 10 models. No agent names hardcoded.
217
218
 
218
219
  - [PyPI](https://pypi.org/project/trinity-lite/)
219
220
  - [Documentation](docs/)
221
+ - [Why Trinity Lite?](docs/WHY_TRINITY_LITE.md)
222
+ - [Recipes](docs/recipes/generic-cli.md)
220
223
  - [Changelog](CHANGELOG.md)
221
224
  - [Contributing](CONTRIBUTING.md)
222
225
  - [Architecture](docs/ARCHITECTURE.md)
File without changes
File without changes