codeframe-ai 0.9.2__tar.gz → 0.9.4__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.
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/PKG-INFO +126 -40
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/README.md +110 -26
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/__init__.py +7 -1
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/adapters/llm/anthropic.py +109 -67
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/adapters/llm/base.py +15 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/adapters/llm/errors.py +68 -4
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/adapters/llm/mock.py +55 -3
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/adapters/llm/openai.py +67 -25
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/auth/api_key_router.py +3 -8
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/auth/dependencies.py +18 -3
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/auth/manager.py +63 -6
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/auth/router.py +57 -41
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/auth/schemas.py +3 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/auth/scopes.py +0 -10
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/auth/stream_tickets.py +17 -4
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/__init__.py +2 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/app.py +493 -493
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/auth_commands.py +108 -23
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/config_commands.py +2 -1
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/dashboard_commands.py +3 -1
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/engines_commands.py +7 -5
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/env_commands.py +9 -8
- codeframe_ai-0.9.4/codeframe/cli/helpers.py +41 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/hooks_commands.py +46 -23
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/import_commands.py +9 -6
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/pr_commands.py +203 -52
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/proof_commands.py +145 -131
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/stats_commands.py +5 -4
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/telemetry_runtime.py +7 -4
- codeframe_ai-0.9.4/codeframe/cli/validators.py +194 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/config/rate_limits.py +16 -21
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/__init__.py +0 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/adapters/builtin.py +18 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/adapters/codex.py +206 -60
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/adapters/git_utils.py +33 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/adapters/kilocode.py +50 -8
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/adapters/opencode.py +53 -32
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/adapters/streaming_chat.py +125 -82
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/adapters/subprocess_adapter.py +103 -87
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/adapters/verification_wrapper.py +16 -1
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/agent.py +58 -11
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/agent_env.py +45 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/blockers.py +26 -4
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/checkpoints.py +52 -7
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/conductor.py +487 -139
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/config.py +18 -230
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/config_watcher.py +51 -28
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/cost_tracker.py +24 -4
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/credentials.py +150 -7
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/dangerous_commands.py +8 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/engine_registry.py +36 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/env_provenance.py +0 -1
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/events.py +13 -4
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/gates.py +255 -138
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/github_integration_config.py +154 -7
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/github_issues_service.py +11 -4
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/importers/ralph.py +32 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/installer.py +2 -13
- codeframe_ai-0.9.4/codeframe/core/llm_json.py +113 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/llm_resolution.py +141 -4
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/models.py +10 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/prd.py +6 -3
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/prd_discovery.py +369 -60
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/prd_stress_test.py +32 -2
- codeframe_ai-0.9.4/codeframe/core/proof/capture.py +92 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/proof/evidence.py +42 -3
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/proof/ledger.py +191 -102
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/proof/models.py +6 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/proof/obligations.py +21 -0
- codeframe_ai-0.9.4/codeframe/core/proof/report.py +54 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/proof/runner.py +215 -4
- codeframe_ai-0.9.4/codeframe/core/proof/scope.py +345 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/proof/stubs.py +76 -56
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/react_agent.py +35 -4
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/reconciliation.py +18 -9
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/replay.py +23 -2
- codeframe_ai-0.9.4/codeframe/core/run_control.py +435 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/runtime.py +159 -17
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/sandbox/context.py +133 -25
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/schedule.py +3 -3
- codeframe_ai-0.9.4/codeframe/core/spend_limit.py +228 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/streaming.py +32 -6
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/task_tree.py +45 -43
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/tasks.py +67 -34
- codeframe_ai-0.9.4/codeframe/core/tech_stack.py +135 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/telemetry.py +1 -1
- codeframe_ai-0.9.4/codeframe/core/usage_recording.py +249 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/workspace.py +86 -37
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/git/github_integration.py +57 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/lib/audit_logger.py +6 -107
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/lib/metrics_tracker.py +5 -288
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/lib/quality/security_scanner.py +10 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/lib/rate_limiter.py +73 -65
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/notifications/webhook.py +119 -53
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/platform_store/database.py +250 -9
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/base.py +0 -131
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/interactive_sessions.py +3 -1
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/workspace_registry_repository.py +22 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/platform_store/schema_manager.py +34 -65
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/dependencies.py +206 -8
- codeframe_ai-0.9.4/codeframe/ui/models.py +92 -0
- codeframe_ai-0.9.4/codeframe/ui/response_models.py +188 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/batches_v2.py +23 -6
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/checkpoints_v2.py +4 -1
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/costs_v2.py +5 -6
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/discovery_v2.py +112 -13
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/environment_v2.py +2 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/events_v2.py +7 -1
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/gates_v2.py +2 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/github_integrations_v2.py +60 -76
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/interactive_sessions_v2.py +3 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/pr_v2.py +89 -11
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/prd_v2.py +93 -15
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/proof_v2.py +56 -5
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/session_chat_ws.py +120 -7
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/settings_v2.py +52 -92
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/tasks_v2.py +156 -33
- codeframe_ai-0.9.4/codeframe/ui/routers/terminal_ws.py +376 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/workspace_v2.py +57 -94
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/server.py +31 -65
- codeframe_ai-0.9.4/codeframe/ui/shared.py +83 -0
- codeframe_ai-0.9.2/codeframe/ui/routers/streaming_v2.py → codeframe_ai-0.9.4/codeframe/ui/streaming_utils.py +28 -20
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/PKG-INFO +126 -40
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/SOURCES.txt +10 -2
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/requires.txt +16 -13
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/pyproject.toml +45 -15
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/tests/test_claude_review_workflow_1011.py +2 -1
- codeframe_ai-0.9.4/tests/test_deploy_audit_gate_1131.py +143 -0
- codeframe_ai-0.9.4/tests/test_deploy_config.py +491 -0
- codeframe_ai-0.9.4/tests/test_design_partners_619.py +91 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/tests/test_lifecycle_gates_948.py +169 -35
- codeframe_ai-0.9.4/tests/test_ops_hygiene_969.py +212 -0
- codeframe_ai-0.9.4/tests/test_pm2_scoping_912.py +156 -0
- codeframe_ai-0.9.4/tests/test_roadmap_status_1246.py +136 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/tests/test_root_docs_950.py +15 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/tests/test_workflow_lint_wiring_1122.py +84 -19
- codeframe_ai-0.9.2/codeframe/cli/commands/__init__.py +0 -5
- codeframe_ai-0.9.2/codeframe/cli/helpers.py +0 -56
- codeframe_ai-0.9.2/codeframe/cli/validators.py +0 -153
- codeframe_ai-0.9.2/codeframe/core/llm_json.py +0 -62
- codeframe_ai-0.9.2/codeframe/core/proof/capture.py +0 -84
- codeframe_ai-0.9.2/codeframe/core/proof/scope.py +0 -113
- codeframe_ai-0.9.2/codeframe/ui/models.py +0 -999
- codeframe_ai-0.9.2/codeframe/ui/response_models.py +0 -241
- codeframe_ai-0.9.2/codeframe/ui/routers/terminal_ws.py +0 -265
- codeframe_ai-0.9.2/codeframe/ui/shared.py +0 -252
- codeframe_ai-0.9.2/tests/test_deploy_config.py +0 -308
- codeframe_ai-0.9.2/tests/test_pm2_scoping_912.py +0 -112
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/LICENSE +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/__main__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/adapters/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/adapters/e2b/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/adapters/e2b/adapter.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/adapters/e2b/budget.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/adapters/e2b/credential_scanner.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/adapters/llm/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/agents/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/agents/dependency_resolver.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/auth/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/auth/api_keys.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/auth/models.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/__main__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/api_client.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/cli/auth.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/adapters/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/adapters/agent_adapter.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/adapters/claude_code.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/agents_config.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/api_key_service.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/artifacts.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/atomic_io.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/blocker_detection.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/claude_code_guard.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/context.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/context_packager.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/dependency_analyzer.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/dependency_graph.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/diagnostic_agent.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/diagnostics.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/editor.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/engine_stats.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/environment.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/executor.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/fix_tracker.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/git.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/github_connect_service.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/hook_trust.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/hooks.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/importers/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/notifications_config.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/path_safety.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/planner.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/progress.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/proof/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/quick_fixes.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/review.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/sandbox/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/sandbox/worktree.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/stall_detector.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/stall_monitor.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/state_machine.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/templates.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/tools.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/core/worktrees.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/git/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/lib/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/lib/quality/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/lib/quality/complexity_analyzer.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/lib/quality/owasp_patterns.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/notifications/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/planning/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/planning/prd_templates.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/planning/task_scheduler.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/planning/task_templates.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/platform_store/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/api_key_repository.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/audit_repository.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/token_repository.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/templates/AGENTS.md.default +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/tui/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/tui/app.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/tui/data_service.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/__init__.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/_helpers.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/blockers_v2.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/diagnose_v2.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/git_v2.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/review_v2.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/schedule_v2.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe/ui/routers/templates_v2.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/dependency_links.txt +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/entry_points.txt +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/top_level.txt +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/setup.cfg +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/tests/test_ambient_workspace_guard.py +0 -0
- {codeframe_ai-0.9.2 → codeframe_ai-0.9.4}/tests/test_offline_default_946.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codeframe-ai
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.4
|
|
4
4
|
Summary: A project delivery system that orchestrates frontier coding agents: Think, Build, Prove, Ship.
|
|
5
5
|
Author-email: Frank Bria <hello@codeframe.sh>
|
|
6
6
|
License: AGPL-3.0-or-later
|
|
@@ -17,10 +17,10 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
17
17
|
Requires-Python: >=3.11
|
|
18
18
|
Description-Content-Type: text/markdown
|
|
19
19
|
License-File: LICENSE
|
|
20
|
-
Requires-Dist: anthropic
|
|
20
|
+
Requires-Dist: anthropic<2,>=1.0
|
|
21
21
|
Requires-Dist: bandit>=1.8.6
|
|
22
22
|
Requires-Dist: tenacity>=8.2.0
|
|
23
|
-
Requires-Dist: openai
|
|
23
|
+
Requires-Dist: openai<3,>=1.12.0
|
|
24
24
|
Requires-Dist: fastapi>=0.109.0
|
|
25
25
|
Requires-Dist: uvicorn[standard]>=0.27.0
|
|
26
26
|
Requires-Dist: websockets>=12.0
|
|
@@ -30,12 +30,13 @@ Requires-Dist: python-dotenv>=1.2.2
|
|
|
30
30
|
Requires-Dist: sqlalchemy>=2.0.0
|
|
31
31
|
Requires-Dist: aiosqlite>=0.19.0
|
|
32
32
|
Requires-Dist: aiohttp>=3.14.0
|
|
33
|
+
Requires-Dist: yarl<2,>=1.22
|
|
33
34
|
Requires-Dist: httpx>=0.27.0
|
|
34
|
-
Requires-Dist: typer
|
|
35
|
+
Requires-Dist: typer<0.28,>=0.27
|
|
35
36
|
Requires-Dist: rich>=13.7.0
|
|
36
37
|
Requires-Dist: textual>=0.86.0
|
|
37
38
|
Requires-Dist: requests>=2.33.0
|
|
38
|
-
Requires-Dist: gitpython
|
|
39
|
+
Requires-Dist: gitpython<4,>=3.1.60
|
|
39
40
|
Requires-Dist: pyyaml>=6.0.0
|
|
40
41
|
Requires-Dist: tree-sitter>=0.20.4
|
|
41
42
|
Requires-Dist: tree-sitter-python>=0.20.4
|
|
@@ -43,32 +44,32 @@ Requires-Dist: tree-sitter-javascript>=0.20.3
|
|
|
43
44
|
Requires-Dist: tree-sitter-typescript>=0.20.3
|
|
44
45
|
Requires-Dist: tiktoken>=0.12.0
|
|
45
46
|
Requires-Dist: radon>=6.0.1
|
|
46
|
-
Requires-Dist: pytest
|
|
47
|
+
Requires-Dist: pytest<10,>=9.0.3
|
|
47
48
|
Requires-Dist: ruff>=0.14.0
|
|
48
|
-
Requires-Dist: pytest-asyncio>=1.
|
|
49
|
+
Requires-Dist: pytest-asyncio>=1.4.0
|
|
49
50
|
Requires-Dist: pytest-json-report>=1.5.0
|
|
50
51
|
Requires-Dist: hypothesis>=6.148.0
|
|
51
52
|
Requires-Dist: fastapi-users[sqlalchemy]>=15.0.2
|
|
52
53
|
Requires-Dist: filelock>=3.0
|
|
53
|
-
Requires-Dist:
|
|
54
|
-
Requires-Dist: passlib[argon2]>=1.7.4
|
|
54
|
+
Requires-Dist: bcrypt>=4.2.0
|
|
55
55
|
Requires-Dist: keyring>=24.0.0
|
|
56
56
|
Requires-Dist: jinja2>=3.1.6
|
|
57
57
|
Requires-Dist: slowapi>=0.1.9
|
|
58
58
|
Requires-Dist: rapidfuzz>=3.0.0
|
|
59
59
|
Requires-Dist: starlette>=1.0.1
|
|
60
60
|
Requires-Dist: python-multipart>=0.0.27
|
|
61
|
-
Requires-Dist: pyjwt>=2.
|
|
61
|
+
Requires-Dist: pyjwt>=2.15.0
|
|
62
62
|
Requires-Dist: cryptography>=46.0.7
|
|
63
|
-
Requires-Dist: urllib3>=2.
|
|
64
|
-
Requires-Dist: pyasn1>=0.6.3
|
|
63
|
+
Requires-Dist: urllib3>=2.8.0
|
|
65
64
|
Requires-Dist: mcp>=1.23.0
|
|
66
65
|
Requires-Dist: idna>=3.15
|
|
67
66
|
Provides-Extra: cloud
|
|
68
67
|
Requires-Dist: e2b>=2.0.0; extra == "cloud"
|
|
68
|
+
Provides-Extra: redis
|
|
69
|
+
Requires-Dist: limits[redis]; extra == "redis"
|
|
69
70
|
Provides-Extra: dev
|
|
70
|
-
Requires-Dist: pytest
|
|
71
|
-
Requires-Dist: pytest-asyncio>=
|
|
71
|
+
Requires-Dist: pytest<10,>=9.0.3; extra == "dev"
|
|
72
|
+
Requires-Dist: pytest-asyncio>=1.4.0; extra == "dev"
|
|
72
73
|
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
73
74
|
Requires-Dist: pytest-json-report>=1.5.0; extra == "dev"
|
|
74
75
|
Requires-Dist: pytest-timeout>=2.3.0; extra == "dev"
|
|
@@ -79,6 +80,7 @@ Requires-Dist: pre-commit>=3.5.0; extra == "dev"
|
|
|
79
80
|
Requires-Dist: hypothesis>=6.0.0; extra == "dev"
|
|
80
81
|
Requires-Dist: e2b>=2.0.0; extra == "dev"
|
|
81
82
|
Requires-Dist: jsonschema>=4.0.0; extra == "dev"
|
|
83
|
+
Requires-Dist: limits[redis]; extra == "dev"
|
|
82
84
|
Dynamic: license-file
|
|
83
85
|
|
|
84
86
|

