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.
- plm_skill_packages-1.0.0/PKG-INFO +77 -0
- plm_skill_packages-1.0.0/README.md +62 -0
- plm_skill_packages-1.0.0/plm_skill_packages/__init__.py +66 -0
- plm_skill_packages-1.0.0/plm_skill_packages/build_registry.py +249 -0
- plm_skill_packages-1.0.0/plm_skill_packages/common/__init__.py +59 -0
- plm_skill_packages-1.0.0/plm_skill_packages/common/formatters.py +201 -0
- plm_skill_packages-1.0.0/plm_skill_packages/common/scoring.py +150 -0
- plm_skill_packages-1.0.0/plm_skill_packages/common/validators.py +104 -0
- plm_skill_packages-1.0.0/plm_skill_packages/contracts.py +167 -0
- plm_skill_packages-1.0.0/plm_skill_packages/domain_classifier.py +14 -0
- plm_skill_packages-1.0.0/plm_skill_packages/domain_prompts.py +11 -0
- plm_skill_packages-1.0.0/plm_skill_packages/enrich_tproc_chain.py +300 -0
- plm_skill_packages-1.0.0/plm_skill_packages/lifecycle.py +114 -0
- plm_skill_packages-1.0.0/plm_skill_packages/manifests/bpmn.fix_format.yaml +21 -0
- plm_skill_packages-1.0.0/plm_skill_packages/manifests/bpmn.generate_from_csv.yaml +20 -0
- plm_skill_packages-1.0.0/plm_skill_packages/manifests/build.registry.yaml +19 -0
- plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.bpmn_transpiler.yaml +19 -0
- plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.logic_modeler.yaml +18 -0
- plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.orchestrate_extraction.yaml +21 -0
- plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.process_scout.yaml +18 -0
- plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.quality_gate.yaml +20 -0
- plm_skill_packages-1.0.0/plm_skill_packages/manifests/plm.structural_analyst.yaml +19 -0
- plm_skill_packages-1.0.0/plm_skill_packages/manifests.py +106 -0
- plm_skill_packages-1.0.0/plm_skill_packages/orchestrators/__init__.py +6 -0
- plm_skill_packages-1.0.0/plm_skill_packages/orchestrators/plm_orchestrator.py +489 -0
- plm_skill_packages-1.0.0/plm_skill_packages/output_format_controller.py +847 -0
- plm_skill_packages-1.0.0/plm_skill_packages/plm_bpmn_transpiler.py +225 -0
- plm_skill_packages-1.0.0/plm_skill_packages/plm_logic_modeler.py +477 -0
- plm_skill_packages-1.0.0/plm_skill_packages/plm_process_scout.py +330 -0
- plm_skill_packages-1.0.0/plm_skill_packages/plm_quality_gate.py +454 -0
- plm_skill_packages-1.0.0/plm_skill_packages/plm_structural_analyst.py +359 -0
- plm_skill_packages-1.0.0/plm_skill_packages/process_generator.py +874 -0
- plm_skill_packages-1.0.0/plm_skill_packages/raci_extractor.py +13 -0
- plm_skill_packages-1.0.0/plm_skill_packages/registry.py +104 -0
- plm_skill_packages-1.0.0/plm_skill_packages.egg-info/PKG-INFO +77 -0
- plm_skill_packages-1.0.0/plm_skill_packages.egg-info/SOURCES.txt +45 -0
- plm_skill_packages-1.0.0/plm_skill_packages.egg-info/dependency_links.txt +1 -0
- plm_skill_packages-1.0.0/plm_skill_packages.egg-info/requires.txt +7 -0
- plm_skill_packages-1.0.0/plm_skill_packages.egg-info/top_level.txt +1 -0
- plm_skill_packages-1.0.0/pyproject.toml +128 -0
- plm_skill_packages-1.0.0/setup.cfg +4 -0
- plm_skill_packages-1.0.0/tests/test_contracts.py +133 -0
- plm_skill_packages-1.0.0/tests/test_lifecycle.py +102 -0
- plm_skill_packages-1.0.0/tests/test_lifted_us_as_9_smoke.py +109 -0
- plm_skill_packages-1.0.0/tests/test_manifests.py +133 -0
- plm_skill_packages-1.0.0/tests/test_public_surface.py +42 -0
- 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
|
+
]
|