plm-skill-packages 1.0.0__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 (47) hide show
  1. plm_skill_packages-1.0.0/PKG-INFO +77 -0
  2. plm_skill_packages-1.0.0/README.md +62 -0
  3. plm_skill_packages-1.0.0/plm_skill_packages/__init__.py +66 -0
  4. plm_skill_packages-1.0.0/plm_skill_packages/build_registry.py +249 -0
  5. plm_skill_packages-1.0.0/plm_skill_packages/common/__init__.py +59 -0
  6. plm_skill_packages-1.0.0/plm_skill_packages/common/formatters.py +201 -0
  7. plm_skill_packages-1.0.0/plm_skill_packages/common/scoring.py +150 -0
  8. plm_skill_packages-1.0.0/plm_skill_packages/common/validators.py +104 -0
  9. plm_skill_packages-1.0.0/plm_skill_packages/contracts.py +167 -0
  10. plm_skill_packages-1.0.0/plm_skill_packages/domain_classifier.py +14 -0
  11. plm_skill_packages-1.0.0/plm_skill_packages/domain_prompts.py +11 -0
  12. plm_skill_packages-1.0.0/plm_skill_packages/enrich_tproc_chain.py +300 -0
  13. plm_skill_packages-1.0.0/plm_skill_packages/lifecycle.py +114 -0
  14. plm_skill_packages-1.0.0/plm_skill_packages/manifests/bpmn.fix_format.yaml +21 -0
  15. plm_skill_packages-1.0.0/plm_skill_packages/manifests/bpmn.generate_from_csv.yaml +20 -0
  16. plm_skill_packages-1.0.0/plm_skill_packages/manifests/build.registry.yaml +19 -0
  17. plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.bpmn_transpiler.yaml +19 -0
  18. plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.logic_modeler.yaml +18 -0
  19. plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.orchestrate_extraction.yaml +21 -0
  20. plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.process_scout.yaml +18 -0
  21. plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.quality_gate.yaml +20 -0
  22. plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.structural_analyst.yaml +19 -0
  23. plm_skill_packages-1.0.0/plm_skill_packages/manifests.py +106 -0
  24. plm_skill_packages-1.0.0/plm_skill_packages/orchestrators/__init__.py +6 -0
  25. plm_skill_packages-1.0.0/plm_skill_packages/orchestrators/plm_orchestrator.py +489 -0
  26. plm_skill_packages-1.0.0/plm_skill_packages/output_format_controller.py +847 -0
  27. plm_skill_packages-1.0.0/plm_skill_packages/plm_bpmn_transpiler.py +225 -0
  28. plm_skill_packages-1.0.0/plm_skill_packages/plm_logic_modeler.py +477 -0
  29. plm_skill_packages-1.0.0/plm_skill_packages/plm_process_scout.py +330 -0
  30. plm_skill_packages-1.0.0/plm_skill_packages/plm_quality_gate.py +454 -0
  31. plm_skill_packages-1.0.0/plm_skill_packages/plm_structural_analyst.py +359 -0
  32. plm_skill_packages-1.0.0/plm_skill_packages/process_generator.py +874 -0
  33. plm_skill_packages-1.0.0/plm_skill_packages/raci_extractor.py +13 -0
  34. plm_skill_packages-1.0.0/plm_skill_packages/registry.py +104 -0
  35. plm_skill_packages-1.0.0/plm_skill_packages.egg-info/PKG-INFO +77 -0
  36. plm_skill_packages-1.0.0/plm_skill_packages.egg-info/SOURCES.txt +45 -0
  37. plm_skill_packages-1.0.0/plm_skill_packages.egg-info/dependency_links.txt +1 -0
  38. plm_skill_packages-1.0.0/plm_skill_packages.egg-info/requires.txt +7 -0
  39. plm_skill_packages-1.0.0/plm_skill_packages.egg-info/top_level.txt +1 -0
  40. plm_skill_packages-1.0.0/pyproject.toml +128 -0
  41. plm_skill_packages-1.0.0/setup.cfg +4 -0
  42. plm_skill_packages-1.0.0/tests/test_contracts.py +133 -0
  43. plm_skill_packages-1.0.0/tests/test_lifecycle.py +102 -0
  44. plm_skill_packages-1.0.0/tests/test_lifted_us_as_9_smoke.py +109 -0
  45. plm_skill_packages-1.0.0/tests/test_manifests.py +133 -0
  46. plm_skill_packages-1.0.0/tests/test_public_surface.py +42 -0
  47. plm_skill_packages-1.0.0/tests/test_registry.py +113 -0
