fenix-mcp 1.9.0__py3-none-any.whl → 1.11.0__py3-none-any.whl
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.
- fenix_mcp/__init__.py +1 -1
- fenix_mcp/application/tool_base.py +24 -0
- fenix_mcp/application/tools/intelligence.py +2 -1
- fenix_mcp/application/tools/knowledge.py +17 -2
- fenix_mcp/application/tools/productivity.py +3 -1
- fenix_mcp/domain/knowledge.py +7 -0
- fenix_mcp/infrastructure/fenix_api/client.py +4 -0
- {fenix_mcp-1.9.0.dist-info → fenix_mcp-1.11.0.dist-info}/METADATA +1 -1
- {fenix_mcp-1.9.0.dist-info → fenix_mcp-1.11.0.dist-info}/RECORD +12 -12
- {fenix_mcp-1.9.0.dist-info → fenix_mcp-1.11.0.dist-info}/WHEEL +0 -0
- {fenix_mcp-1.9.0.dist-info → fenix_mcp-1.11.0.dist-info}/entry_points.txt +0 -0
- {fenix_mcp-1.9.0.dist-info → fenix_mcp-1.11.0.dist-info}/top_level.txt +0 -0
fenix_mcp/__init__.py
CHANGED
|
@@ -70,6 +70,30 @@ MarkdownStr = Annotated[
|
|
|
70
70
|
),
|
|
71
71
|
]
|
|
72
72
|
|
|
73
|
+
# Mermaid diagram hint for markdown fields
|
|
74
|
+
MERMAID_HINT = """
|
|
75
|
+
💡 **Tip**: You can use Mermaid code blocks to create visual diagrams.
|
|
76
|
+
|
|
77
|
+
Flowchart example:
|
|
78
|
+
```mermaid
|
|
79
|
+
graph TD
|
|
80
|
+
A[Start] --> B{Decision}
|
|
81
|
+
B -->|Yes| C[Action 1]
|
|
82
|
+
B -->|No| D[Action 2]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Sequence diagram example:
|
|
86
|
+
```mermaid
|
|
87
|
+
sequenceDiagram
|
|
88
|
+
participant U as User
|
|
89
|
+
participant A as API
|
|
90
|
+
U->>A: Request
|
|
91
|
+
A-->>U: Response
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Supported types: flowchart, sequenceDiagram, classDiagram, gantt, pie, mindmap, gitGraph.
|
|
95
|
+
"""
|
|
96
|
+
|
|
73
97
|
# Short title/name strings (1-300 chars)
|
|
74
98
|
TitleStr = Annotated[
|
|
75
99
|
str,
|
|
@@ -10,6 +10,7 @@ from pydantic import Field, field_validator
|
|
|
10
10
|
|
|
11
11
|
from fenix_mcp.application.presenters import text
|
|
12
12
|
from fenix_mcp.application.tool_base import (
|
|
13
|
+
MERMAID_HINT,
|
|
13
14
|
CategoryStr,
|
|
14
15
|
DateTimeStr,
|
|
15
16
|
MarkdownStr,
|
|
@@ -73,7 +74,7 @@ class IntelligenceRequest(ToolRequest):
|
|
|
73
74
|
action: IntelligenceAction = Field(description=ACTION_FIELD_DESCRIPTION)
|
|
74
75
|
title: Optional[TitleStr] = Field(default=None, description="Memory title.")
|
|
75
76
|
content: Optional[MarkdownStr] = Field(
|
|
76
|
-
default=None, description="Memory content/text (Markdown)."
|
|
77
|
+
default=None, description=f"Memory content/text (Markdown).{MERMAID_HINT}"
|
|
77
78
|
)
|
|
78
79
|
metadata: Optional[MarkdownStr] = Field(
|
|
79
80
|
default=None,
|
|
@@ -10,6 +10,7 @@ from pydantic import Field
|
|
|
10
10
|
|
|
11
11
|
from fenix_mcp.application.presenters import text
|
|
12
12
|
from fenix_mcp.application.tool_base import (
|
|
13
|
+
MERMAID_HINT,
|
|
13
14
|
CategoryStr,
|
|
14
15
|
DateTimeStr,
|
|
15
16
|
DescriptionStr,
|
|
@@ -78,6 +79,10 @@ class KnowledgeAction(str, Enum):
|
|
|
78
79
|
"work_assign_to_me",
|
|
79
80
|
"Assigns a work item to the current user.",
|
|
80
81
|
)
|
|
82
|
+
WORK_MINE = (
|
|
83
|
+
"work_mine",
|
|
84
|
+
"Lists work items assigned to the current user. Automatically excludes items with status 'done' or 'cancelled'. Supports pagination via limit and offset parameters.",
|
|
85
|
+
)
|
|
81
86
|
WORK_BULK_CREATE = (
|
|
82
87
|
"work_bulk_create",
|
|
83
88
|
"Creates multiple work items atomically with hierarchy. Use temp_id as temporary identifier and parent_temp_id to reference parent in the same batch, or parent_key to reference an existing work item (e.g., TEMA-0056). Cannot use both parent_temp_id and parent_key on the same item. Example: [{temp_id:'epic-1', title:'My Epic', item_type:'epic', work_category:'backend'}, {temp_id:'task-1', parent_temp_id:'epic-1', title:'My Task', item_type:'task', work_category:'backend'}] or [{temp_id:'task-1', parent_key:'TEMA-0056', title:'My Task', item_type:'task', work_category:'backend'}]",
|
|
@@ -222,7 +227,7 @@ class KnowledgeRequest(ToolRequest):
|
|
|
222
227
|
)
|
|
223
228
|
work_title: Optional[TitleStr] = Field(default=None, description="Work item title.")
|
|
224
229
|
work_description: Optional[MarkdownStr] = Field(
|
|
225
|
-
default=None, description="Work item description (Markdown)."
|
|
230
|
+
default=None, description=f"Work item description (Markdown).{MERMAID_HINT}"
|
|
226
231
|
)
|
|
227
232
|
work_type: Optional[str] = Field(
|
|
228
233
|
default="task",
|
|
@@ -320,7 +325,7 @@ class KnowledgeRequest(ToolRequest):
|
|
|
320
325
|
default=None, description="Documentation description."
|
|
321
326
|
)
|
|
322
327
|
doc_content: Optional[MarkdownStr] = Field(
|
|
323
|
-
default=None, description="Documentation content (Markdown)."
|
|
328
|
+
default=None, description=f"Documentation content (Markdown).{MERMAID_HINT}"
|
|
324
329
|
)
|
|
325
330
|
doc_status: Optional[str] = Field(
|
|
326
331
|
default=None,
|
|
@@ -493,6 +498,16 @@ class KnowledgeTool(Tool):
|
|
|
493
498
|
work = await self._service.work_assign_to_me(work_id)
|
|
494
499
|
return text(_format_work(work, header="✅ Work item assigned to you"))
|
|
495
500
|
|
|
501
|
+
if action is KnowledgeAction.WORK_MINE:
|
|
502
|
+
items = await self._service.work_mine(
|
|
503
|
+
limit=payload.limit,
|
|
504
|
+
offset=payload.offset,
|
|
505
|
+
)
|
|
506
|
+
if not items:
|
|
507
|
+
return text("🎯 No work items assigned to you.")
|
|
508
|
+
body = "\n\n".join(_format_work(item) for item in items)
|
|
509
|
+
return text(f"🎯 **Your work items ({len(items)}):**\n\n{body}")
|
|
510
|
+
|
|
496
511
|
if action is KnowledgeAction.WORK_BACKLOG:
|
|
497
512
|
items = await self._service.work_backlog()
|
|
498
513
|
if not items:
|
|
@@ -10,6 +10,7 @@ from pydantic import Field
|
|
|
10
10
|
|
|
11
11
|
from fenix_mcp.application.presenters import text
|
|
12
12
|
from fenix_mcp.application.tool_base import (
|
|
13
|
+
MERMAID_HINT,
|
|
13
14
|
CategoryStr,
|
|
14
15
|
DateTimeStr,
|
|
15
16
|
MarkdownStr,
|
|
@@ -77,7 +78,8 @@ class ProductivityRequest(ToolRequest):
|
|
|
77
78
|
default=None, description="TODO title (required for create)."
|
|
78
79
|
)
|
|
79
80
|
content: Optional[MarkdownStr] = Field(
|
|
80
|
-
default=None,
|
|
81
|
+
default=None,
|
|
82
|
+
description=f"Markdown content (required for create).{MERMAID_HINT}",
|
|
81
83
|
)
|
|
82
84
|
status: Optional[str] = Field(
|
|
83
85
|
default=None,
|
fenix_mcp/domain/knowledge.py
CHANGED
|
@@ -78,6 +78,13 @@ class KnowledgeService:
|
|
|
78
78
|
async def work_assign_to_me(self, work_id: str) -> Dict[str, Any]:
|
|
79
79
|
return await self._call_dict(self.api.assign_work_item_to_me, work_id)
|
|
80
80
|
|
|
81
|
+
async def work_mine(
|
|
82
|
+
self, *, limit: int = 50, offset: int = 0
|
|
83
|
+
) -> List[Dict[str, Any]]:
|
|
84
|
+
return await self._call_list(
|
|
85
|
+
self.api.get_work_items_mine, limit=limit, offset=offset
|
|
86
|
+
)
|
|
87
|
+
|
|
81
88
|
async def work_update(
|
|
82
89
|
self, work_id: str, payload: Dict[str, Any]
|
|
83
90
|
) -> Dict[str, Any]:
|
|
@@ -498,6 +498,10 @@ class FenixApiClient:
|
|
|
498
498
|
def assign_work_item_to_me(self, item_id: str) -> Any:
|
|
499
499
|
return self._request("POST", f"/api/work-items/{item_id}/assign-to-me")
|
|
500
500
|
|
|
501
|
+
def get_work_items_mine(self, *, limit: int = 50, offset: int = 0) -> Any:
|
|
502
|
+
params = self._build_params(optional={"limit": limit, "offset": offset})
|
|
503
|
+
return self._request("GET", "/api/work-items/mine", params=params)
|
|
504
|
+
|
|
501
505
|
def update_work_item(self, item_id: str, payload: Mapping[str, Any]) -> Any:
|
|
502
506
|
return self._request("PATCH", f"/api/work-items/{item_id}", json=payload)
|
|
503
507
|
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
fenix_mcp/__init__.py,sha256=
|
|
1
|
+
fenix_mcp/__init__.py,sha256=17a6anjdJHVc3TWomuQjFJeic0Pk_iIb4z6-uyKORw0,181
|
|
2
2
|
fenix_mcp/main.py,sha256=iJV-9btNMDJMObvcn7wBQdbLLKjkYCQ1ANGEwHGHlMU,2857
|
|
3
3
|
fenix_mcp/application/presenters.py,sha256=fGME54PdCDhTBhXO-JUB9yLdBHiE1aeXLTC2fCuxnxM,689
|
|
4
|
-
fenix_mcp/application/tool_base.py,sha256=
|
|
4
|
+
fenix_mcp/application/tool_base.py,sha256=ZCb9g4ij5Hbb0410NEZTYXvPWq-Zkg8ZCsinTa3gCY4,4741
|
|
5
5
|
fenix_mcp/application/tool_registry.py,sha256=bPT5g8GfxG_qu28R1WaDOZHvtmG6TPDvZi8eWj1T9xE,1250
|
|
6
6
|
fenix_mcp/application/tools/__init__.py,sha256=Gi1YvYh-KdL9HD8gLVrknHrxiKKEOhHBEZ02KBXJaKQ,796
|
|
7
7
|
fenix_mcp/application/tools/health.py,sha256=m5DxhoRbdwl6INzd6PISxv1NAv-ljCrezsr773VB0wE,834
|
|
8
8
|
fenix_mcp/application/tools/initialize.py,sha256=YfsE3fVYiqGEwvaI_jg5-0K7pGURXxpB3WNwETmGBPc,5499
|
|
9
|
-
fenix_mcp/application/tools/intelligence.py,sha256=
|
|
10
|
-
fenix_mcp/application/tools/knowledge.py,sha256=
|
|
11
|
-
fenix_mcp/application/tools/productivity.py,sha256=
|
|
9
|
+
fenix_mcp/application/tools/intelligence.py,sha256=wsph1GwiQX3aX5NtFIZlM7I5xo1N3KT-cMlVfZuaHpU,15811
|
|
10
|
+
fenix_mcp/application/tools/knowledge.py,sha256=AQBSispBde0-jAhlKjHrek9FNUaZzqhn293yyocYUQ0,61057
|
|
11
|
+
fenix_mcp/application/tools/productivity.py,sha256=Wmefwg6yuXkHwwQT999d9D4lQf0UY_jnCTDlBe2YRTg,11273
|
|
12
12
|
fenix_mcp/application/tools/user_config.py,sha256=O5AVg7IUKL9uIoUoBSFovBDHl9jofhKWzhFK7CnKi4s,6470
|
|
13
13
|
fenix_mcp/domain/initialization.py,sha256=AZhdSNITQ7O3clELBuqGvjJc-c8pFKc7zQz-XR2xXPc,6933
|
|
14
14
|
fenix_mcp/domain/intelligence.py,sha256=j1kkxT-pjuzLQeAGDd2H8gd3O1aeUIRgHFnMGvNwQYg,8636
|
|
15
|
-
fenix_mcp/domain/knowledge.py,sha256=
|
|
15
|
+
fenix_mcp/domain/knowledge.py,sha256=xZt2Mjikf4HxcXERDC6ov1fxoHnm4LPU6FI2FZxqq0w,21152
|
|
16
16
|
fenix_mcp/domain/productivity.py,sha256=PzY664eRPuBCfZGUY_Uv1GNeyMWsw6xqC54C-nobQns,6799
|
|
17
17
|
fenix_mcp/domain/user_config.py,sha256=8rzhJCNqIArfaCoKxxQXFoemCU7qww3hq0RDanIf_2Y,2028
|
|
18
18
|
fenix_mcp/infrastructure/config.py,sha256=zhJ3hhsP-bRfICcdq8rIDh5NGDe_u7AGpcgjcc2U1nY,1908
|
|
19
19
|
fenix_mcp/infrastructure/context.py,sha256=kiDiamiPbHZpTGyZMylcQwtLhfaDXrxAkWSst_DWQNw,470
|
|
20
20
|
fenix_mcp/infrastructure/http_client.py,sha256=QLIPhGYR_cBQGsbIO4RTR6ksyvkQt-OKHQU1JhPyap8,2470
|
|
21
21
|
fenix_mcp/infrastructure/logging.py,sha256=bHrWlSi_0HshRe3--BK_5nzUszW-gh37q6jsd0ShS2Y,1371
|
|
22
|
-
fenix_mcp/infrastructure/fenix_api/client.py,sha256=
|
|
22
|
+
fenix_mcp/infrastructure/fenix_api/client.py,sha256=YIoDIUQdNd7zzt2X3OsgajjxH5Jqb_85A6BvQDN6H6o,28693
|
|
23
23
|
fenix_mcp/interface/mcp_server.py,sha256=5UM2NJuNbwHkmCEprIFataJ5nFZiO8efTtP_oW3_iX0,2331
|
|
24
24
|
fenix_mcp/interface/transports.py,sha256=PxdhfjH8UMl03f7nuCLc-M6tMx6-Y-btVz_mSqXKrSI,8138
|
|
25
|
-
fenix_mcp-1.
|
|
26
|
-
fenix_mcp-1.
|
|
27
|
-
fenix_mcp-1.
|
|
28
|
-
fenix_mcp-1.
|
|
29
|
-
fenix_mcp-1.
|
|
25
|
+
fenix_mcp-1.11.0.dist-info/METADATA,sha256=0U8QF618uJxIavnMhEnIbSD_5qPf48e1eavB_0dX3n0,7261
|
|
26
|
+
fenix_mcp-1.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
27
|
+
fenix_mcp-1.11.0.dist-info/entry_points.txt,sha256=o52x_YHBupEd-1Z1GSfUjv3gJrx5_I-EkHhCgt1WBaE,49
|
|
28
|
+
fenix_mcp-1.11.0.dist-info/top_level.txt,sha256=2G1UtKpwjaIGQyE7sRoHecxaGLeuexfjrOUjv9DDKh4,10
|
|
29
|
+
fenix_mcp-1.11.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|