forked from HAL9000/cleveragents-core
165 lines
4.5 KiB
Markdown
165 lines
4.5 KiB
Markdown
# Project Context Policy
|
|
|
|
A `ProjectContextPolicy` controls what context (resources and files) is available
|
|
during each ACMS phase. It uses **view inheritance** so each phase can selectively
|
|
override or inherit from its parent.
|
|
|
|
## Inheritance Chain
|
|
|
|
```
|
|
default → strategize → execute → apply
|
|
```
|
|
|
|
| Phase | Inherits from |
|
|
|--------------|---------------|
|
|
| `default` | *(none)* |
|
|
| `strategize` | `default` |
|
|
| `execute` | `strategize` |
|
|
| `apply` | `execute` |
|
|
|
|
When resolving a view for a phase, the system walks up the inheritance chain and
|
|
returns the first explicitly-set `ContextView`. If no overrides are found, the
|
|
`default_view` is returned.
|
|
|
|
## ContextView
|
|
|
|
Each view controls:
|
|
|
|
| Field | Type | Default | Description |
|
|
|---------------------|----------------|---------|------------------------------------------|
|
|
| `include_resources` | `list[str]` | `[]` | Resource names/patterns to include |
|
|
| `exclude_resources` | `list[str]` | `[]` | Resource names/patterns to exclude |
|
|
| `include_paths` | `list[str]` | `[]` | File path globs to include |
|
|
| `exclude_paths` | `list[str]` | `[]` | File path globs to exclude |
|
|
| `max_file_size` | `int \| None` | `None` | Max file size in bytes (None = no limit) |
|
|
| `max_total_size` | `int \| None` | `None` | Max total context size (None = no limit) |
|
|
|
|
**Empty lists mean "include everything"** — no filtering is applied.
|
|
Exclusions always take precedence over inclusions.
|
|
|
|
## Examples
|
|
|
|
### Empty policy (include everything)
|
|
|
|
```python
|
|
from cleveragents.domain.models.core.context_policy import (
|
|
ProjectContextPolicy,
|
|
)
|
|
|
|
policy = ProjectContextPolicy()
|
|
view = policy.resolve_view("execute")
|
|
# view.include_resources == [] (all resources)
|
|
# view.include_paths == [] (all paths)
|
|
# view.max_file_size is None (no limit)
|
|
```
|
|
|
|
### Default view with overrides at strategize
|
|
|
|
```python
|
|
from cleveragents.domain.models.core.context_policy import (
|
|
ContextView,
|
|
ProjectContextPolicy,
|
|
)
|
|
|
|
policy = ProjectContextPolicy(
|
|
default_view=ContextView(
|
|
include_resources=["db-*"],
|
|
exclude_paths=["*.pyc"],
|
|
max_file_size=1_048_576, # 1 MB
|
|
),
|
|
strategize_view=ContextView(
|
|
include_resources=["db-*", "cache-*"],
|
|
max_file_size=2_097_152, # 2 MB
|
|
),
|
|
)
|
|
|
|
# Strategize uses its own view
|
|
view = policy.resolve_view("strategize")
|
|
assert view.include_resources == ["db-*", "cache-*"]
|
|
assert view.max_file_size == 2_097_152
|
|
|
|
# Execute inherits from strategize (no execute_view set)
|
|
view = policy.resolve_view("execute")
|
|
assert view.include_resources == ["db-*", "cache-*"]
|
|
|
|
# Apply also inherits from strategize
|
|
view = policy.resolve_view("apply")
|
|
assert view.include_resources == ["db-*", "cache-*"]
|
|
```
|
|
|
|
### Override at execute level only
|
|
|
|
```python
|
|
from cleveragents.domain.models.core.context_policy import (
|
|
ContextView,
|
|
ProjectContextPolicy,
|
|
)
|
|
|
|
policy = ProjectContextPolicy(
|
|
default_view=ContextView(
|
|
include_resources=["db-*"],
|
|
),
|
|
execute_view=ContextView(
|
|
include_resources=["db-*", "api-*"],
|
|
max_total_size=10_485_760, # 10 MB
|
|
),
|
|
)
|
|
|
|
# Strategize inherits from default (no strategize_view set)
|
|
view = policy.resolve_view("strategize")
|
|
assert view.include_resources == ["db-*"]
|
|
|
|
# Execute uses its own view
|
|
view = policy.resolve_view("execute")
|
|
assert view.include_resources == ["db-*", "api-*"]
|
|
|
|
# Apply inherits from execute
|
|
view = policy.resolve_view("apply")
|
|
assert view.include_resources == ["db-*", "api-*"]
|
|
```
|
|
|
|
### Size limits
|
|
|
|
```python
|
|
from cleveragents.domain.models.core.context_policy import (
|
|
ContextView,
|
|
)
|
|
|
|
# Valid size limits
|
|
view = ContextView(
|
|
max_file_size=1_048_576, # 1 MB per file
|
|
max_total_size=10_485_760, # 10 MB total
|
|
)
|
|
|
|
# None means no limit (default)
|
|
view = ContextView()
|
|
assert view.max_file_size is None
|
|
assert view.max_total_size is None
|
|
|
|
# Zero or negative values are rejected
|
|
# ContextView(max_file_size=0) -> ValidationError
|
|
# ContextView(max_file_size=-1) -> ValidationError
|
|
```
|
|
|
|
## JSON Serialization
|
|
|
|
```python
|
|
import json
|
|
from cleveragents.domain.models.core.context_policy import (
|
|
ContextView,
|
|
ProjectContextPolicy,
|
|
)
|
|
|
|
policy = ProjectContextPolicy(
|
|
default_view=ContextView(include_resources=["db-*"]),
|
|
strategize_view=ContextView(include_resources=["cache-*"]),
|
|
)
|
|
|
|
# Serialize
|
|
data = json.loads(policy.model_dump_json())
|
|
|
|
# Deserialize
|
|
restored = ProjectContextPolicy.model_validate(data)
|
|
assert restored == policy
|
|
```
|