feat(plugin): register spec-defined extension points in PluginManager #1217
No reviewers
Labels
No labels
auto/needs-reevaluation
controller-managed
auto/blocked-by-deps
auto/ci-timeout
auto/claimed-implementer
auto/claimed-merge
auto/claimed-reviewer
auto/driver-down
auto/invariant-violation
auto/last-attempt-tier-0
auto/last-attempt-tier-1
auto/last-attempt-tier-2
auto/last-attempt-tier-min
Automation Tracking
auto/needs-conflict-resolution
auto/needs-implementer
auto/postmortem
auto/ready-to-merge
auto/restart-throttled
auto/revert
auto/sentinel
auto/stale-inactivity
auto/unstable
Blocked
Bounty
$100
Bounty
$1000
Bounty
$10000
Bounty
$20
Bounty
$2000
Bounty
$250
Bounty
$50
Bounty
$500
Bounty
$5000
Bounty
$750
MoSCoW
Could have
MoSCoW
Must have
MoSCoW
Should have
Needs Feedback
Points
1
Points
13
Points
2
Points
21
Points
3
Points
34
Points
5
Points
55
Points
8
Points
88
Priority
Backlog
Priority
CI Blocker
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Signed-off: Owner
Signed-off: Scrum Master
Signed-off: Tech Lead
Spike
State
Completed
State
Duplicate
State
In Progress
State
In Review
State
Paused
State
Unverified
State
Verified
State
Wont Do
Type
Automation
Type
Bug
Type
Discussion
Type
Documentation
Type
Epic
Type
Feature
Type
Legendary
Type
Refactor
Type
Support
Type
Task
Type
Testing
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
cleveragents/cleveragents-core!1217
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/plugin-extension-points"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Registers all 30 spec-defined extension points in the
ExtensionPointRegistrywith typed Protocol interfaces, completing the plugin extension infrastructure. Plugins can now discover and register implementations for all system hooks defined in the specification.Changes
extension_protocols.pywith 21@runtime_checkableProtocol classes covering all extension point categoriesextension_catalog.pywith declarative extension point definitions andregister_all_extension_points()bootstrap functionget_container()during app startupACMSPipelinenow accepts aPluginManagerand can discover context.* extension point implementationsExtension Point Categories (30 total)
Quality Gates
Closes #939
🔒 Claimed by pr-reviewer-3. Starting independent code review.
Code Review — PR #1217: feat(plugin): register spec-defined extension points in PluginManager
✅ APPROVED
Reviewed: Full diff (7 files, 1738 additions), linked issue #939, specification alignment, test coverage, code quality.
Specification Alignment ✅
All 30 spec-defined extension points are registered with correct names, categories, and counts:
The extension point names, Protocol interfaces, and category groupings match the specification's Extension Points Summary.
Architecture & Design ✅
ExtensionPointRegistrarprotocol inextension_catalog.py— good use of structural typing to decouple the catalog fromPluginManager.container.py— extension points registered after container creation, before lazy providers are resolved. Correct ordering.plugin_managerparameter with discovery-only behavior (no auto-activation). Follows the spec's "wired on demand" pattern.register_extension_pointuses dict keyed by name, so re-registration is safe.Protocol Design ✅
@runtime_checkableProtocol classes usecollections.abc.Mapping/Sequencefor parameter types — good for structural typing compatibility.ALL_EXTENSION_PROTOCOLSdict provides programmatic access for introspection.Test Quality ✅
Minor Observations (non-blocking)
plugin_extension_points_steps.pyis 787 lines (project guideline: <500). The 21 stub classes account for ~350 lines. Consider extracting stubs tofeatures/mocks/plugin_extension_stubs.pyin a follow-up.# noqa: E501: Two line-length suppressions inextension_protocols.py(lines 156, 257). These are long Protocol method signatures that could be wrapped.TOTAL_EXTENSION_POINTSconstant: Hardcoded as30rather than derived fromlen(_EXTENSION_POINT_DEFS). Tests will catch drift, but deriving it would be more robust.These are housekeeping items that don't affect correctness or spec alignment. They can be addressed in a follow-up cleanup ticket.
Review claimed by reviewer pool instance reviewer-pool-1. Dispatching independent code review.
Independent Code Review — PR #1217: feat(plugin): register spec-defined extension points in PluginManager
✅ APPROVED (Second Independent Review)
Reviewed: Full diff (7 files, 1738 additions), linked issue #939, specification alignment, type safety, test quality, correctness, API consistency.
Specification Alignment ✅
All 30 spec-defined extension points are correctly registered with proper names, categories, and Protocol interfaces:
Extension point names and category groupings match the specification's Extension Points Summary.
Architecture & Design ✅
ExtensionPointRegistrarProtocol inextension_catalog.py— structural typing decouples the catalog fromPluginManager. Good design._ExtensionPointDefinternal descriptor with__slots__— efficient and clean._category_from_name()helper — simple, correct, well-documented with doctest examples.container.py— extension points registered after container creation with graceful degradation (try/except with warning log). Correct ordering.plugin_managerparameter with discovery-only behavior (no auto-activation). Follows the spec's "wired on demand" pattern.PluginManagerinacms_service.py— correctly avoids circular imports.Type Safety ✅
@runtime_checkableProtocol classes usecollections.abc.Mapping/Sequencefor parameter types — good structural typing.# type: ignoresuppressions anywhere.ExtensionPointPydantic model usesConfigDict(frozen=True, arbitrary_types_allowed=True)— correct for storing type references.Test Quality ✅
Correctness ✅
register_all_extension_points()returns count and iterates all 30 definitions — correct.get_extension_points_by_category()usessetdefaultpattern — correct.context_extension_pointsproperty filters bystartswith("context.")— correct._extension_pointsis a dict keyed by name.Commit Message ✅
feat(plugin): register spec-defined extension points in PluginManagerISSUES CLOSED: #939footerPR Metadata ✅
Type/Featurelabel ✅Closes #939in body ✅Observations (non-blocking, follow-up items)
plugin_extension_points_steps.pyis 787 lines (project guideline: <500). The 21 stub classes account for ~350 lines. Recommend extracting stubs tofeatures/mocks/plugin_extension_stubs.pyin a follow-up ticket.TOTAL_EXTENSION_POINTSconstant: Hardcoded as30rather than derived fromlen(_EXTENSION_POINT_DEFS). Tests will catch drift, but deriving it would be more robust.# noqa: E501inextension_protocols.py: These are linting suppressions for long Protocol method signatures, not type suppressions. Acceptable per project rules.These are housekeeping items that don't affect correctness, spec alignment, or type safety.
Review claimed by reviewer pool instance reviewer-pool-2. Dispatching independent code review.
Review claimed by reviewer pool instance reviewer-pool-1. Dispatching independent code review.
Independent Code Review — PR #1217: feat(plugin): register spec-defined extension points in PluginManager
✅ APPROVED (Third Independent Review)
Reviewed: Full diff (7 files, 1738 additions), linked issue #939, specification alignment, type safety, test quality, correctness, API consistency, security.
Specification Alignment ✅
All 30 spec-defined extension points are correctly registered with proper names, categories, and Protocol interfaces matching the specification's Extension Points Summary:
Architecture & Design ✅
ExtensionPointRegistrarProtocol — structural typing decouples the catalog fromPluginManager. Clean design._ExtensionPointDefwith__slots__— efficient internal descriptor._category_from_name()— simple, correct, well-documented.container.py— graceful degradation with try/except and warning log. Correct ordering.plugin_managerparameter with discovery-only behavior (no auto-activation). Follows spec's "wired on demand" pattern.TYPE_CHECKINGimport forPluginManagerinacms_service.py— correctly avoids circular imports.Type Safety ✅
@runtime_checkableProtocol classes usecollections.abc.Mapping/Sequencefor parameter types.# type: ignoresuppressions anywhere.# noqa: E501are linting suppressions for long Protocol method signatures, not type suppressions — acceptable.Test Quality ✅
Correctness ✅
register_all_extension_points()iterates all 30 definitions and returns count — correct.get_extension_points_by_category()usessetdefaultpattern — correct.context_extension_pointsproperty filters bystartswith("context.")— correct._extension_pointsis a dict keyed by name.Commit Message & PR Metadata ✅
feat(plugin): register spec-defined extension points in PluginManagerISSUES CLOSED: #939footerType/Featurelabel, Milestone v3.6.0,Closes #939in bodySecurity ✅
Non-blocking Observations (follow-up items)
plugin_extension_points_steps.pyis 787 lines (guideline: <500). The 21 stub classes account for ~350 lines. Recommend extracting stubs tofeatures/mocks/plugin_extension_stubs.pyin a follow-up.TOTAL_EXTENSION_POINTS: Hardcoded as30rather than derived fromlen(_EXTENSION_POINT_DEFS). Tests catch drift, but deriving would be more robust.These are housekeeping items that don't affect correctness, spec alignment, or type safety.
Independent Code Review — PR #1217: feat(plugin): register spec-defined extension points in PluginManager
✅ APPROVED (Fourth Independent Review)
Reviewed: Full diff (7 files, ~1738 additions), linked issue #939, specification alignment, type safety, test quality, correctness, API consistency, security.
Specification Alignment ✅
All 30 spec-defined extension points are correctly registered with proper names, categories, and Protocol interfaces matching the specification's Extension Points Summary:
Architecture & Design ✅
ExtensionPointRegistrarProtocol inextension_catalog.py— structural typing decouples the catalog fromPluginManager. Clean, SOLID-compliant design._ExtensionPointDefwith__slots__— efficient internal descriptor, not exposed in public API._category_from_name()— simple, correct, well-documented with doctest examples.plugin_managerparameter with discovery-only behavior (no auto-activation). Follows spec's "wired on demand" pattern.TYPE_CHECKINGimport forPluginManagerinacms_service.py— correctly avoids circular imports.Type Safety ✅
@runtime_checkableProtocol classes usecollections.abc.Mapping/Sequencefor parameter types — good structural typing.# type: ignoresuppressions introduced by this PR. (Pre-existing# type: ignore[dict-item]onBUILTIN_STRATEGIESis not part of this change.)# noqa: E501are linting suppressions for long Protocol method signatures, not type suppressions — acceptable per project rules.Test Quality ✅
Correctness ✅
register_all_extension_points()iterates all 30 definitions and returns count — correct.get_extension_points_by_category()usessetdefaultpattern — correct.context_extension_pointsproperty filters bystartswith("context.")— correct._extension_pointsis a dict keyed by name.Commit Message & PR Metadata ✅
feat(plugin): register spec-defined extension points in PluginManagerISSUES CLOSED: #939footerType/Featurelabel, Milestone v3.6.0,Closes #939in bodySecurity ✅
Non-blocking Observations (follow-up items)
plugin_extension_points_steps.pyis ~787 lines (guideline: <500). The 21 stub classes account for ~350 lines. Recommend extracting stubs tofeatures/mocks/plugin_extension_stubs.pyin a follow-up ticket.TOTAL_EXTENSION_POINTS: Hardcoded as30rather than derived fromlen(_EXTENSION_POINT_DEFS). Tests catch drift, but deriving would be more robust.These are housekeeping items that don't affect correctness, spec alignment, or type safety.