plane-agent 2.3.3__tar.gz → 2.3.4__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 (73) hide show
  1. {plane_agent-2.3.3/plane_agent.egg-info → plane_agent-2.3.4}/PKG-INFO +2 -2
  2. {plane_agent-2.3.3 → plane_agent-2.3.4}/README.md +1 -1
  3. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/ontology/plane.ttl +2 -0
  4. {plane_agent-2.3.3 → plane_agent-2.3.4/plane_agent.egg-info}/PKG-INFO +2 -2
  5. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent.egg-info/SOURCES.txt +1 -0
  6. {plane_agent-2.3.3 → plane_agent-2.3.4}/pyproject.toml +1 -1
  7. plane_agent-2.3.4/tests/test_ontology_parent_link.py +110 -0
  8. {plane_agent-2.3.3 → plane_agent-2.3.4}/LICENSE +0 -0
  9. {plane_agent-2.3.3 → plane_agent-2.3.4}/MANIFEST.in +0 -0
  10. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/__init__.py +0 -0
  11. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/__main__.py +0 -0
  12. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api/__init__.py +0 -0
  13. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api/api_client_base.py +0 -0
  14. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api/api_client_cycles.py +0 -0
  15. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api/api_client_epics.py +0 -0
  16. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api/api_client_initiatives.py +0 -0
  17. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api/api_client_intake.py +0 -0
  18. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api/api_client_milestones.py +0 -0
  19. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api/api_client_modules_states.py +0 -0
  20. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api/api_client_projects.py +0 -0
  21. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api/api_client_work_items.py +0 -0
  22. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api/api_client_workspace.py +0 -0
  23. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/api_client.py +0 -0
  24. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/auth.py +0 -0
  25. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/connectors/__init__.py +0 -0
  26. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/connectors/mcp_source_presets.json +0 -0
  27. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/connectors/tool_schema_fingerprints.json +0 -0
  28. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/kg_ingest.py +0 -0
  29. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/mcp_config.json +0 -0
  30. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/mcp_server.py +0 -0
  31. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/ontology/__init__.py +0 -0
  32. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/ontology/certification.json +0 -0
  33. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/ontology/fixtures/records.json +0 -0
  34. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/ontology/mappings/source.yaml +0 -0
  35. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/ontology/migrations/manifest.json +0 -0
  36. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/ontology/shapes/connector.shacl.ttl +0 -0
  37. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/plane_models.py +0 -0
  38. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/prompts/__init__.py +0 -0
  39. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/prompts/project_tracking_specialist.json +0 -0
  40. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/__init__.py +0 -0
  41. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-agent-operations/SKILL.md +0 -0
  42. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-agent-operations/agents/openai.yaml +0 -0
  43. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-agent-operations/references/catalog.md +0 -0
  44. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-create-work-item-guided/SKILL.md +0 -0
  45. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-create-work-item-guided/WORKFLOW.md +0 -0
  46. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-create-work-item-guided/references/property-discovery.md +0 -0
  47. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-cycle-planning/SKILL.md +0 -0
  48. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-cycle-planning/WORKFLOW.md +0 -0
  49. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-kg-ingestion/SKILL.md +0 -0
  50. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-kg-ingestion/WORKFLOW.md +0 -0
  51. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-my-priority-queue/SKILL.md +0 -0
  52. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-my-priority-queue/WORKFLOW.md +0 -0
  53. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-my-priority-queue/references/filter-recipes.md +0 -0
  54. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-my-priority-queue/scripts/rank_items.py +0 -0
  55. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-work-item-tracking/SKILL.md +0 -0
  56. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent/skills/plane-work-item-tracking/WORKFLOW.md +0 -0
  57. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent.egg-info/dependency_links.txt +0 -0
  58. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent.egg-info/entry_points.txt +0 -0
  59. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent.egg-info/requires.txt +0 -0
  60. {plane_agent-2.3.3 → plane_agent-2.3.4}/plane_agent.egg-info/top_level.txt +0 -0
  61. {plane_agent-2.3.3 → plane_agent-2.3.4}/requirements.txt +0 -0
  62. {plane_agent-2.3.3 → plane_agent-2.3.4}/scripts/security_sanitizer.py +0 -0
  63. {plane_agent-2.3.3 → plane_agent-2.3.4}/scripts/verify_api_integration.py +0 -0
  64. {plane_agent-2.3.3 → plane_agent-2.3.4}/setup.cfg +0 -0
  65. {plane_agent-2.3.3 → plane_agent-2.3.4}/tests/conftest.py +0 -0
  66. {plane_agent-2.3.3 → plane_agent-2.3.4}/tests/test_action_discovery.py +0 -0
  67. {plane_agent-2.3.3 → plane_agent-2.3.4}/tests/test_coverage_gap_fillers.py +0 -0
  68. {plane_agent-2.3.3 → plane_agent-2.3.4}/tests/test_default_content_surfaces.py +0 -0
  69. {plane_agent-2.3.3 → plane_agent-2.3.4}/tests/test_init.py +0 -0
  70. {plane_agent-2.3.3 → plane_agent-2.3.4}/tests/test_init_dynamics.py +0 -0
  71. {plane_agent-2.3.3 → plane_agent-2.3.4}/tests/test_kg_ingest.py +0 -0
  72. {plane_agent-2.3.3 → plane_agent-2.3.4}/tests/test_rank_items.py +0 -0
  73. {plane_agent-2.3.3 → plane_agent-2.3.4}/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
