plane-agent 2.3.4__tar.gz → 2.3.6__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 (76) hide show
  1. {plane_agent-2.3.4/plane_agent.egg-info → plane_agent-2.3.6}/PKG-INFO +2 -2
  2. {plane_agent-2.3.4 → plane_agent-2.3.6}/README.md +1 -1
  3. plane_agent-2.3.6/plane_agent/ontology/ingest_sources.json +16 -0
  4. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/ontology/plane.ttl +12 -2
  5. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/ontology/shapes/connector.shacl.ttl +2 -2
  6. {plane_agent-2.3.4 → plane_agent-2.3.6/plane_agent.egg-info}/PKG-INFO +2 -2
  7. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent.egg-info/SOURCES.txt +3 -0
  8. {plane_agent-2.3.4 → plane_agent-2.3.6}/pyproject.toml +1 -1
  9. plane_agent-2.3.6/tests/test_cq_paths.py +53 -0
  10. plane_agent-2.3.6/tests/test_ingest_sources.py +32 -0
  11. {plane_agent-2.3.4 → plane_agent-2.3.6}/tests/test_ontology_parent_link.py +5 -7
  12. {plane_agent-2.3.4 → plane_agent-2.3.6}/LICENSE +0 -0
  13. {plane_agent-2.3.4 → plane_agent-2.3.6}/MANIFEST.in +0 -0
  14. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/__init__.py +0 -0
  15. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/__main__.py +0 -0
  16. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api/__init__.py +0 -0
  17. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api/api_client_base.py +0 -0
  18. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api/api_client_cycles.py +0 -0
  19. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api/api_client_epics.py +0 -0
  20. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api/api_client_initiatives.py +0 -0
  21. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api/api_client_intake.py +0 -0
  22. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api/api_client_milestones.py +0 -0
  23. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api/api_client_modules_states.py +0 -0
  24. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api/api_client_projects.py +0 -0
  25. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api/api_client_work_items.py +0 -0
  26. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api/api_client_workspace.py +0 -0
  27. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/api_client.py +0 -0
  28. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/auth.py +0 -0
  29. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/connectors/__init__.py +0 -0
  30. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/connectors/mcp_source_presets.json +0 -0
  31. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/connectors/tool_schema_fingerprints.json +0 -0
  32. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/kg_ingest.py +0 -0
  33. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/mcp_config.json +0 -0
  34. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/mcp_server.py +0 -0
  35. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/ontology/__init__.py +0 -0
  36. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/ontology/certification.json +0 -0
  37. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/ontology/fixtures/records.json +0 -0
  38. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/ontology/mappings/source.yaml +0 -0
  39. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/ontology/migrations/manifest.json +0 -0
  40. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/plane_models.py +0 -0
  41. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/prompts/__init__.py +0 -0
  42. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/prompts/project_tracking_specialist.json +0 -0
  43. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/__init__.py +0 -0
  44. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-agent-operations/SKILL.md +0 -0
  45. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-agent-operations/agents/openai.yaml +0 -0
  46. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-agent-operations/references/catalog.md +0 -0
  47. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-create-work-item-guided/SKILL.md +0 -0
  48. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-create-work-item-guided/WORKFLOW.md +0 -0
  49. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-create-work-item-guided/references/property-discovery.md +0 -0
  50. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-cycle-planning/SKILL.md +0 -0
  51. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-cycle-planning/WORKFLOW.md +0 -0
  52. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-kg-ingestion/SKILL.md +0 -0
  53. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-kg-ingestion/WORKFLOW.md +0 -0
  54. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-my-priority-queue/SKILL.md +0 -0
  55. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-my-priority-queue/WORKFLOW.md +0 -0
  56. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-my-priority-queue/references/filter-recipes.md +0 -0
  57. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-my-priority-queue/scripts/rank_items.py +0 -0
  58. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-work-item-tracking/SKILL.md +0 -0
  59. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent/skills/plane-work-item-tracking/WORKFLOW.md +0 -0
  60. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent.egg-info/dependency_links.txt +0 -0
  61. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent.egg-info/entry_points.txt +0 -0
  62. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent.egg-info/requires.txt +0 -0
  63. {plane_agent-2.3.4 → plane_agent-2.3.6}/plane_agent.egg-info/top_level.txt +0 -0
  64. {plane_agent-2.3.4 → plane_agent-2.3.6}/requirements.txt +0 -0
  65. {plane_agent-2.3.4 → plane_agent-2.3.6}/scripts/security_sanitizer.py +0 -0
  66. {plane_agent-2.3.4 → plane_agent-2.3.6}/scripts/verify_api_integration.py +0 -0
  67. {plane_agent-2.3.4 → plane_agent-2.3.6}/setup.cfg +0 -0
  68. {plane_agent-2.3.4 → plane_agent-2.3.6}/tests/conftest.py +0 -0
  69. {plane_agent-2.3.4 → plane_agent-2.3.6}/tests/test_action_discovery.py +0 -0
  70. {plane_agent-2.3.4 → plane_agent-2.3.6}/tests/test_coverage_gap_fillers.py +0 -0
  71. {plane_agent-2.3.4 → plane_agent-2.3.6}/tests/test_default_content_surfaces.py +0 -0
  72. {plane_agent-2.3.4 → plane_agent-2.3.6}/tests/test_init.py +0 -0
  73. {plane_agent-2.3.4 → plane_agent-2.3.6}/tests/test_init_dynamics.py +0 -0
  74. {plane_agent-2.3.4 → plane_agent-2.3.6}/tests/test_kg_ingest.py +0 -0
  75. {plane_agent-2.3.4 → plane_agent-2.3.6}/tests/test_rank_items.py +0 -0
  76. {plane_agent-2.3.4 → plane_agent-2.3.6}/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.4
