skillpool 4.3.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.
- skillpool-4.3.0/PKG-INFO +21 -0
- skillpool-4.3.0/README.md +100 -0
- skillpool-4.3.0/pyproject.toml +58 -0
- skillpool-4.3.0/setup.cfg +4 -0
- skillpool-4.3.0/src/skillpool/__init__.py +74 -0
- skillpool-4.3.0/src/skillpool/__main__.py +6 -0
- skillpool-4.3.0/src/skillpool/adapters/__init__.py +8 -0
- skillpool-4.3.0/src/skillpool/adapters/base.py +41 -0
- skillpool-4.3.0/src/skillpool/adapters/claude_adapter.py +36 -0
- skillpool-4.3.0/src/skillpool/adapters/codex_adapter.py +92 -0
- skillpool-4.3.0/src/skillpool/adapters/hermes_adapter.py +38 -0
- skillpool-4.3.0/src/skillpool/audit/__init__.py +651 -0
- skillpool-4.3.0/src/skillpool/bridge/__init__.py +16 -0
- skillpool-4.3.0/src/skillpool/bridge/freeze_detector.py +134 -0
- skillpool-4.3.0/src/skillpool/bridge/maintenance.py +119 -0
- skillpool-4.3.0/src/skillpool/bridge/wal_manager.py +136 -0
- skillpool-4.3.0/src/skillpool/clawmem_client.py +176 -0
- skillpool-4.3.0/src/skillpool/cli.py +700 -0
- skillpool-4.3.0/src/skillpool/combiner/__init__.py +31 -0
- skillpool-4.3.0/src/skillpool/combiner/lifecycle.py +453 -0
- skillpool-4.3.0/src/skillpool/combiner/models.py +99 -0
- skillpool-4.3.0/src/skillpool/config.py +34 -0
- skillpool-4.3.0/src/skillpool/cost/__init__.py +111 -0
- skillpool-4.3.0/src/skillpool/cost/audit_hash.py +51 -0
- skillpool-4.3.0/src/skillpool/cost/budget_tracker.py +66 -0
- skillpool-4.3.0/src/skillpool/cost/dashboard.py +189 -0
- skillpool-4.3.0/src/skillpool/cost/models.py +129 -0
- skillpool-4.3.0/src/skillpool/cost/token_governor.py +264 -0
- skillpool-4.3.0/src/skillpool/cost/trace_ceiling.py +38 -0
- skillpool-4.3.0/src/skillpool/csdf.py +126 -0
- skillpool-4.3.0/src/skillpool/evolver/__init__.py +978 -0
- skillpool-4.3.0/src/skillpool/gain/__init__.py +285 -0
- skillpool-4.3.0/src/skillpool/gate.py +282 -0
- skillpool-4.3.0/src/skillpool/gate_policy/__init__.py +31 -0
- skillpool-4.3.0/src/skillpool/gate_policy/incremental.py +157 -0
- skillpool-4.3.0/src/skillpool/gate_policy/parser.py +258 -0
- skillpool-4.3.0/src/skillpool/gate_policy/state_machine.py +432 -0
- skillpool-4.3.0/src/skillpool/graph/__init__.py +14 -0
- skillpool-4.3.0/src/skillpool/graph/ppr.py +279 -0
- skillpool-4.3.0/src/skillpool/health/__init__.py +73 -0
- skillpool-4.3.0/src/skillpool/health/check.py +85 -0
- skillpool-4.3.0/src/skillpool/health/degradation.py +90 -0
- skillpool-4.3.0/src/skillpool/health/models.py +43 -0
- skillpool-4.3.0/src/skillpool/hooks/__init__.py +4 -0
- skillpool-4.3.0/src/skillpool/hooks/security_scanner.py +288 -0
- skillpool-4.3.0/src/skillpool/lifecycle.py +150 -0
- skillpool-4.3.0/src/skillpool/materializer/__init__.py +124 -0
- skillpool-4.3.0/src/skillpool/materializer/budget_cropper.py +178 -0
- skillpool-4.3.0/src/skillpool/materializer/csdf_loader.py +114 -0
- skillpool-4.3.0/src/skillpool/materializer/lazy_loader.py +265 -0
- skillpool-4.3.0/src/skillpool/materializer/lifecycle_filter.py +93 -0
- skillpool-4.3.0/src/skillpool/materializer/mapper.py +178 -0
- skillpool-4.3.0/src/skillpool/materializer/models.py +66 -0
- skillpool-4.3.0/src/skillpool/mcp_server.py +2005 -0
- skillpool-4.3.0/src/skillpool/monitor/__init__.py +576 -0
- skillpool-4.3.0/src/skillpool/monitor/bug_collector.py +392 -0
- skillpool-4.3.0/src/skillpool/monitor/defect_classifier.py +218 -0
- skillpool-4.3.0/src/skillpool/monitor/self_healing.py +530 -0
- skillpool-4.3.0/src/skillpool/monitor/telemetry_bridge.py +197 -0
- skillpool-4.3.0/src/skillpool/paradigm/__init__.py +312 -0
- skillpool-4.3.0/src/skillpool/paradigm/override.py +285 -0
- skillpool-4.3.0/src/skillpool/profile.py +94 -0
- skillpool-4.3.0/src/skillpool/quality.py +254 -0
- skillpool-4.3.0/src/skillpool/registry/__init__.py +509 -0
- skillpool-4.3.0/src/skillpool/registry/models.py +98 -0
- skillpool-4.3.0/src/skillpool/resolver/__init__.py +320 -0
- skillpool-4.3.0/src/skillpool/resolver/cache.py +103 -0
- skillpool-4.3.0/src/skillpool/resolver/circuit_breaker.py +103 -0
- skillpool-4.3.0/src/skillpool/resolver/conflict_detector.py +111 -0
- skillpool-4.3.0/src/skillpool/resolver/health_filter.py +38 -0
- skillpool-4.3.0/src/skillpool/resolver/models.py +154 -0
- skillpool-4.3.0/src/skillpool/resolver/rate_limiter.py +48 -0
- skillpool-4.3.0/src/skillpool/resolver/skill_graph.py +183 -0
- skillpool-4.3.0/src/skillpool/review/__init__.py +242 -0
- skillpool-4.3.0/src/skillpool/review/async_queue.py +96 -0
- skillpool-4.3.0/src/skillpool/review/checkpoint_runner.py +345 -0
- skillpool-4.3.0/src/skillpool/review/models.py +164 -0
- skillpool-4.3.0/src/skillpool/review/suspect_marker.py +39 -0
- skillpool-4.3.0/src/skillpool/review/veto_evaluator.py +94 -0
- skillpool-4.3.0/src/skillpool/router/__init__.py +481 -0
- skillpool-4.3.0/src/skillpool/schemas.py +119 -0
- skillpool-4.3.0/src/skillpool/synergy/__init__.py +240 -0
- skillpool-4.3.0/src/skillpool/synergy/detector.py +5 -0
- skillpool-4.3.0/src/skillpool/telemetry.py +126 -0
- skillpool-4.3.0/src/skillpool/utils/__init__.py +21 -0
- skillpool-4.3.0/src/skillpool/utils/changelog.py +218 -0
- skillpool-4.3.0/src/skillpool/utils/logger.py +273 -0
- skillpool-4.3.0/src/skillpool/utils/runtime_audit.py +163 -0
- skillpool-4.3.0/src/skillpool/utils/time_utils.py +13 -0
- skillpool-4.3.0/src/skillpool.egg-info/PKG-INFO +21 -0
- skillpool-4.3.0/src/skillpool.egg-info/SOURCES.txt +155 -0
- skillpool-4.3.0/src/skillpool.egg-info/dependency_links.txt +1 -0
- skillpool-4.3.0/src/skillpool.egg-info/entry_points.txt +3 -0
- skillpool-4.3.0/src/skillpool.egg-info/requires.txt +17 -0
- skillpool-4.3.0/src/skillpool.egg-info/top_level.txt +1 -0
- skillpool-4.3.0/tests/test_audit.py +485 -0
- skillpool-4.3.0/tests/test_budget_tracker.py +100 -0
- skillpool-4.3.0/tests/test_bug_collector.py +600 -0
- skillpool-4.3.0/tests/test_changelog.py +312 -0
- skillpool-4.3.0/tests/test_circuit_breaker.py +78 -0
- skillpool-4.3.0/tests/test_clawmem_client.py +82 -0
- skillpool-4.3.0/tests/test_clawmem_gaps.py +154 -0
- skillpool-4.3.0/tests/test_codex_adapter.py +178 -0
- skillpool-4.3.0/tests/test_combiner.py +1059 -0
- skillpool-4.3.0/tests/test_config.py +59 -0
- skillpool-4.3.0/tests/test_conflict_detector.py +138 -0
- skillpool-4.3.0/tests/test_cost_dashboard.py +204 -0
- skillpool-4.3.0/tests/test_cost_gaps.py +115 -0
- skillpool-4.3.0/tests/test_cross_agent.py +283 -0
- skillpool-4.3.0/tests/test_defect_classifier.py +305 -0
- skillpool-4.3.0/tests/test_e2e.py +130 -0
- skillpool-4.3.0/tests/test_evolver.py +803 -0
- skillpool-4.3.0/tests/test_evolver_gaps.py +396 -0
- skillpool-4.3.0/tests/test_gain.py +924 -0
- skillpool-4.3.0/tests/test_gate.py +219 -0
- skillpool-4.3.0/tests/test_gate_policy.py +768 -0
- skillpool-4.3.0/tests/test_graph.py +466 -0
- skillpool-4.3.0/tests/test_health.py +171 -0
- skillpool-4.3.0/tests/test_health_gaps.py +78 -0
- skillpool-4.3.0/tests/test_integration.py +219 -0
- skillpool-4.3.0/tests/test_lazy_loader.py +197 -0
- skillpool-4.3.0/tests/test_lifecycle.py +174 -0
- skillpool-4.3.0/tests/test_lifecycle_gaps.py +167 -0
- skillpool-4.3.0/tests/test_logger.py +198 -0
- skillpool-4.3.0/tests/test_materializer.py +765 -0
- skillpool-4.3.0/tests/test_materializer_gaps.py +200 -0
- skillpool-4.3.0/tests/test_mcp_e2e.py +751 -0
- skillpool-4.3.0/tests/test_mcp_protocol.py +445 -0
- skillpool-4.3.0/tests/test_mcp_server.py +1157 -0
- skillpool-4.3.0/tests/test_mcp_server_gaps.py +615 -0
- skillpool-4.3.0/tests/test_monitor.py +446 -0
- skillpool-4.3.0/tests/test_monitor_gaps.py +319 -0
- skillpool-4.3.0/tests/test_override.py +385 -0
- skillpool-4.3.0/tests/test_paradigm.py +286 -0
- skillpool-4.3.0/tests/test_ppr.py +147 -0
- skillpool-4.3.0/tests/test_profile.py +192 -0
- skillpool-4.3.0/tests/test_quality.py +1083 -0
- skillpool-4.3.0/tests/test_rate_limiter.py +40 -0
- skillpool-4.3.0/tests/test_registry.py +573 -0
- skillpool-4.3.0/tests/test_registry_gaps.py +526 -0
- skillpool-4.3.0/tests/test_resolver.py +755 -0
- skillpool-4.3.0/tests/test_resolver_cache.py +121 -0
- skillpool-4.3.0/tests/test_review.py +650 -0
- skillpool-4.3.0/tests/test_review_checkpoint.py +1610 -0
- skillpool-4.3.0/tests/test_router.py +360 -0
- skillpool-4.3.0/tests/test_router_gaps.py +589 -0
- skillpool-4.3.0/tests/test_runtime_audit.py +563 -0
- skillpool-4.3.0/tests/test_schemas.py +466 -0
- skillpool-4.3.0/tests/test_security_scanner.py +484 -0
- skillpool-4.3.0/tests/test_self_healing.py +727 -0
- skillpool-4.3.0/tests/test_skill_graph.py +111 -0
- skillpool-4.3.0/tests/test_synergy.py +633 -0
- skillpool-4.3.0/tests/test_synergy_detector.py +297 -0
- skillpool-4.3.0/tests/test_telemetry.py +223 -0
- skillpool-4.3.0/tests/test_telemetry_gaps.py +168 -0
- skillpool-4.3.0/tests/test_token_governor.py +513 -0
- skillpool-4.3.0/tests/test_trace_ceiling_audit.py +106 -0
skillpool-4.3.0/PKG-INFO
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: skillpool
|
|
3
|
+
Version: 4.3.0
|
|
4
|
+
Summary: Skill Pool V4.3 — AI Agent Skill Governance & Delivery Platform
|
|
5
|
+
License: MIT
|
|
6
|
+
Requires-Python: >=3.11
|
|
7
|
+
Requires-Dist: click>=8.0
|
|
8
|
+
Requires-Dist: pydantic>=2.0
|
|
9
|
+
Requires-Dist: fastmcp>=0.2.0
|
|
10
|
+
Requires-Dist: pyyaml>=6.0
|
|
11
|
+
Requires-Dist: httpx>=0.24.0
|
|
12
|
+
Provides-Extra: graph
|
|
13
|
+
Requires-Dist: numpy>=1.24; extra == "graph"
|
|
14
|
+
Requires-Dist: scipy>=1.10; extra == "graph"
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
17
|
+
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
18
|
+
Requires-Dist: pytest-xdist>=3.0; extra == "dev"
|
|
19
|
+
Requires-Dist: pytest-asyncio>=0.21; extra == "dev"
|
|
20
|
+
Requires-Dist: pytest-bdd>=7.0; extra == "dev"
|
|
21
|
+
Requires-Dist: ruff>=0.1; extra == "dev"
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# SkillPool v4.3.0
|
|
2
|
+
|
|
3
|
+
> AI Agent Skill Governance & Delivery Platform — MCP Resources/Tools/Prompts architecture
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Install (editable)
|
|
9
|
+
pip install -e .
|
|
10
|
+
|
|
11
|
+
# CLI
|
|
12
|
+
skillpool --version
|
|
13
|
+
skillpool inspect S09
|
|
14
|
+
|
|
15
|
+
# MCP Server (stdio)
|
|
16
|
+
skillpool-mcp
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Architecture (V4.3 Dual-Channel)
|
|
20
|
+
|
|
21
|
+
| Channel | Transport | Purpose |
|
|
22
|
+
|---------|-----------|---------|
|
|
23
|
+
| CLI | Start Hook | Materialization — one-time SKILL.md file writes |
|
|
24
|
+
| MCP Resources | stdio | Read-only context delivery (skill definitions, audit, bugs) |
|
|
25
|
+
| MCP Tools | stdio | State-changing governance actions (register, gate, heal) |
|
|
26
|
+
| MCP Prompts | stdio | User-controlled templates (review, skill context) |
|
|
27
|
+
|
|
28
|
+
## MCP Resources (Read-Only)
|
|
29
|
+
|
|
30
|
+
| URI | Description |
|
|
31
|
+
|-----|-------------|
|
|
32
|
+
| `skill://list` | All skills metadata (L0 tier, ~50 tokens/skill) |
|
|
33
|
+
| `skill://{id}/summary` | Medium detail (L1 tier, ~200 tokens) |
|
|
34
|
+
| `skill://{id}/definition` | Full SKILL.md content (L2 tier) |
|
|
35
|
+
| `skill://{id}/manifest.yaml` | Dependencies, conflicts, veto rules |
|
|
36
|
+
| `skill://{id}/x-execution` | Execution method + input/output schema |
|
|
37
|
+
| `skill://graph` | Skill dependency DAG |
|
|
38
|
+
| `audit://records` | Audit hash chain (read-only, immutable) |
|
|
39
|
+
| `bug://list` | BugCollector defect records |
|
|
40
|
+
|
|
41
|
+
## MCP Tools (Governance Actions)
|
|
42
|
+
|
|
43
|
+
| Tool | Description |
|
|
44
|
+
|------|-------------|
|
|
45
|
+
| `gate_check` | Gate decision (ALLOW/GUARD/ESCALATE/DENY) |
|
|
46
|
+
| `telemetry_report` | Report telemetry event |
|
|
47
|
+
| `audit_verify` | Verify audit hash chain integrity |
|
|
48
|
+
| `security_scan` | Pre-materialization security gate |
|
|
49
|
+
| `healing_scan` | Scan bugs for recurring defects, propose healing |
|
|
50
|
+
| `healing_execute` | Execute healing with BDD verify + auto-rollback |
|
|
51
|
+
| `skill_register` | Register skill candidate into Registry |
|
|
52
|
+
| `skill_transition` | Transition skill lifecycle state |
|
|
53
|
+
| `evolution_trigger` | Record defect triggering evolution |
|
|
54
|
+
| `evolution_proposal` | Create recommendation-only evolution proposal |
|
|
55
|
+
| `monitor_evaluate` | Five-dimension skill evaluation |
|
|
56
|
+
| `health_check` | System health check |
|
|
57
|
+
| `review_trigger` | Trigger review checkpoint (L1-L4) |
|
|
58
|
+
|
|
59
|
+
## MCP Prompts (User-Controlled)
|
|
60
|
+
|
|
61
|
+
| Prompt | Description |
|
|
62
|
+
|--------|-------------|
|
|
63
|
+
| `skill_context {skill_id}` | Inject skill definition + dependencies |
|
|
64
|
+
| `trigger_review` | Multi-dimension review (uses MCP Resources) |
|
|
65
|
+
| `gate_status {skill_id}` | Check gate decision for a skill |
|
|
66
|
+
|
|
67
|
+
## Security Architecture
|
|
68
|
+
|
|
69
|
+
Three-layer pre-materialization security gate:
|
|
70
|
+
1. **Hook layer**: SecurityScanner — YAML safety + dangerous pattern scanning
|
|
71
|
+
2. **MCP layer**: `gate_check` tool — complexity assessment + profile matching
|
|
72
|
+
3. **Audit layer**: Immutable hash chain — all actions recorded, tamper-evident
|
|
73
|
+
|
|
74
|
+
Timeout degradation: `gate_check` → DENY, `telemetry` → silent, `health_check` → DEGRADED
|
|
75
|
+
|
|
76
|
+
## Key Modules
|
|
77
|
+
|
|
78
|
+
| Module | Description |
|
|
79
|
+
|--------|-------------|
|
|
80
|
+
| Lifecycle | 9-state skill lifecycle state machine |
|
|
81
|
+
| Profile | Agent capability profiles (Claude Code/Codex/Hermes) |
|
|
82
|
+
| Gate | Gate management + complexity assessment |
|
|
83
|
+
| Materializer | CSDF → SKILL.md materialization engine (14 mapping rules) |
|
|
84
|
+
| LazySkillLoader | L0/L1/L2 tiered loading with cache + thread safety |
|
|
85
|
+
| Resolver | Skill chain resolution + DAG + circuit breaker + rate limiter |
|
|
86
|
+
| Review | Review trigger + VETO V1-V6 + L1-L4 checkpoints |
|
|
87
|
+
| BugCollector | 4-stage defect pipeline (Capture→Enrich→Filter→Persist) |
|
|
88
|
+
| SelfHealingLoop | BugCollector → Evolver → BDD verify → auto-rollback |
|
|
89
|
+
| SecurityScanner | YAML safety + dangerous pattern scanning + signature placeholder |
|
|
90
|
+
| Audit | 34-field OTel audit + SHA-256 hash chain |
|
|
91
|
+
| Evolver | Defect accumulation + Add/Merge/Discard evolution |
|
|
92
|
+
| Registry | Skill registry + supply chain evidence + 9-state lifecycle |
|
|
93
|
+
|
|
94
|
+
## Test Baseline
|
|
95
|
+
|
|
96
|
+
1027 tests passing (V4.3.0)
|
|
97
|
+
|
|
98
|
+
## License
|
|
99
|
+
|
|
100
|
+
MIT
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "skillpool"
|
|
7
|
+
version = "4.3.0"
|
|
8
|
+
description = "Skill Pool V4.3 — AI Agent Skill Governance & Delivery Platform"
|
|
9
|
+
requires-python = ">=3.11"
|
|
10
|
+
license = {text = "MIT"}
|
|
11
|
+
dependencies = [
|
|
12
|
+
"click>=8.0",
|
|
13
|
+
"pydantic>=2.0",
|
|
14
|
+
"fastmcp>=0.2.0",
|
|
15
|
+
"pyyaml>=6.0",
|
|
16
|
+
"httpx>=0.24.0",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
[project.optional-dependencies]
|
|
20
|
+
graph = ["numpy>=1.24", "scipy>=1.10"]
|
|
21
|
+
dev = ["pytest>=7.0", "pytest-cov>=4.0", "pytest-xdist>=3.0", "pytest-asyncio>=0.21", "pytest-bdd>=7.0", "ruff>=0.1"]
|
|
22
|
+
|
|
23
|
+
[project.scripts]
|
|
24
|
+
skillpool = "skillpool.cli:main"
|
|
25
|
+
skillpool-mcp = "skillpool.mcp_server:main"
|
|
26
|
+
|
|
27
|
+
[tool.setuptools.packages.find]
|
|
28
|
+
where = ["src"]
|
|
29
|
+
|
|
30
|
+
[tool.pytest.ini_options]
|
|
31
|
+
testpaths = ["tests"]
|
|
32
|
+
addopts = "-v --tb=short"
|
|
33
|
+
asyncio_mode = "auto"
|
|
34
|
+
|
|
35
|
+
[tool.coverage.run]
|
|
36
|
+
source = ["skillpool"]
|
|
37
|
+
branch = true
|
|
38
|
+
omit = [
|
|
39
|
+
"*/skillpool/cli.py", # Click CLI — tested via subprocess
|
|
40
|
+
"*/skillpool/__main__.py", # Entry point
|
|
41
|
+
"*/skillpool/adapters/*", # Adapter stubs (not yet implemented)
|
|
42
|
+
"*/skillpool/bridge/*", # Bridge module (WIP)
|
|
43
|
+
"*/skillpool/csdf.py", # CSDF standalone (covered via materializer)
|
|
44
|
+
"*/skillpool/quality.py", # Quality module (placeholder)
|
|
45
|
+
"*/skillpool/synergy/detector.py", # 2-line re-export
|
|
46
|
+
"*/skillpool/mcp_server.py", # FastMCP server — tested via E2E, not unit-cov
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
[tool.coverage.report]
|
|
50
|
+
fail_under = 90
|
|
51
|
+
exclude_also = [
|
|
52
|
+
"if TYPE_CHECKING:",
|
|
53
|
+
"raise NotImplementedError",
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
[tool.ruff]
|
|
57
|
+
line-length = 120
|
|
58
|
+
target-version = "py311"
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""SkillPool — Skill lifecycle management system."""
|
|
2
|
+
|
|
3
|
+
from skillpool.audit import AuditLayer, AuditRecord, AuditUnavailableError, log_event
|
|
4
|
+
from skillpool.clawmem_client import ClawMemClient
|
|
5
|
+
from skillpool.cost import CostManager
|
|
6
|
+
from skillpool.evolver import EvolverLayer, EvolutionProposal, DefectSeverity
|
|
7
|
+
from skillpool.gate import GateManager
|
|
8
|
+
|
|
9
|
+
# graph is lazy-imported via __getattr__ (numpy/scipy are optional)
|
|
10
|
+
from skillpool.health import HealthManager
|
|
11
|
+
from skillpool.lifecycle import SkillLifecycleState
|
|
12
|
+
from skillpool.materializer import Materializer
|
|
13
|
+
from skillpool.monitor import MonitorLayer, TelemetryBridge, FiveDimensionEvaluation
|
|
14
|
+
from skillpool.paradigm import ParadigmRegistry
|
|
15
|
+
from skillpool.profile import AgentCapabilityProfile
|
|
16
|
+
from skillpool.registry import Registry, SkillRecord, SkillStatus
|
|
17
|
+
from skillpool.resolver import SkillResolver
|
|
18
|
+
from skillpool.review import ReviewManager
|
|
19
|
+
from skillpool.telemetry import TelemetryBridge as CoreTelemetryBridge
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def __getattr__(name: str):
|
|
23
|
+
"""Lazy import for graph module (numpy/scipy are optional dependencies)."""
|
|
24
|
+
if name in ("personalized_pagerank", "reverse_ppr"):
|
|
25
|
+
from skillpool.graph import personalized_pagerank, reverse_ppr # noqa: F401
|
|
26
|
+
|
|
27
|
+
return locals().get(name)
|
|
28
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
__all__ = [
|
|
32
|
+
# Audit
|
|
33
|
+
"AuditLayer",
|
|
34
|
+
"AuditRecord",
|
|
35
|
+
"AuditUnavailableError",
|
|
36
|
+
"log_event",
|
|
37
|
+
# ClawMem
|
|
38
|
+
"ClawMemClient",
|
|
39
|
+
# Cost
|
|
40
|
+
"CostManager",
|
|
41
|
+
# Evolver
|
|
42
|
+
"EvolverLayer",
|
|
43
|
+
"EvolutionProposal",
|
|
44
|
+
"DefectSeverity",
|
|
45
|
+
# Gate
|
|
46
|
+
"GateManager",
|
|
47
|
+
# Graph
|
|
48
|
+
"personalized_pagerank",
|
|
49
|
+
"reverse_ppr",
|
|
50
|
+
# Health
|
|
51
|
+
"HealthManager",
|
|
52
|
+
# Lifecycle
|
|
53
|
+
"SkillLifecycleState",
|
|
54
|
+
# Materializer
|
|
55
|
+
"Materializer",
|
|
56
|
+
# Monitor
|
|
57
|
+
"MonitorLayer",
|
|
58
|
+
"TelemetryBridge",
|
|
59
|
+
"FiveDimensionEvaluation",
|
|
60
|
+
# Paradigm
|
|
61
|
+
"ParadigmRegistry",
|
|
62
|
+
# Profile
|
|
63
|
+
"AgentCapabilityProfile",
|
|
64
|
+
# Registry
|
|
65
|
+
"Registry",
|
|
66
|
+
"SkillRecord",
|
|
67
|
+
"SkillStatus",
|
|
68
|
+
# Resolver
|
|
69
|
+
"SkillResolver",
|
|
70
|
+
# Review
|
|
71
|
+
"ReviewManager",
|
|
72
|
+
# Core telemetry
|
|
73
|
+
"CoreTelemetryBridge",
|
|
74
|
+
]
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""SkillPool Agent Adapters — unified interface for agent runtime integration."""
|
|
2
|
+
|
|
3
|
+
from .base import AgentAdapter
|
|
4
|
+
from .claude_adapter import ClaudeAdapter
|
|
5
|
+
from .codex_adapter import CodexAdapter
|
|
6
|
+
from .hermes_adapter import HermesAdapter
|
|
7
|
+
|
|
8
|
+
__all__ = ["AgentAdapter", "ClaudeAdapter", "CodexAdapter", "HermesAdapter"]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""SkillPool Agent Adapter — Base class for agent runtime integration."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
from skillpool.csdf import CSDFDocument
|
|
9
|
+
from skillpool.materializer import MaterializationResult, Materializer
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class AgentAdapter(ABC):
|
|
13
|
+
"""Base class for agent-specific skill adapters.
|
|
14
|
+
|
|
15
|
+
Subclasses must implement:
|
|
16
|
+
- render_skill: format a CSDF document for the target agent
|
|
17
|
+
- install_skill: place the rendered skill in the agent's runtime directory
|
|
18
|
+
- verify_skill: confirm the skill is accessible to the agent
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, materializer: Materializer | None = None, state_dir: Path = Path(".skillpool")) -> None:
|
|
22
|
+
self.materializer = materializer or Materializer(state_dir)
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def render_skill(self, doc: CSDFDocument) -> str:
|
|
26
|
+
"""Render a CSDF document into the agent's native format."""
|
|
27
|
+
...
|
|
28
|
+
|
|
29
|
+
@abstractmethod
|
|
30
|
+
def install_skill(self, doc: CSDFDocument, target_dir: Path) -> MaterializationResult:
|
|
31
|
+
"""Render and install a skill into the agent's runtime directory."""
|
|
32
|
+
...
|
|
33
|
+
|
|
34
|
+
@abstractmethod
|
|
35
|
+
def verify_skill(self, name: str, target_dir: Path) -> bool:
|
|
36
|
+
"""Verify a skill is installed and accessible."""
|
|
37
|
+
...
|
|
38
|
+
|
|
39
|
+
def materialize_and_install(self, doc: CSDFDocument, target_dir: Path) -> MaterializationResult:
|
|
40
|
+
"""Convenience: render + install in one call."""
|
|
41
|
+
return self.install_skill(doc, target_dir)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Claude Agent Adapter — skill integration for Claude runtime."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from skillpool.csdf import CSDFDocument
|
|
8
|
+
from skillpool.materializer import MaterializationResult, Materializer
|
|
9
|
+
|
|
10
|
+
from .base import AgentAdapter
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ClaudeAdapter(AgentAdapter):
|
|
14
|
+
"""Adapter for Claude agent runtime.
|
|
15
|
+
|
|
16
|
+
Claude expects SKILL.md files with ### When to use / ### Instructions.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(self, materializer: Materializer | None = None, state_dir: Path = Path(".skillpool")) -> None:
|
|
20
|
+
super().__init__(materializer, state_dir)
|
|
21
|
+
self.agent_type = "claude"
|
|
22
|
+
|
|
23
|
+
def render_skill(self, doc: CSDFDocument) -> str:
|
|
24
|
+
"""Render CSDF as Claude-compatible SKILL.md."""
|
|
25
|
+
triggers = "\n".join(f"- {t}" for t in doc.triggers) if doc.triggers else "- (none)"
|
|
26
|
+
return f"# {doc.name}\n\n{doc.description}\n\n### When to use\n{triggers}\n\n### Instructions\n{doc.body}\n"
|
|
27
|
+
|
|
28
|
+
def install_skill(self, doc: CSDFDocument, target_dir: Path) -> MaterializationResult:
|
|
29
|
+
"""Materialize and install skill into Claude skills directory."""
|
|
30
|
+
output_path = target_dir / f"{doc.name}.md"
|
|
31
|
+
return self.materializer.materialize(doc, agent_type=self.agent_type, output_path=output_path)
|
|
32
|
+
|
|
33
|
+
def verify_skill(self, name: str, target_dir: Path) -> bool:
|
|
34
|
+
"""Check if a Claude skill file exists and is non-empty."""
|
|
35
|
+
skill_file = target_dir / f"{name}.md"
|
|
36
|
+
return skill_file.exists() and skill_file.stat().st_size > 0
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Codex Agent Adapter — skill integration for Codex runtime."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
from skillpool.config import get_data_dir
|
|
9
|
+
from skillpool.csdf import CSDFDocument
|
|
10
|
+
from skillpool.materializer import MaterializationResult, Materializer
|
|
11
|
+
|
|
12
|
+
from .base import AgentAdapter
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class CodexAdapter(AgentAdapter):
|
|
18
|
+
"""Adapter for Codex agent runtime.
|
|
19
|
+
|
|
20
|
+
Codex expects SKILL.md files with ## Triggers / ## Instructions sections.
|
|
21
|
+
Startup hook auto-registers skills from ~/.skillpool/skills/ on init.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, materializer: Materializer | None = None, state_dir: Path = Path(".skillpool")) -> None:
|
|
25
|
+
super().__init__(materializer, state_dir)
|
|
26
|
+
self.agent_type = "codex"
|
|
27
|
+
self._skills_dir = get_data_dir() / "skills"
|
|
28
|
+
|
|
29
|
+
def render_skill(self, doc: CSDFDocument) -> str:
|
|
30
|
+
"""Render CSDF as Codex-compatible SKILL.md."""
|
|
31
|
+
triggers = "\n".join(f"- {t}" for t in doc.triggers) if doc.triggers else "- (none)"
|
|
32
|
+
return f"# {doc.name}\n\n{doc.description}\n\n## Triggers\n{triggers}\n\n## Instructions\n{doc.body}\n"
|
|
33
|
+
|
|
34
|
+
def install_skill(self, doc: CSDFDocument, target_dir: Path) -> MaterializationResult:
|
|
35
|
+
"""Materialize and install skill into Codex skills directory."""
|
|
36
|
+
output_path = target_dir / f"{doc.name}.md"
|
|
37
|
+
return self.materializer.materialize(doc, agent_type=self.agent_type, output_path=output_path)
|
|
38
|
+
|
|
39
|
+
def verify_skill(self, name: str, target_dir: Path) -> bool:
|
|
40
|
+
"""Check if a Codex skill file exists and is non-empty."""
|
|
41
|
+
skill_file = target_dir / f"{name}.md"
|
|
42
|
+
return skill_file.exists() and skill_file.stat().st_size > 0
|
|
43
|
+
|
|
44
|
+
def on_startup(self, target_dir: Path | None = None) -> dict[str, bool]:
|
|
45
|
+
"""Startup hook: auto-register all skills from SkillPool.
|
|
46
|
+
|
|
47
|
+
Called when Codex initializes to sync skills from ~/.skillpool/skills/
|
|
48
|
+
to the Codex skills directory.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
target_dir: Codex skills directory (defaults to ~/.codex/skills/).
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
Dict mapping skill_id to install success status.
|
|
55
|
+
"""
|
|
56
|
+
from skillpool.materializer.csdf_loader import load_csdf
|
|
57
|
+
|
|
58
|
+
target = target_dir or Path.home() / ".codex" / "skills"
|
|
59
|
+
target.mkdir(parents=True, exist_ok=True)
|
|
60
|
+
|
|
61
|
+
results: dict[str, bool] = {}
|
|
62
|
+
|
|
63
|
+
if not self._skills_dir.exists():
|
|
64
|
+
logger.info("Codex startup hook: no skills directory found at %s", self._skills_dir)
|
|
65
|
+
return results
|
|
66
|
+
|
|
67
|
+
# Scan for CSDF YAML files
|
|
68
|
+
for yaml_file in sorted(self._skills_dir.glob("*.yaml")):
|
|
69
|
+
if yaml_file.name == "skill_graph.yaml":
|
|
70
|
+
continue
|
|
71
|
+
skill_id = yaml_file.stem.split("-")[0]
|
|
72
|
+
try:
|
|
73
|
+
csdf_data = load_csdf(skill_id, self._skills_dir)
|
|
74
|
+
if csdf_data is None:
|
|
75
|
+
continue
|
|
76
|
+
doc = CSDFDocument(**csdf_data)
|
|
77
|
+
# Render and write directly (bypass broken install_skill)
|
|
78
|
+
rendered = self.render_skill(doc)
|
|
79
|
+
output_path = target / f"{doc.name}.md"
|
|
80
|
+
output_path.write_text(rendered, encoding="utf-8")
|
|
81
|
+
success = output_path.exists() and output_path.stat().st_size > 0
|
|
82
|
+
results[skill_id] = success
|
|
83
|
+
if success:
|
|
84
|
+
logger.debug("Codex startup hook: installed %s", skill_id)
|
|
85
|
+
else:
|
|
86
|
+
logger.warning("Codex startup hook: failed to install %s (empty file)", skill_id)
|
|
87
|
+
except Exception as e:
|
|
88
|
+
logger.error("Codex startup hook: error installing %s: %s", skill_id, e)
|
|
89
|
+
results[skill_id] = False
|
|
90
|
+
|
|
91
|
+
logger.info("Codex startup hook: registered %d/%d skills", sum(results.values()), len(results))
|
|
92
|
+
return results
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""Hermes Agent Adapter — skill integration for Hermes TUI runtime."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from skillpool.csdf import CSDFDocument
|
|
8
|
+
from skillpool.materializer import MaterializationResult, Materializer
|
|
9
|
+
|
|
10
|
+
from .base import AgentAdapter
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class HermesAdapter(AgentAdapter):
|
|
14
|
+
"""Adapter for Hermes TUI agent runtime.
|
|
15
|
+
|
|
16
|
+
Hermes is a TUI agent that reads skills from ~/.hermes/skills/.
|
|
17
|
+
Format: SKILL.md with ## When to use / ## Instructions sections,
|
|
18
|
+
matching the directory-based skill layout Hermes expects.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, materializer: Materializer | None = None, state_dir: Path = Path(".skillpool")) -> None:
|
|
22
|
+
super().__init__(materializer, state_dir)
|
|
23
|
+
self.agent_type = "hermes"
|
|
24
|
+
|
|
25
|
+
def render_skill(self, doc: CSDFDocument) -> str:
|
|
26
|
+
"""Render CSDF as Hermes-compatible SKILL.md."""
|
|
27
|
+
triggers = "\n".join(f"- {t}" for t in doc.triggers) if doc.triggers else "- (none)"
|
|
28
|
+
return f"# {doc.name}\n\n{doc.description}\n\n## When to use\n{triggers}\n\n## Instructions\n{doc.body}\n"
|
|
29
|
+
|
|
30
|
+
def install_skill(self, doc: CSDFDocument, target_dir: Path) -> MaterializationResult:
|
|
31
|
+
"""Materialize and install skill into Hermes skills directory."""
|
|
32
|
+
output_path = target_dir / f"{doc.name}.md"
|
|
33
|
+
return self.materializer.materialize(doc, agent_type=self.agent_type, output_path=output_path)
|
|
34
|
+
|
|
35
|
+
def verify_skill(self, name: str, target_dir: Path) -> bool:
|
|
36
|
+
"""Check if a Hermes skill file exists and is non-empty."""
|
|
37
|
+
skill_file = target_dir / f"{name}.md"
|
|
38
|
+
return skill_file.exists() and skill_file.stat().st_size > 0
|