|
|
@@ -119,7 +121,7 @@ THINK What are you building? How should it be broken down?
|
|
|
119
121
|
cf tasks generate Atomic tasks with dependency graphs
|
|
120
122
|
|
|
121
123
|
BUILD Delegate to the best coding agent for the job
|
|
122
|
-
cf work start --engine Claude Code, Codex, OpenCode, Kilocode, or built-in
|
|
124
|
+
cf work start <task> --engine Claude Code, Codex, OpenCode, Kilocode, or built-in
|
|
123
125
|
CodeFRAME owns: verification gates, self-correction, stall detection
|
|
124
126
|
|
|
125
127
|
PROVE Is the output any good?
|
|
@@ -132,7 +134,7 @@ PROVE Is the output any good?
|
|
|
132
134
|
|
|
133
135
|
SHIP Deploy with confidence
|
|
134
136
|
cf pr create PR with proof report attached
|
|
135
|
-
cf pr merge
|
|
137
|
+
cf pr merge <number> Only merges if proof passes
|
|
136
138
|
|
|
137
139
|
THE CLOSED LOOP
|
|
138
140
|
Glitch in production
|
|
@@ -157,7 +159,7 @@ THE CLOSED LOOP
|
|
|
157
159
|
---
|
|
158
160
|
|
|
159
161
|
> [!NOTE]
|
|
160
|
-
> **CodeFRAME is in public beta (`0.9.
|
|
162
|
+
> **CodeFRAME is in public beta (`0.9.4`).** The vision and the Golden Path CLI
|
|
161
163
|
> (`cf init/prd/tasks/work/proof/pr`) and v2 API are stable enough to build on;
|
|
162
164
|
> the web UI and anything marked "in progress" in
|
|
163
165
|
> [`docs/PRODUCT_ROADMAP.md`](docs/PRODUCT_ROADMAP.md) are still moving, and
|
|
@@ -193,6 +195,7 @@ When working from source, prefix the commands below with `uv run`.
|
|
|
193
195
|
|
|
194
196
|
```bash
|
|
195
197
|
export ANTHROPIC_API_KEY="sk-ant-..." # get yours at https://console.anthropic.com/
|
|
198
|
+
# or store it once instead: cf auth setup --provider anthropic
|
|
196
199
|
```
|
|
197
200
|
|
|
198
201
|
**Step 3 — Initialize your project**
|
|
@@ -209,28 +212,111 @@ cf tasks generate # Decompose PRD into atomic tasks with dependencies
|
|
|
209
212
|
cf tasks list # Review what was generated
|
|
210
213
|
```
|
|
211
214
|
|
|
212
|
-
**Step 5 — Promote
|
|
215
|
+
**Step 5 — Promote one task**
|
|
213
216
|
|
|
214
217
|
`cf tasks generate` creates tasks in `BACKLOG` so you can review them before an
|
|
215
|
-
agent touches your code.
|
|
218
|
+
agent touches your code. Pick one and move it to `READY` — `cf tasks list` prints
|
|
219
|
+
an 8-character ID for each task, and that prefix is all you need:
|
|
216
220
|
|
|
217
221
|
```bash
|
|
218
|
-
cf tasks
|
|
219
|
-
cf tasks set status <task-id> READY
|
|
222
|
+
cf tasks list # copy the ID of the task you want
|
|
223
|
+
cf tasks set status <task-id> READY # note: id before status
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Start with one. A generated backlog is typically 20+ tasks, and your first run
|
|
227
|
+
should show you the loop, not build the whole project in one sitting.
|
|
228
|
+
|
|
229
|
+
**Step 6 — Build: hand the task to an agent**
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
cf work start <task-id> --execute
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**Step 7 — Prove: capture a requirement, then verify it**
|
|
236
|
+
|
|
237
|
+
PROOF9 verifies *obligations*, and a new workspace has none — so verifying it
|
|
238
|
+
first would report that nothing was checked and exit `2`. That is deliberate: a
|
|
239
|
+
run that checked nothing is not a pass. Give it something to check.
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
cf proof capture \
|
|
243
|
+
--title "add() returns the wrong sum for negative numbers" \
|
|
244
|
+
--description "Calculation is wrong: add(-1, -1) returned 0 instead of -2" \
|
|
245
|
+
--where src/calc.py --severity high --source qa
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
That creates a requirement, picks the gates that would have caught it, and
|
|
249
|
+
writes a **draft** test stub per gate under `tests/proof/<REQ-ID>/`. The stubs
|
|
250
|
+
are named `draft_*.py` so pytest does not collect them yet, and each one is a
|
|
251
|
+
placeholder `assert False`. Turn them into real tests — drop the `draft_`
|
|
252
|
+
prefix from each filename, and replace the placeholder with an assertion that
|
|
253
|
+
actually proves the bug is fixed:
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
ls tests/proof/REQ-0001/ # draft_test_..._unit.py, draft_test_..._contract.py
|
|
257
|
+
# rename each to test_*.py and write the real assertion
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Now the gates have evidence to collect:
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
cf proof run --full # -> All obligations satisfied. (exit 0)
|
|
220
264
|
```
|
|
221
265
|
|
|
222
|
-
|
|
223
|
-
|
|
266
|
+
`--full` checks every open requirement; plain `cf proof run` checks only the
|
|
267
|
+
ones your current diff touches. The `unit` and `contract` gates run **your
|
|
268
|
+
project's** pytest, so the project needs pytest available (`uv add --dev
|
|
269
|
+
pytest`) — a gate with no way to run is reported as unverified, never as a pass.
|
|
270
|
+
|
|
271
|
+
This is the loop that compounds: every glitch you capture stays a permanent
|
|
272
|
+
check, and `cf pr merge` refuses to merge while any of them is open.
|
|
273
|
+
|
|
274
|
+
**Step 8 — Ship**
|
|
275
|
+
|
|
276
|
+
`cf pr` talks to GitHub, so it needs a token and the repository: connect them in
|
|
277
|
+
the web UI (Settings → Integrations), or export `GITHUB_TOKEN` (a PAT with
|
|
278
|
+
`repo` scope) and `GITHUB_REPO=owner/repo`.
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
cf pr create # Open a PR with proof report attached
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
The title defaults to the branch's newest commit (`--title` overrides it), and
|
|
285
|
+
the body ends with the workspace's PROOF9 status: requirement counts, the open
|
|
286
|
+
ones by name, and the latest `cf proof run` verdict.
|
|
287
|
+
|
|
288
|
+
That is the entire workflow. An empty directory through a green `cf proof run`
|
|
289
|
+
is **5m59s** of wall clock on a clean machine — measured, not estimated, in
|
|
290
|
+
[this walkthrough](docs/demos/quickstart-cleanroom.md) — most of it in
|
|
291
|
+
`cf prd generate` and the agent run; Step 7 costs 7 seconds of it. `cf pr create`
|
|
292
|
+
needs a GitHub remote, so it is outside that measurement.
|
|
224
293
|
|
|
225
|
-
|
|
294
|
+
If the agent needs a decision it cannot make, it stops and files a blocker
|
|
295
|
+
rather than guessing — `cf blocker list` shows it and `cf blocker answer <id>
|
|
296
|
+
"..."` unblocks the task.
|
|
297
|
+
|
|
298
|
+
<details>
|
|
299
|
+
<summary>Running the whole backlog</summary>
|
|
300
|
+
|
|
301
|
+
Once you trust the loop, promote everything and let it run:
|
|
226
302
|
|
|
227
303
|
```bash
|
|
228
|
-
cf
|
|
229
|
-
cf
|
|
230
|
-
cf pr create # Open a PR with proof report attached
|
|
304
|
+
cf tasks set status READY --all --from BACKLOG # every BACKLOG task
|
|
305
|
+
cf work batch run --all-ready # execute them
|
|
231
306
|
```
|
|
232
307
|
|
|
233
|
-
|
|
308
|
+
This is **long-running** — each task is a full agent run, and serial is the
|
|
309
|
+
default strategy — so start it and watch it from another terminal rather than
|
|
310
|
+
waiting on the prompt:
|
|
311
|
+
|
|
312
|
+
```bash
|
|
313
|
+
cf work batch status # lists recent batches and their IDs
|
|
314
|
+
cf work batch follow <batch-id> # live progress for one of them
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
`--strategy parallel --max-parallel 4` and `--retry 2` are worth knowing about
|
|
318
|
+
before you kick off a large batch; see [`docs/QUICKSTART.md`](docs/QUICKSTART.md).
|
|
319
|
+
</details>
|
|
234
320
|
|
|
235
321
|
> **See it run from scratch.** [Cold start on a clean machine](docs/demos/quickstart-cleanroom.md)
|
|
236
322
|
> is a narrated walkthrough of exactly these steps in a throwaway container —
|
|
@@ -252,7 +338,7 @@ That is the entire workflow. Everything else is optional.
|
|
|
252
338
|
|
|
|
253
339
|
v
|
|
254
340
|
+-BUILD---------------------------------------------+
|
|
255
|
-
| cf work start --engine <agent>
|
|
341
|
+
| cf work start <task> --engine <agent> |
|
|
256
342
|
| |
|
|
257
343
|
| +-- Claude Code / Codex / OpenCode / Kilocode / ReAct |
|
|
258
344
|
| | |
|
|
@@ -270,7 +356,7 @@ That is the entire workflow. Everything else is optional.
|
|
|
270
356
|
v
|
|
271
357
|
+-SHIP----------------------------------------------+
|
|
272
358
|
| cf pr create PR with proof report |
|
|
273
|
-
| cf pr merge
|
|
359
|
+
| cf pr merge <n> Merge if proof passes |
|
|
274
360
|
+---------------------------------------------------+
|
|
275
361
|
|
|
|
276
362
|
Glitch in production?
|
|
@@ -349,7 +435,7 @@ cf blocker show <id> # Blocker details
|
|
|
349
435
|
cf blocker answer <id> "answer" # Unblock the agent
|
|
350
436
|
|
|
351
437
|
# Diagnostics
|
|
352
|
-
cf work diagnose <id> #
|
|
438
|
+
cf work diagnose <id> # Pattern-based failure analysis
|
|
353
439
|
cf env check # Validate environment
|
|
354
440
|
cf env doctor # Comprehensive health check
|
|
355
441
|
```
|
|
@@ -384,23 +470,23 @@ resolved by waiving it with a justification.
|
|
|
384
470
|
cf review # Run verification gates
|
|
385
471
|
cf checkpoint create "milestone" # Snapshot project state
|
|
386
472
|
cf checkpoint list # List checkpoints
|
|
387
|
-
cf checkpoint restore <id> #
|
|
473
|
+
cf checkpoint restore <id> # Restore task statuses (files untouched)
|
|
388
474
|
|
|
389
475
|
# Debugging
|
|
390
|
-
cf work replay <id>
|
|
476
|
+
cf work replay <run-id> # Replay and debug a past run (built-in react engine)
|
|
391
477
|
cf dashboard # Launch TUI dashboard
|
|
392
478
|
```
|
|
393
479
|
|
|
394
480
|
### SHIP -- Delivery
|
|
395
481
|
|
|
396
482
|
```bash
|
|
397
|
-
cf pr create
|
|
483
|
+
cf pr create --title "Add search" # PR from the current branch, PROOF9 report appended
|
|
398
484
|
cf pr list # List open PRs
|
|
399
485
|
cf pr status # PR status, review state and CI checks
|
|
400
486
|
cf pr get <number> # Details for one PR
|
|
401
|
-
cf pr merge
|
|
487
|
+
cf pr merge <number> # Merge it (refused while a requirement is open)
|
|
402
488
|
cf pr close <number> # Close a PR without merging
|
|
403
|
-
cf commit
|
|
489
|
+
cf commit create -m "feat: search" # Commit verified changes
|
|
404
490
|
cf patch export # Export changes as patch
|
|
405
491
|
```
|
|
406
492
|
|
|
@@ -411,7 +497,7 @@ cf patch export # Export changes as patch
|
|
|
411
497
|
CodeFRAME delivers the full Think-Build-Prove-Ship loop from the CLI and browser:
|
|
412
498
|
|
|
413
499
|
- **THINK**: Socratic PRD generation with recursive stress-testing, LLM-powered task decomposition with dependency graphs, 5 PRD templates, 7 task templates, CPM-based scheduling
|
|
414
|
-
- **BUILD**: ReAct agent with 7 tools, self-correction with loop prevention, verification gates (ruff/pytest/BUILD), stall detection with configurable recovery (retry/blocker/fail), batch execution (serial/parallel/auto), human-in-the-loop blockers, checkpointing, state persistence, replay/debug mode (`cf work replay`), dynamic config reload, TUI dashboard (`cf dashboard`)
|
|
500
|
+
- **BUILD**: ReAct agent with 7 tools, self-correction with loop prevention, verification gates (ruff/pytest/BUILD), stall detection with configurable recovery (retry/blocker/fail), batch execution (serial/parallel/auto), human-in-the-loop blockers, checkpointing, state persistence, replay/debug mode for built-in react runs (`cf work replay`), dynamic config reload, TUI dashboard (`cf dashboard`)
|
|
415
501
|
- **PROVE**: PROOF9 quality memory system — 9-gate evidence-based verification (`cf proof run/capture/list/status/show/waive`), every glitch becomes a permanent proof obligation
|
|
416
502
|
- **SHIP**: GitHub PR workflow, environment validation, task self-diagnosis
|
|
417
503
|
- **Engine adapters**: Claude Code, Codex, OpenCode, Kilocode, and built-in ReAct — all via `--engine` flag
|
|
@@ -433,7 +519,7 @@ CodeFRAME delivers the full Think-Build-Prove-Ship loop from the CLI and browser
|
|
|
433
519
|
- [x] Agent adapter architecture -- delegate to Claude Code, Codex, OpenCode, Kilocode via workspace hooks
|
|
434
520
|
- [x] Worktree isolation for parallel agent execution
|
|
435
521
|
- [x] Reconciliation layer for multi-agent output
|
|
436
|
-
- [x] Replay/debug mode (`cf work replay
|
|
522
|
+
- [x] Replay/debug mode (`cf work replay`, built-in react engine)
|
|
437
523
|
- [x] TUI dashboard (`cf dashboard`)
|
|
438
524
|
- [x] Dynamic config reload during batch execution
|
|
439
525
|
- [x] Multi-provider LLM -- Anthropic, OpenAI, or any OpenAI-compatible endpoint
|
|
@@ -479,7 +565,7 @@ export OPENAI_BASE_URL=http://localhost:11434/v1 # for Ollama, vLLM, LM Studio,
|
|
|
479
565
|
# Per-workspace: .codeframe/config.yaml supports an `llm:` block for the same options
|
|
480
566
|
|
|
481
567
|
# Optional
|
|
482
|
-
export DATABASE_PATH=./codeframe.db #
|
|
568
|
+
export DATABASE_PATH=./codeframe.db # Server accounts/keys; default ./.codeframe/platform.db
|
|
483
569
|
export RATE_LIMIT_ENABLED=true # API rate limiting
|
|
484
570
|
export RATE_LIMIT_DEFAULT=100/minute # Default limit
|
|
485
571
|
```
|
|
@@ -547,7 +633,7 @@ CodeFRAME is in **public beta**.
|
|
|
547
633
|
- **Security:** found a vulnerability? Report it privately via [GitHub private vulnerability reporting](https://github.com/frankbria/codeframe/security/advisories/new) (or `security@codeframe.sh`) -- never a public issue. See [SECURITY.md](SECURITY.md) for scope and response expectations.
|
|
548
634
|
- **Licensing:** CodeFRAME is [AGPL-3.0](LICENSE), an open-core stance. [LICENSING.md](LICENSING.md) explains what that means for individuals, internal company use, and embedding -- and how to reach us about **commercial licensing or a hosted offering** (both planned). Commercial inquiries: `licensing@codeframe.sh`.
|
|
549
635
|
- **Trademark:** the code is AGPL-3.0, but the **CodeFRAME name and logo are trademarks** and are *not* covered by the code license. See [TRADEMARKS.md](TRADEMARKS.md) before using the name for a fork or product.
|
|
550
|
-
- **Early access / design partners:** email `hello@codeframe.sh` or reply to the pinned [Discussion](https://github.com/frankbria/codeframe/discussions)
|
|
636
|
+
- **Early access / design partners:** we are recruiting 5-10 teams for the beta design-partner cohort -- see [DESIGN_PARTNERS.md](DESIGN_PARTNERS.md) for what partners get and commit. To be included, email `hello@codeframe.sh` or reply to the pinned [Discussion](https://github.com/frankbria/codeframe/discussions).
|
|
551
637
|
- **Help & community:** [Discussions -> Q&A](https://github.com/frankbria/codeframe/discussions/categories/q-a) for questions, [Ideas](https://github.com/frankbria/codeframe/discussions/categories/ideas) for feature requests, and [bug reports](https://github.com/frankbria/codeframe/issues/new/choose) for confirmed bugs.
|
|
552
638
|
|
|
553
639
|
---
|
|
@@ -36,7 +36,7 @@ THINK What are you building? How should it be broken down?
|
|
|
36
36
|
cf tasks generate Atomic tasks with dependency graphs
|
|
37
37
|
|
|
38
38
|
BUILD Delegate to the best coding agent for the job
|
|
39
|
-
cf work start --engine Claude Code, Codex, OpenCode, Kilocode, or built-in
|
|
39
|
+
cf work start <task> --engine Claude Code, Codex, OpenCode, Kilocode, or built-in
|
|
40
40
|
CodeFRAME owns: verification gates, self-correction, stall detection
|
|
41
41
|
|
|
42
42
|
PROVE Is the output any good?
|
|
@@ -49,7 +49,7 @@ PROVE Is the output any good?
|
|
|
49
49
|
|
|
50
50
|
SHIP Deploy with confidence
|
|
51
51
|
cf pr create PR with proof report attached
|
|
52
|
-
cf pr merge
|
|
52
|
+
cf pr merge <number> Only merges if proof passes
|
|
53
53
|
|
|
54
54
|
THE CLOSED LOOP
|
|
55
55
|
Glitch in production
|
|
@@ -74,7 +74,7 @@ THE CLOSED LOOP
|
|
|
74
74
|
---
|
|
75
75
|
|
|
76
76
|
> [!NOTE]
|
|
77
|
-
> **CodeFRAME is in public beta (`0.9.
|
|
77
|
+
> **CodeFRAME is in public beta (`0.9.4`).** The vision and the Golden Path CLI
|
|
78
78
|
> (`cf init/prd/tasks/work/proof/pr`) and v2 API are stable enough to build on;
|
|
79
79
|
> the web UI and anything marked "in progress" in
|
|
80
80
|
> [`docs/PRODUCT_ROADMAP.md`](docs/PRODUCT_ROADMAP.md) are still moving, and
|
|
@@ -110,6 +110,7 @@ When working from source, prefix the commands below with `uv run`.
|
|
|
110
110
|
|
|
111
111
|
```bash
|
|
112
112
|
export ANTHROPIC_API_KEY="sk-ant-..." # get yours at https://console.anthropic.com/
|
|
113
|
+
# or store it once instead: cf auth setup --provider anthropic
|
|
113
114
|
```
|
|
114
115
|
|
|
115
116
|
**Step 3 — Initialize your project**
|
|
@@ -126,28 +127,111 @@ cf tasks generate # Decompose PRD into atomic tasks with dependencies
|
|
|
126
127
|
cf tasks list # Review what was generated
|
|
127
128
|
```
|
|
128
129
|
|
|
129
|
-
**Step 5 — Promote
|
|
130
|
+
**Step 5 — Promote one task**
|
|
130
131
|
|
|
131
132
|
`cf tasks generate` creates tasks in `BACKLOG` so you can review them before an
|
|
132
|
-
agent touches your code.
|
|
133
|
+
agent touches your code. Pick one and move it to `READY` — `cf tasks list` prints
|
|
134
|
+
an 8-character ID for each task, and that prefix is all you need:
|
|
133
135
|
|
|
134
136
|
```bash
|
|
135
|
-
cf tasks
|
|
136
|
-
cf tasks set status <task-id> READY
|
|
137
|
+
cf tasks list # copy the ID of the task you want
|
|
138
|
+
cf tasks set status <task-id> READY # note: id before status
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Start with one. A generated backlog is typically 20+ tasks, and your first run
|
|
142
|
+
should show you the loop, not build the whole project in one sitting.
|
|
143
|
+
|
|
144
|
+
**Step 6 — Build: hand the task to an agent**
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
cf work start <task-id> --execute
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Step 7 — Prove: capture a requirement, then verify it**
|
|
151
|
+
|
|
152
|
+
PROOF9 verifies *obligations*, and a new workspace has none — so verifying it
|
|
153
|
+
first would report that nothing was checked and exit `2`. That is deliberate: a
|
|
154
|
+
run that checked nothing is not a pass. Give it something to check.
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
cf proof capture \
|
|
158
|
+
--title "add() returns the wrong sum for negative numbers" \
|
|
159
|
+
--description "Calculation is wrong: add(-1, -1) returned 0 instead of -2" \
|
|
160
|
+
--where src/calc.py --severity high --source qa
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
That creates a requirement, picks the gates that would have caught it, and
|
|
164
|
+
writes a **draft** test stub per gate under `tests/proof/<REQ-ID>/`. The stubs
|
|
165
|
+
are named `draft_*.py` so pytest does not collect them yet, and each one is a
|
|
166
|
+
placeholder `assert False`. Turn them into real tests — drop the `draft_`
|
|
167
|
+
prefix from each filename, and replace the placeholder with an assertion that
|
|
168
|
+
actually proves the bug is fixed:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
ls tests/proof/REQ-0001/ # draft_test_..._unit.py, draft_test_..._contract.py
|
|
172
|
+
# rename each to test_*.py and write the real assertion
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Now the gates have evidence to collect:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
cf proof run --full # -> All obligations satisfied. (exit 0)
|
|
137
179
|
```
|
|
138
180
|
|
|
139
|
-
|
|
140
|
-
|
|
181
|
+
`--full` checks every open requirement; plain `cf proof run` checks only the
|
|
182
|
+
ones your current diff touches. The `unit` and `contract` gates run **your
|
|
183
|
+
project's** pytest, so the project needs pytest available (`uv add --dev
|
|
184
|
+
pytest`) — a gate with no way to run is reported as unverified, never as a pass.
|
|
185
|
+
|
|
186
|
+
This is the loop that compounds: every glitch you capture stays a permanent
|
|
187
|
+
check, and `cf pr merge` refuses to merge while any of them is open.
|
|
188
|
+
|
|
189
|
+
**Step 8 — Ship**
|
|
190
|
+
|
|
191
|
+
`cf pr` talks to GitHub, so it needs a token and the repository: connect them in
|
|
192
|
+
the web UI (Settings → Integrations), or export `GITHUB_TOKEN` (a PAT with
|
|
193
|
+
`repo` scope) and `GITHUB_REPO=owner/repo`.
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
cf pr create # Open a PR with proof report attached
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
The title defaults to the branch's newest commit (`--title` overrides it), and
|
|
200
|
+
the body ends with the workspace's PROOF9 status: requirement counts, the open
|
|
201
|
+
ones by name, and the latest `cf proof run` verdict.
|
|
202
|
+
|
|
203
|
+
That is the entire workflow. An empty directory through a green `cf proof run`
|
|
204
|
+
is **5m59s** of wall clock on a clean machine — measured, not estimated, in
|
|
205
|
+
[this walkthrough](docs/demos/quickstart-cleanroom.md) — most of it in
|
|
206
|
+
`cf prd generate` and the agent run; Step 7 costs 7 seconds of it. `cf pr create`
|
|
207
|
+
needs a GitHub remote, so it is outside that measurement.
|
|
141
208
|
|
|
142
|
-
|
|
209
|
+
If the agent needs a decision it cannot make, it stops and files a blocker
|
|
210
|
+
rather than guessing — `cf blocker list` shows it and `cf blocker answer <id>
|
|
211
|
+
"..."` unblocks the task.
|
|
212
|
+
|
|
213
|
+
<details>
|
|
214
|
+
<summary>Running the whole backlog</summary>
|
|
215
|
+
|
|
216
|
+
Once you trust the loop, promote everything and let it run:
|
|
143
217
|
|
|
144
218
|
```bash
|
|
145
|
-
cf
|
|
146
|
-
cf
|
|
147
|
-
cf pr create # Open a PR with proof report attached
|
|
219
|
+
cf tasks set status READY --all --from BACKLOG # every BACKLOG task
|
|
220
|
+
cf work batch run --all-ready # execute them
|
|
148
221
|
```
|
|
149
222
|
|
|
150
|
-
|
|
223
|
+
This is **long-running** — each task is a full agent run, and serial is the
|
|
224
|
+
default strategy — so start it and watch it from another terminal rather than
|
|
225
|
+
waiting on the prompt:
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
cf work batch status # lists recent batches and their IDs
|
|
229
|
+
cf work batch follow <batch-id> # live progress for one of them
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
`--strategy parallel --max-parallel 4` and `--retry 2` are worth knowing about
|
|
233
|
+
before you kick off a large batch; see [`docs/QUICKSTART.md`](docs/QUICKSTART.md).
|
|
234
|
+
</details>
|
|
151
235
|
|
|
152
236
|
> **See it run from scratch.** [Cold start on a clean machine](docs/demos/quickstart-cleanroom.md)
|
|
153
237
|
> is a narrated walkthrough of exactly these steps in a throwaway container —
|
|
@@ -169,7 +253,7 @@ That is the entire workflow. Everything else is optional.
|
|
|
169
253
|
|
|
|
170
254
|
v
|
|
171
255
|
+-BUILD---------------------------------------------+
|
|
172
|
-
| cf work start --engine <agent>
|
|
256
|
+
| cf work start <task> --engine <agent> |
|
|
173
257
|
| |
|
|
174
258
|
| +-- Claude Code / Codex / OpenCode / Kilocode / ReAct |
|
|
175
259
|
| | |
|
|
@@ -187,7 +271,7 @@ That is the entire workflow. Everything else is optional.
|
|
|
187
271
|
v
|
|
188
272
|
+-SHIP----------------------------------------------+
|
|
189
273
|
| cf pr create PR with proof report |
|
|
190
|
-
| cf pr merge
|
|
274
|
+
| cf pr merge <n> Merge if proof passes |
|
|
191
275
|
+---------------------------------------------------+
|
|
192
276
|
|
|
|
193
277
|
Glitch in production?
|
|
@@ -266,7 +350,7 @@ cf blocker show <id> # Blocker details
|
|
|
266
350
|
cf blocker answer <id> "answer" # Unblock the agent
|
|
267
351
|
|
|
268
352
|
# Diagnostics
|
|
269
|
-
cf work diagnose <id> #
|
|
353
|
+
cf work diagnose <id> # Pattern-based failure analysis
|
|
270
354
|
cf env check # Validate environment
|
|
271
355
|
cf env doctor # Comprehensive health check
|
|
272
356
|
```
|
|
@@ -301,23 +385,23 @@ resolved by waiving it with a justification.
|
|
|
301
385
|
cf review # Run verification gates
|
|
302
386
|
cf checkpoint create "milestone" # Snapshot project state
|
|
303
387
|
cf checkpoint list # List checkpoints
|
|
304
|
-
cf checkpoint restore <id> #
|
|
388
|
+
cf checkpoint restore <id> # Restore task statuses (files untouched)
|
|
305
389
|
|
|
306
390
|
# Debugging
|
|
307
|
-
cf work replay <id>
|
|
391
|
+
cf work replay <run-id> # Replay and debug a past run (built-in react engine)
|
|
308
392
|
cf dashboard # Launch TUI dashboard
|
|
309
393
|
```
|
|
310
394
|
|
|
311
395
|
### SHIP -- Delivery
|
|
312
396
|
|
|
313
397
|
```bash
|
|
314
|
-
cf pr create
|
|
398
|
+
cf pr create --title "Add search" # PR from the current branch, PROOF9 report appended
|
|
315
399
|
cf pr list # List open PRs
|
|
316
400
|
cf pr status # PR status, review state and CI checks
|
|
317
401
|
cf pr get <number> # Details for one PR
|
|
318
|
-
cf pr merge
|
|
402
|
+
cf pr merge <number> # Merge it (refused while a requirement is open)
|
|
319
403
|
cf pr close <number> # Close a PR without merging
|
|
320
|
-
cf commit
|
|
404
|
+
cf commit create -m "feat: search" # Commit verified changes
|
|
321
405
|
cf patch export # Export changes as patch
|
|
322
406
|
```
|
|
323
407
|
|
|
@@ -328,7 +412,7 @@ cf patch export # Export changes as patch
|
|
|
328
412
|
CodeFRAME delivers the full Think-Build-Prove-Ship loop from the CLI and browser:
|
|
329
413
|
|
|
330
414
|
- **THINK**: Socratic PRD generation with recursive stress-testing, LLM-powered task decomposition with dependency graphs, 5 PRD templates, 7 task templates, CPM-based scheduling
|
|
331
|
-
- **BUILD**: ReAct agent with 7 tools, self-correction with loop prevention, verification gates (ruff/pytest/BUILD), stall detection with configurable recovery (retry/blocker/fail), batch execution (serial/parallel/auto), human-in-the-loop blockers, checkpointing, state persistence, replay/debug mode (`cf work replay`), dynamic config reload, TUI dashboard (`cf dashboard`)
|
|
415
|
+
- **BUILD**: ReAct agent with 7 tools, self-correction with loop prevention, verification gates (ruff/pytest/BUILD), stall detection with configurable recovery (retry/blocker/fail), batch execution (serial/parallel/auto), human-in-the-loop blockers, checkpointing, state persistence, replay/debug mode for built-in react runs (`cf work replay`), dynamic config reload, TUI dashboard (`cf dashboard`)
|
|
332
416
|
- **PROVE**: PROOF9 quality memory system — 9-gate evidence-based verification (`cf proof run/capture/list/status/show/waive`), every glitch becomes a permanent proof obligation
|
|
333
417
|
- **SHIP**: GitHub PR workflow, environment validation, task self-diagnosis
|
|
334
418
|
- **Engine adapters**: Claude Code, Codex, OpenCode, Kilocode, and built-in ReAct — all via `--engine` flag
|
|
@@ -350,7 +434,7 @@ CodeFRAME delivers the full Think-Build-Prove-Ship loop from the CLI and browser
|
|
|
350
434
|
- [x] Agent adapter architecture -- delegate to Claude Code, Codex, OpenCode, Kilocode via workspace hooks
|
|
351
435
|
- [x] Worktree isolation for parallel agent execution
|
|
352
436
|
- [x] Reconciliation layer for multi-agent output
|
|
353
|
-
- [x] Replay/debug mode (`cf work replay
|
|
437
|
+
- [x] Replay/debug mode (`cf work replay`, built-in react engine)
|
|
354
438
|
- [x] TUI dashboard (`cf dashboard`)
|
|
355
439
|
- [x] Dynamic config reload during batch execution
|
|
356
440
|
- [x] Multi-provider LLM -- Anthropic, OpenAI, or any OpenAI-compatible endpoint
|
|
@@ -396,7 +480,7 @@ export OPENAI_BASE_URL=http://localhost:11434/v1 # for Ollama, vLLM, LM Studio,
|
|
|
396
480
|
# Per-workspace: .codeframe/config.yaml supports an `llm:` block for the same options
|
|
397
481
|
|
|
398
482
|
# Optional
|
|
399
|
-
export DATABASE_PATH=./codeframe.db #
|
|
483
|
+
export DATABASE_PATH=./codeframe.db # Server accounts/keys; default ./.codeframe/platform.db
|
|
400
484
|
export RATE_LIMIT_ENABLED=true # API rate limiting
|
|
401
485
|
export RATE_LIMIT_DEFAULT=100/minute # Default limit
|
|
402
486
|
```
|
|
@@ -464,7 +548,7 @@ CodeFRAME is in **public beta**.
|
|
|
464
548
|
- **Security:** found a vulnerability? Report it privately via [GitHub private vulnerability reporting](https://github.com/frankbria/codeframe/security/advisories/new) (or `security@codeframe.sh`) -- never a public issue. See [SECURITY.md](SECURITY.md) for scope and response expectations.
|
|
465
549
|
- **Licensing:** CodeFRAME is [AGPL-3.0](LICENSE), an open-core stance. [LICENSING.md](LICENSING.md) explains what that means for individuals, internal company use, and embedding -- and how to reach us about **commercial licensing or a hosted offering** (both planned). Commercial inquiries: `licensing@codeframe.sh`.
|
|
466
550
|
- **Trademark:** the code is AGPL-3.0, but the **CodeFRAME name and logo are trademarks** and are *not* covered by the code license. See [TRADEMARKS.md](TRADEMARKS.md) before using the name for a fork or product.
|
|
467
|
-
- **Early access / design partners:** email `hello@codeframe.sh` or reply to the pinned [Discussion](https://github.com/frankbria/codeframe/discussions)
|
|
551
|
+
- **Early access / design partners:** we are recruiting 5-10 teams for the beta design-partner cohort -- see [DESIGN_PARTNERS.md](DESIGN_PARTNERS.md) for what partners get and commit. To be included, email `hello@codeframe.sh` or reply to the pinned [Discussion](https://github.com/frankbria/codeframe/discussions).
|
|
468
552
|
- **Help & community:** [Discussions -> Q&A](https://github.com/frankbria/codeframe/discussions/categories/q-a) for questions, [Ideas](https://github.com/frankbria/codeframe/discussions/categories/ideas) for feature requests, and [bug reports](https://github.com/frankbria/codeframe/issues/new/choose) for confirmed bugs.
|
|
469
553
|
|
|
470
554
|
---
|
|
@@ -5,7 +5,13 @@ An autonomous AI development system where multiple specialized agents
|
|
|
5
5
|
collaborate to build software projects from requirements to deployment.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
__version__ = version("codeframe-ai")
|
|
12
|
+
except PackageNotFoundError: # source checkout, never installed
|
|
13
|
+
__version__ = "0.0.0+unknown"
|
|
14
|
+
|
|
9
15
|
__author__ = "Frank Bria"
|
|
10
16
|
|
|
11
17
|
__all__ = ["__version__", "__author__"]
|