wade-cli 0.29.0__tar.gz → 0.29.2__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.29.2/.github/workflows/publish.yml +17 -0
- wade_cli-0.29.2/.github/workflows/release.yml +33 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/AGENTS.md +4 -3
- {wade_cli-0.29.0 → wade_cli-0.29.2}/CHANGELOG.md +12 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/CONTRIBUTING.md +3 -2
- {wade_cli-0.29.0 → wade_cli-0.29.2}/PKG-INFO +3 -1
- {wade_cli-0.29.0 → wade_cli-0.29.2}/README.md +2 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/docs/dev/architecture.md +17 -25
- {wade_cli-0.29.0 → wade_cli-0.29.2}/docs/dev/extending.md +2 -11
- {wade_cli-0.29.0 → wade_cli-0.29.2}/docs/dev/testing.md +0 -2
- {wade_cli-0.29.0 → wade_cli-0.29.2}/pyproject.toml +1 -1
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/__init__.py +1 -1
- wade_cli-0.29.0/scripts/probe_models.sh +0 -3
- {wade_cli-0.29.0 → wade_cli-0.29.2}/.github/workflows/auto-version.yml +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/.github/workflows/ci.yml +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/.github/workflows/pr-title-lint.yml +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/.gitignore +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/.pre-commit-config.yaml +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/.wade.yml +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/KNOWLEDGE.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/KNOWLEDGE.ratings.yml +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/assets/wade.png +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/docker-compose.e2e.yml +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/docs/dev/documentation-policies.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/docs/dev/skills-system.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/install.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/auto_version.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/changelog.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/check-all.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/check.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/fmt.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/hooks/pre-push +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/install-hooks.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/release.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/setup-worktree.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/test-e2e-docker.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/test-e2e.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/test-live-ai-taskr.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/test-live-ai.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/test-live-gh.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/scripts/test.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/__main__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/admin.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/autocomplete.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/implementation_session.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/knowledge.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/main.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/plan_session.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/review.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/review_pr_comments_session.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/session_shared.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/task.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/cli/worktree.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/config/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/config/loader.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/config/migrations.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/config/schema.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/db/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/db/engine.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/db/repositories.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/db/tables.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/git/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/git/branch.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/git/pr.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/git/repo.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/git/stash.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/git/sync.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/git/worktree.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/hooks/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/hooks/plan_write_guard.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/hooks/worktree_guard.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/logging/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/logging/context.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/logging/setup.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/models/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/models/batch.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/models/config.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/models/delegation.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/models/deps.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/models/events.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/models/review.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/models/session.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/models/task.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/providers/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/providers/_pr_delegate.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/providers/base.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/providers/clickup.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/providers/github.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/providers/markdown.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/providers/registry.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/ai_resolution.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/batch_review_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/check_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/delegation_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/deps_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/implementation_service/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/implementation_service/batch.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/implementation_service/bootstrap.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/implementation_service/core.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/implementation_service/usage_tracking.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/init_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/knowledge_search.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/knowledge_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/plan_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/prompt_delivery.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/review_delegation_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/review_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/review_settle.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/smart_start.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/task_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/skills/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/skills/installer.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/skills/pointer.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/ui/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/ui/console.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/ui/prompts.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/utils/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/utils/clipboard.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/utils/http.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/utils/install.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/utils/markdown.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/utils/process.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/utils/slug.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/utils/terminal.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/utils/token_usage_markdown.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/utils/update_check.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/agents-pointer.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/prompts/deps-analysis.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/prompts/implement-context.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/prompts/plan-session.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/prompts/review-batch.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/prompts/review-code.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/prompts/review-plan.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/prompts/review-pr-comments.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/setup-worktree.sh.example +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/_partials/review-enforcement-rule.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/_partials/review-implementation-closing-step.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/_partials/review-plan-step.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/_partials/user-interaction.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/deps/SKILL.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/implementation-session/SKILL.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/knowledge/SKILL.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/plan-session/SKILL.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/review-pr-comments-session/SKILL.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/task/SKILL.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/task/examples.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/skills/task/plan-format.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/templates/statusline-command.sh +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/conftest.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/_support.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/conftest.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/mock_gh_script.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/test_admin_contract.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/test_check_contract.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/test_implement_work_done_contract.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/test_knowledge_contract.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/test_mock_gh_contract.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/test_plan_contract.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/test_review_contract.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/test_smart_start_contract.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/test_task_contract.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/e2e/test_work_sync_list_contract.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/fixtures/live/taskr_header_hi_body.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/fixtures/live/taskr_header_howdy_body.md +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/fixtures/transcripts/claude_session.txt +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/fixtures/transcripts/codex_session.txt +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/fixtures/transcripts/copilot_session.txt +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/fixtures/transcripts/gemini_session.txt +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/fixtures/transcripts/generic_session.txt +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/integration/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/integration/test_autostash.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/integration/test_check.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/integration/test_git.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/integration/test_implementation_lifecycle.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/integration/test_init.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/integration/test_knowledge.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/integration/test_markdown_provider.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/integration/test_skill_install.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/live/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/live/test_wade_live_ai.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/live/test_wade_live_ai_taskr.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/live/test_wade_live_gh.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/test_cli_basics.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/conftest.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_cli/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_cli/test_done_review_hint.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_cli/test_knowledge_cli.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_cli/test_review_cli.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_cli/test_session_subapps.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_cli/test_shell_init.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_cli/test_task_cli.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_cli/test_work_ai_flags.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_cli/test_work_cli.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_config/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_config/test_loader.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_config/test_migrations.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_config/test_migrations_atomic.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_console.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_db/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_db/test_repository_transactions.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_effort.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_git/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_git/test_branch_slugify.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_git/test_detached_worktree.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_git/test_pr_base.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_git/test_repo.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_git/test_scaffold_commit.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_git/test_sync_conflicted_files.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_git/test_worktree_remove.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_hooks/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_hooks/test_plan_write_guard.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_hooks/test_worktree_guard.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_models/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_models/test_batch.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_models/test_config_models.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_models/test_db.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_models/test_delegation.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_models/test_deps_models.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_models/test_deps_partition.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_models/test_review.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_models/test_task_models.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_providers/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_providers/test_clickup.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_providers/test_github.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_providers/test_github_pr.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_providers/test_markdown.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_ai_resolution.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_batch_review_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_bootstrap_allowlist.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_bootstrap_hook_timeout.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_catchup.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_check.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_delegation_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_deps_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_done_plan_flag.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_done_via_direct_cleanup.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_implementation_done_sync.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_implementation_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_implementation_service_resume.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_init.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_init_shell_integration.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_knowledge_search.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_knowledge_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_plan_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_poll_for_reviews.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_post_implementation_lifecycle.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_pr_summary_path.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_preserve_session_data.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_prompt_delivery.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_review_delegation_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_review_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_smart_start.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_smart_start_resume.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_sync_base_branch.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_task_service.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_tracked_managed_files.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_services/test_worktree_gitignore.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_skills/test_managed_gitignore.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_utils/__init__.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_utils/test_http.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_utils/test_install.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_utils/test_markdown.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_utils/test_process.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_utils/test_prompts.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_utils/test_slug.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_utils/test_terminal.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_utils/test_terminal_launch.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_utils/test_update_check.py +0 -0
- {wade_cli-0.29.0 → wade_cli-0.29.2}/tests/unit/test_yolo.py +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
publish:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
environment: pypi
|
|
11
|
+
permissions:
|
|
12
|
+
id-token: write
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- uses: astral-sh/setup-uv@v4
|
|
16
|
+
- run: uv build
|
|
17
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Create Draft Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ['v*']
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
draft-release:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
permissions:
|
|
11
|
+
contents: write
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
with:
|
|
15
|
+
fetch-depth: 0
|
|
16
|
+
|
|
17
|
+
- name: Extract changelog section
|
|
18
|
+
id: changelog
|
|
19
|
+
run: |
|
|
20
|
+
VERSION="${GITHUB_REF_NAME}"
|
|
21
|
+
NOTES=$(awk "/^## \[${VERSION}\]/{found=1; next} found && /^## \[/{exit} found{print}" CHANGELOG.md)
|
|
22
|
+
echo "notes<<EOF" >> $GITHUB_OUTPUT
|
|
23
|
+
echo "$NOTES" >> $GITHUB_OUTPUT
|
|
24
|
+
echo "EOF" >> $GITHUB_OUTPUT
|
|
25
|
+
|
|
26
|
+
- name: Create draft release
|
|
27
|
+
env:
|
|
28
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
29
|
+
run: |
|
|
30
|
+
gh release create "$GITHUB_REF_NAME" \
|
|
31
|
+
--draft \
|
|
32
|
+
--title "$GITHUB_REF_NAME" \
|
|
33
|
+
--notes "${{ steps.changelog.outputs.notes }}"
|
|
@@ -53,9 +53,8 @@ uv run python scripts/auto_version.py patch # Version bump (patch/minor/major)
|
|
|
53
53
|
|
|
54
54
|
```
|
|
55
55
|
CLI Layer -> can import: services, models, config, logging, ui
|
|
56
|
-
Service Layer -> can import: providers,
|
|
56
|
+
Service Layer -> can import: providers, crossby (AI tool adapters), git, db, models, config, logging
|
|
57
57
|
Provider Layer -> can import: models, config, logging (NO service imports)
|
|
58
|
-
AI Tool Layer -> can import: models, config, logging (NO service imports)
|
|
59
58
|
Git Layer -> can import: models, config, logging (NO service imports)
|
|
60
59
|
DB Layer -> can import: models, logging (NO config imports)
|
|
61
60
|
Models Layer -> can import: nothing (leaf dependency)
|
|
@@ -63,13 +62,15 @@ Models Layer -> can import: nothing (leaf dependency)
|
|
|
63
62
|
|
|
64
63
|
No circular dependencies. Models are pure data. Services orchestrate. **Never import a higher layer from a lower layer.**
|
|
65
64
|
|
|
65
|
+
AI tool adapters are not part of this repo — they live in the external [`crossby`](https://github.com/ivanviragine/crossby) package (`pyproject.toml`). See `docs/dev/architecture.md` for what moved there.
|
|
66
|
+
|
|
66
67
|
CLI modules are thin dispatch — they parse flags via Typer, then call service methods. Business logic lives in `services/`, not in `cli/`.
|
|
67
68
|
|
|
68
69
|
> Full package structure, command dispatch, config system, and subsystem details: see `docs/dev/architecture.md`
|
|
69
70
|
|
|
70
71
|
### Key Design Patterns
|
|
71
72
|
|
|
72
|
-
- **AI Tool
|
|
73
|
+
- **AI Tool Adapters via crossby**: `AbstractAITool` and every tool-specific adapter (Claude, Cursor, Copilot, Gemini, Codex, OpenCode, Antigravity, VS Code) live in the external `crossby` dependency, not this repo. Wade's services import `crossby.ai_tools` and `crossby.models.ai` directly. Adding a new AI tool means contributing to crossby, not wade.
|
|
73
74
|
- **Provider Abstraction**: `AbstractTaskProvider` ABC with pluggable backends (GitHub via `gh` CLI, ClickUp via REST API, Markdown via a single central file). Non-GitHub providers compose `GitHubPRDelegateMixin` so PR-review APIs still flow through `gh`.
|
|
74
75
|
- **Prompts as .md Templates**: All AI prompts live in `templates/prompts/`, not inline strings.
|
|
75
76
|
- **Synchronous Only**: No asyncio. Process-level parallelism via multiple terminals.
|
|
@@ -4,6 +4,18 @@ 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
|
+
## [v0.29.2] — 2026-07-15
|
|
8
|
+
|
|
9
|
+
### CI/CD
|
|
10
|
+
|
|
11
|
+
- restore release and publish workflows (8a5ddc3)
|
|
12
|
+
|
|
13
|
+
## [v0.29.1] — 2026-07-15
|
|
14
|
+
|
|
15
|
+
### Documentation
|
|
16
|
+
|
|
17
|
+
- reflect crossby AI tool layer migration, remove dead artifacts (6927543)
|
|
18
|
+
|
|
7
19
|
## [v0.29.0] — 2026-07-14
|
|
8
20
|
|
|
9
21
|
### Features
|
|
@@ -35,14 +35,15 @@ uv pip install -e ".[dev]"
|
|
|
35
35
|
|
|
36
36
|
```
|
|
37
37
|
CLI Layer → services, models, config, logging, ui
|
|
38
|
-
Service Layer → providers,
|
|
38
|
+
Service Layer → providers, crossby (AI tool adapters), git, db, models, config, logging
|
|
39
39
|
Provider Layer → models, config, logging (no service imports)
|
|
40
|
-
AI Tool Layer → models, config, logging (no service imports)
|
|
41
40
|
Git Layer → models, config, logging (no service imports)
|
|
42
41
|
DB Layer → models, logging (no config imports)
|
|
43
42
|
Models Layer → nothing (leaf)
|
|
44
43
|
```
|
|
45
44
|
|
|
45
|
+
AI tool adapters live in the external [`crossby`](https://github.com/ivanviragine/crossby) package, not this repo — see `docs/dev/architecture.md`.
|
|
46
|
+
|
|
46
47
|
CLI modules are thin dispatch — parse flags with Typer, call service methods. Business logic lives in `services/`, not `cli/`.
|
|
47
48
|
|
|
48
49
|
See `docs/dev/architecture.md` for the full reference.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wade-cli
|
|
3
|
-
Version: 0.29.
|
|
3
|
+
Version: 0.29.2
|
|
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
|
|
@@ -183,6 +183,8 @@ Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level
|
|
|
183
183
|
|
|
184
184
|
## Supported AI Tools
|
|
185
185
|
|
|
186
|
+
Adapters, model/effort resolution, and per-tool config (allowlists, hooks) are powered by [`crossby`](https://github.com/ivanviragine/crossby), WADE's AI-tool-integration dependency.
|
|
187
|
+
|
|
186
188
|
| Tool | Binary |
|
|
187
189
|
|------|--------|
|
|
188
190
|
| [Claude Code](https://claude.com/product/claude-code) | `claude` |
|
|
@@ -146,6 +146,8 @@ Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level
|
|
|
146
146
|
|
|
147
147
|
## Supported AI Tools
|
|
148
148
|
|
|
149
|
+
Adapters, model/effort resolution, and per-tool config (allowlists, hooks) are powered by [`crossby`](https://github.com/ivanviragine/crossby), WADE's AI-tool-integration dependency.
|
|
150
|
+
|
|
149
151
|
| Tool | Binary |
|
|
150
152
|
|------|--------|
|
|
151
153
|
| [Claude Code](https://claude.com/product/claude-code) | `claude` |
|
|
@@ -42,8 +42,6 @@ uv run python scripts/changelog.py # write CHANGELOG.md
|
|
|
42
42
|
uv run python scripts/changelog.py --stdout # print to stdout
|
|
43
43
|
uv run python scripts/changelog.py --tag v1.0.0 # label unreleased as v1.0.0
|
|
44
44
|
|
|
45
|
-
# Probe AI CLIs for new/removed models and diff against models.json
|
|
46
|
-
./scripts/probe_models.sh
|
|
47
45
|
```
|
|
48
46
|
|
|
49
47
|
## Package Structure
|
|
@@ -66,7 +64,6 @@ src/wade/
|
|
|
66
64
|
│ ├── config.py # ProjectConfig, ProjectSettings, AIConfig, ComplexityModelMapping
|
|
67
65
|
│ ├── task.py # Task, PlanFile, Complexity, Label, TaskState
|
|
68
66
|
│ ├── session.py # ImplementationSession, WorktreeState, SyncResult, SyncEvent, MergeStrategy
|
|
69
|
-
│ ├── ai.py # AIToolID, AIModel, ModelTier, TokenUsage, AIToolCapabilities
|
|
70
67
|
│ ├── delegation.py # DelegationRequest, DelegationResult, DelegationMode
|
|
71
68
|
│ ├── review.py # PRReviewStatus, ReviewThread, ReviewComment
|
|
72
69
|
│ ├── batch.py # BatchIssueContext, BatchReviewContext
|
|
@@ -95,18 +92,6 @@ src/wade/
|
|
|
95
92
|
│ ├── github.py # GitHubProvider (gh CLI subprocess)
|
|
96
93
|
│ ├── clickup.py # ClickUpProvider (REST API)
|
|
97
94
|
│ └── registry.py # Provider registry (register_provider / get_provider)
|
|
98
|
-
├── ai_tools/ # AI tool adapters (ABC, self-registering)
|
|
99
|
-
│ ├── base.py # AbstractAITool with __init_subclass__ registry
|
|
100
|
-
│ ├── claude.py # ClaudeAdapter
|
|
101
|
-
│ ├── cursor.py # CursorAdapter
|
|
102
|
-
│ ├── copilot.py # CopilotAdapter
|
|
103
|
-
│ ├── gemini.py # GeminiAdapter
|
|
104
|
-
│ ├── codex.py # CodexAdapter (OpenAI Codex)
|
|
105
|
-
│ ├── opencode.py # OpenCodeAdapter (multi-provider)
|
|
106
|
-
│ ├── antigravity.py # AntigravityAdapter
|
|
107
|
-
│ ├── vscode.py # VSCodeAdapter (GUI launcher)
|
|
108
|
-
│ ├── transcript.py # Shared transcript parsing
|
|
109
|
-
│ └── model_utils.py # pick_best_for_tier, has_date_suffix
|
|
110
95
|
├── git/ # Git operations (all subprocess)
|
|
111
96
|
│ ├── repo.py # Repo introspection
|
|
112
97
|
│ ├── worktree.py # Worktree create/remove/list
|
|
@@ -121,19 +106,10 @@ src/wade/
|
|
|
121
106
|
├── config/ # Configuration management
|
|
122
107
|
│ ├── loader.py # Find + parse .wade.yml (walk up from CWD)
|
|
123
108
|
│ ├── schema.py # Re-exports from models (Pydantic Settings)
|
|
124
|
-
│
|
|
125
|
-
│ ├── migrations.py # Config migration pipeline (ensure version key)
|
|
126
|
-
│ ├── claude_allowlist.py # .claude/settings.json allowlist management
|
|
127
|
-
│ ├── cursor_allowlist.py # Cursor settings allowlist management
|
|
128
|
-
│ ├── hooks_util.py # Shared JSON hook config read/merge/write utility
|
|
129
|
-
│ ├── cursor_hooks.py # Cursor settings.json hooks
|
|
130
|
-
│ ├── copilot_hooks.py # Copilot VS Code settings hooks
|
|
131
|
-
│ └── gemini_hooks.py # Gemini configuration hooks
|
|
109
|
+
│ └── migrations.py # Config migration pipeline (ensure version key)
|
|
132
110
|
├── ui/ # Terminal UI (Rich)
|
|
133
111
|
│ ├── console.py # Console class
|
|
134
112
|
│ └── prompts.py # confirm, input, select, menu
|
|
135
|
-
├── data/ # Bundled data files
|
|
136
|
-
│ └── models.json # AI model registry (probed from CLIs)
|
|
137
113
|
├── logging/ # Structured logging
|
|
138
114
|
│ ├── setup.py # structlog configuration
|
|
139
115
|
│ └── context.py # Session context binding
|
|
@@ -148,6 +124,22 @@ src/wade/
|
|
|
148
124
|
└── install.py # Self-upgrade helpers (venv/source detection, re-exec)
|
|
149
125
|
```
|
|
150
126
|
|
|
127
|
+
## AI Tool Layer (external: crossby)
|
|
128
|
+
|
|
129
|
+
AI tool adapters, model/effort resolution primitives, the model registry, and per-tool config (allowlists, hooks, defaults) are **not** part of this repo. They live in the external [`crossby`](https://github.com/ivanviragine/crossby) package, pinned in `pyproject.toml` (`crossby>=0.2.6,<0.3.0`). This replaced wade's formerly-internal `ai_tools/` and parts of `config/` and `data/` (see `feat: replace internal AI tool layer with the crossby dependency (#215)`).
|
|
130
|
+
|
|
131
|
+
| What | Lives in crossby | Used from wade via |
|
|
132
|
+
|------|-------------------|---------------------|
|
|
133
|
+
| `AbstractAITool` + adapters (Claude, Cursor, Copilot, Gemini, Codex, OpenCode, Antigravity, VS Code) | `crossby.ai_tools` | `services/ai_resolution.py`, `delegation_service.py`, `review_service.py`, `plan_service.py`, `prompt_delivery.py` |
|
|
134
|
+
| `AIToolID`, `AIModel`, `ModelTier`, `TokenUsage`, `AIToolCapabilities`, `EffortLevel` | `crossby.models.ai` | re-exported from `wade.models` |
|
|
135
|
+
| Model registry (probed from CLIs, was `data/models.json`) | `crossby.data.get_models_for_tool()` | `ai_resolution.py`, `init_service.py` |
|
|
136
|
+
| Per-tool default model tiers (was `config/defaults.py`) | `crossby.config.defaults.get_defaults()` | `init_service.py` |
|
|
137
|
+
| Claude/Cursor allowlist management, Cursor/Copilot/Gemini hook config (was `config/*_allowlist.py`, `config/*_hooks.py`) | `crossby.config.*`, `crossby.sync.permissions` | `implementation_service/bootstrap.py`, `init_service.py` |
|
|
138
|
+
|
|
139
|
+
Wade still owns a thin `services/ai_resolution.py` rather than delegating outright: wade's `ProjectConfig.ai` uses named per-command fields (e.g. `ai.plan`), while crossby's own config expects a `commands` dict — the two shapes aren't interchangeable yet. See that module's docstring for the up-to-date status.
|
|
140
|
+
|
|
141
|
+
Adding support for a new AI tool means contributing an adapter to crossby, not to this repo — see `docs/dev/extending.md`.
|
|
142
|
+
|
|
151
143
|
## Command Dispatch
|
|
152
144
|
|
|
153
145
|
`src/wade/cli/main.py` is the root Typer application. It registers subcommand groups (`task`, `worktree`, `plan-session`, `implementation-session`, `review-pr-comments-session`, `review`) and admin commands (`init`, `update`, `deinit`, `check-config`, `shell-init`). The `tasks` alias is registered as a hidden Typer group pointing to the same `task_app`. The `wade` entry point (defined in `pyproject.toml` as `wade.cli.main:cli_main`) invokes the root app.
|
|
@@ -14,20 +14,11 @@ The task CLI is in `src/wade/cli/task.py`, business logic in `src/wade/services/
|
|
|
14
14
|
|
|
15
15
|
## Adding a New AI Tool
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
1. Create `src/wade/ai_tools/<tool_name>.py`
|
|
20
|
-
2. Define a class that inherits from `AbstractAITool` and sets `TOOL_ID`
|
|
21
|
-
3. Implement the required abstract method: `capabilities()` (returns `AIToolCapabilities`)
|
|
22
|
-
4. Override `get_models()`, `launch()`, or `parse_transcript()` only if the defaults are insufficient
|
|
23
|
-
5. Add the tool ID to `AIToolID` enum in `models/ai.py`
|
|
24
|
-
6. Import the module in `ai_tools/__init__.py` to trigger registration
|
|
25
|
-
|
|
26
|
-
No modification to `base.py`, services, or CLI is needed.
|
|
17
|
+
AI tool adapters (`AbstractAITool` subclasses, using `__init_subclass__` auto-registration) live in the external [`crossby`](https://github.com/ivanviragine/crossby) package, not in this repo — see `docs/dev/architecture.md` for the full list of what moved there. Adding a new AI tool means adding an adapter in crossby, then in wade: bump the `crossby` pin in `pyproject.toml`, and add the tool's binary name to `README.md`'s "Supported AI Tools" table. No changes to wade's `services/` or `cli/` are needed unless the tool needs command-specific handling.
|
|
27
18
|
|
|
28
19
|
## Adding a New Provider
|
|
29
20
|
|
|
30
|
-
The provider system uses `AbstractTaskProvider` ABC (`src/wade/providers/base.py`) with `GitHubProvider` and `ClickUpProvider` as current implementations. Unlike AI tools (which
|
|
21
|
+
The provider system uses `AbstractTaskProvider` ABC (`src/wade/providers/base.py`) with `GitHubProvider` and `ClickUpProvider` as current implementations. Unlike AI tools (which are external, via crossby), providers are local to wade and use a registry pattern. To add a new provider (e.g., Linear, Jira):
|
|
31
22
|
|
|
32
23
|
1. Create `src/wade/providers/<provider_name>.py`
|
|
33
24
|
2. Implement all abstract methods from `AbstractTaskProvider`
|
|
@@ -12,10 +12,8 @@ tests/
|
|
|
12
12
|
│ ├── test_models/ # Pydantic model tests
|
|
13
13
|
│ ├── test_services/ # Service logic tests (mocked providers/git)
|
|
14
14
|
│ ├── test_config/ # Config parsing tests
|
|
15
|
-
│ ├── test_transcript/ # Transcript parsing tests
|
|
16
15
|
│ ├── test_utils/ # Utility function tests
|
|
17
16
|
│ ├── test_cli/ # CLI command tests (shell-init, AI flags)
|
|
18
|
-
│ ├── test_ai_tools/ # AI tool adapter and registry tests
|
|
19
17
|
│ ├── test_db/ # Database repository tests
|
|
20
18
|
│ ├── test_git/ # Git operation tests (branch, sync, worktree)
|
|
21
19
|
│ ├── test_hooks/ # Hook tests (plan write guard)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{wade_cli-0.29.0 → wade_cli-0.29.2}/src/wade/services/implementation_service/usage_tracking.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|