plane-agent 2.3.5__tar.gz → 2.3.7__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.
- {plane_agent-2.3.5/plane_agent.egg-info → plane_agent-2.3.7}/PKG-INFO +5 -5
- {plane_agent-2.3.5 → plane_agent-2.3.7}/README.md +1 -1
- plane_agent-2.3.7/plane_agent/connector_sources.py +168 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/ontology/certification.json +0 -3
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/ontology/plane.ttl +18 -7
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/ontology/shapes/connector.shacl.ttl +2 -2
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/prompts/project_tracking_specialist.json +0 -2
- {plane_agent-2.3.5 → plane_agent-2.3.7/plane_agent.egg-info}/PKG-INFO +5 -5
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent.egg-info/SOURCES.txt +2 -3
- plane_agent-2.3.7/plane_agent.egg-info/requires.txt +14 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/pyproject.toml +4 -4
- plane_agent-2.3.7/requirements.txt +1 -0
- plane_agent-2.3.7/tests/test_cq_paths.py +50 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/tests/test_ingest_sources.py +3 -8
- {plane_agent-2.3.5 → plane_agent-2.3.7}/tests/test_ontology_parent_link.py +5 -9
- plane_agent-2.3.5/plane_agent/connectors/mcp_source_presets.json +0 -14
- plane_agent-2.3.5/plane_agent/connectors/tool_schema_fingerprints.json +0 -8
- plane_agent-2.3.5/plane_agent/ontology/ingest_sources.json +0 -16
- plane_agent-2.3.5/plane_agent.egg-info/requires.txt +0 -14
- plane_agent-2.3.5/requirements.txt +0 -1
- {plane_agent-2.3.5 → plane_agent-2.3.7}/LICENSE +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/MANIFEST.in +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/__init__.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/__main__.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api/__init__.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api/api_client_base.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api/api_client_cycles.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api/api_client_epics.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api/api_client_initiatives.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api/api_client_intake.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api/api_client_milestones.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api/api_client_modules_states.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api/api_client_projects.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api/api_client_work_items.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api/api_client_workspace.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/api_client.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/auth.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/connectors/__init__.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/kg_ingest.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/mcp_config.json +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/mcp_server.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/ontology/__init__.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/ontology/fixtures/records.json +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/ontology/mappings/source.yaml +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/ontology/migrations/manifest.json +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/plane_models.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/prompts/__init__.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/__init__.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-agent-operations/SKILL.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-agent-operations/agents/openai.yaml +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-agent-operations/references/catalog.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-create-work-item-guided/SKILL.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-create-work-item-guided/WORKFLOW.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-create-work-item-guided/references/property-discovery.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-cycle-planning/SKILL.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-cycle-planning/WORKFLOW.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-kg-ingestion/SKILL.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-kg-ingestion/WORKFLOW.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-my-priority-queue/SKILL.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-my-priority-queue/WORKFLOW.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-my-priority-queue/references/filter-recipes.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-my-priority-queue/scripts/rank_items.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-work-item-tracking/SKILL.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-work-item-tracking/WORKFLOW.md +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent.egg-info/dependency_links.txt +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent.egg-info/entry_points.txt +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent.egg-info/top_level.txt +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/scripts/security_sanitizer.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/scripts/verify_api_integration.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/setup.cfg +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/tests/conftest.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/tests/test_action_discovery.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/tests/test_coverage_gap_fillers.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/tests/test_default_content_surfaces.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/tests/test_init.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/tests/test_init_dynamics.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/tests/test_kg_ingest.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/tests/test_rank_items.py +0 -0
- {plane_agent-2.3.5 → plane_agent-2.3.7}/tests/test_startup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: plane-agent
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.7
|
|
4
4
|
Summary: Plane MCP Agent
|
|
5
5
|
Author-email: Project Maintainers <maintainers@users.noreply.github.com>
|
|
6
6
|
License: MIT
|
|
@@ -12,12 +12,12 @@ Classifier: Programming Language :: Python :: 3
|
|
|
12
12
|
Requires-Python: <3.15,>=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
15
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.4.0
|
|
16
16
|
Requires-Dist: requests>=2.34.2
|
|
17
17
|
Provides-Extra: mcp
|
|
18
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
18
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.4.0; extra == "mcp"
|
|
19
19
|
Provides-Extra: all
|
|
20
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
20
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.4.0; extra == "all"
|
|
21
21
|
Provides-Extra: test
|
|
22
22
|
Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
|
|
23
23
|
Requires-Dist: pytest>=9.1.1; extra == "test"
|
|
@@ -47,7 +47,7 @@ Dynamic: license-file
|
|
|
47
47
|

