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.
Files changed (157) hide show
  1. skillpool-4.3.0/PKG-INFO +21 -0
  2. skillpool-4.3.0/README.md +100 -0
  3. skillpool-4.3.0/pyproject.toml +58 -0
  4. skillpool-4.3.0/setup.cfg +4 -0
  5. skillpool-4.3.0/src/skillpool/__init__.py +74 -0
  6. skillpool-4.3.0/src/skillpool/__main__.py +6 -0
  7. skillpool-4.3.0/src/skillpool/adapters/__init__.py +8 -0
  8. skillpool-4.3.0/src/skillpool/adapters/base.py +41 -0
  9. skillpool-4.3.0/src/skillpool/adapters/claude_adapter.py +36 -0
  10. skillpool-4.3.0/src/skillpool/adapters/codex_adapter.py +92 -0
  11. skillpool-4.3.0/src/skillpool/adapters/hermes_adapter.py +38 -0
  12. skillpool-4.3.0/src/skillpool/audit/__init__.py +651 -0
  13. skillpool-4.3.0/src/skillpool/bridge/__init__.py +16 -0
  14. skillpool-4.3.0/src/skillpool/bridge/freeze_detector.py +134 -0
  15. skillpool-4.3.0/src/skillpool/bridge/maintenance.py +119 -0
  16. skillpool-4.3.0/src/skillpool/bridge/wal_manager.py +136 -0
  17. skillpool-4.3.0/src/skillpool/clawmem_client.py +176 -0
  18. skillpool-4.3.0/src/skillpool/cli.py +700 -0
  19. skillpool-4.3.0/src/skillpool/combiner/__init__.py +31 -0
  20. skillpool-4.3.0/src/skillpool/combiner/lifecycle.py +453 -0
  21. skillpool-4.3.0/src/skillpool/combiner/models.py +99 -0
  22. skillpool-4.3.0/src/skillpool/config.py +34 -0
  23. skillpool-4.3.0/src/skillpool/cost/__init__.py +111 -0
  24. skillpool-4.3.0/src/skillpool/cost/audit_hash.py +51 -0
  25. skillpool-4.3.0/src/skillpool/cost/budget_tracker.py +66 -0
  26. skillpool-4.3.0/src/skillpool/cost/dashboard.py +189 -0
  27. skillpool-4.3.0/src/skillpool/cost/models.py +129 -0
  28. skillpool-4.3.0/src/skillpool/cost/token_governor.py +264 -0
  29. skillpool-4.3.0/src/skillpool/cost/trace_ceiling.py +38 -0
  30. skillpool-4.3.0/src/skillpool/csdf.py +126 -0
  31. skillpool-4.3.0/src/skillpool/evolver/__init__.py +978 -0
  32. skillpool-4.3.0/src/skillpool/gain/__init__.py +285 -0
  33. skillpool-4.3.0/src/skillpool/gate.py +282 -0
  34. skillpool-4.3.0/src/skillpool/gate_policy/__init__.py +31 -0
  35. skillpool-4.3.0/src/skillpool/gate_policy/incremental.py +157 -0
  36. skillpool-4.3.0/src/skillpool/gate_policy/parser.py +258 -0
  37. skillpool-4.3.0/src/skillpool/gate_policy/state_machine.py +432 -0
  38. skillpool-4.3.0/src/skillpool/graph/__init__.py +14 -0
  39. skillpool-4.3.0/src/skillpool/graph/ppr.py +279 -0
  40. skillpool-4.3.0/src/skillpool/health/__init__.py +73 -0
  41. skillpool-4.3.0/src/skillpool/health/check.py +85 -0
  42. skillpool-4.3.0/src/skillpool/health/degradation.py +90 -0
  43. skillpool-4.3.0/src/skillpool/health/models.py +43 -0
  44. skillpool-4.3.0/src/skillpool/hooks/__init__.py +4 -0
  45. skillpool-4.3.0/src/skillpool/hooks/security_scanner.py +288 -0
  46. skillpool-4.3.0/src/skillpool/lifecycle.py +150 -0
  47. skillpool-4.3.0/src/skillpool/materializer/__init__.py +124 -0
  48. skillpool-4.3.0/src/skillpool/materializer/budget_cropper.py +178 -0
  49. skillpool-4.3.0/src/skillpool/materializer/csdf_loader.py +114 -0
  50. skillpool-4.3.0/src/skillpool/materializer/lazy_loader.py +265 -0
  51. skillpool-4.3.0/src/skillpool/materializer/lifecycle_filter.py +93 -0
  52. skillpool-4.3.0/src/skillpool/materializer/mapper.py +178 -0
  53. skillpool-4.3.0/src/skillpool/materializer/models.py +66 -0
  54. skillpool-4.3.0/src/skillpool/mcp_server.py +2005 -0
  55. skillpool-4.3.0/src/skillpool/monitor/__init__.py +576 -0
  56. skillpool-4.3.0/src/skillpool/monitor/bug_collector.py +392 -0
  57. skillpool-4.3.0/src/skillpool/monitor/defect_classifier.py +218 -0
  58. skillpool-4.3.0/src/skillpool/monitor/self_healing.py +530 -0
  59. skillpool-4.3.0/src/skillpool/monitor/telemetry_bridge.py +197 -0
  60. skillpool-4.3.0/src/skillpool/paradigm/__init__.py +312 -0
  61. skillpool-4.3.0/src/skillpool/paradigm/override.py +285 -0
  62. skillpool-4.3.0/src/skillpool/profile.py +94 -0
  63. skillpool-4.3.0/src/skillpool/quality.py +254 -0
  64. skillpool-4.3.0/src/skillpool/registry/__init__.py +509 -0
  65. skillpool-4.3.0/src/skillpool/registry/models.py +98 -0
  66. skillpool-4.3.0/src/skillpool/resolver/__init__.py +320 -0
  67. skillpool-4.3.0/src/skillpool/resolver/cache.py +103 -0
  68. skillpool-4.3.0/src/skillpool/resolver/circuit_breaker.py +103 -0
  69. skillpool-4.3.0/src/skillpool/resolver/conflict_detector.py +111 -0
  70. skillpool-4.3.0/src/skillpool/resolver/health_filter.py +38 -0
  71. skillpool-4.3.0/src/skillpool/resolver/models.py +154 -0
  72. skillpool-4.3.0/src/skillpool/resolver/rate_limiter.py +48 -0
  73. skillpool-4.3.0/src/skillpool/resolver/skill_graph.py +183 -0
  74. skillpool-4.3.0/src/skillpool/review/__init__.py +242 -0
  75. skillpool-4.3.0/src/skillpool/review/async_queue.py +96 -0
  76. skillpool-4.3.0/src/skillpool/review/checkpoint_runner.py +345 -0
  77. skillpool-4.3.0/src/skillpool/review/models.py +164 -0
  78. skillpool-4.3.0/src/skillpool/review/suspect_marker.py +39 -0
  79. skillpool-4.3.0/src/skillpool/review/veto_evaluator.py +94 -0
  80. skillpool-4.3.0/src/skillpool/router/__init__.py +481 -0
  81. skillpool-4.3.0/src/skillpool/schemas.py +119 -0
  82. skillpool-4.3.0/src/skillpool/synergy/__init__.py +240 -0
  83. skillpool-4.3.0/src/skillpool/synergy/detector.py +5 -0
  84. skillpool-4.3.0/src/skillpool/telemetry.py +126 -0
  85. skillpool-4.3.0/src/skillpool/utils/__init__.py +21 -0
  86. skillpool-4.3.0/src/skillpool/utils/changelog.py +218 -0
  87. skillpool-4.3.0/src/skillpool/utils/logger.py +273 -0
  88. skillpool-4.3.0/src/skillpool/utils/runtime_audit.py +163 -0
  89. skillpool-4.3.0/src/skillpool/utils/time_utils.py +13 -0
  90. skillpool-4.3.0/src/skillpool.egg-info/PKG-INFO +21 -0
  91. skillpool-4.3.0/src/skillpool.egg-info/SOURCES.txt +155 -0
  92. skillpool-4.3.0/src/skillpool.egg-info/dependency_links.txt +1 -0
  93. skillpool-4.3.0/src/skillpool.egg-info/entry_points.txt +3 -0
  94. skillpool-4.3.0/src/skillpool.egg-info/requires.txt +17 -0
  95. skillpool-4.3.0/src/skillpool.egg-info/top_level.txt +1 -0
  96. skillpool-4.3.0/tests/test_audit.py +485 -0
  97. skillpool-4.3.0/tests/test_budget_tracker.py +100 -0
  98. skillpool-4.3.0/tests/test_bug_collector.py +600 -0
  99. skillpool-4.3.0/tests/test_changelog.py +312 -0
  100. skillpool-4.3.0/tests/test_circuit_breaker.py +78 -0
  101. skillpool-4.3.0/tests/test_clawmem_client.py +82 -0
  102. skillpool-4.3.0/tests/test_clawmem_gaps.py +154 -0
  103. skillpool-4.3.0/tests/test_codex_adapter.py +178 -0
  104. skillpool-4.3.0/tests/test_combiner.py +1059 -0
  105. skillpool-4.3.0/tests/test_config.py +59 -0
  106. skillpool-4.3.0/tests/test_conflict_detector.py +138 -0
  107. skillpool-4.3.0/tests/test_cost_dashboard.py +204 -0
  108. skillpool-4.3.0/tests/test_cost_gaps.py +115 -0
  109. skillpool-4.3.0/tests/test_cross_agent.py +283 -0
  110. skillpool-4.3.0/tests/test_defect_classifier.py +305 -0
  111. skillpool-4.3.0/tests/test_e2e.py +130 -0
  112. skillpool-4.3.0/tests/test_evolver.py +803 -0
  113. skillpool-4.3.0/tests/test_evolver_gaps.py +396 -0
  114. skillpool-4.3.0/tests/test_gain.py +924 -0
  115. skillpool-4.3.0/tests/test_gate.py +219 -0
  116. skillpool-4.3.0/tests/test_gate_policy.py +768 -0
  117. skillpool-4.3.0/tests/test_graph.py +466 -0
  118. skillpool-4.3.0/tests/test_health.py +171 -0
  119. skillpool-4.3.0/tests/test_health_gaps.py +78 -0
  120. skillpool-4.3.0/tests/test_integration.py +219 -0
  121. skillpool-4.3.0/tests/test_lazy_loader.py +197 -0
  122. skillpool-4.3.0/tests/test_lifecycle.py +174 -0
  123. skillpool-4.3.0/tests/test_lifecycle_gaps.py +167 -0
  124. skillpool-4.3.0/tests/test_logger.py +198 -0
  125. skillpool-4.3.0/tests/test_materializer.py +765 -0
  126. skillpool-4.3.0/tests/test_materializer_gaps.py +200 -0
  127. skillpool-4.3.0/tests/test_mcp_e2e.py +751 -0
  128. skillpool-4.3.0/tests/test_mcp_protocol.py +445 -0
  129. skillpool-4.3.0/tests/test_mcp_server.py +1157 -0
  130. skillpool-4.3.0/tests/test_mcp_server_gaps.py +615 -0
  131. skillpool-4.3.0/tests/test_monitor.py +446 -0
  132. skillpool-4.3.0/tests/test_monitor_gaps.py +319 -0
  133. skillpool-4.3.0/tests/test_override.py +385 -0
  134. skillpool-4.3.0/tests/test_paradigm.py +286 -0
  135. skillpool-4.3.0/tests/test_ppr.py +147 -0
  136. skillpool-4.3.0/tests/test_profile.py +192 -0
  137. skillpool-4.3.0/tests/test_quality.py +1083 -0
  138. skillpool-4.3.0/tests/test_rate_limiter.py +40 -0
  139. skillpool-4.3.0/tests/test_registry.py +573 -0
  140. skillpool-4.3.0/tests/test_registry_gaps.py +526 -0
  141. skillpool-4.3.0/tests/test_resolver.py +755 -0
  142. skillpool-4.3.0/tests/test_resolver_cache.py +121 -0
  143. skillpool-4.3.0/tests/test_review.py +650 -0
  144. skillpool-4.3.0/tests/test_review_checkpoint.py +1610 -0
  145. skillpool-4.3.0/tests/test_router.py +360 -0
  146. skillpool-4.3.0/tests/test_router_gaps.py +589 -0
  147. skillpool-4.3.0/tests/test_runtime_audit.py +563 -0
  148. skillpool-4.3.0/tests/test_schemas.py +466 -0
  149. skillpool-4.3.0/tests/test_security_scanner.py +484 -0
  150. skillpool-4.3.0/tests/test_self_healing.py +727 -0
  151. skillpool-4.3.0/tests/test_skill_graph.py +111 -0
  152. skillpool-4.3.0/tests/test_synergy.py +633 -0
  153. skillpool-4.3.0/tests/test_synergy_detector.py +297 -0
  154. skillpool-4.3.0/tests/test_telemetry.py +223 -0
  155. skillpool-4.3.0/tests/test_telemetry_gaps.py +168 -0
  156. skillpool-4.3.0/tests/test_token_governor.py +513 -0
  157. skillpool-4.3.0/tests/test_trace_ceiling_audit.py +106 -0
@@ -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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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,6 @@
1
+ """Allow running skillpool as: python -m skillpool"""
2
+
3
+ from skillpool.cli import main
4
+
5
+ if __name__ == "__main__":
6
+ main()
@@ -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