@@ -0,0 +1,77 @@
1
+ Metadata-Version: 2.4
2
+ Name: plm-skill-packages
3
+ Version: 1.0.0
4
+ Summary: TracePulse PLM Skill Packages product-line — 5-agent PLM PDF→BPMN chain, CSV→BPMN process_generator, output_format_controller, build_registry, plm_orchestrator (Wave 6.5 Conv A / PRD §3 #3). Full description in README.
5
+ Author: TracePulse
6
+ License: Proprietary
7
+ Requires-Python: >=3.12
8
+ Description-Content-Type: text/markdown
9
+ Requires-Dist: plm-shared
10
+ Requires-Dist: pydantic>=2.5.0
11
+ Requires-Dist: PyYAML>=6.0
12
+ Provides-Extra: test
13
+ Requires-Dist: pytest; extra == "test"
14
+ Requires-Dist: pytest-asyncio; extra == "test"
15
+
16
+ # plm-skill-packages
17
+
18
+ PRD §3 #3 product-line carve — Wave 6.5 Conv A.
19
+
20
+ Hosts the **5-agent PLM PDF→BPMN chain** + **CSV→BPMN generator** + **BPMN format controller** + **build registry** + **5-agent orchestrator**, plus skill manifests (YAML + filesystem) and the 4-state lifecycle FSM aligned verbatim with PRD §8.11.3.
21
+
22
+ ## Layout
23
+
24
+ ```
25
+ plm_skill_packages/
26
+ ├── plm_structural_analyst.py # PLM PDF→BPMN agent #1
27
+ ├── plm_process_scout.py # PLM PDF→BPMN agent #2
28
+ ├── plm_logic_modeler.py # PLM PDF→BPMN agent #3
29
+ ├── plm_bpmn_transpiler.py # PLM PDF→BPMN agent #4
30
+ ├── plm_quality_gate.py # PLM PDF→BPMN agent #5
31
+ ├── process_generator.py # CSV→BPMN; only legitimate cascade fallback
32
+ ├── output_format_controller.py # BPMN format correction + hidden retries
33
+ ├── build_registry.py # File-handler dispatch
34
+ ├── orchestrators/
35
+ │ └── plm_orchestrator.py # 5-agent chain coordinator
36
+ ├── lifecycle.py # 4-state FSM (PRD §8.11.3 verbatim)
37
+ ├── manifests.py # YAML manifest loader
38
+ ├── registry.py # Skill manifest registry
39
+ ├── contracts.py # Wire-contract Pydantic v2 frozen models
40
+ └── manifests/ # YAML skill manifests (one per skill)
41
+ ├── plm.structural_analyst.yaml
42
+ ├── plm.process_scout.yaml
43
+ ├── plm.logic_modeler.yaml
44
+ ├── plm.bpmn_transpiler.yaml
45
+ ├── plm.quality_gate.yaml
46
+ ├── plm.orchestrate_extraction.yaml
47
+ ├── bpmn.generate_from_csv.yaml
48
+ └── bpmn.fix_format.yaml
49
+ ```
50
+
51
+ ## Lifecycle FSM (Decision #167 — PRD §8.11.3 verbatim)
52
+
53
+ ```
54
+ draft ──► released ──► deprecated ──► retired
55
+ │ │
56
+ └──────────────┴──► (terminal)
57
+ ```
58
+
59
+ States are **strictly forward-flowing** (matching PRD §8.11.3 4-state capability lifecycle). No revivals, no skips. The FSM rejects any non-canonical transition.
60
+
61
+ ## Manifest store (Decision #168 — YAML + filesystem)
62
+
63
+ Manifests live under `plm_skill_packages/manifests/*.yaml` and load at boot via `manifests.load_all()`, matching the `litellm_config/model_list.yaml` catalog-as-truth pattern. No SQL, no admin UI in V1.
64
+
65
+ ## Re-export shims
66
+
67
+ Every monolith path that today references the lifted modules is preserved as a re-export shim — `from agents.plm_structural_analyst import ...` continues to work. Pattern matches Wave 1 W1.4 `services/run_task_tracker.py` (canonical decommission template).
68
+
69
+ ## Transitional dependency note
70
+
71
+ The lifted PLM agent + process_generator code keeps its existing `from services.X` / `from models.X` / `from utils.X` / `from agents.base_agent` imports. These resolve at runtime in the backend process via PYTHONPATH; standalone sibling tests configure conftest.py to extend sys.path. **Wave 7 Extraction** physically separates the repos and refactors inbound deps to ports/Protocols.
72
+
73
+ ## Wave 6.5 lineage
74
+
75
+ - **Wave 6.5 Conv A** (this) — `plm-skill-packages` carve.
76
+ - **Wave 6.5 Conv B** — `plm-knowledge` carve (PRD §3 #6).
77
+ - **Wave 6.5 Conv C** — closure audit + Wave 7 readiness re-author.
@@ -0,0 +1,62 @@
1
+ # plm-skill-packages
2
+
3
+ PRD §3 #3 product-line carve — Wave 6.5 Conv A.
4
+
5
+ Hosts the **5-agent PLM PDF→BPMN chain** + **CSV→BPMN generator** + **BPMN format controller** + **build registry** + **5-agent orchestrator**, plus skill manifests (YAML + filesystem) and the 4-state lifecycle FSM aligned verbatim with PRD §8.11.3.
6
+
7
+ ## Layout
8
+
9
+ ```
10
+ plm_skill_packages/
11
+ ├── plm_structural_analyst.py # PLM PDF→BPMN agent #1
12
+ ├── plm_process_scout.py # PLM PDF→BPMN agent #2
13
+ ├── plm_logic_modeler.py # PLM PDF→BPMN agent #3
14
+ ├── plm_bpmn_transpiler.py # PLM PDF→BPMN agent #4
15
+ ├── plm_quality_gate.py # PLM PDF→BPMN agent #5
16
+ ├── process_generator.py # CSV→BPMN; only legitimate cascade fallback
17
+ ├── output_format_controller.py # BPMN format correction + hidden retries
18
+ ├── build_registry.py # File-handler dispatch
19
+ ├── orchestrators/
20
+ │ └── plm_orchestrator.py # 5-agent chain coordinator
21
+ ├── lifecycle.py # 4-state FSM (PRD §8.11.3 verbatim)
22
+ ├── manifests.py # YAML manifest loader
23
+ ├── registry.py # Skill manifest registry
24
+ ├── contracts.py # Wire-contract Pydantic v2 frozen models
25
+ └── manifests/ # YAML skill manifests (one per skill)
26
+ ├── plm.structural_analyst.yaml
27
+ ├── plm.process_scout.yaml
28
+ ├── plm.logic_modeler.yaml
29
+ ├── plm.bpmn_transpiler.yaml
30
+ ├── plm.quality_gate.yaml
31
+ ├── plm.orchestrate_extraction.yaml
32
+ ├── bpmn.generate_from_csv.yaml
33
+ └── bpmn.fix_format.yaml
34
+ ```
35
+
36
+ ## Lifecycle FSM (Decision #167 — PRD §8.11.3 verbatim)
37
+
38
+ ```
39
+ draft ──► released ──► deprecated ──► retired
40
+ │ │
41
+ └──────────────┴──► (terminal)
42
+ ```
43
+
44
+ States are **strictly forward-flowing** (matching PRD §8.11.3 4-state capability lifecycle). No revivals, no skips. The FSM rejects any non-canonical transition.
45
+
46
+ ## Manifest store (Decision #168 — YAML + filesystem)
47
+
48
+ Manifests live under `plm_skill_packages/manifests/*.yaml` and load at boot via `manifests.load_all()`, matching the `litellm_config/model_list.yaml` catalog-as-truth pattern. No SQL, no admin UI in V1.
49
+
50
+ ## Re-export shims
51
+
52
+ Every monolith path that today references the lifted modules is preserved as a re-export shim — `from agents.plm_structural_analyst import ...` continues to work. Pattern matches Wave 1 W1.4 `services/run_task_tracker.py` (canonical decommission template).
53
+
54
+ ## Transitional dependency note
55
+
56
+ The lifted PLM agent + process_generator code keeps its existing `from services.X` / `from models.X` / `from utils.X` / `from agents.base_agent` imports. These resolve at runtime in the backend process via PYTHONPATH; standalone sibling tests configure conftest.py to extend sys.path. **Wave 7 Extraction** physically separates the repos and refactors inbound deps to ports/Protocols.
57
+
58
+ ## Wave 6.5 lineage
59
+
60
+ - **Wave 6.5 Conv A** (this) — `plm-skill-packages` carve.
61
+ - **Wave 6.5 Conv B** — `plm-knowledge` carve (PRD §3 #6).
62
+ - **Wave 6.5 Conv C** — closure audit + Wave 7 readiness re-author.
@@ -0,0 +1,66 @@
1
+ """TracePulse PLM Skill Packages — Wave 6.5 Conv A.
2
+
3
+ PRD §3 #3 product-line carve. Hosts the PLM PDF→BPMN 5-agent chain
4
+ (Structural Analyst → Process Scout → Logic Modeler → BPMN Transpiler
5
+ → Quality Gate), the CSV→BPMN process_generator (with the only
6
+ legitimate cascade fallback per CLAUDE.md), output_format_controller,
7
+ build_registry, and plm_orchestrator.
8
+
9
+ Public surface:
10
+ * The 9 lifted modules at top level.
11
+ * ``lifecycle`` — 4-state FSM aligned verbatim with PRD §8.11.3
12
+ (Decision #167).
13
+ * ``manifests`` — YAML manifest loader (Decision #168 = YAML +
14
+ filesystem).
15
+ * ``contracts`` — wire-contract Pydantic v2 frozen models for the
16
+ public surface (Decision #160 interface-freeze pattern).
17
+ * ``registry`` — manifest+lifecycle registry exposed to the kernel
18
+ (capability registry callers).
19
+
20
+ Re-export shims at every monolith path keep legacy callers working
21
+ through Wave 7 Extraction (Wave 1 W1.4 RunTaskTracker template).
22
+ """
23
+
24
+ from plm_skill_packages.contracts import (
25
+ SKILL_PACKAGES_VERSION,
26
+ SkillManifest,
27
+ SkillLifecycleState,
28
+ SkillKind,
29
+ )
30
+ from plm_skill_packages.lifecycle import (
31
+ LIFECYCLE_STATES,
32
+ LIFECYCLE_TRANSITIONS,
33
+ InvalidLifecycleTransition,
34
+ next_state,
35
+ is_terminal,
36
+ can_transition,
37
+ )
38
+ from plm_skill_packages.manifests import (
39
+ MANIFESTS_DIR,
40
+ ManifestLoadError,
41
+ load_manifest,
42
+ load_all,
43
+ )
44
+ from plm_skill_packages.registry import (
45
+ SkillRegistry,
46
+ get_skill_registry,
47
+ )
48
+
49
+ __all__ = [
50
+ "SKILL_PACKAGES_VERSION",
51
+ "SkillManifest",
52
+ "SkillLifecycleState",
53
+ "SkillKind",
54
+ "LIFECYCLE_STATES",
55
+ "LIFECYCLE_TRANSITIONS",
56
+ "InvalidLifecycleTransition",
57
+ "next_state",
58
+ "is_terminal",
59
+ "can_transition",
60
+ "MANIFESTS_DIR",
61
+ "ManifestLoadError",
62
+ "load_manifest",
63
+ "load_all",
64
+ "SkillRegistry",
65
+ "get_skill_registry",
66
+ ]
@@ -0,0 +1,249 @@
1
+ """
2
+ Build Registry Agent
3
+ Manages build generators registry and handler routing.
4
+ """
5
+
6
+ from typing import Any, Dict, List, Optional
7
+
8
+ from plm_shared.agents.base_agent import BaseAgent
9
+
10
+
11
+ # Schema: id, title, output_extension, handler_type, description (optional)
12
+ BUILD_GENERATORS: List[Dict[str, Any]] = [
13
+ {
14
+ "id": "generate_process",
15
+ "title": "Processus BPMN",
16
+ "output_extension": "tproc",
17
+ "handler_type": "generate_process",
18
+ "description": "Génération d'un processus BPMN à partir du plan et des sources.",
19
+ },
20
+ {
21
+ "id": "agent_stream",
22
+ "title": "Document Markdown",
23
+ "output_extension": "md",
24
+ "handler_type": "agent_stream",
25
+ "description": "Génération d'un document Markdown par l'agent conversationnel.",
26
+ },
27
+ ]
28
+
29
+
30
+ class BuildRegistryAgent(BaseAgent):
31
+ """
32
+ Build Registry Agent
33
+
34
+ Manages the build generators registry and provides handler routing
35
+ for the orchestrator. Maps file extensions to handler types.
36
+
37
+ Per SPEC_FLUX_BUILD: mapping extension -> handler for orchestrator routing.
38
+
39
+ Phase 1: Config in code (can be moved to YAML/env later)
40
+
41
+ Input (flexible):
42
+ - extension: File extension to look up handler (optional)
43
+ - action: "get_handler", "list_extensions", "get_generators" (optional)
44
+
45
+ Output (flexible):
46
+ - handler: Handler type for extension
47
+ - extensions: List of supported extensions
48
+ - generators: Full registry list
49
+ """
50
+
51
+ def __init__(self):
52
+ super().__init__(
53
+ name="build_registry",
54
+ description="Manages build generators registry and handler routing"
55
+ )
56
+
57
+ def get_output_schema(self) -> Dict[str, Any]:
58
+ """Define build registry output schema."""
59
+ return {
60
+ "type": "object",
61
+ "properties": {
62
+ "handler": {"type": "string"},
63
+ "extensions": {"type": "array", "items": {"type": "string"}},
64
+ "generators": {
65
+ "type": "array",
66
+ "items": {
67
+ "type": "object",
68
+ "properties": {
69
+ "id": {"type": "string"},
70
+ "title": {"type": "string"},
71
+ "output_extension": {"type": "string"},
72
+ "handler_type": {"type": "string"},
73
+ "description": {"type": "string"},
74
+ }
75
+ }
76
+ },
77
+ },
78
+ }
79
+
80
+ def get_required_fields(self) -> list:
81
+ """Return required input fields (none are strictly required)."""
82
+ return []
83
+
84
+ def validate_input(self, input_data: Dict[str, Any]) -> bool:
85
+ """Validate build registry input."""
86
+ # No strict requirements - can be called with or without parameters
87
+ return True
88
+
89
+ async def execute(self, input_data: Dict[str, Any]) -> Dict[str, Any]:
90
+ """Execute build registry operations."""
91
+ self.validate_input(input_data)
92
+
93
+ # Determine action to perform
94
+ action = input_data.get("action", "get_generators").lower()
95
+ extension = input_data.get("extension")
96
+
97
+ if action == "get_handler":
98
+ handler = self._get_handler_for_extension(extension)
99
+ return {
100
+ "handler": handler,
101
+ "extension": extension,
102
+ }
103
+ elif action == "list_extensions":
104
+ extensions = self._list_extensions()
105
+ return {
106
+ "extensions": extensions,
107
+ }
108
+ else: # Default: get_generators
109
+ generators = self._get_generators()
110
+ extensions = self._list_extensions()
111
+ return {
112
+ "generators": generators,
113
+ "extensions": extensions,
114
+ }
115
+
116
+ def _get_generators(self) -> List[Dict[str, Any]]:
117
+ """
118
+ Return the complete build generators registry.
119
+
120
+ Returns:
121
+ List of generator definitions
122
+ """
123
+ return BUILD_GENERATORS
124
+
125
+ def _get_handler_for_extension(self, extension: Optional[str]) -> Optional[str]:
126
+ """
127
+ Return handler_type for the given output extension.
128
+
129
+ Examples:
130
+ 'tproc' → 'generate_process'
131
+ 'md' → 'agent_stream'
132
+
133
+ Args:
134
+ extension: File extension to look up (case-insensitive)
135
+
136
+ Returns:
137
+ Handler type string or None if not found
138
+ """
139
+ ext = (extension or "").lower().strip()
140
+ if not ext:
141
+ return None
142
+
143
+ for generator in BUILD_GENERATORS:
144
+ if (generator.get("output_extension") or "").lower() == ext:
145
+ return generator.get("handler_type")
146
+
147
+ return None
148
+
149
+ def _list_extensions(self) -> List[str]:
150
+ """
151
+ Return list of supported output extensions.
152
+
153
+ Returns:
154
+ List of extension strings (e.g., ['tproc', 'md'])
155
+ """
156
+ return [
157
+ generator.get("output_extension")
158
+ for generator in BUILD_GENERATORS
159
+ if generator.get("output_extension")
160
+ ]
161
+
162
+ def _get_generator_by_id(self, generator_id: str) -> Optional[Dict[str, Any]]:
163
+ """
164
+ Return generator definition by ID.
165
+
166
+ Args:
167
+ generator_id: Generator ID to look up
168
+
169
+ Returns:
170
+ Generator definition dict or None if not found
171
+ """
172
+ gen_id = (generator_id or "").lower().strip()
173
+ if not gen_id:
174
+ return None
175
+
176
+ for generator in BUILD_GENERATORS:
177
+ if (generator.get("id") or "").lower() == gen_id:
178
+ return generator
179
+
180
+ return None
181
+
182
+ def _get_generator_by_extension(self, extension: str) -> Optional[Dict[str, Any]]:
183
+ """
184
+ Return full generator definition by output extension.
185
+
186
+ Args:
187
+ extension: File extension to look up
188
+
189
+ Returns:
190
+ Generator definition dict or None if not found
191
+ """
192
+ ext = (extension or "").lower().strip()
193
+ if not ext:
194
+ return None
195
+
196
+ for generator in BUILD_GENERATORS:
197
+ if (generator.get("output_extension") or "").lower() == ext:
198
+ return generator
199
+
200
+ return None
201
+
202
+ def _is_extension_supported(self, extension: str) -> bool:
203
+ """
204
+ Check if an extension is supported.
205
+
206
+ Args:
207
+ extension: File extension to check
208
+
209
+ Returns:
210
+ True if extension is supported, False otherwise
211
+ """
212
+ return self._get_handler_for_extension(extension) is not None
213
+
214
+
215
+ # Singleton instance
216
+ build_registry_agent = BuildRegistryAgent()
217
+
218
+
219
+ # ==================== BACKWARD COMPATIBILITY ====================
220
+
221
+ def get_handler_for_extension(extension: str) -> Optional[str]:
222
+ """
223
+ Backward compatibility wrapper for original function.
224
+
225
+ Return handler_type for the given output extension (e.g. 'tproc' -> 'generate_process').
226
+
227
+ Args:
228
+ extension: File extension to look up
229
+
230
+ Returns:
231
+ Handler type string or None
232
+
233
+ Delegates to build_registry_agent singleton.
234
+ """
235
+ return build_registry_agent._get_handler_for_extension(extension)
236
+
237
+
238
+ def list_extensions() -> List[str]:
239
+ """
240
+ Backward compatibility wrapper for original function.
241
+
242
+ Return list of supported output extensions.
243
+
244
+ Returns:
245
+ List of extension strings
246
+
247
+ Delegates to build_registry_agent singleton.
248
+ """
249
+ return build_registry_agent._list_extensions()
@@ -0,0 +1,59 @@
1
+ """
2
+ Common utilities package for PLM skill agents.
3
+
4
+ Wave 9 Conv C (US-AS-9): canonical home for the BPMN-side common
5
+ helpers. The legacy ``agents.common`` import path stays live via
6
+ ``02_App/backend/agents/common/__init__.py`` re-export shim.
7
+ """
8
+
9
+ from plm_skill_packages.common.validators import (
10
+ validate_bpmn_structure,
11
+ validate_required_fields,
12
+ sanitize_bpmn_xml,
13
+ )
14
+
15
+ from plm_skill_packages.common.scoring import (
16
+ build_error_payload,
17
+ derive_plan_name_from_message,
18
+ derive_process_name_from_plan,
19
+ BUILD_ERROR_QUALITY_OR_ITERATIONS,
20
+ BUILD_ERROR_LLM_CONFIG,
21
+ BUILD_ERROR_LLM_UNAVAILABLE,
22
+ BUILD_ERROR_GENERIC,
23
+ )
24
+
25
+ from plm_skill_packages.common.formatters import (
26
+ parse_personas_systems_from_documentation,
27
+ parse_personas_systems_from_bpmn,
28
+ parse_process_name_from_bpmn,
29
+ filter_personas_to_plm_skills,
30
+ count_lines,
31
+ extract_bpmn_from_reply,
32
+ split_reply_markdown_bpmn,
33
+ looks_like_bpmn,
34
+ is_binary_or_encoded,
35
+ is_editable_text_document,
36
+ )
37
+
38
+ __all__ = [
39
+ "validate_bpmn_structure",
40
+ "validate_required_fields",
41
+ "sanitize_bpmn_xml",
42
+ "build_error_payload",
43
+ "derive_plan_name_from_message",
44
+ "derive_process_name_from_plan",
45
+ "BUILD_ERROR_QUALITY_OR_ITERATIONS",
46
+ "BUILD_ERROR_LLM_CONFIG",
47
+ "BUILD_ERROR_LLM_UNAVAILABLE",
48
+ "BUILD_ERROR_GENERIC",
49
+ "parse_personas_systems_from_documentation",
50
+ "parse_personas_systems_from_bpmn",
51
+ "parse_process_name_from_bpmn",
52
+ "filter_personas_to_plm_skills",
53
+ "count_lines",
54
+ "extract_bpmn_from_reply",
55
+ "split_reply_markdown_bpmn",
56
+ "looks_like_bpmn",
57
+ "is_binary_or_encoded",
58
+ "is_editable_text_document",
59
+ ]