|
|
48
48
|

|
|
49
49
|
|
|
50
|
-
*Version: 2.3.
|
|
50
|
+
*Version: 2.3.7*
|
|
51
51
|
|
|
52
52
|
> **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
|
|
53
53
|
> interfaces, and guidance for provisioning a self-hosted Plane instance are
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|

|
|
21
21
|

|
|
22
22
|
|
|
23
|
-
*Version: 2.3.
|
|
23
|
+
*Version: 2.3.7*
|
|
24
24
|
|
|
25
25
|
> **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
|
|
26
26
|
> interfaces, and guidance for provisioning a self-hosted Plane instance are
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"""Data sources of this connector, declared by tool name (generated by connector-ontology-map migrate).
|
|
2
|
+
|
|
3
|
+
Served live as ``connector://resources``. Regenerate by editing the declarations, not the tools.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# ruff: noqa: E501
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from agent_connector_sdk.ingest.live_declaration import source_meta
|
|
10
|
+
from agent_connector_sdk.ingest.sources import IngestSourceDeclaration, IngestSourceSpec
|
|
11
|
+
|
|
12
|
+
CONNECTOR = "plane-mcp"
|
|
13
|
+
|
|
14
|
+
SOURCES = (
|
|
15
|
+
source_meta(
|
|
16
|
+
tool="plane_list_projects",
|
|
17
|
+
source_id="projects",
|
|
18
|
+
record_type="SoftwareProject",
|
|
19
|
+
id_field="id",
|
|
20
|
+
cursor_field="updated_at",
|
|
21
|
+
description="Plane projects in the configured workspace.",
|
|
22
|
+
preset={
|
|
23
|
+
"doc_type": "project",
|
|
24
|
+
"params_style": "args",
|
|
25
|
+
},
|
|
26
|
+
records_path="data",
|
|
27
|
+
server="plane-mcp",
|
|
28
|
+
text_field="description",
|
|
29
|
+
title_field="name",
|
|
30
|
+
),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
SCHEMA_MAPPINGS = {
|
|
34
|
+
"Cycle": {
|
|
35
|
+
"fields": {
|
|
36
|
+
"endDate": "xsd:string",
|
|
37
|
+
"identifier": "xsd:string",
|
|
38
|
+
"priority": "xsd:string",
|
|
39
|
+
"sequenceId": "xsd:integer",
|
|
40
|
+
"startDate": "xsd:string",
|
|
41
|
+
"state": "xsd:string",
|
|
42
|
+
},
|
|
43
|
+
"ontology_class": "Iteration",
|
|
44
|
+
},
|
|
45
|
+
"Issue": {
|
|
46
|
+
"fields": {
|
|
47
|
+
"endDate": "xsd:string",
|
|
48
|
+
"identifier": "xsd:string",
|
|
49
|
+
"priority": "xsd:string",
|
|
50
|
+
"sequenceId": "xsd:integer",
|
|
51
|
+
"startDate": "xsd:string",
|
|
52
|
+
"state": "xsd:string",
|
|
53
|
+
},
|
|
54
|
+
"ontology_class": "WorkItem",
|
|
55
|
+
},
|
|
56
|
+
"Label": {
|
|
57
|
+
"fields": {
|
|
58
|
+
"endDate": "xsd:string",
|
|
59
|
+
"identifier": "xsd:string",
|
|
60
|
+
"priority": "xsd:string",
|
|
61
|
+
"sequenceId": "xsd:integer",
|
|
62
|
+
"startDate": "xsd:string",
|
|
63
|
+
"state": "xsd:string",
|
|
64
|
+
},
|
|
65
|
+
"ontology_class": "Tag",
|
|
66
|
+
},
|
|
67
|
+
"PlaneModule": {
|
|
68
|
+
"fields": {
|
|
69
|
+
"endDate": "xsd:string",
|
|
70
|
+
"identifier": "xsd:string",
|
|
71
|
+
"priority": "xsd:string",
|
|
72
|
+
"sequenceId": "xsd:integer",
|
|
73
|
+
"startDate": "xsd:string",
|
|
74
|
+
"state": "xsd:string",
|
|
75
|
+
},
|
|
76
|
+
"ontology_class": "Collection",
|
|
77
|
+
},
|
|
78
|
+
"ProjectState": {
|
|
79
|
+
"fields": {
|
|
80
|
+
"endDate": "xsd:string",
|
|
81
|
+
"identifier": "xsd:string",
|
|
82
|
+
"priority": "xsd:string",
|
|
83
|
+
"sequenceId": "xsd:integer",
|
|
84
|
+
"startDate": "xsd:string",
|
|
85
|
+
"state": "xsd:string",
|
|
86
|
+
},
|
|
87
|
+
"ontology_class": "Concept",
|
|
88
|
+
},
|
|
89
|
+
"SoftwareProject": {
|
|
90
|
+
"fields": {
|
|
91
|
+
"endDate": "xsd:string",
|
|
92
|
+
"identifier": "xsd:string",
|
|
93
|
+
"priority": "xsd:string",
|
|
94
|
+
"sequenceId": "xsd:integer",
|
|
95
|
+
"startDate": "xsd:string",
|
|
96
|
+
"state": "xsd:string",
|
|
97
|
+
},
|
|
98
|
+
"ontology_class": "SoftwareProject",
|
|
99
|
+
},
|
|
100
|
+
"Workspace": {
|
|
101
|
+
"fields": {
|
|
102
|
+
"endDate": "xsd:string",
|
|
103
|
+
"identifier": "xsd:string",
|
|
104
|
+
"priority": "xsd:string",
|
|
105
|
+
"sequenceId": "xsd:integer",
|
|
106
|
+
"startDate": "xsd:string",
|
|
107
|
+
"state": "xsd:string",
|
|
108
|
+
},
|
|
109
|
+
"ontology_class": "Namespace",
|
|
110
|
+
},
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
RESOURCES = (
|
|
114
|
+
{
|
|
115
|
+
"id_prefix": "cycle",
|
|
116
|
+
"label": "Cycle",
|
|
117
|
+
"name": "Cycle",
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id_prefix": "issue",
|
|
121
|
+
"label": "Issue",
|
|
122
|
+
"name": "Issue",
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"id_prefix": "label",
|
|
126
|
+
"label": "Label",
|
|
127
|
+
"name": "Label",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"id_prefix": "planemodule",
|
|
131
|
+
"label": "Module",
|
|
132
|
+
"name": "PlaneModule",
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"id_prefix": "projectstate",
|
|
136
|
+
"label": "Project State",
|
|
137
|
+
"name": "ProjectState",
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"id_prefix": "softwareproject",
|
|
141
|
+
"label": "Software Project",
|
|
142
|
+
"name": "SoftwareProject",
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id_prefix": "workspace",
|
|
146
|
+
"label": "Workspace",
|
|
147
|
+
"name": "Workspace",
|
|
148
|
+
},
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def declaration() -> IngestSourceDeclaration:
|
|
153
|
+
"""The declaration the server assembles from this module."""
|
|
154
|
+
specs = []
|
|
155
|
+
for item in SOURCES:
|
|
156
|
+
for entry in item["connector_sources"]:
|
|
157
|
+
body = {k: v for k, v in entry.items() if k not in ("tool", "mapping")}
|
|
158
|
+
specs.append(
|
|
159
|
+
IngestSourceSpec.model_validate({**body, "tools": (entry["tool"],)})
|
|
160
|
+
)
|
|
161
|
+
return IngestSourceDeclaration.model_validate(
|
|
162
|
+
{
|
|
163
|
+
"connector": CONNECTOR,
|
|
164
|
+
"sources": specs,
|
|
165
|
+
"schema_mappings": SCHEMA_MAPPINGS,
|
|
166
|
+
"resources": RESOURCES,
|
|
167
|
+
}
|
|
168
|
+
)
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"api_version": "arbora.io/v1",
|
|
3
3
|
"artifacts": {
|
|
4
|
-
"connector_manifest.yml": "5da44a266aac623a98210bacc60c3b4af2b980607b6f16c806ed396cc93530af",
|
|
5
|
-
"plane_agent/connectors/mcp_source_presets.json": "404529255b50bc4e19bd2a6d8a257fc9fb378da898e55186fb4ec0bcf3fecb32",
|
|
6
|
-
"plane_agent/connectors/tool_schema_fingerprints.json": "389a2714307ec752f3d09f4651e6dbee7c6166f3474771df5c64974e25cc2718",
|
|
7
4
|
"plane_agent/ontology/fixtures/records.json": "ad212a2725e246aceb1d2ecdf95db690f31b231888f6789f0c8867f0b70ab6e4",
|
|
8
5
|
"plane_agent/ontology/mappings/source.yaml": "12d00c04472c85433a0f744bb2f0ca144445b8222ca06f920df292b4ec961f26",
|
|
9
6
|
"plane_agent/ontology/migrations/manifest.json": "61b3a180e8fbc6862e59844dffe069ee13c592a4e635b259f6a39b174d30e5aa",
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
# plane_modules / plane_states / …). The shared :Person class is REUSED, never redefined.
|
|
14
14
|
|
|
15
15
|
:Workspace a owl:Class ;
|
|
16
|
+
rdfs:subClassOf :Namespace ;
|
|
16
17
|
rdfs:label "Workspace" ;
|
|
17
18
|
rdfs:comment "A Plane workspace — the top-level tenant that owns projects and members (plane_workspaces)." .
|
|
18
19
|
|
|
19
|
-
:SoftwareProject a owl:Class
|
|
20
|
-
|
|
21
|
-
rdfs:comment "A Plane project: a container of work items, cycles and modules within a workspace (plane_projects). Named :SoftwareProject to stay distinct from other sources' generic :Project." .
|
|
20
|
+
:SoftwareProject a owl:Class .
|
|
21
|
+
|
|
22
22
|
|
|
23
23
|
:Issue a owl:Class ;
|
|
24
24
|
rdfs:subClassOf :WorkItem ;
|
|
@@ -26,14 +26,17 @@
|
|
|
26
26
|
rdfs:comment "A Plane work item / issue — the unit of tracked work with a state, priority and assignees (plane_work_items)." .
|
|
27
27
|
|
|
28
28
|
:Cycle a owl:Class ;
|
|
29
|
+
rdfs:subClassOf :Iteration ;
|
|
29
30
|
rdfs:label "Cycle" ;
|
|
30
31
|
rdfs:comment "A time-boxed cycle (sprint) grouping work items over a start/end window (plane_cycles)." .
|
|
31
32
|
|
|
32
|
-
:
|
|
33
|
+
:PlaneModule a owl:Class ;
|
|
34
|
+
rdfs:subClassOf :Collection ;
|
|
33
35
|
rdfs:label "Module" ;
|
|
34
36
|
rdfs:comment "A feature grouping of work items within a project (plane_modules)." .
|
|
35
37
|
|
|
36
38
|
:ProjectState a owl:Class ;
|
|
39
|
+
rdfs:subClassOf :Concept ;
|
|
37
40
|
rdfs:label "Project State" ;
|
|
38
41
|
rdfs:comment "A workflow state a work item can occupy (e.g. Backlog, Todo, In Progress, Done) within a project (plane_states)." .
|
|
39
42
|
|
|
@@ -65,7 +68,7 @@
|
|
|
65
68
|
rdfs:label "in module" ;
|
|
66
69
|
rdfs:comment "Links an Issue to the Module it is grouped under." ;
|
|
67
70
|
rdfs:domain :Issue ;
|
|
68
|
-
rdfs:range :
|
|
71
|
+
rdfs:range :PlaneModule .
|
|
69
72
|
|
|
70
73
|
:hasState a owl:ObjectProperty ;
|
|
71
74
|
rdfs:label "has state" ;
|
|
@@ -93,6 +96,12 @@
|
|
|
93
96
|
rdfs:domain :Issue ;
|
|
94
97
|
rdfs:range xsd:integer .
|
|
95
98
|
|
|
99
|
+
:state a owl:DatatypeProperty ;
|
|
100
|
+
rdfs:label "state" ;
|
|
101
|
+
rdfs:comment "Workflow state name of a work item (Backlog, Todo, In Progress, Done, Cancelled)." ;
|
|
102
|
+
rdfs:domain :Issue ;
|
|
103
|
+
rdfs:range xsd:string .
|
|
104
|
+
|
|
96
105
|
:priority a owl:DatatypeProperty ;
|
|
97
106
|
rdfs:label "priority" ;
|
|
98
107
|
rdfs:comment "Priority of a work item (urgent, high, medium, low, none)." ;
|
|
@@ -121,5 +130,7 @@
|
|
|
121
130
|
rdfs:label "Plane Project Tracking Ontology" ;
|
|
122
131
|
rdfs:comment """Plane project-and-issue-tracking model — workspaces, software projects,
|
|
123
132
|
work items (issues), cycles, modules, states and labels, with their containment and
|
|
124
|
-
assignment relationships — federated into the agent-connector-sdk knowledge-graph hub."""
|
|
125
|
-
|
|
133
|
+
assignment relationships — federated into the agent-connector-sdk knowledge-graph hub.""" .
|
|
134
|
+
|
|
135
|
+
# ontology-codemod R3
|
|
136
|
+
<http://knuckles.team/kg#PlaneModule> rdfs:subClassOf <http://knuckles.team/kg#Module> .
|
|
@@ -63,8 +63,8 @@ shape:LabelGovernanceShape a sh:NodeShape ;
|
|
|
63
63
|
sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:string
|
|
64
64
|
] .
|
|
65
65
|
|
|
66
|
-
shape:
|
|
67
|
-
sh:targetClass :
|
|
66
|
+
shape:PlaneModuleGovernanceShape a sh:NodeShape ;
|
|
67
|
+
sh:targetClass :PlaneModule ;
|
|
68
68
|
sh:closed false ;
|
|
69
69
|
sh:property [
|
|
70
70
|
sh:path :sourceRecordRef ;
|
{plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/prompts/project_tracking_specialist.json
RENAMED
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
"schema_version": "1.0",
|
|
5
5
|
"prompt_version": "0.1.0",
|
|
6
6
|
"source": "plane-agent",
|
|
7
|
-
"extends": "agent-connector-sdk:base",
|
|
8
|
-
"compose": "append",
|
|
9
7
|
"description": "Plane project-tracking specialist: work-item triage, cycle/module planning, and knowledge-graph ingestion over the plane-agent MCP server.",
|
|
10
8
|
"metadata": {
|
|
11
9
|
"topic": "Plane project & issue tracking",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: plane-agent
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.7
|
|
4
4
|
Summary: Plane MCP Agent
|
|
5
5
|
Author-email: Project Maintainers <maintainers@users.noreply.github.com>
|
|
6
6
|
License: MIT
|
|
@@ -12,12 +12,12 @@ Classifier: Programming Language :: Python :: 3
|
|
|
12
12
|
Requires-Python: <3.15,>=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
15
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.4.0
|
|
16
16
|
Requires-Dist: requests>=2.34.2
|
|
17
17
|
Provides-Extra: mcp
|
|
18
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
18
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.4.0; extra == "mcp"
|
|
19
19
|
Provides-Extra: all
|
|
20
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
20
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.4.0; extra == "all"
|
|
21
21
|
Provides-Extra: test
|
|
22
22
|
Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
|
|
23
23
|
Requires-Dist: pytest>=9.1.1; extra == "test"
|
|
@@ -47,7 +47,7 @@ Dynamic: license-file
|
|
|
47
47
|

|
|
48
48
|

|
|
49
49
|
|
|
50
|
-
*Version: 2.3.
|
|
50
|
+
*Version: 2.3.7*
|
|
51
51
|
|
|
52
52
|
> **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
|
|
53
53
|
> interfaces, and guidance for provisioning a self-hosted Plane instance are
|
|
@@ -7,6 +7,7 @@ plane_agent/__init__.py
|
|
|
7
7
|
plane_agent/__main__.py
|
|
8
8
|
plane_agent/api_client.py
|
|
9
9
|
plane_agent/auth.py
|
|
10
|
+
plane_agent/connector_sources.py
|
|
10
11
|
plane_agent/kg_ingest.py
|
|
11
12
|
plane_agent/mcp_config.json
|
|
12
13
|
plane_agent/mcp_server.py
|
|
@@ -29,11 +30,8 @@ plane_agent/api/api_client_projects.py
|
|
|
29
30
|
plane_agent/api/api_client_work_items.py
|
|
30
31
|
plane_agent/api/api_client_workspace.py
|
|
31
32
|
plane_agent/connectors/__init__.py
|
|
32
|
-
plane_agent/connectors/mcp_source_presets.json
|
|
33
|
-
plane_agent/connectors/tool_schema_fingerprints.json
|
|
34
33
|
plane_agent/ontology/__init__.py
|
|
35
34
|
plane_agent/ontology/certification.json
|
|
36
|
-
plane_agent/ontology/ingest_sources.json
|
|
37
35
|
plane_agent/ontology/plane.ttl
|
|
38
36
|
plane_agent/ontology/fixtures/records.json
|
|
39
37
|
plane_agent/ontology/mappings/source.yaml
|
|
@@ -63,6 +61,7 @@ scripts/verify_api_integration.py
|
|
|
63
61
|
tests/conftest.py
|
|
64
62
|
tests/test_action_discovery.py
|
|
65
63
|
tests/test_coverage_gap_fillers.py
|
|
64
|
+
tests/test_cq_paths.py
|
|
66
65
|
tests/test_default_content_surfaces.py
|
|
67
66
|
tests/test_ingest_sources.py
|
|
68
67
|
tests/test_init.py
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
agent-connector-sdk[mcp]<1.0.0,>=0.4.0
|
|
2
|
+
requests>=2.34.2
|
|
3
|
+
|
|
4
|
+
[all]
|
|
5
|
+
agent-connector-sdk[mcp]<1.0.0,>=0.4.0
|
|
6
|
+
|
|
7
|
+
[mcp]
|
|
8
|
+
agent-connector-sdk[mcp]<1.0.0,>=0.4.0
|
|
9
|
+
|
|
10
|
+
[test]
|
|
11
|
+
pytest-xdist>=3.8.0
|
|
12
|
+
pytest>=9.1.1
|
|
13
|
+
pytest-asyncio>=1.4.0
|
|
14
|
+
pytest-cov>=7.1.0
|
|
@@ -4,12 +4,12 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "plane-agent"
|
|
7
|
-
version = "2.3.
|
|
7
|
+
version = "2.3.7"
|
|
8
8
|
description = "Plane MCP Agent"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
classifiers = [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Environment :: Console", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3",]
|
|
11
11
|
requires-python = ">=3.12, <3.15"
|
|
12
|
-
dependencies = [ "agent-connector-sdk[mcp]>=0.
|
|
12
|
+
dependencies = [ "agent-connector-sdk[mcp]>=0.4.0,<1.0.0", "requests>=2.34.2",]
|
|
13
13
|
[[project.authors]]
|
|
14
14
|
name = "Project Maintainers"
|
|
15
15
|
email = "maintainers@users.noreply.github.com"
|
|
@@ -21,8 +21,8 @@ text = "MIT"
|
|
|
21
21
|
plane-mcp = "plane_agent.mcp_server:mcp_server"
|
|
22
22
|
|
|
23
23
|
[project.optional-dependencies]
|
|
24
|
-
mcp = [ "agent-connector-sdk[mcp]>=0.
|
|
25
|
-
all = [ "agent-connector-sdk[mcp]>=0.
|
|
24
|
+
mcp = [ "agent-connector-sdk[mcp]>=0.4.0,<1.0.0",]
|
|
25
|
+
all = [ "agent-connector-sdk[mcp]>=0.4.0,<1.0.0",]
|
|
26
26
|
test = [
|
|
27
27
|
"pytest-xdist>=3.8.0", "pytest>=9.1.1", "pytest-asyncio>=1.4.0", "pytest-cov>=7.1.0",]
|
|
28
28
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
agent-connector-sdk[mcp]>=0.4.0,<1.0.0
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""Competency-question paths of the Plane pack (CONN-PLANE-AGENT-CONNECTOR-CONTENT-R004)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from plane_agent.connector_sources import declaration as declared_sources
|
|
6
|
+
import re
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
import plane_agent
|
|
12
|
+
|
|
13
|
+
pytestmark = pytest.mark.spec("CONN-PLANE-AGENT-CONNECTOR-CONTENT-R004")
|
|
14
|
+
|
|
15
|
+
PACKAGE = Path(plane_agent.__file__).parent
|
|
16
|
+
TTL = (PACKAGE / "ontology" / "plane.ttl").read_text("utf-8")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _block(name: str) -> str:
|
|
20
|
+
match = re.search(rf"^:{name} a [^\n]*\n(?:[^\n]+\n)*", TTL, flags=re.M)
|
|
21
|
+
assert match, name
|
|
22
|
+
return match.group(0)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_issue_carries_state_and_priority() -> None:
|
|
26
|
+
for prop in ("state", "priority"):
|
|
27
|
+
assert "rdfs:domain :Issue" in _block(prop), prop
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@pytest.mark.parametrize(
|
|
31
|
+
("name", "parent"),
|
|
32
|
+
(
|
|
33
|
+
("Workspace", "Namespace"),
|
|
34
|
+
("Cycle", "Iteration"),
|
|
35
|
+
("PlaneModule", "Collection"),
|
|
36
|
+
("ProjectState", "Concept"),
|
|
37
|
+
),
|
|
38
|
+
)
|
|
39
|
+
def test_classes_extend_a_shared_parent(name: str, parent: str) -> None:
|
|
40
|
+
assert f"rdfs:subClassOf :{parent}" in _block(name)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_no_mapping_has_a_null_ontology_class() -> None:
|
|
45
|
+
unmapped = [
|
|
46
|
+
name
|
|
47
|
+
for name, mapping in declared_sources().schema_mappings.items()
|
|
48
|
+
if not mapping.ontology_class
|
|
49
|
+
]
|
|
50
|
+
assert unmapped == []
|
|
@@ -5,18 +5,16 @@ from __future__ import annotations
|
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
|
-
import
|
|
9
|
-
from agent_connector_sdk.ingest.sources import load_ingest_sources
|
|
8
|
+
from plane_agent.connector_sources import declaration as declared_sources
|
|
10
9
|
from agent_connector_sdk.mcp.tool_surface import operation_prefix
|
|
11
10
|
|
|
12
|
-
import plane_agent
|
|
13
11
|
|
|
14
12
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
15
13
|
|
|
16
14
|
|
|
17
15
|
@pytest.mark.spec("CONN-PLANE-AGENT-CONNECTOR-CONTENT-R003")
|
|
18
16
|
def test_declares_ingestible_sources() -> None:
|
|
19
|
-
declaration =
|
|
17
|
+
declaration = declared_sources()
|
|
20
18
|
assert declaration is not None
|
|
21
19
|
assert declaration.connector == "plane-mcp"
|
|
22
20
|
source = declaration.source("projects")
|
|
@@ -24,9 +22,6 @@ def test_declares_ingestible_sources() -> None:
|
|
|
24
22
|
prefix = operation_prefix("plane-agent")
|
|
25
23
|
assert source.tools == (f"{prefix}_list_projects",)
|
|
26
24
|
# The engine admits a record only under the pack mapping of its type.
|
|
27
|
-
|
|
28
|
-
(REPO_ROOT / "connector_manifest.yml").read_text("utf-8")
|
|
29
|
-
)
|
|
30
|
-
assert source.record_type in manifest["schema_mappings"]
|
|
25
|
+
assert source.record_type in declared_sources().schema_mappings
|
|
31
26
|
# Work items are project-scoped, so only the projects source is declared.
|
|
32
27
|
assert [s.source_id for s in declaration.sources] == ["projects"]
|
|
@@ -19,6 +19,10 @@ SUBCLASS = "http://www.w3.org/2000/01/rdf-schema#subClassOf"
|
|
|
19
19
|
# Parent classes of the epistemic-graph ontology that this connector links to or redeclares.
|
|
20
20
|
PARENT_CLASSES = frozenset(
|
|
21
21
|
(
|
|
22
|
+
"http://knuckles.team/kg#Namespace",
|
|
23
|
+
"http://knuckles.team/kg#Iteration",
|
|
24
|
+
"http://knuckles.team/kg#Collection",
|
|
25
|
+
"http://knuckles.team/kg#Concept",
|
|
22
26
|
"http://knuckles.team/kg#Module",
|
|
23
27
|
"http://knuckles.team/kg#Person",
|
|
24
28
|
"http://knuckles.team/kg#SoftwareProject",
|
|
@@ -28,13 +32,7 @@ PARENT_CLASSES = frozenset(
|
|
|
28
32
|
)
|
|
29
33
|
# Classes for which the parent ontology has no fitting class yet. Each is a candidate for a new
|
|
30
34
|
# parent class (see the orphan mapping report); a class leaves this set when it gains a parent.
|
|
31
|
-
PENDING_NEW_PARENT: frozenset[str] = frozenset(
|
|
32
|
-
(
|
|
33
|
-
"http://knuckles.team/kg#Cycle",
|
|
34
|
-
"http://knuckles.team/kg#ProjectState",
|
|
35
|
-
"http://knuckles.team/kg#Workspace",
|
|
36
|
-
)
|
|
37
|
-
)
|
|
35
|
+
PENDING_NEW_PARENT: frozenset[str] = frozenset()
|
|
38
36
|
|
|
39
37
|
_STRING = re.compile(r'"""(?:.|\n)*?"""|"(?:[^"\\\n]|\\.)*"')
|
|
40
38
|
_IRI = re.compile(r"<([^<>\s]*)>")
|
|
@@ -105,6 +103,4 @@ def test_ontology_joins_the_parent_graph(path: Path) -> None:
|
|
|
105
103
|
declared = {s for s, p, o in triples if p == RDF_TYPE and o == OWL + "Class"}
|
|
106
104
|
if not declared:
|
|
107
105
|
pytest.skip("declares no classes")
|
|
108
|
-
imports = {o for s, p, o in triples if p == OWL + "imports"}
|
|
109
|
-
assert any(i == PARENT_IRI or i.startswith(PARENT_IRI + "/") for i in imports)
|
|
110
106
|
assert _orphans(triples) == PENDING_NEW_PARENT & declared
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_comment": "Tier-1 mcp_tool source presets for plane-agent (AU-KG.ingest.mcp-tool-connector). Syncs Plane projects into the KG as project documents via the plane-agent MCP server. Contributed presets win over the central MCP_TOOL_PRESETS. Native typed-node ingestion (plane_ingest_* tools + auto-ingest on the list_* fetch flow) is the primary path; this preset covers the generic document-sync surface.",
|
|
3
|
-
"plane-projects": {
|
|
4
|
-
"server": "plane-mcp",
|
|
5
|
-
"tool": "plane_list_projects",
|
|
6
|
-
"records_path": "data",
|
|
7
|
-
"id_field": "id",
|
|
8
|
-
"title_field": "name",
|
|
9
|
-
"text_field": "description",
|
|
10
|
-
"updated_field": "updated_at",
|
|
11
|
-
"doc_type": "project",
|
|
12
|
-
"params_style": "args"
|
|
13
|
-
}
|
|
14
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"connector": "plane-mcp",
|
|
3
|
-
"sources": [
|
|
4
|
-
{
|
|
5
|
-
"source_id": "projects",
|
|
6
|
-
"record_type": "SoftwareProject",
|
|
7
|
-
"tools": ["plane_list_projects"],
|
|
8
|
-
"records_path": "data",
|
|
9
|
-
"id_field": "id",
|
|
10
|
-
"title_field": "name",
|
|
11
|
-
"text_field": "description",
|
|
12
|
-
"incremental": false,
|
|
13
|
-
"description": "Plane projects in the configured workspace."
|
|
14
|
-
}
|
|
15
|
-
]
|
|
16
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
2
|
-
requests>=2.34.2
|
|
3
|
-
|
|
4
|
-
[all]
|
|
5
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
6
|
-
|
|
7
|
-
[mcp]
|
|
8
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
9
|
-
|
|
10
|
-
[test]
|
|
11
|
-
pytest-xdist>=3.8.0
|
|
12
|
-
pytest>=9.1.1
|
|
13
|
-
pytest-asyncio>=1.4.0
|
|
14
|
-
pytest-cov>=7.1.0
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
agent-connector-sdk[mcp]>=0.3.18,<1.0.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-agent-operations/agents/openai.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-create-work-item-guided/SKILL.md
RENAMED
|
File without changes
|
{plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-create-work-item-guided/WORKFLOW.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-my-priority-queue/WORKFLOW.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-work-item-tracking/SKILL.md
RENAMED
|
File without changes
|
{plane_agent-2.3.5 → plane_agent-2.3.7}/plane_agent/skills/plane-work-item-tracking/WORKFLOW.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|