codeframe-ai 0.9.3__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.3 → codeframe_ai-0.9.4}/PKG-INFO +125 -37
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/README.md +110 -26
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/adapters/llm/anthropic.py +109 -67
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/adapters/llm/base.py +15 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/adapters/llm/errors.py +68 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/adapters/llm/openai.py +67 -25
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/auth/api_key_router.py +3 -8
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/auth/dependencies.py +18 -3
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/auth/manager.py +61 -5
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/auth/router.py +57 -41
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/auth/schemas.py +3 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/auth/scopes.py +0 -10
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/auth/stream_tickets.py +17 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/__init__.py +2 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/app.py +493 -493
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/auth_commands.py +108 -23
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/config_commands.py +2 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/dashboard_commands.py +3 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/engines_commands.py +7 -5
- {codeframe_ai-0.9.3 → 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.3 → codeframe_ai-0.9.4}/codeframe/cli/hooks_commands.py +46 -23
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/import_commands.py +9 -6
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/pr_commands.py +203 -52
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/proof_commands.py +87 -34
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/stats_commands.py +5 -4
- {codeframe_ai-0.9.3 → 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.3 → codeframe_ai-0.9.4}/codeframe/config/rate_limits.py +16 -17
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/adapters/builtin.py +18 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/adapters/codex.py +206 -60
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/adapters/git_utils.py +33 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/adapters/kilocode.py +50 -8
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/adapters/opencode.py +53 -32
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/adapters/streaming_chat.py +125 -82
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/adapters/subprocess_adapter.py +103 -87
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/adapters/verification_wrapper.py +16 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/agent.py +58 -11
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/agent_env.py +45 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/blockers.py +26 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/checkpoints.py +52 -7
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/conductor.py +487 -139
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/config.py +7 -12
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/config_watcher.py +51 -28
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/cost_tracker.py +24 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/credentials.py +150 -7
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/dangerous_commands.py +8 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/engine_registry.py +36 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/events.py +13 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/gates.py +255 -138
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/github_integration_config.py +154 -7
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/github_issues_service.py +11 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/importers/ralph.py +32 -2
- {codeframe_ai-0.9.3 → 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.3 → codeframe_ai-0.9.4}/codeframe/core/llm_resolution.py +141 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/models.py +10 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/prd.py +6 -3
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/prd_discovery.py +369 -60
- {codeframe_ai-0.9.3 → 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.3 → codeframe_ai-0.9.4}/codeframe/core/proof/evidence.py +42 -3
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/proof/ledger.py +191 -102
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/proof/models.py +6 -0
- {codeframe_ai-0.9.3 → 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.3 → codeframe_ai-0.9.4}/codeframe/core/proof/runner.py +18 -1
- codeframe_ai-0.9.4/codeframe/core/proof/scope.py +345 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/proof/stubs.py +76 -56
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/react_agent.py +35 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/reconciliation.py +18 -9
- {codeframe_ai-0.9.3 → 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.3 → codeframe_ai-0.9.4}/codeframe/core/runtime.py +123 -13
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/sandbox/context.py +133 -25
- {codeframe_ai-0.9.3 → 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.3 → codeframe_ai-0.9.4}/codeframe/core/streaming.py +32 -6
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/task_tree.py +45 -43
- {codeframe_ai-0.9.3 → 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.3 → 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.3 → codeframe_ai-0.9.4}/codeframe/core/workspace.py +59 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/git/github_integration.py +57 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/lib/audit_logger.py +6 -107
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/lib/metrics_tracker.py +5 -288
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/lib/quality/security_scanner.py +10 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/lib/rate_limiter.py +64 -48
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/notifications/webhook.py +119 -53
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/platform_store/database.py +247 -6
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/base.py +0 -131
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/interactive_sessions.py +3 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/workspace_registry_repository.py +22 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/platform_store/schema_manager.py +12 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/dependencies.py +201 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/models.py +5 -20
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/response_models.py +60 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/batches_v2.py +23 -6
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/checkpoints_v2.py +4 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/costs_v2.py +5 -6
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/discovery_v2.py +112 -13
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/environment_v2.py +2 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/events_v2.py +7 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/gates_v2.py +2 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/github_integrations_v2.py +60 -76
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/interactive_sessions_v2.py +3 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/pr_v2.py +89 -11
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/prd_v2.py +92 -14
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/proof_v2.py +56 -5
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/session_chat_ws.py +120 -7
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/settings_v2.py +52 -92
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/tasks_v2.py +116 -24
- codeframe_ai-0.9.4/codeframe/ui/routers/terminal_ws.py +376 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/workspace_v2.py +57 -94
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/server.py +30 -29
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/streaming_utils.py +19 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/PKG-INFO +125 -37
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/SOURCES.txt +8 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/requires.txt +15 -10
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/pyproject.toml +40 -18
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/tests/test_claude_review_workflow_1011.py +2 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/tests/test_deploy_config.py +76 -0
- codeframe_ai-0.9.4/tests/test_design_partners_619.py +91 -0
- codeframe_ai-0.9.4/tests/test_ops_hygiene_969.py +212 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/tests/test_pm2_scoping_912.py +6 -3
- codeframe_ai-0.9.4/tests/test_roadmap_status_1246.py +136 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/tests/test_root_docs_950.py +1 -0
- codeframe_ai-0.9.3/codeframe/cli/commands/__init__.py +0 -5
- codeframe_ai-0.9.3/codeframe/cli/helpers.py +0 -56
- codeframe_ai-0.9.3/codeframe/cli/validators.py +0 -153
- codeframe_ai-0.9.3/codeframe/core/llm_json.py +0 -62
- codeframe_ai-0.9.3/codeframe/core/proof/capture.py +0 -84
- codeframe_ai-0.9.3/codeframe/core/proof/scope.py +0 -113
- codeframe_ai-0.9.3/codeframe/ui/routers/terminal_ws.py +0 -265
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/LICENSE +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/__main__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/adapters/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/adapters/e2b/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/adapters/e2b/adapter.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/adapters/e2b/budget.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/adapters/e2b/credential_scanner.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/adapters/llm/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/adapters/llm/mock.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/agents/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/agents/dependency_resolver.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/auth/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/auth/api_keys.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/auth/models.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/__main__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/api_client.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/cli/auth.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/adapters/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/adapters/agent_adapter.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/adapters/claude_code.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/agents_config.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/api_key_service.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/artifacts.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/atomic_io.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/blocker_detection.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/claude_code_guard.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/context.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/context_packager.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/dependency_analyzer.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/dependency_graph.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/diagnostic_agent.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/diagnostics.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/editor.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/engine_stats.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/env_provenance.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/environment.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/executor.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/fix_tracker.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/git.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/github_connect_service.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/hook_trust.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/hooks.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/importers/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/notifications_config.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/path_safety.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/planner.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/progress.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/proof/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/quick_fixes.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/review.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/sandbox/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/sandbox/worktree.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/stall_detector.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/stall_monitor.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/state_machine.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/templates.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/tools.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/core/worktrees.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/git/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/lib/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/lib/quality/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/lib/quality/complexity_analyzer.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/lib/quality/owasp_patterns.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/notifications/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/planning/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/planning/prd_templates.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/planning/task_scheduler.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/planning/task_templates.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/platform_store/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/api_key_repository.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/audit_repository.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/platform_store/repositories/token_repository.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/templates/AGENTS.md.default +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/tui/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/tui/app.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/tui/data_service.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/_helpers.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/blockers_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/diagnose_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/git_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/review_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/schedule_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/routers/templates_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe/ui/shared.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/dependency_links.txt +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/entry_points.txt +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/codeframe_ai.egg-info/top_level.txt +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/setup.cfg +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/tests/test_ambient_workspace_guard.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/tests/test_deploy_audit_gate_1131.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/tests/test_lifecycle_gates_948.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/tests/test_offline_default_946.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.4}/tests/test_workflow_lint_wiring_1122.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<1.0
|
|
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,9 +44,9 @@ 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
|
|
@@ -57,16 +58,18 @@ Requires-Dist: slowapi>=0.1.9
|
|
|
57
58
|
Requires-Dist: rapidfuzz>=3.0.0
|
|
58
59
|
Requires-Dist: starlette>=1.0.1
|
|
59
60
|
Requires-Dist: python-multipart>=0.0.27
|
|
60
|
-
Requires-Dist: pyjwt>=2.
|
|
61
|
+
Requires-Dist: pyjwt>=2.15.0
|
|
61
62
|
Requires-Dist: cryptography>=46.0.7
|
|
62
|
-
Requires-Dist: urllib3>=2.
|
|
63
|
+
Requires-Dist: urllib3>=2.8.0
|
|
63
64
|
Requires-Dist: mcp>=1.23.0
|
|
64
65
|
Requires-Dist: idna>=3.15
|
|
65
66
|
Provides-Extra: cloud
|
|
66
67
|
Requires-Dist: e2b>=2.0.0; extra == "cloud"
|
|
68
|
+
Provides-Extra: redis
|
|
69
|
+
Requires-Dist: limits[redis]; extra == "redis"
|
|
67
70
|
Provides-Extra: dev
|
|
68
|
-
Requires-Dist: pytest
|
|
69
|
-
Requires-Dist: pytest-asyncio>=
|
|
71
|
+
Requires-Dist: pytest<10,>=9.0.3; extra == "dev"
|
|
72
|
+
Requires-Dist: pytest-asyncio>=1.4.0; extra == "dev"
|
|
70
73
|
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
71
74
|
Requires-Dist: pytest-json-report>=1.5.0; extra == "dev"
|
|
72
75
|
Requires-Dist: pytest-timeout>=2.3.0; extra == "dev"
|
|
@@ -77,6 +80,7 @@ Requires-Dist: pre-commit>=3.5.0; extra == "dev"
|
|
|
77
80
|
Requires-Dist: hypothesis>=6.0.0; extra == "dev"
|
|
78
81
|
Requires-Dist: e2b>=2.0.0; extra == "dev"
|
|
79
82
|
Requires-Dist: jsonschema>=4.0.0; extra == "dev"
|
|
83
|
+
Requires-Dist: limits[redis]; extra == "dev"
|
|
80
84
|
Dynamic: license-file
|
|
81
85
|
|
|
82
86
|

