codeframe-ai 0.9.0__py3-none-any.whl
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.
- codeframe/__init__.py +11 -0
- codeframe/__main__.py +20 -0
- codeframe/adapters/__init__.py +5 -0
- codeframe/adapters/e2b/__init__.py +13 -0
- codeframe/adapters/e2b/adapter.py +342 -0
- codeframe/adapters/e2b/budget.py +71 -0
- codeframe/adapters/e2b/credential_scanner.py +134 -0
- codeframe/adapters/llm/__init__.py +92 -0
- codeframe/adapters/llm/anthropic.py +414 -0
- codeframe/adapters/llm/base.py +444 -0
- codeframe/adapters/llm/mock.py +281 -0
- codeframe/adapters/llm/openai.py +483 -0
- codeframe/agents/__init__.py +8 -0
- codeframe/agents/dependency_resolver.py +714 -0
- codeframe/auth/__init__.py +16 -0
- codeframe/auth/api_key_router.py +238 -0
- codeframe/auth/api_keys.py +156 -0
- codeframe/auth/dependencies.py +358 -0
- codeframe/auth/manager.py +178 -0
- codeframe/auth/models.py +30 -0
- codeframe/auth/router.py +93 -0
- codeframe/auth/schemas.py +15 -0
- codeframe/auth/scopes.py +53 -0
- codeframe/cli/__init__.py +12 -0
- codeframe/cli/__main__.py +20 -0
- codeframe/cli/api_client.py +275 -0
- codeframe/cli/app.py +5688 -0
- codeframe/cli/auth.py +122 -0
- codeframe/cli/auth_commands.py +958 -0
- codeframe/cli/commands/__init__.py +5 -0
- codeframe/cli/config_commands.py +79 -0
- codeframe/cli/dashboard_commands.py +67 -0
- codeframe/cli/engines_commands.py +205 -0
- codeframe/cli/env_commands.py +409 -0
- codeframe/cli/helpers.py +56 -0
- codeframe/cli/hooks_commands.py +208 -0
- codeframe/cli/import_commands.py +129 -0
- codeframe/cli/pr_commands.py +549 -0
- codeframe/cli/proof_commands.py +415 -0
- codeframe/cli/stats_commands.py +311 -0
- codeframe/cli/telemetry_runtime.py +153 -0
- codeframe/cli/validators.py +123 -0
- codeframe/config/rate_limits.py +165 -0
- codeframe/core/__init__.py +15 -0
- codeframe/core/adapters/__init__.py +43 -0
- codeframe/core/adapters/agent_adapter.py +114 -0
- codeframe/core/adapters/builtin.py +326 -0
- codeframe/core/adapters/claude_code.py +62 -0
- codeframe/core/adapters/codex.py +393 -0
- codeframe/core/adapters/git_utils.py +40 -0
- codeframe/core/adapters/kilocode.py +126 -0
- codeframe/core/adapters/opencode.py +48 -0
- codeframe/core/adapters/streaming_chat.py +483 -0
- codeframe/core/adapters/subprocess_adapter.py +213 -0
- codeframe/core/adapters/verification_wrapper.py +269 -0
- codeframe/core/agent.py +2183 -0
- codeframe/core/agents_config.py +569 -0
- codeframe/core/api_key_service.py +211 -0
- codeframe/core/artifacts.py +428 -0
- codeframe/core/blocker_detection.py +218 -0
- codeframe/core/blockers.py +433 -0
- codeframe/core/checkpoints.py +481 -0
- codeframe/core/conductor.py +2255 -0
- codeframe/core/config.py +827 -0
- codeframe/core/config_watcher.py +268 -0
- codeframe/core/context.py +542 -0
- codeframe/core/context_packager.py +234 -0
- codeframe/core/credentials.py +735 -0
- codeframe/core/dependency_analyzer.py +229 -0
- codeframe/core/dependency_graph.py +290 -0
- codeframe/core/diagnostic_agent.py +712 -0
- codeframe/core/diagnostics.py +616 -0
- codeframe/core/editor.py +556 -0
- codeframe/core/engine_registry.py +256 -0
- codeframe/core/engine_stats.py +231 -0
- codeframe/core/environment.py +697 -0
- codeframe/core/events.py +375 -0
- codeframe/core/executor.py +1005 -0
- codeframe/core/fix_tracker.py +480 -0
- codeframe/core/gates.py +1322 -0
- codeframe/core/git.py +477 -0
- codeframe/core/github_connect_service.py +178 -0
- codeframe/core/github_integration_config.py +118 -0
- codeframe/core/github_issues_service.py +449 -0
- codeframe/core/hooks.py +184 -0
- codeframe/core/importers/__init__.py +1 -0
- codeframe/core/importers/ralph.py +540 -0
- codeframe/core/installer.py +650 -0
- codeframe/core/models.py +1026 -0
- codeframe/core/notifications_config.py +183 -0
- codeframe/core/planner.py +437 -0
- codeframe/core/prd.py +670 -0
- codeframe/core/prd_discovery.py +1118 -0
- codeframe/core/prd_stress_test.py +499 -0
- codeframe/core/progress.py +126 -0
- codeframe/core/proof/__init__.py +34 -0
- codeframe/core/proof/capture.py +79 -0
- codeframe/core/proof/evidence.py +56 -0
- codeframe/core/proof/ledger.py +574 -0
- codeframe/core/proof/models.py +162 -0
- codeframe/core/proof/obligations.py +103 -0
- codeframe/core/proof/runner.py +233 -0
- codeframe/core/proof/scope.py +81 -0
- codeframe/core/proof/stubs.py +156 -0
- codeframe/core/quick_fixes.py +558 -0
- codeframe/core/react_agent.py +1650 -0
- codeframe/core/reconciliation.py +183 -0
- codeframe/core/replay.py +788 -0
- codeframe/core/review.py +285 -0
- codeframe/core/runtime.py +1134 -0
- codeframe/core/sandbox/__init__.py +27 -0
- codeframe/core/sandbox/context.py +98 -0
- codeframe/core/sandbox/worktree.py +20 -0
- codeframe/core/schedule.py +396 -0
- codeframe/core/stall_detector.py +71 -0
- codeframe/core/stall_monitor.py +134 -0
- codeframe/core/state_machine.py +121 -0
- codeframe/core/streaming.py +502 -0
- codeframe/core/task_tree.py +400 -0
- codeframe/core/tasks.py +1022 -0
- codeframe/core/telemetry.py +232 -0
- codeframe/core/templates.py +221 -0
- codeframe/core/tools.py +942 -0
- codeframe/core/workspace.py +887 -0
- codeframe/core/worktrees.py +276 -0
- codeframe/git/__init__.py +5 -0
- codeframe/git/github_integration.py +505 -0
- codeframe/lib/__init__.py +0 -0
- codeframe/lib/audit_logger.py +248 -0
- codeframe/lib/metrics_tracker.py +800 -0
- codeframe/lib/quality/__init__.py +7 -0
- codeframe/lib/quality/complexity_analyzer.py +316 -0
- codeframe/lib/quality/owasp_patterns.py +284 -0
- codeframe/lib/quality/security_scanner.py +250 -0
- codeframe/lib/rate_limiter.py +312 -0
- codeframe/notifications/__init__.py +0 -0
- codeframe/notifications/webhook.py +380 -0
- codeframe/planning/__init__.py +30 -0
- codeframe/planning/issue_generator.py +219 -0
- codeframe/planning/prd_template_functions.py +137 -0
- codeframe/planning/prd_templates.py +975 -0
- codeframe/planning/task_scheduler.py +511 -0
- codeframe/planning/task_templates.py +533 -0
- codeframe/platform_store/__init__.py +5 -0
- codeframe/platform_store/database.py +277 -0
- codeframe/platform_store/repositories/__init__.py +24 -0
- codeframe/platform_store/repositories/api_key_repository.py +245 -0
- codeframe/platform_store/repositories/audit_repository.py +67 -0
- codeframe/platform_store/repositories/base.py +295 -0
- codeframe/platform_store/repositories/interactive_sessions.py +165 -0
- codeframe/platform_store/repositories/token_repository.py +598 -0
- codeframe/platform_store/repositories/workspace_registry_repository.py +175 -0
- codeframe/platform_store/schema_manager.py +321 -0
- codeframe/templates/AGENTS.md.default +94 -0
- codeframe/tui/__init__.py +5 -0
- codeframe/tui/app.py +256 -0
- codeframe/tui/data_service.py +103 -0
- codeframe/ui/__init__.py +0 -0
- codeframe/ui/dependencies.py +103 -0
- codeframe/ui/models.py +999 -0
- codeframe/ui/response_models.py +201 -0
- codeframe/ui/routers/__init__.py +5 -0
- codeframe/ui/routers/_helpers.py +29 -0
- codeframe/ui/routers/batches_v2.py +315 -0
- codeframe/ui/routers/blockers_v2.py +320 -0
- codeframe/ui/routers/checkpoints_v2.py +310 -0
- codeframe/ui/routers/costs_v2.py +322 -0
- codeframe/ui/routers/diagnose_v2.py +225 -0
- codeframe/ui/routers/discovery_v2.py +417 -0
- codeframe/ui/routers/environment_v2.py +284 -0
- codeframe/ui/routers/events_v2.py +75 -0
- codeframe/ui/routers/gates_v2.py +166 -0
- codeframe/ui/routers/git_v2.py +284 -0
- codeframe/ui/routers/github_integrations_v2.py +532 -0
- codeframe/ui/routers/interactive_sessions_v2.py +238 -0
- codeframe/ui/routers/pr_v2.py +709 -0
- codeframe/ui/routers/prd_v2.py +695 -0
- codeframe/ui/routers/proof_v2.py +755 -0
- codeframe/ui/routers/review_v2.py +360 -0
- codeframe/ui/routers/schedule_v2.py +214 -0
- codeframe/ui/routers/session_chat_ws.py +354 -0
- codeframe/ui/routers/settings_v2.py +562 -0
- codeframe/ui/routers/streaming_v2.py +155 -0
- codeframe/ui/routers/tasks_v2.py +1098 -0
- codeframe/ui/routers/templates_v2.py +232 -0
- codeframe/ui/routers/terminal_ws.py +267 -0
- codeframe/ui/routers/workspace_v2.py +527 -0
- codeframe/ui/server.py +568 -0
- codeframe/ui/shared.py +241 -0
- codeframe/workspace/__init__.py +5 -0
- codeframe/workspace/manager.py +249 -0
- codeframe_ai-0.9.0.dist-info/METADATA +517 -0
- codeframe_ai-0.9.0.dist-info/RECORD +197 -0
- codeframe_ai-0.9.0.dist-info/WHEEL +5 -0
- codeframe_ai-0.9.0.dist-info/entry_points.txt +3 -0
- codeframe_ai-0.9.0.dist-info/licenses/LICENSE +661 -0
- codeframe_ai-0.9.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"""PROOF9 test stub generator.
|
|
2
|
+
|
|
3
|
+
Generates skeleton test files for each proof gate obligation.
|
|
4
|
+
Uses inline templates (no Jinja2 dependency for simplicity).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from codeframe.core.proof.models import Gate, Requirement
|
|
8
|
+
|
|
9
|
+
_TEMPLATES: dict[Gate, str] = {
|
|
10
|
+
Gate.UNIT: '''\
|
|
11
|
+
"""Unit test for {req_id}: {title}"""
|
|
12
|
+
import pytest
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def test_{slug}():
|
|
16
|
+
"""Proves: {description}"""
|
|
17
|
+
# Arrange
|
|
18
|
+
# TODO: Set up test data
|
|
19
|
+
|
|
20
|
+
# Act
|
|
21
|
+
# TODO: Call the function under test
|
|
22
|
+
|
|
23
|
+
# Assert
|
|
24
|
+
# TODO: Verify the expected behavior
|
|
25
|
+
assert False, "Not implemented yet — replace with real assertions"
|
|
26
|
+
''',
|
|
27
|
+
Gate.CONTRACT: '''\
|
|
28
|
+
"""Contract test for {req_id}: {title}"""
|
|
29
|
+
import pytest
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_contract_{slug}():
|
|
33
|
+
"""Proves API/integration contract: {description}"""
|
|
34
|
+
# TODO: Validate request/response schema
|
|
35
|
+
# TODO: Check status codes and error formats
|
|
36
|
+
assert False, "Not implemented yet — replace with real assertions"
|
|
37
|
+
''',
|
|
38
|
+
Gate.E2E: '''\
|
|
39
|
+
"""E2E test for {req_id}: {title}
|
|
40
|
+
|
|
41
|
+
Run with: npx playwright test {filename}
|
|
42
|
+
"""
|
|
43
|
+
import {{ test, expect }} from '@playwright/test';
|
|
44
|
+
|
|
45
|
+
test('{title}', async ({{ page }}) => {{
|
|
46
|
+
// {description}
|
|
47
|
+
// TODO: Navigate to the relevant page
|
|
48
|
+
// TODO: Interact with the UI
|
|
49
|
+
// TODO: Assert the expected outcome
|
|
50
|
+
await expect(page).toHaveTitle(/TODO/);
|
|
51
|
+
}});
|
|
52
|
+
''',
|
|
53
|
+
Gate.VISUAL: '''\
|
|
54
|
+
"""Visual snapshot test for {req_id}: {title}"""
|
|
55
|
+
import pytest
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_visual_{slug}():
|
|
59
|
+
"""Proves visual correctness: {description}"""
|
|
60
|
+
# TODO: Render the component/page
|
|
61
|
+
# TODO: Compare against baseline snapshot
|
|
62
|
+
assert False, "Not implemented yet — add snapshot comparison"
|
|
63
|
+
''',
|
|
64
|
+
Gate.A11Y: '''\
|
|
65
|
+
"""Accessibility test for {req_id}: {title}"""
|
|
66
|
+
import pytest
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def test_a11y_{slug}():
|
|
70
|
+
"""Proves accessibility: {description}"""
|
|
71
|
+
# TODO: Run axe-core or similar accessibility checker
|
|
72
|
+
# TODO: Check WCAG compliance
|
|
73
|
+
assert False, "Not implemented yet — add a11y assertions"
|
|
74
|
+
''',
|
|
75
|
+
Gate.PERF: '''\
|
|
76
|
+
"""Performance test for {req_id}: {title}"""
|
|
77
|
+
import pytest
|
|
78
|
+
import time
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def test_perf_{slug}():
|
|
82
|
+
"""Proves performance budget: {description}"""
|
|
83
|
+
start = time.monotonic()
|
|
84
|
+
# TODO: Run the operation under test
|
|
85
|
+
elapsed = time.monotonic() - start
|
|
86
|
+
assert elapsed < 1.0, f"Took {{elapsed:.2f}}s — exceeds budget"
|
|
87
|
+
''',
|
|
88
|
+
Gate.SEC: '''\
|
|
89
|
+
"""Security check for {req_id}: {title}"""
|
|
90
|
+
import pytest
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_sec_{slug}():
|
|
94
|
+
"""Proves security: {description}"""
|
|
95
|
+
# TODO: Check for the specific vulnerability
|
|
96
|
+
# TODO: Verify sanitization/validation
|
|
97
|
+
assert False, "Not implemented yet — add security assertions"
|
|
98
|
+
''',
|
|
99
|
+
Gate.DEMO: '''\
|
|
100
|
+
"""Demo walkthrough for {req_id}: {title}
|
|
101
|
+
|
|
102
|
+
This is an automated demo script that proves the feature works.
|
|
103
|
+
Run with: showboat exec {filename}
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
# Steps:
|
|
107
|
+
# 1. TODO: Navigate to the feature
|
|
108
|
+
# 2. TODO: Perform the action
|
|
109
|
+
# 3. TODO: Capture screenshot/output as evidence
|
|
110
|
+
# 4. TODO: Verify expected outcome
|
|
111
|
+
''',
|
|
112
|
+
Gate.MANUAL: '''\
|
|
113
|
+
# Manual Verification Checklist: {req_id}
|
|
114
|
+
|
|
115
|
+
## {title}
|
|
116
|
+
|
|
117
|
+
{description}
|
|
118
|
+
|
|
119
|
+
### Checklist
|
|
120
|
+
- [ ] Step 1: TODO
|
|
121
|
+
- [ ] Step 2: TODO
|
|
122
|
+
- [ ] Step 3: TODO
|
|
123
|
+
|
|
124
|
+
### Evidence
|
|
125
|
+
Attach screenshots or notes below when complete.
|
|
126
|
+
''',
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _slugify(text: str) -> str:
|
|
131
|
+
"""Create a safe identifier from text."""
|
|
132
|
+
import re
|
|
133
|
+
slug = re.sub(r"[^a-z0-9]+", "_", text.lower().strip())[:50].strip("_")
|
|
134
|
+
return slug or "unnamed"
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def generate_stubs(req: Requirement) -> dict[Gate, str]:
|
|
138
|
+
"""Generate test stub content for each obligation in a requirement.
|
|
139
|
+
|
|
140
|
+
Returns a mapping of Gate → file content string.
|
|
141
|
+
"""
|
|
142
|
+
result: dict[Gate, str] = {}
|
|
143
|
+
slug = _slugify(req.title)
|
|
144
|
+
|
|
145
|
+
for obligation in req.obligations:
|
|
146
|
+
template = _TEMPLATES.get(obligation.gate, _TEMPLATES[Gate.UNIT])
|
|
147
|
+
content = template.format(
|
|
148
|
+
req_id=req.id,
|
|
149
|
+
title=req.title,
|
|
150
|
+
description=req.description,
|
|
151
|
+
slug=slug,
|
|
152
|
+
filename=f"test_{slug}_{obligation.gate.value}",
|
|
153
|
+
)
|
|
154
|
+
result[obligation.gate] = content
|
|
155
|
+
|
|
156
|
+
return result
|