codeframe-ai 0.9.3__tar.gz → 0.9.5__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.egg-info → codeframe_ai-0.9.5}/PKG-INFO +126 -37
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/README.md +111 -26
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/adapters/llm/anthropic.py +109 -67
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/adapters/llm/base.py +22 -7
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/adapters/llm/errors.py +68 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/adapters/llm/openai.py +67 -25
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/auth/api_key_router.py +3 -8
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/auth/dependencies.py +18 -3
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/auth/manager.py +61 -5
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/auth/router.py +57 -41
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/auth/schemas.py +3 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/auth/scopes.py +0 -10
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/auth/stream_tickets.py +17 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/__init__.py +2 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/app.py +583 -516
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/auth_commands.py +108 -23
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/config_commands.py +2 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/dashboard_commands.py +3 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/engines_commands.py +7 -5
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/env_commands.py +9 -8
- codeframe_ai-0.9.5/codeframe/cli/helpers.py +41 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/hooks_commands.py +46 -23
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/import_commands.py +9 -6
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/pr_commands.py +203 -52
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/proof_commands.py +87 -34
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/stats_commands.py +5 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/telemetry_runtime.py +7 -4
- codeframe_ai-0.9.5/codeframe/cli/validators.py +194 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/config/rate_limits.py +16 -17
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/adapters/builtin.py +18 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/adapters/codex.py +206 -60
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/adapters/git_utils.py +33 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/adapters/kilocode.py +50 -8
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/adapters/opencode.py +53 -32
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/adapters/streaming_chat.py +136 -86
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/adapters/subprocess_adapter.py +103 -87
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/adapters/verification_wrapper.py +16 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/agent.py +58 -11
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/agent_env.py +45 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/blockers.py +26 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/checkpoints.py +52 -7
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/conductor.py +487 -139
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/config.py +10 -12
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/config_watcher.py +51 -28
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/cost_tracker.py +24 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/credentials.py +150 -7
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/dangerous_commands.py +8 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/engine_registry.py +36 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/events.py +13 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/gates.py +255 -138
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/github_integration_config.py +154 -7
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/github_issues_service.py +11 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/importers/ralph.py +32 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/installer.py +2 -13
- codeframe_ai-0.9.5/codeframe/core/llm_json.py +113 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/llm_resolution.py +141 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/models.py +10 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/prd.py +6 -3
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/prd_discovery.py +694 -97
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/prd_stress_test.py +32 -2
- codeframe_ai-0.9.5/codeframe/core/proof/capture.py +92 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/proof/evidence.py +42 -3
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/proof/ledger.py +191 -102
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/proof/models.py +6 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/proof/obligations.py +21 -0
- codeframe_ai-0.9.5/codeframe/core/proof/report.py +54 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/proof/runner.py +18 -1
- codeframe_ai-0.9.5/codeframe/core/proof/scope.py +345 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/proof/stubs.py +76 -56
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/react_agent.py +35 -4
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/reconciliation.py +18 -9
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/replay.py +23 -2
- codeframe_ai-0.9.5/codeframe/core/run_control.py +435 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/runtime.py +123 -13
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/sandbox/context.py +133 -25
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/schedule.py +3 -3
- codeframe_ai-0.9.5/codeframe/core/spend_limit.py +228 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/streaming.py +32 -6
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/task_tree.py +45 -43
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/tasks.py +67 -34
- codeframe_ai-0.9.5/codeframe/core/tech_stack.py +135 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/telemetry.py +1 -1
- codeframe_ai-0.9.5/codeframe/core/usage_recording.py +249 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/workspace.py +59 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/git/github_integration.py +57 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/lib/audit_logger.py +6 -107
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/lib/metrics_tracker.py +14 -288
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/lib/quality/security_scanner.py +10 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/lib/rate_limiter.py +64 -48
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/notifications/webhook.py +119 -53
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/platform_store/database.py +247 -6
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/platform_store/repositories/base.py +0 -131
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/platform_store/repositories/interactive_sessions.py +3 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/platform_store/repositories/workspace_registry_repository.py +22 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/platform_store/schema_manager.py +12 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/dependencies.py +201 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/models.py +5 -20
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/response_models.py +60 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/batches_v2.py +23 -6
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/checkpoints_v2.py +4 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/costs_v2.py +5 -6
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/discovery_v2.py +160 -13
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/environment_v2.py +2 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/events_v2.py +7 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/gates_v2.py +2 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/github_integrations_v2.py +60 -76
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/interactive_sessions_v2.py +3 -2
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/pr_v2.py +89 -11
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/prd_v2.py +92 -14
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/proof_v2.py +56 -5
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/session_chat_ws.py +120 -7
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/settings_v2.py +52 -92
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/tasks_v2.py +116 -24
- codeframe_ai-0.9.5/codeframe/ui/routers/terminal_ws.py +376 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/workspace_v2.py +57 -94
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/server.py +30 -29
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/streaming_utils.py +19 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5/codeframe_ai.egg-info}/PKG-INFO +126 -37
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe_ai.egg-info/SOURCES.txt +8 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe_ai.egg-info/requires.txt +15 -10
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/pyproject.toml +40 -18
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/tests/test_claude_review_workflow_1011.py +2 -1
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/tests/test_deploy_config.py +76 -0
- codeframe_ai-0.9.5/tests/test_design_partners_619.py +91 -0
- codeframe_ai-0.9.5/tests/test_ops_hygiene_969.py +212 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/tests/test_pm2_scoping_912.py +6 -3
- codeframe_ai-0.9.5/tests/test_roadmap_status_1246.py +136 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/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.5}/LICENSE +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/__main__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/adapters/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/adapters/e2b/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/adapters/e2b/adapter.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/adapters/e2b/budget.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/adapters/e2b/credential_scanner.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/adapters/llm/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/adapters/llm/mock.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/agents/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/agents/dependency_resolver.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/auth/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/auth/api_keys.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/auth/models.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/__main__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/api_client.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/cli/auth.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/adapters/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/adapters/agent_adapter.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/adapters/claude_code.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/agents_config.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/api_key_service.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/artifacts.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/atomic_io.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/blocker_detection.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/claude_code_guard.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/context.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/context_packager.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/dependency_analyzer.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/dependency_graph.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/diagnostic_agent.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/diagnostics.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/editor.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/engine_stats.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/env_provenance.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/environment.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/executor.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/fix_tracker.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/git.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/github_connect_service.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/hook_trust.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/hooks.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/importers/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/notifications_config.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/path_safety.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/planner.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/progress.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/proof/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/quick_fixes.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/review.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/sandbox/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/sandbox/worktree.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/stall_detector.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/stall_monitor.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/state_machine.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/templates.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/tools.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/core/worktrees.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/git/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/lib/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/lib/quality/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/lib/quality/complexity_analyzer.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/lib/quality/owasp_patterns.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/notifications/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/planning/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/planning/prd_templates.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/planning/task_scheduler.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/planning/task_templates.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/platform_store/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/platform_store/repositories/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/platform_store/repositories/api_key_repository.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/platform_store/repositories/audit_repository.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/platform_store/repositories/token_repository.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/templates/AGENTS.md.default +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/tui/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/tui/app.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/tui/data_service.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/__init__.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/_helpers.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/blockers_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/diagnose_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/git_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/review_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/schedule_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/routers/templates_v2.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe/ui/shared.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe_ai.egg-info/dependency_links.txt +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe_ai.egg-info/entry_points.txt +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/codeframe_ai.egg-info/top_level.txt +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/setup.cfg +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/tests/test_ambient_workspace_guard.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/tests/test_deploy_audit_gate_1131.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/tests/test_lifecycle_gates_948.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/tests/test_offline_default_946.py +0 -0
- {codeframe_ai-0.9.3 → codeframe_ai-0.9.5}/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.5
|
|
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.5`).** 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?
|
|
@@ -297,6 +385,7 @@ cf status # Workspace status
|
|
|
297
385
|
# Requirements
|
|
298
386
|
cf prd generate # AI-guided Socratic PRD creation
|
|
299
387
|
cf prd generate --template lean # Use a specific template
|
|
388
|
+
cf prd generate --max-questions 6 # Cap discovery (default 10; /done finishes early)
|
|
300
389
|
cf prd add <file.md> # Import existing PRD
|
|
301
390
|
cf prd show # Display current PRD
|
|
302
391
|
|
|
@@ -347,7 +436,7 @@ cf blocker show <id> # Blocker details
|
|
|
347
436
|
cf blocker answer <id> "answer" # Unblock the agent
|
|
348
437
|
|
|
349
438
|
# Diagnostics
|
|
350
|
-
cf work diagnose <id> #
|
|
439
|
+
cf work diagnose <id> # Pattern-based failure analysis
|
|
351
440
|
cf env check # Validate environment
|
|
352
441
|
cf env doctor # Comprehensive health check
|
|
353
442
|
```
|
|
@@ -382,23 +471,23 @@ resolved by waiving it with a justification.
|
|
|
382
471
|
cf review # Run verification gates
|
|
383
472
|
cf checkpoint create "milestone" # Snapshot project state
|
|
384
473
|
cf checkpoint list # List checkpoints
|
|
385
|
-
cf checkpoint restore <id> #
|
|
474
|
+
cf checkpoint restore <id> # Restore task statuses (files untouched)
|
|
386
475
|
|
|
387
476
|
# Debugging
|
|
388
|
-
cf work replay <id>
|
|
477
|
+
cf work replay <run-id> # Replay and debug a past run (built-in react engine)
|
|
389
478
|
cf dashboard # Launch TUI dashboard
|
|
390
479
|
```
|
|
391
480
|
|
|
392
481
|
### SHIP -- Delivery
|
|
393
482
|
|
|
394
483
|
```bash
|
|
395
|
-
cf pr create
|
|
484
|
+
cf pr create --title "Add search" # PR from the current branch, PROOF9 report appended
|
|
396
485
|
cf pr list # List open PRs
|
|
397
486
|
cf pr status # PR status, review state and CI checks
|
|
398
487
|
cf pr get <number> # Details for one PR
|
|
399
|
-
cf pr merge
|
|
488
|
+
cf pr merge <number> # Merge it (refused while a requirement is open)
|
|
400
489
|
cf pr close <number> # Close a PR without merging
|
|
401
|
-
cf commit
|
|
490
|
+
cf commit create -m "feat: search" # Commit verified changes
|
|
402
491
|
cf patch export # Export changes as patch
|
|
403
492
|
```
|
|
404
493
|
|
|
@@ -409,7 +498,7 @@ cf patch export # Export changes as patch
|
|
|
409
498
|
CodeFRAME delivers the full Think-Build-Prove-Ship loop from the CLI and browser:
|
|
410
499
|
|
|
411
500
|
- **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`)
|
|
501
|
+
- **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
502
|
- **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
503
|
- **SHIP**: GitHub PR workflow, environment validation, task self-diagnosis
|
|
415
504
|
- **Engine adapters**: Claude Code, Codex, OpenCode, Kilocode, and built-in ReAct — all via `--engine` flag
|
|
@@ -431,7 +520,7 @@ CodeFRAME delivers the full Think-Build-Prove-Ship loop from the CLI and browser
|
|
|
431
520
|
- [x] Agent adapter architecture -- delegate to Claude Code, Codex, OpenCode, Kilocode via workspace hooks
|
|
432
521
|
- [x] Worktree isolation for parallel agent execution
|
|
433
522
|
- [x] Reconciliation layer for multi-agent output
|
|
434
|
-
- [x] Replay/debug mode (`cf work replay
|
|
523
|
+
- [x] Replay/debug mode (`cf work replay`, built-in react engine)
|
|
435
524
|
- [x] TUI dashboard (`cf dashboard`)
|
|
436
525
|
- [x] Dynamic config reload during batch execution
|
|
437
526
|
- [x] Multi-provider LLM -- Anthropic, OpenAI, or any OpenAI-compatible endpoint
|
|
@@ -477,7 +566,7 @@ export OPENAI_BASE_URL=http://localhost:11434/v1 # for Ollama, vLLM, LM Studio,
|
|
|
477
566
|
# Per-workspace: .codeframe/config.yaml supports an `llm:` block for the same options
|
|
478
567
|
|
|
479
568
|
# Optional
|
|
480
|
-
export DATABASE_PATH=./codeframe.db #
|
|
569
|
+
export DATABASE_PATH=./codeframe.db # Server accounts/keys; default ./.codeframe/platform.db
|
|
481
570
|
export RATE_LIMIT_ENABLED=true # API rate limiting
|
|
482
571
|
export RATE_LIMIT_DEFAULT=100/minute # Default limit
|
|
483
572
|
```
|
|
@@ -545,7 +634,7 @@ CodeFRAME is in **public beta**.
|
|
|
545
634
|
- **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
635
|
- **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
636
|
- **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)
|
|
637
|
+
- **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
638
|
- **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
639
|
|
|
551
640
|
---
|
|
@@ -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.5`).** 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?
|
|
@@ -216,6 +300,7 @@ cf status # Workspace status
|
|
|
216
300
|
# Requirements
|
|
217
301
|
cf prd generate # AI-guided Socratic PRD creation
|
|
218
302
|
cf prd generate --template lean # Use a specific template
|
|
303
|
+
cf prd generate --max-questions 6 # Cap discovery (default 10; /done finishes early)
|
|
219
304
|
cf prd add <file.md> # Import existing PRD
|
|
220
305
|
cf prd show # Display current PRD
|
|
221
306
|
|
|
@@ -266,7 +351,7 @@ cf blocker show <id> # Blocker details
|
|
|
266
351
|
cf blocker answer <id> "answer" # Unblock the agent
|
|
267
352
|
|
|
268
353
|
# Diagnostics
|
|
269
|
-
cf work diagnose <id> #
|
|
354
|
+
cf work diagnose <id> # Pattern-based failure analysis
|
|
270
355
|
cf env check # Validate environment
|
|
271
356
|
cf env doctor # Comprehensive health check
|
|
272
357
|
```
|
|
@@ -301,23 +386,23 @@ resolved by waiving it with a justification.
|
|
|
301
386
|
cf review # Run verification gates
|
|
302
387
|
cf checkpoint create "milestone" # Snapshot project state
|
|
303
388
|
cf checkpoint list # List checkpoints
|
|
304
|
-
cf checkpoint restore <id> #
|
|
389
|
+
cf checkpoint restore <id> # Restore task statuses (files untouched)
|
|
305
390
|
|
|
306
391
|
# Debugging
|
|
307
|
-
cf work replay <id>
|
|
392
|
+
cf work replay <run-id> # Replay and debug a past run (built-in react engine)
|
|
308
393
|
cf dashboard # Launch TUI dashboard
|
|
309
394
|
```
|
|
310
395
|
|
|
311
396
|
### SHIP -- Delivery
|
|
312
397
|
|
|
313
398
|
```bash
|
|
314
|
-
cf pr create
|
|
399
|
+
cf pr create --title "Add search" # PR from the current branch, PROOF9 report appended
|
|
315
400
|
cf pr list # List open PRs
|
|
316
401
|
cf pr status # PR status, review state and CI checks
|
|
317
402
|
cf pr get <number> # Details for one PR
|
|
318
|
-
cf pr merge
|
|
403
|
+
cf pr merge <number> # Merge it (refused while a requirement is open)
|
|
319
404
|
cf pr close <number> # Close a PR without merging
|
|
320
|
-
cf commit
|
|
405
|
+
cf commit create -m "feat: search" # Commit verified changes
|
|
321
406
|
cf patch export # Export changes as patch
|
|
322
407
|
```
|
|
323
408
|
|
|
@@ -328,7 +413,7 @@ cf patch export # Export changes as patch
|
|
|
328
413
|
CodeFRAME delivers the full Think-Build-Prove-Ship loop from the CLI and browser:
|
|
329
414
|
|
|
330
415
|
- **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`)
|
|
416
|
+
- **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
417
|
- **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
418
|
- **SHIP**: GitHub PR workflow, environment validation, task self-diagnosis
|
|
334
419
|
- **Engine adapters**: Claude Code, Codex, OpenCode, Kilocode, and built-in ReAct — all via `--engine` flag
|
|
@@ -350,7 +435,7 @@ CodeFRAME delivers the full Think-Build-Prove-Ship loop from the CLI and browser
|
|
|
350
435
|
- [x] Agent adapter architecture -- delegate to Claude Code, Codex, OpenCode, Kilocode via workspace hooks
|
|
351
436
|
- [x] Worktree isolation for parallel agent execution
|
|
352
437
|
- [x] Reconciliation layer for multi-agent output
|
|
353
|
-
- [x] Replay/debug mode (`cf work replay
|
|
438
|
+
- [x] Replay/debug mode (`cf work replay`, built-in react engine)
|
|
354
439
|
- [x] TUI dashboard (`cf dashboard`)
|
|
355
440
|
- [x] Dynamic config reload during batch execution
|
|
356
441
|
- [x] Multi-provider LLM -- Anthropic, OpenAI, or any OpenAI-compatible endpoint
|
|
@@ -396,7 +481,7 @@ export OPENAI_BASE_URL=http://localhost:11434/v1 # for Ollama, vLLM, LM Studio,
|
|
|
396
481
|
# Per-workspace: .codeframe/config.yaml supports an `llm:` block for the same options
|
|
397
482
|
|
|
398
483
|
# Optional
|
|
399
|
-
export DATABASE_PATH=./codeframe.db #
|
|
484
|
+
export DATABASE_PATH=./codeframe.db # Server accounts/keys; default ./.codeframe/platform.db
|
|
400
485
|
export RATE_LIMIT_ENABLED=true # API rate limiting
|
|
401
486
|
export RATE_LIMIT_DEFAULT=100/minute # Default limit
|
|
402
487
|
```
|
|
@@ -464,7 +549,7 @@ CodeFRAME is in **public beta**.
|
|
|
464
549
|
- **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
550
|
- **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
551
|
- **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)
|
|
552
|
+
- **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
553
|
- **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
554
|
|
|
470
555
|
---
|