3
+ Version: 2.3.4
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.3*
50
+ *Version: 2.3.4*
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.3*
23
+ *Version: 2.3.4*
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
@@ -21,6 +21,7 @@
21
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." .
22
22
 
23
23
  :Issue a owl:Class ;
24
+ rdfs:subClassOf :WorkItem ;
24
25
  rdfs:label "Issue" ;
25
26
  rdfs:comment "A Plane work item / issue — the unit of tracked work with a state, priority and assignees (plane_work_items)." .
26
27
 
@@ -37,6 +38,7 @@
37
38
  rdfs:comment "A workflow state a work item can occupy (e.g. Backlog, Todo, In Progress, Done) within a project (plane_states)." .
38
39
 
39
40
  :Label a owl:Class ;
41
+ rdfs:subClassOf :Tag ;
40
42
  rdfs:label "Label" ;
41
43
  rdfs:comment "A tag applied to work items for classification within a project (plane_labels)." .
42
44
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plane-agent
3
- Version: 2.3.3
3
+ Version: 2.3.4
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.3*
50
+ *Version: 2.3.4*
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
@@ -66,5 +66,6 @@ tests/test_default_content_surfaces.py
66
66
  tests/test_init.py
67
67
  tests/test_init_dynamics.py
68
68
  tests/test_kg_ingest.py
69
+ tests/test_ontology_parent_link.py
69
70
  tests/test_rank_items.py
70
71
  tests/test_startup.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "plane-agent"