3
+ Version: 2.3.6
4
4
  Summary: Plane MCP Agent
5
5
  Author-email: Project Maintainers <maintainers@users.noreply.github.com>
6
6
  License: MIT
@@ -47,7 +47,7 @@ Dynamic: license-file
47
47
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/plane-agent)
48
48
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/plane-agent)
49
49
 
50
- *Version: 2.3.4*
50
+ *Version: 2.3.6*
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
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/plane-agent)
21
21
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/plane-agent)
22
22
 
23
- *Version: 2.3.4*
23
+ *Version: 2.3.6*
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,16 @@
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
+ }
@@ -13,6 +13,7 @@
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
 
@@ -26,14 +27,17 @@
26
27
  rdfs:comment "A Plane work item / issue — the unit of tracked work with a state, priority and assignees (plane_work_items)." .
27
28
 
28
29
  :Cycle a owl:Class ;
30
+ rdfs:subClassOf :Iteration ;
29
31
  rdfs:label "Cycle" ;
30
32
  rdfs:comment "A time-boxed cycle (sprint) grouping work items over a start/end window (plane_cycles)." .
31
33
 
32
- :Module a owl:Class ;
34
+ :PlaneModule a owl:Class ;
35
+ rdfs:subClassOf :Collection ;
33
36
  rdfs:label "Module" ;
34
37
  rdfs:comment "A feature grouping of work items within a project (plane_modules)." .
35
38
 
36
39
  :ProjectState a owl:Class ;
40
+ rdfs:subClassOf :Concept ;
37
41
  rdfs:label "Project State" ;
38
42
  rdfs:comment "A workflow state a work item can occupy (e.g. Backlog, Todo, In Progress, Done) within a project (plane_states)." .
39
43
 
@@ -65,7 +69,7 @@
65
69
  rdfs:label "in module" ;
66
70
  rdfs:comment "Links an Issue to the Module it is grouped under." ;
67
71
  rdfs:domain :Issue ;
68
- rdfs:range :Module .
72
+ rdfs:range :PlaneModule .
69
73
 
70
74
  :hasState a owl:ObjectProperty ;
71
75
  rdfs:label "has state" ;
@@ -93,6 +97,12 @@
93
97
  rdfs:domain :Issue ;
94
98
  rdfs:range xsd:integer .
95
99
 
100
+ :state a owl:DatatypeProperty ;
101
+ rdfs:label "state" ;
102
+ rdfs:comment "Workflow state name of a work item (Backlog, Todo, In Progress, Done, Cancelled)." ;
103
+ rdfs:domain :Issue ;
104
+ rdfs:range xsd:string .
105
+
96
106
  :priority a owl:DatatypeProperty ;