|
|
@@ -117,7 +121,7 @@ THINK What are you building? How should it be broken down?
|
|
|
117
121
|
cf tasks generate Atomic tasks with dependency graphs
|
|
118
122
|
|
|
119
123
|
BUILD Delegate to the best coding agent for the job
|
|
120
|
-
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
|
|
121
125
|
CodeFRAME owns: verification gates, self-correction, stall detection
|
|
122
126
|
|
|
123
127
|
PROVE Is the output any good?
|
|
@@ -130,7 +134,7 @@ PROVE Is the output any good?
|
|
|
130
134
|
|
|
131
135
|
SHIP Deploy with confidence
|
|
132
136
|
cf pr create PR with proof report attached
|
|
133
|
-
cf pr merge
|
|
137
|
+
cf pr merge <number> Only merges if proof passes
|
|
134
138
|
|
|
135
139
|
THE CLOSED LOOP
|
|
136
140
|
Glitch in production
|
|
@@ -155,7 +159,7 @@ THE CLOSED LOOP
|
|
|
155
159
|
---
|
|
156
160
|
|
|
157
161
|
> [!NOTE]
|
|
158
|
-
> **CodeFRAME is in public beta (`0.9.
|
|
162
|
+
> **CodeFRAME is in public beta (`0.9.4`).** The vision and the Golden Path CLI
|
|
159
163
|
> (`cf init/prd/tasks/work/proof/pr`) and v2 API are stable enough to build on;
|
|
160
164
|
> the web UI and anything marked "in progress" in
|
|
161
165
|
> [`docs/PRODUCT_ROADMAP.md`](docs/PRODUCT_ROADMAP.md) are still moving, and
|
|
@@ -191,6 +195,7 @@ When working from source, prefix the commands below with `uv run`.
|
|
|
191
195
|
|
|
192
196
|
```bash
|
|
193
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
|
|
194
199
|
```
|
|
195
200
|
|
|
196
201
|
**Step 3 — Initialize your project**
|
|
@@ -207,28 +212,111 @@ cf tasks generate # Decompose PRD into atomic tasks with dependencies
|
|
|
207
212
|
cf tasks list # Review what was generated
|
|
208
213
|
```
|
|
209
214
|
|
|
210
|
-
**Step 5 — Promote
|
|
215
|
+
**Step 5 — Promote one task**
|
|
211
216
|
|
|
212
217
|
`cf tasks generate` creates tasks in `BACKLOG` so you can review them before an
|
|
213
|
-
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:
|
|
214
220
|
|
|
215
221
|
```bash
|
|
216
|
-
cf tasks
|
|
217
|
-
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)
|
|
218
264
|
```
|
|
219
265
|
|
|
220
|
-
|
|
221
|
-
|
|
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.
|
|
222
293
|
|
|
223
|
-
|
|
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:
|
|
224
302
|
|
|
225
303
|
```bash
|
|
226
|
-
cf
|
|
227
|
-
cf
|
|
228
|
-
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
|
|
229
306
|
```
|
|
230
307
|
|
|
231
|
-
|
|
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>
|
|
232
320
|
|
|
233
321
|
> **See it run from scratch.** [Cold start on a clean machine](docs/demos/quickstart-cleanroom.md)
|
|
234
322
|
> is a narrated walkthrough of exactly these steps in a throwaway container —
|
|
@@ -250,7 +338,7 @@ That is the entire workflow. Everything else is optional.
|
|
|
250
338
|
|
|
|
251
339
|
v
|
|
252
340
|
+-BUILD---------------------------------------------+
|
|
253
|
-
| cf work start --engine <agent>
|
|
341
|
+
| cf work start <task> --engine <agent> |
|
|
254
342
|
| |
|
|
255
343
|
| +-- Claude Code / Codex / OpenCode / Kilocode / ReAct |
|
|
256
344
|
| | |
|
|
@@ -268,7 +356,7 @@ That is the entire workflow. Everything else is optional.
|
|
|
268
356
|
v
|
|
269
357
|
+-SHIP----------------------------------------------+
|
|
270
358
|
| cf pr create PR with proof report |
|
|
271
|
-
| cf pr merge
|
|
359
|
+
| cf pr merge <n> Merge if proof passes |
|
|
272
360
|
+---------------------------------------------------+
|
|
273
361
|
|
|
|
274
362
|
Glitch in production?
|
|
@@ -347,7 +435,7 @@ cf blocker show <id> # Blocker details
|
|
|
347
435
|
cf blocker answer <id> "answer" # Unblock the agent
|
|
348
436
|
|
|
349
437
|
# Diagnostics
|
|
350
|
-
cf work diagnose <id> #
|
|
438
|
+
cf work diagnose <id> # Pattern-based failure analysis
|
|
351
439
|
cf env check # Validate environment
|
|
352
440
|
cf env doctor # Comprehensive health check
|
|
353
441
|
```
|
|
@@ -382,23 +470,23 @@ resolved by waiving it with a justification.
|
|
|
382
470
|
cf review # Run verification gates
|
|
383
471
|
cf checkpoint create "milestone" # Snapshot project state
|
|
384
472
|
cf checkpoint list # List checkpoints
|
|
385
|
-
cf checkpoint restore <id> #
|
|
473
|
+
cf checkpoint restore <id> # Restore task statuses (files untouched)
|
|
386
474
|
|
|
387
475
|
# Debugging
|
|
388
|
-
cf work replay <id>
|
|
476
|
+
cf work replay <run-id> # Replay and debug a past run (built-in react engine)
|
|
389
477
|
cf dashboard # Launch TUI dashboard
|
|
390
478
|
```
|
|
391
479
|
|
|
392
480
|
### SHIP -- Delivery
|
|
393
481
|
|
|
394
482
|
```bash
|
|
395
|
-
cf pr create
|
|
483
|
+
cf pr create --title "Add search" # PR from the current branch, PROOF9 report appended
|
|
396
484
|
cf pr list # List open PRs
|
|
397
485
|
cf pr status # PR status, review state and CI checks
|
|
398
486
|
cf pr get <number> # Details for one PR
|
|
399
|
-
cf pr merge
|
|
487
|
+
cf pr merge <number> # Merge it (refused while a requirement is open)
|
|
400
488
|
cf pr close <number> # Close a PR without merging
|
|
401
|
-
cf commit
|
|
489
|
+
cf commit create -m "feat: search" # Commit verified changes
|
|
402
490
|
cf patch export # Export changes as patch
|
|
403
491
|
```
|
|
404
492
|
|
|
@@ -409,7 +497,7 @@ cf patch export # Export changes as patch
|
|
|
409
497
|
CodeFRAME delivers the full Think-Build-Prove-Ship loop from the CLI and browser:
|
|
410
498
|
|
|
411
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
|
|
412
|
-
- **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`)
|
|
413
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
|
|
414
502
|
- **SHIP**: GitHub PR workflow, environment validation, task self-diagnosis
|
|
415
503
|
- **Engine adapters**: Claude Code, Codex, OpenCode, Kilocode, and built-in ReAct — all via `--engine` flag
|
|
@@ -431,7 +519,7 @@ CodeFRAME delivers the full Think-Build-Prove-Ship loop from the CLI and browser
|
|
|
431
519
|
- [x] Agent adapter architecture -- delegate to Claude Code, Codex, OpenCode, Kilocode via workspace hooks
|
|
432
520
|
- [x] Worktree isolation for parallel agent execution
|
|
433
521
|
- [x] Reconciliation layer for multi-agent output
|
|
434
|
-
- [x] Replay/debug mode (`cf work replay
|
|
522
|
+
- [x] Replay/debug mode (`cf work replay`, built-in react engine)
|
|
435
523
|
- [x] TUI dashboard (`cf dashboard`)
|
|
436
524
|
- [x] Dynamic config reload during batch execution
|
|
437
525
|
- [x] Multi-provider LLM -- Anthropic, OpenAI, or any OpenAI-compatible endpoint
|
|
@@ -477,7 +565,7 @@ export OPENAI_BASE_URL=http://localhost:11434/v1 # for Ollama, vLLM, LM Studio,
|
|
|
477
565
|
# Per-workspace: .codeframe/config.yaml supports an `llm:` block for the same options
|
|
478
566
|
|
|
479
567
|
# Optional
|
|
480
|
-
export DATABASE_PATH=./codeframe.db #
|
|
568
|
+
export DATABASE_PATH=./codeframe.db # Server accounts/keys; default ./.codeframe/platform.db
|
|
481
569
|
export RATE_LIMIT_ENABLED=true # API rate limiting
|
|
482
570
|
export RATE_LIMIT_DEFAULT=100/minute # Default limit
|
|
483
571
|
```
|
|
@@ -545,7 +633,7 @@ CodeFRAME is in **public beta**.
|
|
|
545
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.
|
|
546
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`.
|
|
547
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.
|
|
548
|
-
- **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).
|
|
549
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.
|
|
550
638
|
|
|
551
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
|
---
|