7
- version = "2.3.3"
7
+ version = "2.3.4"
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,110 @@
1
+ """Every class of the packaged ontology reaches an epistemic-graph parent class (CONN-PLANE-AGENT-CONNECTOR-CONTENT-R002)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import re
6
+ from pathlib import Path
7
+
8
+ import pytest
9
+
10
+ pytestmark = pytest.mark.spec("CONN-PLANE-AGENT-CONNECTOR-CONTENT-R002")
11
+
12
+ PARENT_IRI = "http://knuckles.team/kg"
13
+ ONTOLOGIES = sorted(
14
+ (Path(__file__).resolve().parents[1] / "plane_agent" / "ontology").glob("*.ttl")
15
+ )
16
+ OWL = "http://www.w3.org/2002/07/owl#"
17
+ RDF_TYPE = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
18
+ SUBCLASS = "http://www.w3.org/2000/01/rdf-schema#subClassOf"
19
+ # Parent classes of the epistemic-graph ontology that this connector links to or redeclares.
20
+ PARENT_CLASSES = frozenset(
21
+ (
22
+ "http://knuckles.team/kg#Module",
23
+ "http://knuckles.team/kg#Person",
24
+ "http://knuckles.team/kg#SoftwareProject",
25
+ "http://knuckles.team/kg#Tag",
26
+ "http://knuckles.team/kg#WorkItem",
27
+ )
28
+ )
29
+ # Classes for which the parent ontology has no fitting class yet. Each is a candidate for a new
30
+ # 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
+ )
38
+
39
+ _STRING = re.compile(r'"""(?:.|\n)*?"""|"(?:[^"\\\n]|\\.)*"')
40
+ _IRI = re.compile(r"<([^<>\s]*)>")
41
+ _PREFIX = re.compile(r"(?im)^\s*@?prefix\s+([A-Za-z][\w.-]*)?:\s+\x00(\d+)\s*\.?")
42
+ _END = re.compile(r"\s\.(?=\s|$)|(?<=[\]>)\w\"'])\.(?=\s|$)")
43
+
44
+
45
+ def _triples(text: str) -> list[tuple[str, str, str]]:
46
+ """Subject, predicate and object of a Turtle file; names are expanded, literals dropped."""
47
+ iris: list[str] = []
48
+
49
+ def keep(match: re.Match[str]) -> str:
50
+ iris.append(match.group(1))
51
+ return f" \x00{len(iris)} "
52
+
53
+ body = re.sub(r"(?m)#[^\n]*$", "", _IRI.sub(keep, _STRING.sub(' "" ', text)))
54
+ prefixes = {
55
+ m.group(1) or "": iris[int(m.group(2)) - 1] for m in _PREFIX.finditer(body)
56
+ }
57
+ body = re.sub(r"\[[^\[\]]*\]", " _:b ", _PREFIX.sub("", body))
58
+
59
+ def expand(token: str) -> str:
60
+ if token.startswith("\x00"):
61
+ return iris[int(token[1:]) - 1]
62
+ prefix, sep, local = token.partition(":")
63
+ return (
64
+ prefixes[prefix] + local
65
+ if sep and prefix in prefixes
66
+ else RDF_TYPE
67
+ if token == "a"
68
+ else token
69
+ )
70
+
71
+ triples: list[tuple[str, str, str]] = []
72
+ for statement in _END.split(body):
73
+ tokens = statement.replace(";", " ; ").replace(",", " , ").split()
74
+ subject, predicate, fresh = "", "", True
75
+ for index, token in enumerate(tokens):
76
+ if index == 0:
77
+ subject = expand(token)
78
+ elif token == ";":
79
+ fresh = True
80
+ elif token != ",":
81
+ if fresh:
82
+ predicate, fresh = expand(token), False
83
+ else:
84
+ triples.append((subject, predicate, expand(token)))
85
+ return triples
86
+
87
+
88
+ def _orphans(triples: list[tuple[str, str, str]]) -> set[str]:
89
+ declared = {s for s, p, o in triples if p == RDF_TYPE and o == OWL + "Class"}
90
+ linked: set[str] = set()
91
+ changed = True
92
+ while changed:
93
+ changed = False
94
+ for cls in declared - linked - PARENT_CLASSES:
95
+ ups = {o for s, p, o in triples if s == cls and p == SUBCLASS}
96
+ if ups & (PARENT_CLASSES | linked):
97
+ linked.add(cls)
98
+ changed = True
99
+ return declared - linked - PARENT_CLASSES
100
+
101
+
102
+ @pytest.mark.parametrize("path", ONTOLOGIES, ids=lambda p: p.name)
103
+ def test_ontology_joins_the_parent_graph(path: Path) -> None:
104
+ triples = _triples(path.read_text(encoding="utf-8"))
105
+ declared = {s for s, p, o in triples if p == RDF_TYPE and o == OWL + "Class"}
106
+ if not declared:
107
+ 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
+ assert _orphans(triples) == PENDING_NEW_PARENT & declared
File without changes
File without changes
File without changes