wade-cli 0.54.2__tar.gz → 1.0.0__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.
- {wade_cli-0.54.2 → wade_cli-1.0.0}/CHANGELOG.md +16 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/KNOWLEDGE.md +42 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/KNOWLEDGE.ratings.jsonl +6 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/PKG-INFO +112 -55
- {wade_cli-0.54.2 → wade_cli-1.0.0}/README.md +110 -53
- {wade_cli-0.54.2 → wade_cli-1.0.0}/docs/dev/architecture.md +105 -45
- {wade_cli-0.54.2 → wade_cli-1.0.0}/docs/dev/extending.md +16 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/pyproject.toml +2 -2
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/changelog.py +93 -9
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/__init__.py +1 -1
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/main.py +28 -23
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/review.py +5 -5
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/config/loader.py +7 -2
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/config/migrations.py +57 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/config.py +31 -34
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/delegation.py +6 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/ai_resolution.py +159 -31
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/check_service.py +72 -19
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/delegation_service.py +10 -6
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/deps_service.py +23 -1
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/implementation_service/batch.py +14 -14
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/implementation_service/bootstrap.py +21 -2
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/implementation_service/core.py +86 -35
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/implementation_service/lifecycle.py +9 -9
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/plan_service.py +50 -9
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/review_delegation_service.py +26 -1
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/review_service.py +79 -45
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/smart_start.py +11 -11
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/test_implement_work_done_contract.py +72 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/test_plan_contract.py +26 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/test_work_cli.py +10 -3
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_config/test_loader.py +32 -19
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_config/test_migrations.py +105 -0
- wade_cli-1.0.0/tests/unit/test_scripts/__init__.py +1 -0
- wade_cli-1.0.0/tests/unit/test_scripts/test_changelog.py +65 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_ai_resolution.py +252 -52
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_batch_build_cmd.py +18 -17
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_bootstrap_allowlist.py +76 -1
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_check.py +59 -9
- wade_cli-1.0.0/tests/unit/test_services/test_codex_worktree_launch_context.py +288 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_implementation_launch_context.py +158 -51
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_implementation_service.py +8 -8
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_plan_service.py +46 -3
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_post_implementation_lifecycle.py +6 -6
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_review_service.py +61 -26
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_smart_start.py +82 -6
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_skills/test_crossby_contract.py +1 -1
- wade_cli-0.54.2/tests/unit/test_services/test_codex_worktree_launch_context.py +0 -144
- {wade_cli-0.54.2 → wade_cli-1.0.0}/.gitattributes +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/.github/workflows/auto-version.yml +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/.github/workflows/ci.yml +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/.github/workflows/pr-title-lint.yml +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/.github/workflows/publish.yml +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/.github/workflows/release.yml +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/.gitignore +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/.pre-commit-config.yaml +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/.wade.yml +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/AGENTS.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/CONTRIBUTING.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/assets/wade.png +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/docker-compose.e2e.yml +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/docs/dev/documentation-policies.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/docs/dev/skills-system.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/docs/dev/testing.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/docs/dev/workflows-and-skills.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/install.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/auto_version.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/check-all.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/check.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/fmt.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/hooks/pre-push +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/install-hooks.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/release.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/setup-worktree.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/test-concurrency.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/test-e2e-docker.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/test-e2e.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/test-live-ai-taskr.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/test-live-ai.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/test-live-gh.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/scripts/test.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/__main__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/admin.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/autocomplete.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/deps_session.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/hook.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/implementation_session.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/knowledge.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/plan_session.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/review_pr_comments_session.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/session.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/session_shared.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/skills.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/task.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/cli/worktree.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/config/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/config/schema.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/git/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/git/branch.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/git/hooks.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/git/pr.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/git/repo.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/git/stash.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/git/sync.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/git/worktree.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/hooks/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/hooks/cli.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/hooks/policies.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/logging/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/logging/context.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/logging/setup.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/batch.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/deps.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/events.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/hooks.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/permission.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/readiness.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/review.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/session.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/session_manifest.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/skill.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/task.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/workflow.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/models/worktree.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/providers/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/providers/_pr_delegate.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/providers/base.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/providers/clickup.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/providers/github.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/providers/markdown.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/providers/registry.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/batch_review_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/bot_trigger.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/documentation_receipt_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/implementation_service/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/implementation_service/_shared.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/implementation_service/cleanup.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/implementation_service/done.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/implementation_service/draft_pr.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/implementation_service/sync.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/implementation_service/usage_tracking.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/init_service/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/init_service/auth.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/init_service/commands.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/init_service/config_io.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/init_service/manifest.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/init_service/migrations.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/init_service/prompts_ai.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/init_service/prompts_setup.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/init_service/shell.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/knowledge_recovery.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/knowledge_search.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/knowledge_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/prompt_delivery.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/review_record_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/review_settle.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/session_composition_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/skill_diagnostics_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/skill_invocation_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/services/task_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/skills/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/skills/catalog.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/skills/discovery.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/skills/doc_targets.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/skills/installer.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/skills/materializer.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/skills/pointer.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/skills/resolver.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/skills/validation.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/ui/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/ui/console.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/ui/prompts.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/body_markers.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/clipboard.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/conventional.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/filelock.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/gitref.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/http.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/install.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/knowledge_file.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/markdown.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/markers.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/paths.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/plan_validation.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/process.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/safe_state.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/slug.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/stale_base.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/templates.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/terminal.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/token_usage_markdown.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/src/wade/utils/update_check.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/agents-pointer.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/hooks/commit-msg +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/hooks/pre-commit +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/hooks/pre-push +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/prompts/deps-analysis.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/prompts/implement-context.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/prompts/plan-session.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/prompts/review-batch.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/prompts/review-code.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/prompts/review-plan.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/prompts/review-pr-comments.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/prompts/session-start-implement.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/prompts/session-start-plan.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/prompts/session-start-review.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/setup-worktree.sh.example +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/batch-review/SKILL.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/code-review/SKILL.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/dependency-analysis/SKILL.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/implementation/SKILL.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/knowledge/SKILL.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/plan-review/SKILL.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/planning/SKILL.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/review-comments/SKILL.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/task/SKILL.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/task/examples.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/task/plan-format.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/skills/task/reference/session-summary-format.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/statusline-command.sh +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/_partials/completion.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/_partials/documentation-step.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/_partials/interaction-policy.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/_partials/knowledge-step.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/_partials/review-budget.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/implementation.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/plan.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/reference/documentation.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/reference/new-plan.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/reference/plan-output-contract.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/reference/pr-summary-format.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/reference/recovery.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/reference/session-summary-format.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/reference/tracking-issues.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/templates/workflows/review-pr-comments.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/concurrency/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/concurrency/test_batch_multi_pr.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/concurrency/test_knowledge_merge.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/concurrency/test_lock_retry.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/concurrency/test_stash_race.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/conftest.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/_support.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/conftest.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/mock_gh_script.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/test_admin_contract.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/test_check_contract.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/test_knowledge_contract.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/test_mock_gh_contract.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/test_review_contract.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/test_smart_start_contract.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/test_task_contract.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/e2e/test_work_sync_list_contract.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/fixtures/live/taskr_header_hi_body.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/fixtures/live/taskr_header_howdy_body.md +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/fixtures/transcripts/claude_session.txt +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/fixtures/transcripts/codex_session.txt +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/fixtures/transcripts/copilot_session.txt +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/fixtures/transcripts/generic_session.txt +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/integration/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/integration/test_autostash.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/integration/test_check.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/integration/test_dynamic_skill_sessions.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/integration/test_git.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/integration/test_implementation_lifecycle.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/integration/test_init.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/integration/test_knowledge.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/integration/test_markdown_provider.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/integration/test_skill_context_budget.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/integration/test_skill_install.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/live/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/live/test_wade_live_ai.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/live/test_wade_live_ai_taskr.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/live/test_wade_live_gh.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/test_cli_basics.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/conftest.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/test_autocomplete.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/test_done_doc_pass_advisory.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/test_done_review_hint.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/test_knowledge_cli.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/test_review_cli.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/test_session_subapps.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/test_shell_init.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/test_skills_session_cli.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/test_task_cli.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_cli/test_work_ai_flags.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_config/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_config/test_bot_review_config.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_config/test_dynamic_skill_config.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_config/test_merge_strategy_migration.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_config/test_migrations_atomic.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_console.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_effort.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_all_patches_present.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_branch_list.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_branch_slugify.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_detached_worktree.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_is_merged_into.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_main_checkout_root.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_merge_count.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_pr_base.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_pr_lookup.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_pr_retry.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_pr_title.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_repo.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_reset_branch.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_scaffold_commit.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_stash_drop.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_sync_conflicted_files.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_tip_commit_is_empty.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_git/test_worktree_remove.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_hooks/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_hooks/test_hook_cli.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_hooks/test_policies.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_hooks/test_post_tool_use.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_hooks/test_session_start.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_models/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_models/test_batch.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_models/test_config_models.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_models/test_delegation.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_models/test_deps_models.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_models/test_deps_partition.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_models/test_review.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_models/test_review_expectation.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_models/test_task_models.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_models/test_workflow_models.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_permission_mode.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_providers/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_providers/test_clickup.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_providers/test_github.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_providers/test_github_pr.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_providers/test_markdown.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_batch_pr_index.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_batch_review_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_bootstrap_guard_matcher.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_bootstrap_hook_timeout.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_bootstrap_post_tool_use.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_bootstrap_pre_push.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_bootstrap_session_start.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_bot_trigger.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_catchup.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_catchup_reconcile.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_cleanup_loss_guard.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_delegation_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_deps_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_documentation_receipt.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_done_gates.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_done_idempotent.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_done_plan_flag.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_done_pr_title_sync.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_draft_pr_base_fetch.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_draft_pr_retarget.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_implementation_done_sync.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_implementation_service_resume.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_init.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_init_shell_integration.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_knowledge_recovery.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_knowledge_search.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_knowledge_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_managed_git_hooks.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_no_direct_git.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_poll_for_reviews.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_pr_lookup_guards.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_pr_summary_path.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_pre_push_backstop.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_preserve_session_data.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_prompt_delivery.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_push_recovery.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_resolve_task_branch.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_resume_autonomy.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_review_delegation_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_review_receipts.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_review_records.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_review_status_block.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_skill_diagnostics_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_smart_start_resume.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_stale_base_surface.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_sync_base_branch.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_task_service.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_tracked_managed_files.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_services/test_worktree_gitignore.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_skills/test_doc_targets.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_skills/test_dynamic_skills.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_skills/test_generic_builtin_boundaries.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_skills/test_knowledge_attributes.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_skills/test_managed_gitignore.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_skills/test_pointer.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_skills/test_review_budget_partial.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/__init__.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_body_markers.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_conventional.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_filelock.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_gitref.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_http.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_install.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_markdown.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_markers.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_plan_validation.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_process.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_prompts.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_slug.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_stale_base.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_terminal.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_terminal_launch.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_utils/test_update_check.py +0 -0
- {wade_cli-0.54.2 → wade_cli-1.0.0}/tests/unit/test_yolo.py +0 -0
|
@@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Conventional Commits](https://conventionalcommits.org/).
|
|
6
6
|
|
|
7
|
+
## [v1.0.0] — 2026-09-03
|
|
8
|
+
|
|
9
|
+
### Breaking Changes
|
|
10
|
+
|
|
11
|
+
- replace the Codex network pin with a cross-tool sandbox profile (#479) (7fa9561)
|
|
12
|
+
`ai.network_access` is retired and the AI runtime now launches **unsandboxed by default**. Set `ai.sandbox: true` to restore the previous confinement.
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- replace the Codex network pin with a cross-tool sandbox profile (#479) (7fa9561)
|
|
17
|
+
|
|
7
18
|
## [v0.54.2] — 2026-09-02
|
|
8
19
|
|
|
9
20
|
### Chores
|
|
@@ -415,6 +426,11 @@ The format is based on [Conventional Commits](https://conventionalcommits.org/).
|
|
|
415
426
|
|
|
416
427
|
## [v0.33.0] — 2026-07-23
|
|
417
428
|
|
|
429
|
+
### Breaking Changes
|
|
430
|
+
|
|
431
|
+
- replace Gemini CLI support with Antigravity CLI (bump crossby to 0.10.x) (#336) (c54af6d)
|
|
432
|
+
Gemini CLI is no longer a supported AI tool. Projects with ai.default_tool: gemini (or a per-command tool: gemini) must switch to antigravity-cli or another supported tool.
|
|
433
|
+
|
|
418
434
|
### Features
|
|
419
435
|
|
|
420
436
|
- replace Gemini CLI support with Antigravity CLI (bump crossby to 0.10.x) (#336) (c54af6d)
|
|
@@ -707,3 +707,45 @@ uv.lock is gitignored in this repo, so a crossby pin bump needs BOTH `uv lock` a
|
|
|
707
707
|
docs/dev/architecture.md's .wade.yml example hardcodes crossby's claude complexity-tier model IDs, so every crossby pin bump silently makes it stale — wade init writes whatever crossby.config.defaults.get_defaults() returns, not those literals. Update that block on every pin bump; note the crossby version RANGE is deliberately not restated in that file (architecture.md line ~171) so only the tier values need touching. Blast radius on existing projects is narrow: wade update re-resolves defaults but calls _patch_config without force, backfilling only tiers a config left unset.
|
|
708
708
|
|
|
709
709
|
---
|
|
710
|
+
|
|
711
|
+
## d7e3010043a2 | 2026-09-02 | implementation | tags: hooks, codex, gotcha, sandbox | Issue #478
|
|
712
|
+
|
|
713
|
+
`sandboxes_writes` is a STATIC crossby capability but the write boundary became launch-dependent once `ai.sandbox` existed (#478): it describes what a tool can do, not what this launch will do. Any code branching on it — today only `_install_guard_hooks` in `implementation_service/bootstrap.py` — must also consult the resolved profile, or under `sandbox=False` (Codex `--sandbox danger-full-access`) the worktree-containment guard narrows to the shell token and tool-call writes outside the worktree are guarded by nothing. Extends a44493f7, which documents the narrow-don't-skip rule but predates a disableable sandbox.
|
|
714
|
+
|
|
715
|
+
---
|
|
716
|
+
|
|
717
|
+
## 1c79175312c9 | 2026-09-02 | implementation | tags: config, validation, gotcha | Issue #478
|
|
718
|
+
|
|
719
|
+
check_service.py's AI-section key allowlists are derived reflectively from AICommandConfig/AIConfig.model_fields (#368), so DELETING a config field silently drops its key from the allowlist and the generic 'unsupported key' loop turns an un-migrated .wade.yml into a HARD ERROR — independent of any type validator, and in the opposite direction from the drift #368 fixed. Any key retirement needs an explicit tolerance entry (_DEPRECATED_AI_KEYS, added by #478) unioned into both allowlists for the transition release.
|
|
720
|
+
|
|
721
|
+
---
|
|
722
|
+
|
|
723
|
+
## 58e3be66cd66 | 2026-09-02 | implementation | tags: codex, yolo, sandbox | Issue #478
|
|
724
|
+
|
|
725
|
+
Codex --sandbox danger-full-access is APPROVAL-NEUTRAL: it is a distinct flag from --dangerously-bypass-approvals-and-sandbox, so disabling the runtime sandbox does not imply yolo and leaves the autonomy argv byte-identical. Sandbox and permission_mode stay orthogonal axes — one moves the OS boundary, the other the approval tier. Consistent with 1c18f1d4's separation of headless autonomy from permissions.
|
|
726
|
+
|
|
727
|
+
---
|
|
728
|
+
|
|
729
|
+
## 9eacd93219c1 | 2026-09-02 | implementation | tags: crossby, codex, gotcha | Issue #478
|
|
730
|
+
|
|
731
|
+
crossby's network_access parameter defaults to False and survived the #478 sandbox toggle, so wade must keep PASSING it (LAUNCH_NETWORK_ACCESS=True) rather than omitting it: a sandboxed launch that dropped the kwarg pins sandbox_workspace_write.network_access=false and silently takes the network away from the fetch/push/gh lifecycle that requires it. Under sandbox=False crossby short-circuits and ignores the value. This is why issue #478's 'no network_access kwarg reaches any adapter' criterion could not be met literally.
|
|
732
|
+
|
|
733
|
+
---
|
|
734
|
+
|
|
735
|
+
## ee8722fe7f27 | 2026-09-03 | implementation | tags: config, migration, gotcha | Issue #478
|
|
736
|
+
|
|
737
|
+
Config migrations in src/wade/config/migrations.py must test key PRESENCE, never the popped value: YAML `key:` with no value parses to None, so the natural `pop(key, None) is not None` idiom drops the key in memory while reporting 'unchanged'. That boolean is the only thing driving run_all_migrations' write-back, so a false 'unchanged' leaves the retired key on disk and any deprecation warning keyed to it recurs on every run. Use the _pop_if_present helper (#479) for any future key retirement.
|
|
738
|
+
|
|
739
|
+
---
|
|
740
|
+
|
|
741
|
+
## 6eb12fb5eb3a | 2026-09-03 | implementation | tags: tooling, git, gotcha | Issue #478
|
|
742
|
+
|
|
743
|
+
scripts/changelog.py's format_range is re-run by generate() for EVERY tag range in history, so anything per-commit inside it multiplies by the repo's whole commit count on each regeneration — the original per-commit `git log -1` body lookup would have meant thousands of subprocesses once footer-only breaking changes forced every body to be read. Pull extra commit fields from get_commits' single batched git log instead, with \x1f/\x1e field/record separators because bodies are multi-line free text that breaks any newline- or pipe-delimited format.
|
|
744
|
+
|
|
745
|
+
---
|
|
746
|
+
|
|
747
|
+
## ace2eb931e5e | 2026-09-03 | implementation | tags: release, ci, gotcha | Issue #478
|
|
748
|
+
|
|
749
|
+
The release version bump is derived from the PR title ALONE — .github/workflows/auto-version.yml greps only github.event.pull_request.title, never commit history — and done.py's PR-title sync overwrites that title from the ISSUE title on every done. So a `feat!:` commit with a real BREAKING CHANGE footer still ships as a MINOR release unless issue #N's own title carries the `!`; retitle the issue (gh issue edit --title, since wade task update only edits the body), not just the PR, or done reverts it.
|
|
750
|
+
|
|
751
|
+
---
|
|
@@ -152,3 +152,9 @@
|
|
|
152
152
|
{"dir": "up", "event_id": "0d0c898f52b54710a8d50b82cf78444a", "id": "a15045c3", "ts": "2026-09-02T15:22:03.529067+00:00"}
|
|
153
153
|
{"dir": "up", "event_id": "417925753e00400a98e04c6a7d41ccc4", "id": "ae5df2be", "ts": "2026-09-02T15:39:33.320072+00:00"}
|
|
154
154
|
{"dir": "up", "event_id": "a23ed60deb074def962f804a7ff9541a", "id": "fb2a067bb103", "ts": "2026-09-02T15:39:33.521027+00:00"}
|
|
155
|
+
{"dir": "up", "event_id": "e816bf9eda9842ffac928af977bd6ea3", "id": "a44493f7", "ts": "2026-09-02T22:00:41.291342+00:00"}
|
|
156
|
+
{"dir": "up", "event_id": "53071621625c4c40a2f7fded2f48467a", "id": "5b61c9c6", "ts": "2026-09-02T22:00:41.466441+00:00"}
|
|
157
|
+
{"dir": "up", "event_id": "980a8493a8bd42829e2a3057fa681c6a", "id": "fde883286787", "ts": "2026-09-02T22:00:41.632699+00:00"}
|
|
158
|
+
{"dir": "up", "event_id": "5cde95ece3844529a88448383c60e822", "id": "d7e3010043a2", "ts": "2026-09-03T02:07:17.166938+00:00"}
|
|
159
|
+
{"dir": "up", "event_id": "18179aae748f444487502929584aa632", "id": "6eb12fb5eb3a", "ts": "2026-09-03T12:24:58.444706+00:00"}
|
|
160
|
+
{"dir": "up", "event_id": "0c1be71273e34c50b609348a7c09622e", "id": "1c79175312c9", "ts": "2026-09-03T12:24:58.649116+00:00"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: wade-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.0
|
|
4
4
|
Summary: WADE — Workflow for AI-Driven Engineering
|
|
5
5
|
Project-URL: Homepage, https://github.com/ivanviragine/wade
|
|
6
6
|
Project-URL: Repository, https://github.com/ivanviragine/wade
|
|
@@ -16,7 +16,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.13
|
|
17
17
|
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
18
18
|
Requires-Python: >=3.11
|
|
19
|
-
Requires-Dist: crossby<0.
|
|
19
|
+
Requires-Dist: crossby<0.30.0,>=0.29.0
|
|
20
20
|
Requires-Dist: httpx<1.0,>=0.27
|
|
21
21
|
Requires-Dist: pydantic-settings>=2.0
|
|
22
22
|
Requires-Dist: pydantic>=2.0
|
|
@@ -276,7 +276,7 @@ These are invoked by the AI during a session — you normally don't run them by
|
|
|
276
276
|
| `wade plan-session done <plan_dir>` | Finalize a planning session |
|
|
277
277
|
| `wade deps-session check` | Verify the detached dependency-analysis runtime before writing output or staging a knowledge vote |
|
|
278
278
|
|
|
279
|
-
Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level>`, `--permission-mode <tier>`, and `--yolo` to override configured defaults. `plan`, `implement`, and `review pr-comments` accept repeatable `--skill` and `--review-skill` methodology bindings plus `--refresh-skills` for an existing frozen session; `implement-batch` forwards the same binding request to every child session. Standalone plan/code/batch review and `task deps` accept repeatable `--skill`. `implement`, `implement-batch`, `review pr-comments`, and the `wade <N>` shorthand also accept `--
|
|
279
|
+
Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level>`, `--permission-mode <tier>`, and `--yolo` to override configured defaults. `plan`, `implement`, and `review pr-comments` accept repeatable `--skill` and `--review-skill` methodology bindings plus `--refresh-skills` for an existing frozen session; `implement-batch` forwards the same binding request to every child session. Standalone plan/code/batch review and `task deps` accept repeatable `--skill`. `plan`, `implement`, `implement-batch`, `review pr-comments`, and the `wade <N>` shorthand also accept `--sandbox` / `--no-sandbox` (see [AI runtime sandbox profile](#ai-runtime-sandbox-profile)); batch and shorthand forward an explicit flag to the child session they launch. `implement` additionally supports `--detach` (new terminal tab), `--cd` (print worktree path only), and `--base <branch>` (see [Planning & base branches](#planning--base-branches)).
|
|
280
280
|
|
|
281
281
|
## Planning & base branches
|
|
282
282
|
|
|
@@ -348,7 +348,7 @@ for reviews"** after `wade implementation-session done` and comments land —
|
|
|
348
348
|
resolves its tool, model, effort, and autonomy tier from a dedicated
|
|
349
349
|
`ai.review_pr_comments` section (the same keys every `ai.<command>` section
|
|
350
350
|
accepts: `tool`, `model`, `effort`, `mode`, `permission_mode` / `yolo`,
|
|
351
|
-
`
|
|
351
|
+
`sandbox`, `enabled`, `timeout`):
|
|
352
352
|
|
|
353
353
|
```yaml
|
|
354
354
|
ai:
|
|
@@ -689,59 +689,115 @@ appends a clearly labeled stderr tail containing at most the final 20 non-empty
|
|
|
689
689
|
lines and 4,000 characters; if stdout is empty, that diagnostic is shown as the
|
|
690
690
|
failure feedback, and any truncation is labeled.
|
|
691
691
|
|
|
692
|
-
###
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
the
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
and `wade review pr-comments`, because their readiness, sync, and completion
|
|
713
|
-
steps require GitHub. Choose offline operation explicitly with `--no-network`,
|
|
714
|
-
or in `.wade.yml`:
|
|
692
|
+
### AI runtime sandbox profile
|
|
693
|
+
|
|
694
|
+
`ai.sandbox` is a single cross-tool boolean that decides whether WADE launches
|
|
695
|
+
the **AI runtime** inside its own filesystem sandbox. It governs the external
|
|
696
|
+
runtime boundary only — it never relaxes WADE's own guards (see below).
|
|
697
|
+
|
|
698
|
+
| Setting | Meaning |
|
|
699
|
+
|---------|---------|
|
|
700
|
+
| `sandbox: false` (**default**) | Launch the runtime unrestricted. Codex gets `--sandbox danger-full-access`, Cursor `--sandbox disabled`. Repository commands and delegated child tools keep **normal host access and credentials**. |
|
|
701
|
+
| `sandbox: true` | Launch the runtime confined. Codex gets `--sandbox workspace-write`, Cursor `--sandbox enabled`. |
|
|
702
|
+
|
|
703
|
+
Network access is **on in both profiles** and is no longer configurable — it is
|
|
704
|
+
enabled for every WADE launch. Not every phase needs it (planning and
|
|
705
|
+
dependency analysis deliberately do not), but the phases that do — `git
|
|
706
|
+
fetch`/`push`, `gh`, package installs — cannot work without it, and the profile
|
|
707
|
+
is fixed at launch.
|
|
708
|
+
|
|
709
|
+
Set it globally or per command, and override it on any launch command
|
|
710
|
+
(`implement`, `implement-batch`, `plan`, `review pr-comments`, `smart-start`,
|
|
711
|
+
and the `i`/`r`/`p` aliases) with `--sandbox` / `--no-sandbox`:
|
|
715
712
|
|
|
716
713
|
```yaml
|
|
717
714
|
ai:
|
|
718
|
-
|
|
715
|
+
sandbox: true # confine every session's runtime
|
|
719
716
|
implement:
|
|
720
|
-
|
|
717
|
+
sandbox: false # ...except implementation (per-command wins)
|
|
721
718
|
```
|
|
722
719
|
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
720
|
+
Precedence: `--sandbox`/`--no-sandbox` > `ai.<command>.sandbox` > `ai.sandbox` >
|
|
721
|
+
**unrestricted**. WADE pins the resolved profile explicitly in *both* directions,
|
|
722
|
+
so an ambient setting in your own Codex `config.toml` can never silently move the
|
|
723
|
+
boundary of a WADE-managed session. The resolved profile is printed at launch
|
|
724
|
+
next to the tool, model, effort, and permission mode, with its meaning spelled
|
|
725
|
+
out — the security posture is never left implicit.
|
|
726
|
+
|
|
727
|
+
> **Why unrestricted is the default.** WADE runs a deliberately multi-model
|
|
728
|
+
> workflow: a session delegates to reviewers and dependency analysers that
|
|
729
|
+
> authenticate separately. Every `wade` command is a child of the AI runtime, so
|
|
730
|
+
> a sandboxed outer runtime hands its sandbox to every child — and a separately
|
|
731
|
+
> authenticated reviewer such as Claude Code loses its normal host login. That is
|
|
732
|
+
> what makes delegated multi-model sessions fail in practice (#478).
|
|
733
|
+
|
|
734
|
+
**`unrestricted` is not "unattended".** The profile is orthogonal to
|
|
735
|
+
`permission_mode`: it moves the OS boundary, not the approval tier. Codex's
|
|
736
|
+
`--sandbox danger-full-access` is a distinct flag from
|
|
737
|
+
`--dangerously-bypass-approvals-and-sandbox`, so disabling the sandbox never
|
|
738
|
+
implies `yolo` and never changes the resolved autonomy tier. Treat it as an
|
|
739
|
+
intentional project opt-in to host access, not as a synonym for skipping prompts.
|
|
740
|
+
|
|
741
|
+
Only tools with a sandbox toggle (Codex, Cursor) act on the setting. The
|
|
742
|
+
capability handling is deliberately **asymmetric**, because the default is
|
|
743
|
+
`false`:
|
|
744
|
+
|
|
745
|
+
- `sandbox: false` on a tool that never sandboxed anything (Claude, Copilot, …)
|
|
746
|
+
is a silent no-op — those runtimes are already unrestricted.
|
|
747
|
+
- `sandbox: true` **explicitly requested** on a tool with no sandbox toggle is a
|
|
748
|
+
visible error naming the tool. WADE cannot impose a boundary the runtime does
|
|
749
|
+
not have, and will not pretend it did. No tool ever receives an invented flag.
|
|
750
|
+
|
|
751
|
+
#### Worktree git metadata under `sandbox: true`
|
|
752
|
+
|
|
753
|
+
A worktree's git metadata lives **outside** the worktree tree
|
|
754
|
+
(`<main>/.git/worktrees/<wt>` and `<main>/.git`), so under `workspace-write`
|
|
755
|
+
every git write — `git add`/commit, ref updates, stash, and `wade sync`/`done` —
|
|
756
|
+
would fail with `Unable to create …/index.lock` or `could not write index`. WADE
|
|
757
|
+
fixes this automatically: it passes the worktree's absolute path to the launcher,
|
|
758
|
+
which grants those out-of-root git-metadata dirs as sandbox writable roots (the
|
|
759
|
+
OS sandbox otherwise stays fully enabled — this widens nothing else). It is
|
|
760
|
+
transparent, needs no Codex config or manual approval, and is inert under
|
|
761
|
+
`sandbox: false`, where there is no boundary to widen.
|
|
762
|
+
|
|
763
|
+
#### WADE's own guards are unaffected
|
|
764
|
+
|
|
765
|
+
Disabling the runtime sandbox does not disable WADE's containment. The
|
|
766
|
+
worktree-containment guard actually gets **wider**: under `sandbox: true` it is
|
|
767
|
+
narrowed to the shell token (Codex's sandbox already covers tool-call writes, but
|
|
768
|
+
permits `/tmp` and `$TMPDIR`, so a shell redirect can still escape), while under
|
|
769
|
+
`sandbox: false` the **full** matcher is installed because nothing else covers
|
|
770
|
+
tool-call writes outside the worktree. The plan-artifact guard, lifecycle hooks,
|
|
771
|
+
the Stop hook, and the pre-push backstop are identical in both profiles.
|
|
772
|
+
|
|
773
|
+
#### Plan → implement handoff
|
|
774
|
+
|
|
775
|
+
The sandbox is a launch-time OS property: a process started confined cannot drop
|
|
776
|
+
its sandbox later. So when an accepted plan handoff runs inside a **sandboxed**
|
|
777
|
+
Codex planner and the implementation profile resolves to **unrestricted**, WADE
|
|
778
|
+
starts a fresh detached Codex context rather than reusing the planner process. If
|
|
779
|
+
it cannot open that context, the handoff fails rather than reporting an
|
|
780
|
+
implementation session ready — open a new host terminal and run the displayed
|
|
781
|
+
`wade implement <issue> --no-sandbox` command. When both sessions resolve to the
|
|
782
|
+
same profile there is no mismatch and the ordinary nested-launch guard applies.
|
|
783
|
+
|
|
784
|
+
The comparison uses the profile the planner **actually launched under**, so a
|
|
785
|
+
`wade plan --sandbox` / `--no-sandbox` override is honored here rather than
|
|
786
|
+
losing out to `ai.plan.sandbox`.
|
|
787
|
+
|
|
788
|
+
#### Migrating from `ai.network_access`
|
|
789
|
+
|
|
790
|
+
`ai.network_access` was a Codex-only network pin, enabled by default for
|
|
791
|
+
`implement` and `review_pr_comments` and off everywhere else. It is **retired**.
|
|
792
|
+
An existing `.wade.yml` that still carries it keeps loading and passes
|
|
793
|
+
`wade check` with a **warning, not an error**; the key is ignored, and `wade
|
|
794
|
+
update` strips it — that is the only command that runs the config migration
|
|
795
|
+
pipeline. Replace it with `ai.sandbox` if you want the old confinement back:
|
|
796
|
+
|
|
797
|
+
```yaml
|
|
798
|
+
ai:
|
|
799
|
+
sandbox: true # restores the pre-#478 Codex behaviour
|
|
800
|
+
```
|
|
745
801
|
|
|
746
802
|
### Session readiness and least-privilege remediation
|
|
747
803
|
|
|
@@ -801,10 +857,11 @@ credentials, PATH, or sandbox execution access, it does not consume a
|
|
|
801
857
|
timeout still counts as a bounded review attempt, so the review/fix loop cannot
|
|
802
858
|
run forever.
|
|
803
859
|
|
|
804
|
-
For Codex,
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
860
|
+
For Codex, WADE launches unsandboxed by default so delegated tools keep their
|
|
861
|
+
own host credentials; set `ai.sandbox: true` (or pass `--sandbox`) to keep
|
|
862
|
+
`--sandbox workspace-write`, where WADE/crossby add only the linked worktree's
|
|
863
|
+
private/common Git metadata directories. Every session has network access in
|
|
864
|
+
both profiles for its GitHub lifecycle.
|
|
808
865
|
For Claude Code and Cursor, allowlist the worktree/Git metadata paths and only
|
|
809
866
|
the GitHub domains needed by the session rather than choosing unrestricted shell
|
|
810
867
|
access. Copilot and VS Code need network plus usable `gh` credentials in their
|
|
@@ -240,7 +240,7 @@ These are invoked by the AI during a session — you normally don't run them by
|
|
|
240
240
|
| `wade plan-session done <plan_dir>` | Finalize a planning session |
|
|
241
241
|
| `wade deps-session check` | Verify the detached dependency-analysis runtime before writing output or staging a knowledge vote |
|
|
242
242
|
|
|
243
|
-
Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level>`, `--permission-mode <tier>`, and `--yolo` to override configured defaults. `plan`, `implement`, and `review pr-comments` accept repeatable `--skill` and `--review-skill` methodology bindings plus `--refresh-skills` for an existing frozen session; `implement-batch` forwards the same binding request to every child session. Standalone plan/code/batch review and `task deps` accept repeatable `--skill`. `implement`, `implement-batch`, `review pr-comments`, and the `wade <N>` shorthand also accept `--
|
|
243
|
+
Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level>`, `--permission-mode <tier>`, and `--yolo` to override configured defaults. `plan`, `implement`, and `review pr-comments` accept repeatable `--skill` and `--review-skill` methodology bindings plus `--refresh-skills` for an existing frozen session; `implement-batch` forwards the same binding request to every child session. Standalone plan/code/batch review and `task deps` accept repeatable `--skill`. `plan`, `implement`, `implement-batch`, `review pr-comments`, and the `wade <N>` shorthand also accept `--sandbox` / `--no-sandbox` (see [AI runtime sandbox profile](#ai-runtime-sandbox-profile)); batch and shorthand forward an explicit flag to the child session they launch. `implement` additionally supports `--detach` (new terminal tab), `--cd` (print worktree path only), and `--base <branch>` (see [Planning & base branches](#planning--base-branches)).
|
|
244
244
|
|
|
245
245
|
## Planning & base branches
|
|
246
246
|
|
|
@@ -312,7 +312,7 @@ for reviews"** after `wade implementation-session done` and comments land —
|
|
|
312
312
|
resolves its tool, model, effort, and autonomy tier from a dedicated
|
|
313
313
|
`ai.review_pr_comments` section (the same keys every `ai.<command>` section
|
|
314
314
|
accepts: `tool`, `model`, `effort`, `mode`, `permission_mode` / `yolo`,
|
|
315
|
-
`
|
|
315
|
+
`sandbox`, `enabled`, `timeout`):
|
|
316
316
|
|
|
317
317
|
```yaml
|
|
318
318
|
ai:
|
|
@@ -653,59 +653,115 @@ appends a clearly labeled stderr tail containing at most the final 20 non-empty
|
|
|
653
653
|
lines and 4,000 characters; if stdout is empty, that diagnostic is shown as the
|
|
654
654
|
failure feedback, and any truncation is labeled.
|
|
655
655
|
|
|
656
|
-
###
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
the
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
and `wade review pr-comments`, because their readiness, sync, and completion
|
|
677
|
-
steps require GitHub. Choose offline operation explicitly with `--no-network`,
|
|
678
|
-
or in `.wade.yml`:
|
|
656
|
+
### AI runtime sandbox profile
|
|
657
|
+
|
|
658
|
+
`ai.sandbox` is a single cross-tool boolean that decides whether WADE launches
|
|
659
|
+
the **AI runtime** inside its own filesystem sandbox. It governs the external
|
|
660
|
+
runtime boundary only — it never relaxes WADE's own guards (see below).
|
|
661
|
+
|
|
662
|
+
| Setting | Meaning |
|
|
663
|
+
|---------|---------|
|
|
664
|
+
| `sandbox: false` (**default**) | Launch the runtime unrestricted. Codex gets `--sandbox danger-full-access`, Cursor `--sandbox disabled`. Repository commands and delegated child tools keep **normal host access and credentials**. |
|
|
665
|
+
| `sandbox: true` | Launch the runtime confined. Codex gets `--sandbox workspace-write`, Cursor `--sandbox enabled`. |
|
|
666
|
+
|
|
667
|
+
Network access is **on in both profiles** and is no longer configurable — it is
|
|
668
|
+
enabled for every WADE launch. Not every phase needs it (planning and
|
|
669
|
+
dependency analysis deliberately do not), but the phases that do — `git
|
|
670
|
+
fetch`/`push`, `gh`, package installs — cannot work without it, and the profile
|
|
671
|
+
is fixed at launch.
|
|
672
|
+
|
|
673
|
+
Set it globally or per command, and override it on any launch command
|
|
674
|
+
(`implement`, `implement-batch`, `plan`, `review pr-comments`, `smart-start`,
|
|
675
|
+
and the `i`/`r`/`p` aliases) with `--sandbox` / `--no-sandbox`:
|
|
679
676
|
|
|
680
677
|
```yaml
|
|
681
678
|
ai:
|
|
682
|
-
|
|
679
|
+
sandbox: true # confine every session's runtime
|
|
683
680
|
implement:
|
|
684
|
-
|
|
681
|
+
sandbox: false # ...except implementation (per-command wins)
|
|
685
682
|
```
|
|
686
683
|
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
684
|
+
Precedence: `--sandbox`/`--no-sandbox` > `ai.<command>.sandbox` > `ai.sandbox` >
|
|
685
|
+
**unrestricted**. WADE pins the resolved profile explicitly in *both* directions,
|
|
686
|
+
so an ambient setting in your own Codex `config.toml` can never silently move the
|
|
687
|
+
boundary of a WADE-managed session. The resolved profile is printed at launch
|
|
688
|
+
next to the tool, model, effort, and permission mode, with its meaning spelled
|
|
689
|
+
out — the security posture is never left implicit.
|
|
690
|
+
|
|
691
|
+
> **Why unrestricted is the default.** WADE runs a deliberately multi-model
|
|
692
|
+
> workflow: a session delegates to reviewers and dependency analysers that
|
|
693
|
+
> authenticate separately. Every `wade` command is a child of the AI runtime, so
|
|
694
|
+
> a sandboxed outer runtime hands its sandbox to every child — and a separately
|
|
695
|
+
> authenticated reviewer such as Claude Code loses its normal host login. That is
|
|
696
|
+
> what makes delegated multi-model sessions fail in practice (#478).
|
|
697
|
+
|
|
698
|
+
**`unrestricted` is not "unattended".** The profile is orthogonal to
|
|
699
|
+
`permission_mode`: it moves the OS boundary, not the approval tier. Codex's
|
|
700
|
+
`--sandbox danger-full-access` is a distinct flag from
|
|
701
|
+
`--dangerously-bypass-approvals-and-sandbox`, so disabling the sandbox never
|
|
702
|
+
implies `yolo` and never changes the resolved autonomy tier. Treat it as an
|
|
703
|
+
intentional project opt-in to host access, not as a synonym for skipping prompts.
|
|
704
|
+
|
|
705
|
+
Only tools with a sandbox toggle (Codex, Cursor) act on the setting. The
|
|
706
|
+
capability handling is deliberately **asymmetric**, because the default is
|
|
707
|
+
`false`:
|
|
708
|
+
|
|
709
|
+
- `sandbox: false` on a tool that never sandboxed anything (Claude, Copilot, …)
|
|
710
|
+
is a silent no-op — those runtimes are already unrestricted.
|
|
711
|
+
- `sandbox: true` **explicitly requested** on a tool with no sandbox toggle is a
|
|
712
|
+
visible error naming the tool. WADE cannot impose a boundary the runtime does
|
|
713
|
+
not have, and will not pretend it did. No tool ever receives an invented flag.
|
|
714
|
+
|
|
715
|
+
#### Worktree git metadata under `sandbox: true`
|
|
716
|
+
|
|
717
|
+
A worktree's git metadata lives **outside** the worktree tree
|
|
718
|
+
(`<main>/.git/worktrees/<wt>` and `<main>/.git`), so under `workspace-write`
|
|
719
|
+
every git write — `git add`/commit, ref updates, stash, and `wade sync`/`done` —
|
|
720
|
+
would fail with `Unable to create …/index.lock` or `could not write index`. WADE
|
|
721
|
+
fixes this automatically: it passes the worktree's absolute path to the launcher,
|
|
722
|
+
which grants those out-of-root git-metadata dirs as sandbox writable roots (the
|
|
723
|
+
OS sandbox otherwise stays fully enabled — this widens nothing else). It is
|
|
724
|
+
transparent, needs no Codex config or manual approval, and is inert under
|
|
725
|
+
`sandbox: false`, where there is no boundary to widen.
|
|
726
|
+
|
|
727
|
+
#### WADE's own guards are unaffected
|
|
728
|
+
|
|
729
|
+
Disabling the runtime sandbox does not disable WADE's containment. The
|
|
730
|
+
worktree-containment guard actually gets **wider**: under `sandbox: true` it is
|
|
731
|
+
narrowed to the shell token (Codex's sandbox already covers tool-call writes, but
|
|
732
|
+
permits `/tmp` and `$TMPDIR`, so a shell redirect can still escape), while under
|
|
733
|
+
`sandbox: false` the **full** matcher is installed because nothing else covers
|
|
734
|
+
tool-call writes outside the worktree. The plan-artifact guard, lifecycle hooks,
|
|
735
|
+
the Stop hook, and the pre-push backstop are identical in both profiles.
|
|
736
|
+
|
|
737
|
+
#### Plan → implement handoff
|
|
738
|
+
|
|
739
|
+
The sandbox is a launch-time OS property: a process started confined cannot drop
|
|
740
|
+
its sandbox later. So when an accepted plan handoff runs inside a **sandboxed**
|
|
741
|
+
Codex planner and the implementation profile resolves to **unrestricted**, WADE
|
|
742
|
+
starts a fresh detached Codex context rather than reusing the planner process. If
|
|
743
|
+
it cannot open that context, the handoff fails rather than reporting an
|
|
744
|
+
implementation session ready — open a new host terminal and run the displayed
|
|
745
|
+
`wade implement <issue> --no-sandbox` command. When both sessions resolve to the
|
|
746
|
+
same profile there is no mismatch and the ordinary nested-launch guard applies.
|
|
747
|
+
|
|
748
|
+
The comparison uses the profile the planner **actually launched under**, so a
|
|
749
|
+
`wade plan --sandbox` / `--no-sandbox` override is honored here rather than
|
|
750
|
+
losing out to `ai.plan.sandbox`.
|
|
751
|
+
|
|
752
|
+
#### Migrating from `ai.network_access`
|
|
753
|
+
|
|
754
|
+
`ai.network_access` was a Codex-only network pin, enabled by default for
|
|
755
|
+
`implement` and `review_pr_comments` and off everywhere else. It is **retired**.
|
|
756
|
+
An existing `.wade.yml` that still carries it keeps loading and passes
|
|
757
|
+
`wade check` with a **warning, not an error**; the key is ignored, and `wade
|
|
758
|
+
update` strips it — that is the only command that runs the config migration
|
|
759
|
+
pipeline. Replace it with `ai.sandbox` if you want the old confinement back:
|
|
760
|
+
|
|
761
|
+
```yaml
|
|
762
|
+
ai:
|
|
763
|
+
sandbox: true # restores the pre-#478 Codex behaviour
|
|
764
|
+
```
|
|
709
765
|
|
|
710
766
|
### Session readiness and least-privilege remediation
|
|
711
767
|
|
|
@@ -765,10 +821,11 @@ credentials, PATH, or sandbox execution access, it does not consume a
|
|
|
765
821
|
timeout still counts as a bounded review attempt, so the review/fix loop cannot
|
|
766
822
|
run forever.
|
|
767
823
|
|
|
768
|
-
For Codex,
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
824
|
+
For Codex, WADE launches unsandboxed by default so delegated tools keep their
|
|
825
|
+
own host credentials; set `ai.sandbox: true` (or pass `--sandbox`) to keep
|
|
826
|
+
`--sandbox workspace-write`, where WADE/crossby add only the linked worktree's
|
|
827
|
+
private/common Git metadata directories. Every session has network access in
|
|
828
|
+
both profiles for its GitHub lifecycle.
|
|
772
829
|
For Claude Code and Cursor, allowlist the worktree/Git metadata paths and only
|
|
773
830
|
the GitHub domains needed by the session rather than choosing unrestricted shell
|
|
774
831
|
access. Copilot and VS Code need network plus usable `gh` credentials in their
|