crewplane 0.3.2__tar.gz → 0.3.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.
- {crewplane-0.3.2 → crewplane-0.3.4}/PKG-INFO +14 -2
- {crewplane-0.3.2 → crewplane-0.3.4}/README.md +13 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/pyproject.toml +2 -2
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/capabilities.py +12 -1
- crewplane-0.3.4/src/crewplane/adapters/invokers/cli_invoker/providers/opencode.py +169 -0
- crewplane-0.3.4/src/crewplane/adapters/invokers/cli_invoker/providers/opencode_events.py +218 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/invoker.py +1 -3
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/execution_status.py +11 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/integration_secrets.py +3 -8
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/invocation.py +1 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/invocation_failures.py +17 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/atomic.py +21 -4
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/directory_manager.py +10 -4
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/locks/manifest.py +14 -4
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/locks/provider_processes.py +3 -12
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/manager.py +9 -2
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/naming.py +20 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/node_state.py +2 -4
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/persisted_chain.py +3 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/rendered_file_validation.py +5 -9
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/contracts.py +5 -4
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/fields.py +4 -2
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/app.py +59 -146
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/historical_summary.py +7 -3
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/manifest.py +8 -3
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/preflight_success.py +8 -2
- crewplane-0.3.4/src/crewplane/cli/workflow_context.py +138 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/eligibility.py +4 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/evidence_claims.py +6 -3
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/evidence_validation.py +4 -3
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/execution.py +2 -16
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/fragment_handlers.py +2 -9
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_workspace_lineage.py +7 -20
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_signatures.py +2 -0
- crewplane-0.3.4/src/crewplane/core/preflight/runner.py +6 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/runtime_config/redaction.py +2 -5
- crewplane-0.3.4/src/crewplane/core/sensitive_names.py +14 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/models.py +1 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/parsing.py +1 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/traversal.py +4 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/models.py +8 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/payloads.py +2 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/models.py +11 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/workspace.py +16 -2
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/workspace_diagnostics.py +15 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/config.yml +5 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/spend.py +14 -19
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/workspace_readers.py +5 -2
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/failures/__init__.py +1 -2
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/activity/events.py +1 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/errors.py +1 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/parallel.py +1 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/display.py +1 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/generated_files.py +20 -35
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/workspace_worker_cancellation.py +15 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/audit_round.py +1 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/reviewer_round.py +1 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/fulfillment.py +2 -6
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/records.py +20 -24
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/cleanup.py +11 -6
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/prepared_workspace.py +5 -5
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/common.py +2 -2
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/worktree_failures.py +12 -5
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/state.py +18 -11
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/terminalization.py +2 -1
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/lineage.py +1 -18
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/materialization.py +3 -2
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/orchestration.py +2 -2
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/ref_cleanup.py +3 -2
- crewplane-0.3.2/src/crewplane/core/preflight/runner.py +0 -19
- crewplane-0.3.2/src/crewplane/runtime/agent/failures/types.py +0 -24
- {crewplane-0.3.2 → crewplane-0.3.4}/.gitignore +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/LICENSE +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/artifacts/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/artifacts/filesystem.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/artifacts/terminal_history.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/capability.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/claude_json.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/claude_json_parser.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/commands.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/env_command.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/classifier.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/evidence.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/formatting.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/patterns.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/json_number.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/claude.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/codex.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/copilot.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/deepseek.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/gemini.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/generic.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/kilo.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/pi.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/quota/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/quota/classifier.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/quota/evidence.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/quota/lexicons.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/quota/waits.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/streaming.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/usage_decoders.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/validation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/context.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/fixtures.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/logging.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/mutations.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/options.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/outputs.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/selectors.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/ui/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/ui/null.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/ui/tmux.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/ui/validation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/artifacts.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/execution_event.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/integration.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/integration_options.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/json.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/logging.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/observer.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/provider_log.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/run_summary.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/errors.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/loader.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/artifacts.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/invoker.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/options.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/runtime.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/ui.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/registry.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/safe_files.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/failure_artifacts.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/catalog.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/detection.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/paths.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/snapshot_io.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/snapshot_policy.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/locks/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/locks/process_identity.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/provider_process_publisher.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/aggregation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/findings.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/review_loop_status.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/selection.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/stage_document.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/stage_outputs.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/writer.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/decision.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/generated_files.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/hydration.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/validation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/verified_copy.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/run_history.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/verification.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/bundle_validation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/chain_validation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/git_blob_hash.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/source_validation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/expected_set.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/invocation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/invocations.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/lineage.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/paths.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/ref_contracts.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/source_fields.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/validation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/bootstrap/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/bootstrap/container.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/bootstrap/runtime_config.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/cleanup.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/dry_run.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/constants.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/detection.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/history.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/messages.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_config.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_config_agents.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_config_invoker.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_config_validation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_defaults.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_errors.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_providers.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_workflow.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_yaml_blocks.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_yaml_loading.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/runner.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/paths.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/project_init.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/best_effort_thread.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/branch_export_output.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/components.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/context.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/execution.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/execution_helpers.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/observability.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/preflight.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/resume.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/terminalization.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/topology.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/cache_policy.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/disk_policy.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/filesystem_policy.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/git_attributes.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/git_index.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/git_source.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/preflight_diagnostics.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/repo_policy.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/source_policy.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/source_types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/templates.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/update/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/update/detection.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/update/runner.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/update/types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workflow_runner.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/context.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/evidence_discovery.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/run_artifacts.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup_evidence.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/config.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/execution_state.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/file_hashing.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/file_text.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/platform.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/compile_state.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/compiler.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/dependency_edges.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/diagnostics.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/execution_nodes.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/input_sources.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/models.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_artifacts.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_dependencies.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_nodes.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_records.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_shape.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_workspace_locators.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/prompt_transport_warnings.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/references.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/render_plans.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/runtime_config/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/runtime_config/workspace.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/secrets.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/serialization.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/signatures.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/source.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/static_resources.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/token_catalog.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/validation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/value_fingerprints.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/variables.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/files/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/files/locators.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/files/paths.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/files/selection.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/models.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/observability.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/records.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/snapshot_guard.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/prompt_segments.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/provider_names.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/provider_process_state.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/review_contract.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/state_paths.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/token_budget.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/value_checks.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/imports.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/nodes.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/rewrites.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/diagnostics.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/graph.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/keywords.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/loading.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/frontmatter.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/markers.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/sections.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/normalization.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/source_locations.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/syntax.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/api.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/modes.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/nodes.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/policies.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/templates.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/cache.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/checkout_size.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/git_attributes.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/git_policy.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/git_reads.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/invocation_identity.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/naming.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/policy.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/repository_identity.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/selection.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/settings.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/yaml_loader.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/code-review-example.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/composition/review-findings-producer-example.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/composition/review-fix-composed-example.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/composition/review-fix-consumer-example.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/design-review-example.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/feature-implement-example.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/multi-executor-review-chain-example.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/refactoring-example.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/sample-inputs/coding-standards.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/sample-inputs/feature-brief.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/sample-inputs/review-findings.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/test-generation-example.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/worktree/workspace-alternatives-example.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/worktree/workspace-inherited-worktree-example.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/single-agent-review.task.md +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/dag_graph.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/dag_render.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/builders.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/dashboard_state.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/execution_event.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/log.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/payloads.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/reader.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/reducer.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/layout.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/follow.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/formatters.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/json_extract.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/limits.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/models.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/sanitize.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/tail.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/throttle.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/node_order.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/observer.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/observer_lifecycle.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/persistent.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/cells.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/header.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/text.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/timeline.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/viewport.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/accumulator.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/builder.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/formatting.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/issues.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/logger.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/markdown.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/models.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/terminal.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/workspace.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/workspace_state_paths.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/workspace_values.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/runtime.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/status_icons.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/text_layout.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/timing.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/bindings.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/client.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/commands.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/compact.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/control_state.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/inspect_control.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/inspect_launcher.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/inspect_snapshot.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/labels.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/log_tail.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/refresh.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/rendering.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/runtime.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/runtime_files.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/selected_invocation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/selection.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/selection_control.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/session.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/session_lifecycle.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/shell_commands.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/snapshot_types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/viewport.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/warnings.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/window.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/py.typed +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/attempt_decisions.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/command.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/loop.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/output.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/retry.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/retry_reset.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/state.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/telemetry.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/transitions.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invoker.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/diagnostics.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/drain.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/log_rendering.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/runner.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/signals.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/stream_capture.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/streams.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/retry_units.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/usage.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/usage_costs.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/usage_types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/workspace_environment.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/activity/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/activity/console.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/activity/telemetry.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/common.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/consensus.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/deferred_cleanup.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/fragment_assembler.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/input.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/log_presentation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/prompt_budgeting.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/artifact_capture.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/cancellation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/events.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/generated_file_changes.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/generated_file_snapshot_source.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/lifecycle.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/lifecycle_state.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/provider_output.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/workspace.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/publication_registry.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/resume.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/candidate_identity.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/capture.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/comparison.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/detection.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/events.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/guard.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/node.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/recovery.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/reserved.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/snapshots.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/executor_round.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/orchestration.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/policy.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/prompts.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/rounds.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/stall.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/state.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/validation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/workspace_state_paths.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/consensus.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/fingerprints.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/markdown.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/plain_language.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/structured.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/runtime_context.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/sequential.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/stage_finalize_events.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/stage_tasks.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/cleanup.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/execution_session.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/node.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/orchestration.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/postconditions.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/scheduling.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/state.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/descriptors.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/generated.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/models.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/resolution.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/source_resolution.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/source_selection.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/state_loading.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/attempts.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/checkpoint.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/git.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/orchestration.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/reconciliation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/cleanup_notes.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/filesystem.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/git.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/invocation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/lineage_discard.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/locks.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/materialization.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/mutator_fence.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/plan_nodes.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/running_state_payload.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/retry_reset.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/snapshot.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/snapshot_failures.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/worktree.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/worktree_claims.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/setup.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/snapshot.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/snapshot_reporting.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/state_evidence.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/state_selection.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/__init__.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/attributes.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/cache.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/checkout_identity.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/checkout_placement.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/cleanup.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/commit.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/descriptors.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/head.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/inspection.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/policy.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/protected_refs.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/ref_publication.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/refs.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/removal.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/reset.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/result_validation.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/reuse.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/source_refs.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/temporary_refs.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/types.py +0 -0
- {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: crewplane
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: A provider-neutral CLI-first control plane for human-designed coding-agent workflows
|
|
5
5
|
Project-URL: Homepage, https://github.com/crewplaneai/crewplane
|
|
6
6
|
Project-URL: Repository, https://github.com/crewplaneai/crewplane
|
|
@@ -37,10 +37,22 @@ Description-Content-Type: text/markdown
|
|
|
37
37
|
Crewplane is an open-source workflow runner for reviewable, resumable
|
|
38
38
|
coding-agent workflows. Define the whole process in Markdown — the prompts,
|
|
39
39
|
stages, agents, handoffs, and rules for what happens next.
|
|
40
|
-
Crewplane runs
|
|
40
|
+
Crewplane runs your coding-agent CLIs.
|
|
41
41
|
Review becomes a gate, completed work survives failure, and every handoff
|
|
42
42
|
stays on disk.
|
|
43
43
|
</p>
|
|
44
|
+
<p>
|
|
45
|
+
Works with:
|
|
46
|
+
<a href="https://code.claude.com/docs/en/overview" title="Claude Code documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/claudecode-color.svg" width="20" height="20" align="top" alt="Claude Code"></a>
|
|
47
|
+
<a href="https://learn.chatgpt.com/docs/codex/cli" title="Codex CLI documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/codex-color.svg" width="20" height="20" align="top" alt="Codex"></a>
|
|
48
|
+
<a href="https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-copilot-cli" title="GitHub Copilot CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/githubcopilot.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/githubcopilot.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/githubcopilot.png" width="20" height="20" align="top" alt="GitHub Copilot CLI"></picture></a>
|
|
49
|
+
<a href="https://geminicli.com/docs/" title="Gemini CLI documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/geminicli-color.svg" width="20" height="20" align="top" alt="Gemini CLI"></a>
|
|
50
|
+
<a href="https://kilo.ai/docs/code-with-ai/platforms/cli" title="Kilo Code CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/kilocode.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/kilocode.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/kilocode.png" width="20" height="20" align="top" alt="Kilo Code"></picture></a>
|
|
51
|
+
<a href="https://pi.dev/docs/latest" title="Pi documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/pi.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/pi.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/pi.png" width="20" height="20" align="top" alt="Pi"></picture></a>
|
|
52
|
+
<a href="https://deepseek-harness.github.io/deepseek-harness/" title="DeepSeek Harness documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/deepseek-color.svg" width="20" height="20" align="top" alt="DeepSeek"></a>
|
|
53
|
+
<a href="https://opencode.ai/docs/cli/" title="OpenCode CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/opencode.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/opencode.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/opencode.png" width="20" height="20" align="top" alt="OpenCode"></picture></a> ·
|
|
54
|
+
<a href="docs/getting-started/provider-setup.md">Provider setup →</a>
|
|
55
|
+
</p>
|
|
44
56
|
<p>
|
|
45
57
|
<a href="https://github.com/crewplaneai/crewplane/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/crewplaneai/crewplane/actions/workflows/ci.yml/badge.svg?branch=master"></a>
|
|
46
58
|
<a href="https://www.bestpractices.dev/projects/13966"><img src="https://www.bestpractices.dev/projects/13966/badge"></a>
|
|
@@ -5,10 +5,22 @@
|
|
|
5
5
|
Crewplane is an open-source workflow runner for reviewable, resumable
|
|
6
6
|
coding-agent workflows. Define the whole process in Markdown — the prompts,
|
|
7
7
|
stages, agents, handoffs, and rules for what happens next.
|
|
8
|
-
Crewplane runs
|
|
8
|
+
Crewplane runs your coding-agent CLIs.
|
|
9
9
|
Review becomes a gate, completed work survives failure, and every handoff
|
|
10
10
|
stays on disk.
|
|
11
11
|
</p>
|
|
12
|
+
<p>
|
|
13
|
+
Works with:
|
|
14
|
+
<a href="https://code.claude.com/docs/en/overview" title="Claude Code documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/claudecode-color.svg" width="20" height="20" align="top" alt="Claude Code"></a>
|
|
15
|
+
<a href="https://learn.chatgpt.com/docs/codex/cli" title="Codex CLI documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/codex-color.svg" width="20" height="20" align="top" alt="Codex"></a>
|
|
16
|
+
<a href="https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-copilot-cli" title="GitHub Copilot CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/githubcopilot.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/githubcopilot.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/githubcopilot.png" width="20" height="20" align="top" alt="GitHub Copilot CLI"></picture></a>
|
|
17
|
+
<a href="https://geminicli.com/docs/" title="Gemini CLI documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/geminicli-color.svg" width="20" height="20" align="top" alt="Gemini CLI"></a>
|
|
18
|
+
<a href="https://kilo.ai/docs/code-with-ai/platforms/cli" title="Kilo Code CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/kilocode.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/kilocode.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/kilocode.png" width="20" height="20" align="top" alt="Kilo Code"></picture></a>
|
|
19
|
+
<a href="https://pi.dev/docs/latest" title="Pi documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/pi.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/pi.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/pi.png" width="20" height="20" align="top" alt="Pi"></picture></a>
|
|
20
|
+
<a href="https://deepseek-harness.github.io/deepseek-harness/" title="DeepSeek Harness documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/deepseek-color.svg" width="20" height="20" align="top" alt="DeepSeek"></a>
|
|
21
|
+
<a href="https://opencode.ai/docs/cli/" title="OpenCode CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/opencode.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/opencode.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/opencode.png" width="20" height="20" align="top" alt="OpenCode"></picture></a> ·
|
|
22
|
+
<a href="docs/getting-started/provider-setup.md">Provider setup →</a>
|
|
23
|
+
</p>
|
|
12
24
|
<p>
|
|
13
25
|
<a href="https://github.com/crewplaneai/crewplane/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/crewplaneai/crewplane/actions/workflows/ci.yml/badge.svg?branch=master"></a>
|
|
14
26
|
<a href="https://www.bestpractices.dev/projects/13966"><img src="https://www.bestpractices.dev/projects/13966/badge"></a>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "crewplane"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.4"
|
|
4
4
|
description = "A provider-neutral CLI-first control plane for human-designed coding-agent workflows"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.13"
|
|
@@ -41,7 +41,7 @@ Issues = "https://github.com/crewplaneai/crewplane/issues"
|
|
|
41
41
|
Documentation = "https://github.com/crewplaneai/crewplane/blob/master/docs/index.md"
|
|
42
42
|
|
|
43
43
|
[build-system]
|
|
44
|
-
requires = ["hatchling==1.32.
|
|
44
|
+
requires = ["hatchling==1.32.3"]
|
|
45
45
|
build-backend = "hatchling.build"
|
|
46
46
|
|
|
47
47
|
[tool.hatch.build.targets.wheel]
|
{crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/capabilities.py
RENAMED
|
@@ -13,7 +13,17 @@ from crewplane.architecture.contracts.provider_log import build_provider_log_hea
|
|
|
13
13
|
from crewplane.core.config import AgentConfig
|
|
14
14
|
|
|
15
15
|
from .capability import CliInvocationRequest, CliProviderCapability
|
|
16
|
-
from .providers import
|
|
16
|
+
from .providers import (
|
|
17
|
+
claude,
|
|
18
|
+
codex,
|
|
19
|
+
copilot,
|
|
20
|
+
deepseek,
|
|
21
|
+
gemini,
|
|
22
|
+
generic,
|
|
23
|
+
kilo,
|
|
24
|
+
opencode,
|
|
25
|
+
pi,
|
|
26
|
+
)
|
|
17
27
|
|
|
18
28
|
CAPABILITIES: dict[ProviderKind, CliProviderCapability] = {
|
|
19
29
|
ProviderKind.CLAUDE: claude.CLAUDE,
|
|
@@ -23,6 +33,7 @@ CAPABILITIES: dict[ProviderKind, CliProviderCapability] = {
|
|
|
23
33
|
ProviderKind.KILO: kilo.KILO,
|
|
24
34
|
ProviderKind.PI: pi.PI,
|
|
25
35
|
ProviderKind.DEEPSEEK: deepseek.DEEPSEEK,
|
|
36
|
+
ProviderKind.OPENCODE: opencode.OPENCODE,
|
|
26
37
|
ProviderKind.GENERIC: generic.GENERIC,
|
|
27
38
|
}
|
|
28
39
|
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from crewplane.architecture.contracts import ProviderKind
|
|
6
|
+
|
|
7
|
+
from ..capability import CliCommand, CliInvocationRequest, CliProviderCapability
|
|
8
|
+
from ..commands import build_standard_command
|
|
9
|
+
from ..env_command import parse_env_command_context
|
|
10
|
+
from ..validation import reject_unsupported_reasoning
|
|
11
|
+
from .opencode_events import decode_opencode_usage, extract_opencode_output
|
|
12
|
+
|
|
13
|
+
_VALUE_OPTIONS = frozenset(
|
|
14
|
+
{"--model", "-m", "--agent", "--variant", "--title", "--log-level"}
|
|
15
|
+
)
|
|
16
|
+
_BOOLEAN_OPTIONS = frozenset({"--thinking", "--auto", "--print-logs"})
|
|
17
|
+
_CONFLICTING_OPTIONS = frozenset(
|
|
18
|
+
{
|
|
19
|
+
"--format",
|
|
20
|
+
"--continue",
|
|
21
|
+
"-c",
|
|
22
|
+
"--session",
|
|
23
|
+
"-s",
|
|
24
|
+
"--fork",
|
|
25
|
+
"--attach",
|
|
26
|
+
"--password",
|
|
27
|
+
"-p",
|
|
28
|
+
"--username",
|
|
29
|
+
"-u",
|
|
30
|
+
"--port",
|
|
31
|
+
"--hostname",
|
|
32
|
+
"--dir",
|
|
33
|
+
"--file",
|
|
34
|
+
"-f",
|
|
35
|
+
"--command",
|
|
36
|
+
"--interactive",
|
|
37
|
+
"-i",
|
|
38
|
+
"--mini",
|
|
39
|
+
"--share",
|
|
40
|
+
"--help",
|
|
41
|
+
"-h",
|
|
42
|
+
"--version",
|
|
43
|
+
"-v",
|
|
44
|
+
"--replay",
|
|
45
|
+
"--replay-limit",
|
|
46
|
+
"--no-replay",
|
|
47
|
+
"--yolo",
|
|
48
|
+
"--dangerously-skip-permissions",
|
|
49
|
+
"--demo",
|
|
50
|
+
"--",
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def validate_opencode_request(request: CliInvocationRequest) -> None:
|
|
56
|
+
"""Validate a fresh local run before command construction or allocation."""
|
|
57
|
+
try:
|
|
58
|
+
reject_unsupported_reasoning(request)
|
|
59
|
+
except ValueError as exc:
|
|
60
|
+
raise ValueError(f"OpenCode: {exc}") from exc
|
|
61
|
+
config = request.config
|
|
62
|
+
if config.prompt_transport != "stdin" or config.prompt_transport_arg is not None:
|
|
63
|
+
raise ValueError(
|
|
64
|
+
"OpenCode requires stdin transport without prompt_transport_arg."
|
|
65
|
+
)
|
|
66
|
+
arguments = _run_arguments(request)
|
|
67
|
+
seen_options: set[str] = set()
|
|
68
|
+
command_models = _validate_arguments(arguments, "cli_cmd", seen_options)
|
|
69
|
+
extra_models = _validate_arguments(
|
|
70
|
+
tuple(config.extra_args), "extra_args", seen_options
|
|
71
|
+
)
|
|
72
|
+
_validate_model_selection(command_models + extra_models, request.model)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _run_arguments(request: CliInvocationRequest) -> tuple[str, ...]:
|
|
76
|
+
try:
|
|
77
|
+
context = parse_env_command_context(request.config.cli_cmd, None, "")
|
|
78
|
+
except ValueError as exc:
|
|
79
|
+
raise ValueError(f"OpenCode env wrapper validation failed: {exc}") from exc
|
|
80
|
+
if context.command_working_directory_option is not None:
|
|
81
|
+
raise ValueError(
|
|
82
|
+
f"OpenCode option {context.command_working_directory_option!r} "
|
|
83
|
+
"conflicts with the runtime-owned working directory."
|
|
84
|
+
)
|
|
85
|
+
if context.command_executable is None:
|
|
86
|
+
raise ValueError("OpenCode requires an executable after the env wrapper.")
|
|
87
|
+
arguments = context.command_arguments
|
|
88
|
+
if not arguments or arguments[0] != "run":
|
|
89
|
+
raise ValueError("OpenCode requires run immediately after the executable.")
|
|
90
|
+
return arguments[1:]
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _validate_arguments(
|
|
94
|
+
arguments: tuple[str, ...], location: str, seen_options: set[str]
|
|
95
|
+
) -> tuple[str, ...]:
|
|
96
|
+
model_options: list[str] = []
|
|
97
|
+
tokens = iter(enumerate(arguments, start=1))
|
|
98
|
+
for position, token in tokens:
|
|
99
|
+
option, separator, inline_value = token.partition("=")
|
|
100
|
+
if option in _BOOLEAN_OPTIONS:
|
|
101
|
+
_validate_boolean(option, inline_value if separator else None)
|
|
102
|
+
continue
|
|
103
|
+
if option not in _VALUE_OPTIONS:
|
|
104
|
+
_reject_argument(option, location, position)
|
|
105
|
+
value = inline_value if separator else next(tokens, (0, None))[1]
|
|
106
|
+
_validate_value(option, value)
|
|
107
|
+
if option in {"--model", "-m"}:
|
|
108
|
+
model_options.append(option)
|
|
109
|
+
continue
|
|
110
|
+
if option in seen_options:
|
|
111
|
+
raise ValueError(
|
|
112
|
+
f"OpenCode option {option!r} may appear at most once "
|
|
113
|
+
"across cli_cmd and extra_args."
|
|
114
|
+
)
|
|
115
|
+
seen_options.add(option)
|
|
116
|
+
return tuple(model_options)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _validate_boolean(option: str, value: str | None) -> None:
|
|
120
|
+
if value is not None and value not in {"true", "false"}:
|
|
121
|
+
raise ValueError(
|
|
122
|
+
f"OpenCode option {option!r} requires a bare flag or =true/=false."
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _validate_value(option: str, value: str | None) -> None:
|
|
127
|
+
if value is None or not value.strip() or (value.startswith("-") and value != "-"):
|
|
128
|
+
raise ValueError(f"OpenCode option {option!r} requires a nonblank value.")
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _reject_argument(option: str, location: str, position: int) -> None:
|
|
132
|
+
if option in _CONFLICTING_OPTIONS:
|
|
133
|
+
raise ValueError(
|
|
134
|
+
f"OpenCode option {option!r} conflicts with managed fresh local runs."
|
|
135
|
+
)
|
|
136
|
+
raise ValueError(
|
|
137
|
+
f"OpenCode {location} argument at position {position} is outside the "
|
|
138
|
+
"supported option grammar; positional prompts are not supported."
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _validate_model_selection(options: tuple[str, ...], model: str | None) -> None:
|
|
143
|
+
if model is not None:
|
|
144
|
+
_validate_value("--model", model)
|
|
145
|
+
if len(options) > 1:
|
|
146
|
+
raise ValueError("OpenCode accepts at most one raw --model/-m selector.")
|
|
147
|
+
if options and model is not None:
|
|
148
|
+
raise ValueError(
|
|
149
|
+
f"OpenCode option {options[0]!r} conflicts with the resolved Crewplane model."
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def build_opencode_command(request: CliInvocationRequest, prompt: str) -> CliCommand:
|
|
154
|
+
"""Bind native directory selection to runtime cwd instead of inherited PWD."""
|
|
155
|
+
directory = (request.working_directory or Path.cwd()).resolve()
|
|
156
|
+
return build_standard_command(
|
|
157
|
+
request, prompt, structured_args=("--format", "json", "--dir", str(directory))
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
OPENCODE = CliProviderCapability(
|
|
162
|
+
provider_kind=ProviderKind.OPENCODE,
|
|
163
|
+
validate_request=validate_opencode_request,
|
|
164
|
+
build_command=build_opencode_command,
|
|
165
|
+
output_extractor=extract_opencode_output,
|
|
166
|
+
usage_decoder=decode_opencode_usage,
|
|
167
|
+
log_presentation_format="json_lines",
|
|
168
|
+
log_presentation_profile="generic",
|
|
169
|
+
)
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import math
|
|
5
|
+
from collections.abc import Mapping
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from crewplane.architecture.contracts import (
|
|
10
|
+
CommandResult,
|
|
11
|
+
OutputExtractionResult,
|
|
12
|
+
ProviderTokenUsage,
|
|
13
|
+
UsageDecodeResult,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
from ..usage_decoders import CounterReader, UsageAccumulator, complete_sum
|
|
17
|
+
|
|
18
|
+
_ANSWER_EVENTS = frozenset({"step_start", "text", "tool_use", "step_finish"})
|
|
19
|
+
type _Identity = tuple[str, str, str]
|
|
20
|
+
type _Counters = tuple[int | None, ...]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def extract_opencode_output(
|
|
24
|
+
result: CommandResult,
|
|
25
|
+
structured_output_file: Path | None, # noqa: ARG001 - OutputExtractor contract.
|
|
26
|
+
) -> OutputExtractionResult:
|
|
27
|
+
"""Select only completed text from the terminal stopped message."""
|
|
28
|
+
state = _AnswerState()
|
|
29
|
+
try:
|
|
30
|
+
for line in result.iter_stdout_lines():
|
|
31
|
+
event = _read_event(line)
|
|
32
|
+
if event is not None:
|
|
33
|
+
state.consume(event)
|
|
34
|
+
except ValueError:
|
|
35
|
+
return OutputExtractionResult("", "malformed")
|
|
36
|
+
return state.result()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True)
|
|
40
|
+
class _AnswerPart:
|
|
41
|
+
kind: str
|
|
42
|
+
message_id: str
|
|
43
|
+
text: str = ""
|
|
44
|
+
end: int | float | None = None
|
|
45
|
+
reason: str = ""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclass
|
|
49
|
+
class _AnswerState:
|
|
50
|
+
session_id: str | None = None
|
|
51
|
+
last_message: str | None = None
|
|
52
|
+
parts: dict[str, _AnswerPart] = field(default_factory=dict)
|
|
53
|
+
finish_reasons: dict[str, str] = field(default_factory=dict)
|
|
54
|
+
|
|
55
|
+
def consume(self, event: Mapping[str, object]) -> None:
|
|
56
|
+
kind = event.get("type")
|
|
57
|
+
if kind == "error":
|
|
58
|
+
raise ValueError("OpenCode session error.")
|
|
59
|
+
if not isinstance(kind, str) or kind not in _ANSWER_EVENTS:
|
|
60
|
+
return
|
|
61
|
+
identity, part = _identified_part(event)
|
|
62
|
+
session_id, message_id, part_id = identity
|
|
63
|
+
if self.session_id is not None and self.session_id != session_id:
|
|
64
|
+
raise ValueError("Inconsistent OpenCode session identity.")
|
|
65
|
+
self.session_id = session_id
|
|
66
|
+
snapshot = _answer_part(kind, message_id, part)
|
|
67
|
+
if part_id in self.parts:
|
|
68
|
+
if self.parts[part_id] != snapshot:
|
|
69
|
+
raise ValueError("Contradictory OpenCode part snapshot.")
|
|
70
|
+
return
|
|
71
|
+
self.parts[part_id] = snapshot
|
|
72
|
+
self.last_message = message_id
|
|
73
|
+
if kind == "step_finish":
|
|
74
|
+
self.finish_reasons[message_id] = snapshot.reason
|
|
75
|
+
else:
|
|
76
|
+
self.finish_reasons.pop(message_id, None)
|
|
77
|
+
|
|
78
|
+
def result(self) -> OutputExtractionResult:
|
|
79
|
+
if (
|
|
80
|
+
self.last_message is None
|
|
81
|
+
or self.finish_reasons.get(self.last_message) != "stop"
|
|
82
|
+
):
|
|
83
|
+
return OutputExtractionResult("", "missing")
|
|
84
|
+
texts = [
|
|
85
|
+
part.text
|
|
86
|
+
for part in self.parts.values()
|
|
87
|
+
if part.message_id == self.last_message and part.text.strip()
|
|
88
|
+
]
|
|
89
|
+
if not texts:
|
|
90
|
+
return OutputExtractionResult("", "missing")
|
|
91
|
+
text = "\n".join(texts)
|
|
92
|
+
if not text.endswith("\n"):
|
|
93
|
+
text += "\n"
|
|
94
|
+
return OutputExtractionResult(text, "success", output_char_count=len(text))
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _answer_part(kind: str, message_id: str, part: Mapping[str, object]) -> _AnswerPart:
|
|
98
|
+
if kind == "text":
|
|
99
|
+
text = part.get("text")
|
|
100
|
+
if not isinstance(text, str):
|
|
101
|
+
raise ValueError("Malformed OpenCode text.")
|
|
102
|
+
return _AnswerPart(kind, message_id, text=text, end=_completed_time(part))
|
|
103
|
+
if kind == "step_finish":
|
|
104
|
+
reason = part.get("reason")
|
|
105
|
+
if not isinstance(reason, str):
|
|
106
|
+
raise ValueError("Malformed OpenCode finish reason.")
|
|
107
|
+
return _AnswerPart(kind, message_id, reason=reason)
|
|
108
|
+
return _AnswerPart(kind, message_id)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _completed_time(part: Mapping[str, object]) -> int | float:
|
|
112
|
+
time = part.get("time")
|
|
113
|
+
end = time.get("end") if isinstance(time, dict) else None
|
|
114
|
+
if (
|
|
115
|
+
isinstance(end, bool)
|
|
116
|
+
or not isinstance(end, (int, float))
|
|
117
|
+
or end <= 0
|
|
118
|
+
or (isinstance(end, float) and not math.isfinite(end))
|
|
119
|
+
):
|
|
120
|
+
raise ValueError("OpenCode text requires a completed time.end.")
|
|
121
|
+
return end
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _read_event(line: str) -> Mapping[str, object] | None:
|
|
125
|
+
if not line.strip():
|
|
126
|
+
return None
|
|
127
|
+
try:
|
|
128
|
+
event = json.loads(line)
|
|
129
|
+
except json.JSONDecodeError as exc:
|
|
130
|
+
raise ValueError("Malformed OpenCode JSON output.") from exc
|
|
131
|
+
if not isinstance(event, dict):
|
|
132
|
+
raise ValueError("OpenCode events must be JSON objects.")
|
|
133
|
+
return event
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _identified_part(
|
|
137
|
+
event: Mapping[str, object],
|
|
138
|
+
) -> tuple[_Identity, Mapping[str, object]]:
|
|
139
|
+
part = event.get("part")
|
|
140
|
+
if not isinstance(part, dict):
|
|
141
|
+
raise ValueError("Malformed OpenCode event part.")
|
|
142
|
+
session_id = _identity_field(event, "sessionID")
|
|
143
|
+
if session_id != _identity_field(part, "sessionID"):
|
|
144
|
+
raise ValueError("Inconsistent OpenCode envelope/part session identity.")
|
|
145
|
+
return (
|
|
146
|
+
(session_id, _identity_field(part, "messageID"), _identity_field(part, "id")),
|
|
147
|
+
part,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _identity_field(payload: Mapping[str, object], key: str) -> str:
|
|
152
|
+
value = payload.get(key)
|
|
153
|
+
if not isinstance(value, str) or not value.strip():
|
|
154
|
+
raise ValueError(f"OpenCode {key} must be a nonblank string.")
|
|
155
|
+
return value
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def decode_opencode_usage(result: CommandResult) -> UsageDecodeResult:
|
|
159
|
+
"""Aggregate distinct native steps independently of answer extraction."""
|
|
160
|
+
accumulator = UsageAccumulator()
|
|
161
|
+
reports: dict[_Identity, _Counters] = {}
|
|
162
|
+
for line in result.iter_stdout_lines():
|
|
163
|
+
try:
|
|
164
|
+
event = _read_event(line)
|
|
165
|
+
if event is None or event.get("type") != "step_finish":
|
|
166
|
+
continue
|
|
167
|
+
report = _usage_report(event)
|
|
168
|
+
if report is None:
|
|
169
|
+
continue
|
|
170
|
+
identity, counters = report
|
|
171
|
+
if identity in reports:
|
|
172
|
+
if reports[identity] != counters:
|
|
173
|
+
raise ValueError("Contradictory OpenCode step usage report.")
|
|
174
|
+
continue
|
|
175
|
+
reports[identity] = counters
|
|
176
|
+
accumulator.record_usage(_normalized_usage(counters))
|
|
177
|
+
except ValueError as exc:
|
|
178
|
+
accumulator.record_error(str(exc))
|
|
179
|
+
return accumulator.result()
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def _usage_report(
|
|
183
|
+
event: Mapping[str, object],
|
|
184
|
+
) -> tuple[_Identity, _Counters] | None:
|
|
185
|
+
part = event.get("part")
|
|
186
|
+
if not isinstance(part, dict) or "tokens" not in part:
|
|
187
|
+
return None
|
|
188
|
+
identity, part = _identified_part(event)
|
|
189
|
+
tokens = part["tokens"]
|
|
190
|
+
if not isinstance(tokens, dict):
|
|
191
|
+
raise ValueError("Malformed OpenCode token payload.")
|
|
192
|
+
cache = tokens.get("cache")
|
|
193
|
+
if cache is None:
|
|
194
|
+
cache = {}
|
|
195
|
+
if not isinstance(cache, dict):
|
|
196
|
+
raise ValueError("Malformed OpenCode cache payload.")
|
|
197
|
+
counters = CounterReader("OpenCode", tokens)
|
|
198
|
+
cached = CounterReader("OpenCode", cache)
|
|
199
|
+
return identity, (
|
|
200
|
+
counters.optional("input"),
|
|
201
|
+
counters.optional("output"),
|
|
202
|
+
counters.optional("reasoning"),
|
|
203
|
+
cached.optional("read"),
|
|
204
|
+
cached.optional("write"),
|
|
205
|
+
counters.optional("total"),
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _normalized_usage(counters: _Counters) -> ProviderTokenUsage:
|
|
210
|
+
input_tokens, output, reasoning, cache_read, cache_write, total = counters
|
|
211
|
+
return ProviderTokenUsage(
|
|
212
|
+
input=complete_sum(input_tokens, cache_read, cache_write),
|
|
213
|
+
cached_input=cache_read,
|
|
214
|
+
cache_write=cache_write,
|
|
215
|
+
output=complete_sum(output, reasoning),
|
|
216
|
+
reasoning=reasoning,
|
|
217
|
+
total=total if total is not None else complete_sum(*counters[:5]),
|
|
218
|
+
)
|
|
@@ -9,12 +9,10 @@ from crewplane.architecture.contracts import (
|
|
|
9
9
|
MockInvokerOptions,
|
|
10
10
|
)
|
|
11
11
|
from crewplane.architecture.contracts.invocation_failures import (
|
|
12
|
+
InvocationFailureError,
|
|
12
13
|
InvocationFailureSummary,
|
|
13
14
|
)
|
|
14
15
|
from crewplane.core.config import AgentConfig
|
|
15
|
-
from crewplane.runtime.agent.failures import (
|
|
16
|
-
InvocationFailureError,
|
|
17
|
-
)
|
|
18
16
|
|
|
19
17
|
from .context import is_reviewer_context
|
|
20
18
|
from .fixtures import fixture_candidates
|
{crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/execution_status.py
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Execution states and the subsets supported by each lifecycle."""
|
|
2
2
|
|
|
3
3
|
from enum import StrEnum, unique
|
|
4
|
-
from typing import Literal
|
|
4
|
+
from typing import Literal, get_args
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
@unique
|
|
@@ -16,6 +16,16 @@ class ExecutionStatus(StrEnum):
|
|
|
16
16
|
BLOCKED = "blocked"
|
|
17
17
|
|
|
18
18
|
|
|
19
|
+
type TerminalWorkspaceStatus = Literal[
|
|
20
|
+
ExecutionStatus.SUCCEEDED,
|
|
21
|
+
ExecutionStatus.FAILED,
|
|
22
|
+
ExecutionStatus.CANCELLED,
|
|
23
|
+
]
|
|
24
|
+
TERMINAL_WORKSPACE_STATUSES: frozenset[TerminalWorkspaceStatus] = frozenset(
|
|
25
|
+
get_args(TerminalWorkspaceStatus.__value__)
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
19
29
|
type LifecycleStatus = Literal[
|
|
20
30
|
ExecutionStatus.PENDING,
|
|
21
31
|
ExecutionStatus.RUNNING,
|
{crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/integration_secrets.py
RENAMED
|
@@ -4,15 +4,13 @@ import re
|
|
|
4
4
|
from collections.abc import Callable, Collection, Sequence
|
|
5
5
|
from dataclasses import dataclass, field
|
|
6
6
|
|
|
7
|
+
from crewplane.core.sensitive_names import is_sensitive_name
|
|
8
|
+
|
|
7
9
|
from .json import JsonObject, JsonValue
|
|
8
10
|
|
|
9
11
|
type JsonPathSegment = str | int
|
|
10
12
|
type SensitiveOptionTransform = Callable[[str, JsonValue], JsonValue]
|
|
11
13
|
|
|
12
|
-
_SENSITIVE_OPTION_PATTERN = re.compile(
|
|
13
|
-
r"(secret|token|password|passwd|api[_-]?key|credential|private)",
|
|
14
|
-
re.IGNORECASE,
|
|
15
|
-
)
|
|
16
14
|
_INVALID_JSON_POINTER_ESCAPE = re.compile(r"~(?:[^01]|$)")
|
|
17
15
|
_JSON_ARRAY_INDEX = re.compile(r"0|[1-9][0-9]*")
|
|
18
16
|
|
|
@@ -117,10 +115,7 @@ class _SensitiveOptionWalker:
|
|
|
117
115
|
@staticmethod
|
|
118
116
|
def _is_sensitive_name(path: tuple[JsonPathSegment, ...]) -> bool:
|
|
119
117
|
segment = path[-1]
|
|
120
|
-
return (
|
|
121
|
-
isinstance(segment, str)
|
|
122
|
-
and _SENSITIVE_OPTION_PATTERN.search(segment) is not None
|
|
123
|
-
)
|
|
118
|
+
return isinstance(segment, str) and is_sensitive_name(segment)
|
|
124
119
|
|
|
125
120
|
def _has_explicit_descendant(self, pointer: str) -> bool:
|
|
126
121
|
prefix = f"{pointer}/"
|
{crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/invocation_failures.py
RENAMED
|
@@ -54,6 +54,23 @@ class InvocationFailureSummary:
|
|
|
54
54
|
return self.message
|
|
55
55
|
|
|
56
56
|
|
|
57
|
+
class InvocationFailureError(RuntimeError):
|
|
58
|
+
def __init__(
|
|
59
|
+
self,
|
|
60
|
+
prefix: str,
|
|
61
|
+
summary: InvocationFailureSummary,
|
|
62
|
+
log_file: Path | None,
|
|
63
|
+
) -> None:
|
|
64
|
+
self.summary = summary
|
|
65
|
+
self.kind = summary.kind
|
|
66
|
+
self.phase = summary.phase
|
|
67
|
+
self.source = summary.source
|
|
68
|
+
self.advice = summary.advice
|
|
69
|
+
self.log_file = log_file
|
|
70
|
+
self.last_non_quota_failure: InvocationFailureSummary | None = None
|
|
71
|
+
super().__init__(f"{prefix}: {summary.format_for_error(log_file)}")
|
|
72
|
+
|
|
73
|
+
|
|
57
74
|
ADVICE_BY_KIND: dict[FailureKind, str] = {
|
|
58
75
|
"provider_session_context_exhausted": (
|
|
59
76
|
"Provider context filled during tool or file exploration. Split the "
|
|
@@ -8,6 +8,23 @@ from contextlib import suppress
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
from typing import Any
|
|
10
10
|
|
|
11
|
+
_TEMPORARY_SUFFIX = ".tmp"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _temporary_name_prefix(target_name: str) -> str:
|
|
15
|
+
return f".{target_name}."
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def atomic_temporary_target_name(name: str) -> str | None:
|
|
19
|
+
"""Decode a temporary basename without imposing target-file eligibility."""
|
|
20
|
+
if not name.startswith(".") or not name.endswith(_TEMPORARY_SUFFIX):
|
|
21
|
+
return None
|
|
22
|
+
target_and_token = name[1 : -len(_TEMPORARY_SUFFIX)]
|
|
23
|
+
target_name, separator, token = target_and_token.rpartition(".")
|
|
24
|
+
if not separator or not token or not target_name:
|
|
25
|
+
return None
|
|
26
|
+
return target_name
|
|
27
|
+
|
|
11
28
|
|
|
12
29
|
def json_bytes(payload: Any) -> bytes:
|
|
13
30
|
return (
|
|
@@ -32,8 +49,8 @@ def atomic_write_bytes(path: Path, payload: bytes, ensure_parent: bool = True) -
|
|
|
32
49
|
with tempfile.NamedTemporaryFile(
|
|
33
50
|
mode="wb",
|
|
34
51
|
dir=path.parent,
|
|
35
|
-
prefix=
|
|
36
|
-
suffix=
|
|
52
|
+
prefix=_temporary_name_prefix(path.name),
|
|
53
|
+
suffix=_TEMPORARY_SUFFIX,
|
|
37
54
|
delete=False,
|
|
38
55
|
) as handle:
|
|
39
56
|
publication_phase = "write temporary file"
|
|
@@ -75,8 +92,8 @@ def atomic_write_bytes_if_absent(
|
|
|
75
92
|
with tempfile.NamedTemporaryFile(
|
|
76
93
|
mode="wb",
|
|
77
94
|
dir=path.parent,
|
|
78
|
-
prefix=
|
|
79
|
-
suffix=
|
|
95
|
+
prefix=_temporary_name_prefix(path.name),
|
|
96
|
+
suffix=_TEMPORARY_SUFFIX,
|
|
80
97
|
delete=False,
|
|
81
98
|
) as handle:
|
|
82
99
|
publication_phase = "write temporary file"
|