97
107
  rdfs:label "priority" ;
98
108
  rdfs:comment "Priority of a work item (urgent, high, medium, low, none)." ;
@@ -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:ModuleGovernanceShape a sh:NodeShape ;
67
- sh:targetClass :Module ;
66
+ shape:PlaneModuleGovernanceShape a sh:NodeShape ;
67
+ sh:targetClass :PlaneModule ;
68
68
  sh:closed false ;
69
69
  sh:property [
70
70
  sh:path :sourceRecordRef ;
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plane-agent
3
- Version: 2.3.4
3
+ Version: 2.3.6
4
4
  Summary: Plane MCP Agent
5
5
  Author-email: Project Maintainers <maintainers@users.noreply.github.com>
6
6
  License: MIT
@@ -47,7 +47,7 @@ Dynamic: license-file
47
47
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/plane-agent)
48
48
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/plane-agent)
49
49
 
50
- *Version: 2.3.4*
50
+ *Version: 2.3.6*
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
@@ -33,6 +33,7 @@ plane_agent/connectors/mcp_source_presets.json
33
33
  plane_agent/connectors/tool_schema_fingerprints.json
34
34
  plane_agent/ontology/__init__.py
35
35
  plane_agent/ontology/certification.json
36
+ plane_agent/ontology/ingest_sources.json
36
37
  plane_agent/ontology/plane.ttl
37
38
  plane_agent/ontology/fixtures/records.json
38
39
  plane_agent/ontology/mappings/source.yaml
@@ -62,7 +63,9 @@ scripts/verify_api_integration.py
62
63
  tests/conftest.py
63
64
  tests/test_action_discovery.py
64
65
  tests/test_coverage_gap_fillers.py
66
+ tests/test_cq_paths.py
65
67
  tests/test_default_content_surfaces.py
68
+ tests/test_ingest_sources.py
66
69
  tests/test_init.py
67
70
  tests/test_init_dynamics.py
68
71
  tests/test_kg_ingest.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "plane-agent"
7
- version = "2.3.4"
7
+ version = "2.3.6"
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",]
@@ -0,0 +1,53 @@
1
+ """Competency-question paths of the Plane pack (CONN-PLANE-AGENT-CONNECTOR-CONTENT-R004)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import re
6
+ from pathlib import Path
7
+
8
+ import pytest
9
+ import yaml
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
+ manifest = yaml.safe_load(
46
+ (PACKAGE.parent / "connector_manifest.yml").read_text("utf-8")
47
+ )
48
+ unmapped = [
49
+ name
50
+ for name, mapping in manifest["schema_mappings"].items()
51
+ if not mapping["ontology_class"]
52
+ ]
53
+ assert unmapped == []
@@ -0,0 +1,32 @@
1
+ """The packaged ingestible-source declaration (CONN-PLANE-AGENT-CONNECTOR-CONTENT-R003)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+
7
+ import pytest
8
+ import yaml
9
+ from agent_connector_sdk.ingest.sources import load_ingest_sources
10
+ from agent_connector_sdk.mcp.tool_surface import operation_prefix
11
+
12
+ import plane_agent
13
+
14
+ REPO_ROOT = Path(__file__).resolve().parent.parent
15
+
16
+
17
+ @pytest.mark.spec("CONN-PLANE-AGENT-CONNECTOR-CONTENT-R003")
18
+ def test_declares_ingestible_sources() -> None:
19
+ declaration = load_ingest_sources(Path(plane_agent.__file__).parent)
20
+ assert declaration is not None
21
+ assert declaration.connector == "plane-mcp"
22
+ source = declaration.source("projects")
23
+ assert source is not None and source.record_type == "SoftwareProject"
24
+ prefix = operation_prefix("plane-agent")
25
+ assert source.tools == (f"{prefix}_list_projects",)
26
+ # The engine admits a record only under the pack mapping of its type.
27
+ manifest = yaml.safe_load(
28
+ (REPO_ROOT / "connector_manifest.yml").read_text("utf-8")
29
+ )
30
+ assert source.record_type in manifest["schema_mappings"]
31
+ # Work items are project-scoped, so only the projects source is declared.
32
+ 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]*)>")
File without changes
File without changes
File without changes