wade-cli 0.0.1__tar.gz → 0.29.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.29.0/.github/workflows/auto-version.yml +73 -0
- wade_cli-0.29.0/.github/workflows/ci.yml +71 -0
- wade_cli-0.29.0/.github/workflows/pr-title-lint.yml +31 -0
- wade_cli-0.29.0/.gitignore +48 -0
- wade_cli-0.29.0/.pre-commit-config.yaml +26 -0
- wade_cli-0.29.0/.wade.yml +66 -0
- wade_cli-0.29.0/AGENTS.md +144 -0
- wade_cli-0.29.0/CHANGELOG.md +712 -0
- wade_cli-0.29.0/CONTRIBUTING.md +92 -0
- wade_cli-0.29.0/KNOWLEDGE.md +115 -0
- wade_cli-0.29.0/KNOWLEDGE.ratings.yml +27 -0
- wade_cli-0.29.0/PKG-INFO +313 -0
- wade_cli-0.29.0/README.md +276 -0
- wade_cli-0.29.0/assets/wade.png +0 -0
- wade_cli-0.29.0/docker-compose.e2e.yml +25 -0
- wade_cli-0.29.0/docs/dev/architecture.md +339 -0
- wade_cli-0.29.0/docs/dev/documentation-policies.md +64 -0
- wade_cli-0.29.0/docs/dev/extending.md +64 -0
- wade_cli-0.29.0/docs/dev/skills-system.md +136 -0
- wade_cli-0.29.0/docs/dev/testing.md +246 -0
- wade_cli-0.29.0/install.sh +50 -0
- wade_cli-0.29.0/pyproject.toml +114 -0
- wade_cli-0.29.0/scripts/auto_version.py +159 -0
- wade_cli-0.29.0/scripts/changelog.py +195 -0
- wade_cli-0.29.0/scripts/check-all.sh +6 -0
- wade_cli-0.29.0/scripts/check.sh +33 -0
- wade_cli-0.29.0/scripts/fmt.sh +4 -0
- wade_cli-0.29.0/scripts/hooks/pre-push +103 -0
- wade_cli-0.29.0/scripts/install-hooks.sh +54 -0
- wade_cli-0.29.0/scripts/probe_models.sh +3 -0
- wade_cli-0.29.0/scripts/release.sh +92 -0
- wade_cli-0.29.0/scripts/setup-worktree.sh +29 -0
- wade_cli-0.29.0/scripts/test-e2e-docker.sh +29 -0
- wade_cli-0.29.0/scripts/test-e2e.sh +4 -0
- wade_cli-0.29.0/scripts/test-live-ai-taskr.sh +156 -0
- wade_cli-0.29.0/scripts/test-live-ai.sh +38 -0
- wade_cli-0.29.0/scripts/test-live-gh.sh +42 -0
- wade_cli-0.29.0/scripts/test.sh +12 -0
- wade_cli-0.29.0/src/wade/__init__.py +3 -0
- wade_cli-0.29.0/src/wade/__main__.py +5 -0
- wade_cli-0.29.0/src/wade/cli/__init__.py +1 -0
- wade_cli-0.29.0/src/wade/cli/admin.py +126 -0
- wade_cli-0.29.0/src/wade/cli/autocomplete.py +51 -0
- wade_cli-0.29.0/src/wade/cli/implementation_session.py +148 -0
- wade_cli-0.29.0/src/wade/cli/knowledge.py +359 -0
- wade_cli-0.29.0/src/wade/cli/main.py +607 -0
- wade_cli-0.29.0/src/wade/cli/plan_session.py +55 -0
- wade_cli-0.29.0/src/wade/cli/review.py +196 -0
- wade_cli-0.29.0/src/wade/cli/review_pr_comments_session.py +120 -0
- wade_cli-0.29.0/src/wade/cli/session_shared.py +61 -0
- wade_cli-0.29.0/src/wade/cli/task.py +316 -0
- wade_cli-0.29.0/src/wade/cli/worktree.py +130 -0
- wade_cli-0.29.0/src/wade/config/__init__.py +5 -0
- wade_cli-0.29.0/src/wade/config/loader.py +236 -0
- wade_cli-0.29.0/src/wade/config/migrations.py +91 -0
- wade_cli-0.29.0/src/wade/config/schema.py +31 -0
- wade_cli-0.29.0/src/wade/db/__init__.py +34 -0
- wade_cli-0.29.0/src/wade/db/engine.py +85 -0
- wade_cli-0.29.0/src/wade/db/repositories.py +266 -0
- wade_cli-0.29.0/src/wade/db/tables.py +131 -0
- wade_cli-0.29.0/src/wade/git/__init__.py +77 -0
- wade_cli-0.29.0/src/wade/git/branch.py +140 -0
- wade_cli-0.29.0/src/wade/git/pr.py +427 -0
- wade_cli-0.29.0/src/wade/git/repo.py +525 -0
- wade_cli-0.29.0/src/wade/git/stash.py +158 -0
- wade_cli-0.29.0/src/wade/git/sync.py +130 -0
- wade_cli-0.29.0/src/wade/git/worktree.py +195 -0
- wade_cli-0.29.0/src/wade/hooks/__init__.py +19 -0
- wade_cli-0.29.0/src/wade/hooks/plan_write_guard.py +200 -0
- wade_cli-0.29.0/src/wade/hooks/worktree_guard.py +186 -0
- wade_cli-0.29.0/src/wade/logging/__init__.py +1 -0
- wade_cli-0.29.0/src/wade/logging/context.py +18 -0
- wade_cli-0.29.0/src/wade/logging/setup.py +41 -0
- wade_cli-0.29.0/src/wade/models/__init__.py +69 -0
- wade_cli-0.29.0/src/wade/models/batch.py +33 -0
- wade_cli-0.29.0/src/wade/models/config.py +227 -0
- wade_cli-0.29.0/src/wade/models/delegation.py +42 -0
- wade_cli-0.29.0/src/wade/models/deps.py +152 -0
- wade_cli-0.29.0/src/wade/models/events.py +45 -0
- wade_cli-0.29.0/src/wade/models/review.py +517 -0
- wade_cli-0.29.0/src/wade/models/session.py +112 -0
- wade_cli-0.29.0/src/wade/models/task.py +275 -0
- wade_cli-0.29.0/src/wade/providers/__init__.py +39 -0
- wade_cli-0.29.0/src/wade/providers/_pr_delegate.py +69 -0
- wade_cli-0.29.0/src/wade/providers/base.py +170 -0
- wade_cli-0.29.0/src/wade/providers/clickup.py +326 -0
- wade_cli-0.29.0/src/wade/providers/github.py +983 -0
- wade_cli-0.29.0/src/wade/providers/markdown.py +703 -0
- wade_cli-0.29.0/src/wade/providers/registry.py +72 -0
- wade_cli-0.29.0/src/wade/services/__init__.py +1 -0
- wade_cli-0.29.0/src/wade/services/ai_resolution.py +350 -0
- wade_cli-0.29.0/src/wade/services/batch_review_service.py +548 -0
- wade_cli-0.29.0/src/wade/services/check_service.py +584 -0
- wade_cli-0.29.0/src/wade/services/delegation_service.py +271 -0
- wade_cli-0.29.0/src/wade/services/deps_service.py +567 -0
- wade_cli-0.29.0/src/wade/services/implementation_service/__init__.py +11 -0
- wade_cli-0.29.0/src/wade/services/implementation_service/batch.py +533 -0
- wade_cli-0.29.0/src/wade/services/implementation_service/bootstrap.py +539 -0
- wade_cli-0.29.0/src/wade/services/implementation_service/core.py +2856 -0
- wade_cli-0.29.0/src/wade/services/implementation_service/usage_tracking.py +336 -0
- wade_cli-0.29.0/src/wade/services/init_service.py +2748 -0
- wade_cli-0.29.0/src/wade/services/knowledge_search.py +232 -0
- wade_cli-0.29.0/src/wade/services/knowledge_service.py +799 -0
- wade_cli-0.29.0/src/wade/services/plan_service.py +952 -0
- wade_cli-0.29.0/src/wade/services/prompt_delivery.py +37 -0
- wade_cli-0.29.0/src/wade/services/review_delegation_service.py +261 -0
- wade_cli-0.29.0/src/wade/services/review_service.py +1152 -0
- wade_cli-0.29.0/src/wade/services/review_settle.py +81 -0
- wade_cli-0.29.0/src/wade/services/smart_start.py +426 -0
- wade_cli-0.29.0/src/wade/services/task_service.py +757 -0
- wade_cli-0.29.0/src/wade/skills/__init__.py +1 -0
- wade_cli-0.29.0/src/wade/skills/installer.py +461 -0
- wade_cli-0.29.0/src/wade/skills/pointer.py +195 -0
- wade_cli-0.29.0/src/wade/ui/__init__.py +5 -0
- wade_cli-0.29.0/src/wade/ui/console.py +370 -0
- wade_cli-0.29.0/src/wade/ui/prompts.py +206 -0
- wade_cli-0.29.0/src/wade/utils/__init__.py +1 -0
- wade_cli-0.29.0/src/wade/utils/clipboard.py +43 -0
- wade_cli-0.29.0/src/wade/utils/http.py +96 -0
- wade_cli-0.29.0/src/wade/utils/install.py +118 -0
- wade_cli-0.29.0/src/wade/utils/markdown.py +166 -0
- wade_cli-0.29.0/src/wade/utils/process.py +147 -0
- wade_cli-0.29.0/src/wade/utils/slug.py +35 -0
- wade_cli-0.29.0/src/wade/utils/terminal.py +555 -0
- wade_cli-0.29.0/src/wade/utils/token_usage_markdown.py +105 -0
- wade_cli-0.29.0/src/wade/utils/update_check.py +141 -0
- wade_cli-0.29.0/templates/agents-pointer.md +11 -0
- wade_cli-0.29.0/templates/prompts/deps-analysis.md +16 -0
- wade_cli-0.29.0/templates/prompts/implement-context.md +19 -0
- wade_cli-0.29.0/templates/prompts/plan-session.md +58 -0
- wade_cli-0.29.0/templates/prompts/review-batch.md +20 -0
- wade_cli-0.29.0/templates/prompts/review-code.md +14 -0
- wade_cli-0.29.0/templates/prompts/review-plan.md +14 -0
- wade_cli-0.29.0/templates/prompts/review-pr-comments.md +23 -0
- wade_cli-0.29.0/templates/setup-worktree.sh.example +41 -0
- wade_cli-0.29.0/templates/skills/_partials/review-enforcement-rule.md +8 -0
- wade_cli-0.29.0/templates/skills/_partials/review-implementation-closing-step.md +24 -0
- wade_cli-0.29.0/templates/skills/_partials/review-plan-step.md +17 -0
- wade_cli-0.29.0/templates/skills/_partials/user-interaction.md +5 -0
- wade_cli-0.29.0/templates/skills/deps/SKILL.md +92 -0
- wade_cli-0.29.0/templates/skills/implementation-session/SKILL.md +341 -0
- wade_cli-0.29.0/templates/skills/knowledge/SKILL.md +145 -0
- wade_cli-0.29.0/templates/skills/plan-session/SKILL.md +176 -0
- wade_cli-0.29.0/templates/skills/review-pr-comments-session/SKILL.md +247 -0
- wade_cli-0.29.0/templates/skills/task/SKILL.md +187 -0
- wade_cli-0.29.0/templates/skills/task/examples.md +132 -0
- wade_cli-0.29.0/templates/skills/task/plan-format.md +81 -0
- wade_cli-0.29.0/templates/statusline-command.sh +106 -0
- wade_cli-0.29.0/tests/__init__.py +1 -0
- wade_cli-0.29.0/tests/conftest.py +104 -0
- wade_cli-0.29.0/tests/e2e/__init__.py +1 -0
- wade_cli-0.29.0/tests/e2e/_support.py +277 -0
- wade_cli-0.29.0/tests/e2e/conftest.py +100 -0
- wade_cli-0.29.0/tests/e2e/mock_gh_script.py +650 -0
- wade_cli-0.29.0/tests/e2e/test_admin_contract.py +67 -0
- wade_cli-0.29.0/tests/e2e/test_check_contract.py +122 -0
- wade_cli-0.29.0/tests/e2e/test_implement_work_done_contract.py +360 -0
- wade_cli-0.29.0/tests/e2e/test_knowledge_contract.py +116 -0
- wade_cli-0.29.0/tests/e2e/test_mock_gh_contract.py +52 -0
- wade_cli-0.29.0/tests/e2e/test_plan_contract.py +199 -0
- wade_cli-0.29.0/tests/e2e/test_review_contract.py +909 -0
- wade_cli-0.29.0/tests/e2e/test_smart_start_contract.py +203 -0
- wade_cli-0.29.0/tests/e2e/test_task_contract.py +335 -0
- wade_cli-0.29.0/tests/e2e/test_work_sync_list_contract.py +221 -0
- wade_cli-0.29.0/tests/fixtures/live/taskr_header_hi_body.md +17 -0
- wade_cli-0.29.0/tests/fixtures/live/taskr_header_howdy_body.md +17 -0
- wade_cli-0.29.0/tests/fixtures/transcripts/claude_session.txt +57 -0
- wade_cli-0.29.0/tests/fixtures/transcripts/codex_session.txt +4 -0
- wade_cli-0.29.0/tests/fixtures/transcripts/copilot_session.txt +48 -0
- wade_cli-0.29.0/tests/fixtures/transcripts/gemini_session.txt +30 -0
- wade_cli-0.29.0/tests/fixtures/transcripts/generic_session.txt +10 -0
- wade_cli-0.29.0/tests/integration/__init__.py +1 -0
- wade_cli-0.29.0/tests/integration/test_autostash.py +261 -0
- wade_cli-0.29.0/tests/integration/test_check.py +80 -0
- wade_cli-0.29.0/tests/integration/test_git.py +464 -0
- wade_cli-0.29.0/tests/integration/test_implementation_lifecycle.py +269 -0
- wade_cli-0.29.0/tests/integration/test_init.py +73 -0
- wade_cli-0.29.0/tests/integration/test_knowledge.py +276 -0
- wade_cli-0.29.0/tests/integration/test_markdown_provider.py +199 -0
- wade_cli-0.29.0/tests/integration/test_skill_install.py +352 -0
- wade_cli-0.29.0/tests/live/__init__.py +1 -0
- wade_cli-0.29.0/tests/live/test_wade_live_ai.py +88 -0
- wade_cli-0.29.0/tests/live/test_wade_live_ai_taskr.py +502 -0
- wade_cli-0.29.0/tests/live/test_wade_live_gh.py +354 -0
- wade_cli-0.29.0/tests/test_cli_basics.py +291 -0
- wade_cli-0.29.0/tests/unit/__init__.py +1 -0
- wade_cli-0.29.0/tests/unit/conftest.py +20 -0
- wade_cli-0.29.0/tests/unit/test_cli/__init__.py +1 -0
- wade_cli-0.29.0/tests/unit/test_cli/test_done_review_hint.py +189 -0
- wade_cli-0.29.0/tests/unit/test_cli/test_knowledge_cli.py +487 -0
- wade_cli-0.29.0/tests/unit/test_cli/test_review_cli.py +524 -0
- wade_cli-0.29.0/tests/unit/test_cli/test_session_subapps.py +225 -0
- wade_cli-0.29.0/tests/unit/test_cli/test_shell_init.py +105 -0
- wade_cli-0.29.0/tests/unit/test_cli/test_task_cli.py +66 -0
- wade_cli-0.29.0/tests/unit/test_cli/test_work_ai_flags.py +39 -0
- wade_cli-0.29.0/tests/unit/test_cli/test_work_cli.py +113 -0
- wade_cli-0.29.0/tests/unit/test_config/__init__.py +1 -0
- wade_cli-0.29.0/tests/unit/test_config/test_loader.py +333 -0
- wade_cli-0.29.0/tests/unit/test_config/test_migrations.py +184 -0
- wade_cli-0.29.0/tests/unit/test_config/test_migrations_atomic.py +119 -0
- wade_cli-0.29.0/tests/unit/test_console.py +29 -0
- wade_cli-0.29.0/tests/unit/test_db/__init__.py +0 -0
- wade_cli-0.29.0/tests/unit/test_db/test_repository_transactions.py +114 -0
- wade_cli-0.29.0/tests/unit/test_effort.py +426 -0
- wade_cli-0.29.0/tests/unit/test_git/__init__.py +0 -0
- wade_cli-0.29.0/tests/unit/test_git/test_branch_slugify.py +76 -0
- wade_cli-0.29.0/tests/unit/test_git/test_detached_worktree.py +125 -0
- wade_cli-0.29.0/tests/unit/test_git/test_pr_base.py +84 -0
- wade_cli-0.29.0/tests/unit/test_git/test_repo.py +157 -0
- wade_cli-0.29.0/tests/unit/test_git/test_scaffold_commit.py +89 -0
- wade_cli-0.29.0/tests/unit/test_git/test_sync_conflicted_files.py +107 -0
- wade_cli-0.29.0/tests/unit/test_git/test_worktree_remove.py +63 -0
- wade_cli-0.29.0/tests/unit/test_hooks/__init__.py +0 -0
- wade_cli-0.29.0/tests/unit/test_hooks/test_plan_write_guard.py +276 -0
- wade_cli-0.29.0/tests/unit/test_hooks/test_worktree_guard.py +250 -0
- wade_cli-0.29.0/tests/unit/test_models/__init__.py +1 -0
- wade_cli-0.29.0/tests/unit/test_models/test_batch.py +85 -0
- wade_cli-0.29.0/tests/unit/test_models/test_config_models.py +107 -0
- wade_cli-0.29.0/tests/unit/test_models/test_db.py +200 -0
- wade_cli-0.29.0/tests/unit/test_models/test_delegation.py +90 -0
- wade_cli-0.29.0/tests/unit/test_models/test_deps_models.py +85 -0
- wade_cli-0.29.0/tests/unit/test_models/test_deps_partition.py +58 -0
- wade_cli-0.29.0/tests/unit/test_models/test_review.py +927 -0
- wade_cli-0.29.0/tests/unit/test_models/test_task_models.py +282 -0
- wade_cli-0.29.0/tests/unit/test_providers/__init__.py +0 -0
- wade_cli-0.29.0/tests/unit/test_providers/test_clickup.py +542 -0
- wade_cli-0.29.0/tests/unit/test_providers/test_github.py +662 -0
- wade_cli-0.29.0/tests/unit/test_providers/test_github_pr.py +94 -0
- wade_cli-0.29.0/tests/unit/test_providers/test_markdown.py +700 -0
- wade_cli-0.29.0/tests/unit/test_services/__init__.py +1 -0
- wade_cli-0.29.0/tests/unit/test_services/test_ai_resolution.py +478 -0
- wade_cli-0.29.0/tests/unit/test_services/test_batch_review_service.py +1011 -0
- wade_cli-0.29.0/tests/unit/test_services/test_bootstrap_allowlist.py +377 -0
- wade_cli-0.29.0/tests/unit/test_services/test_bootstrap_hook_timeout.py +130 -0
- wade_cli-0.29.0/tests/unit/test_services/test_catchup.py +274 -0
- wade_cli-0.29.0/tests/unit/test_services/test_check.py +387 -0
- wade_cli-0.29.0/tests/unit/test_services/test_delegation_service.py +312 -0
- wade_cli-0.29.0/tests/unit/test_services/test_deps_service.py +513 -0
- wade_cli-0.29.0/tests/unit/test_services/test_done_plan_flag.py +168 -0
- wade_cli-0.29.0/tests/unit/test_services/test_done_via_direct_cleanup.py +279 -0
- wade_cli-0.29.0/tests/unit/test_services/test_implementation_done_sync.py +1554 -0
- wade_cli-0.29.0/tests/unit/test_services/test_implementation_service.py +2167 -0
- wade_cli-0.29.0/tests/unit/test_services/test_implementation_service_resume.py +43 -0
- wade_cli-0.29.0/tests/unit/test_services/test_init.py +2541 -0
- wade_cli-0.29.0/tests/unit/test_services/test_init_shell_integration.py +244 -0
- wade_cli-0.29.0/tests/unit/test_services/test_knowledge_search.py +153 -0
- wade_cli-0.29.0/tests/unit/test_services/test_knowledge_service.py +1386 -0
- wade_cli-0.29.0/tests/unit/test_services/test_plan_service.py +903 -0
- wade_cli-0.29.0/tests/unit/test_services/test_poll_for_reviews.py +822 -0
- wade_cli-0.29.0/tests/unit/test_services/test_post_implementation_lifecycle.py +439 -0
- wade_cli-0.29.0/tests/unit/test_services/test_pr_summary_path.py +108 -0
- wade_cli-0.29.0/tests/unit/test_services/test_preserve_session_data.py +237 -0
- wade_cli-0.29.0/tests/unit/test_services/test_prompt_delivery.py +52 -0
- wade_cli-0.29.0/tests/unit/test_services/test_review_delegation_service.py +717 -0
- wade_cli-0.29.0/tests/unit/test_services/test_review_service.py +1990 -0
- wade_cli-0.29.0/tests/unit/test_services/test_smart_start.py +739 -0
- wade_cli-0.29.0/tests/unit/test_services/test_smart_start_resume.py +410 -0
- wade_cli-0.29.0/tests/unit/test_services/test_sync_base_branch.py +115 -0
- wade_cli-0.29.0/tests/unit/test_services/test_task_service.py +457 -0
- wade_cli-0.29.0/tests/unit/test_services/test_tracked_managed_files.py +348 -0
- wade_cli-0.29.0/tests/unit/test_services/test_worktree_gitignore.py +247 -0
- wade_cli-0.29.0/tests/unit/test_skills/test_managed_gitignore.py +74 -0
- wade_cli-0.29.0/tests/unit/test_utils/__init__.py +1 -0
- wade_cli-0.29.0/tests/unit/test_utils/test_http.py +164 -0
- wade_cli-0.29.0/tests/unit/test_utils/test_install.py +295 -0
- wade_cli-0.29.0/tests/unit/test_utils/test_markdown.py +206 -0
- wade_cli-0.29.0/tests/unit/test_utils/test_process.py +179 -0
- wade_cli-0.29.0/tests/unit/test_utils/test_prompts.py +48 -0
- wade_cli-0.29.0/tests/unit/test_utils/test_slug.py +42 -0
- wade_cli-0.29.0/tests/unit/test_utils/test_terminal.py +79 -0
- wade_cli-0.29.0/tests/unit/test_utils/test_terminal_launch.py +513 -0
- wade_cli-0.29.0/tests/unit/test_utils/test_update_check.py +268 -0
- wade_cli-0.29.0/tests/unit/test_yolo.py +642 -0
- wade_cli-0.0.1/PKG-INFO +0 -27
- wade_cli-0.0.1/README.md +0 -7
- wade_cli-0.0.1/pyproject.toml +0 -32
- wade_cli-0.0.1/src/wade_cli/__init__.py +0 -3
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
name: Auto Version Bump
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [closed]
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
version-bump:
|
|
13
|
+
# Only run when the PR was actually merged
|
|
14
|
+
if: github.event.pull_request.merged == true
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- name: Detect bump type
|
|
18
|
+
id: detect
|
|
19
|
+
env:
|
|
20
|
+
COMMIT_MSG: ${{ github.event.pull_request.title }}
|
|
21
|
+
run: |
|
|
22
|
+
MSG="$COMMIT_MSG"
|
|
23
|
+
FIRST_LINE=$(echo "$MSG" | head -n 1)
|
|
24
|
+
|
|
25
|
+
if echo "$MSG" | grep -q 'BREAKING CHANGE'; then
|
|
26
|
+
echo "bump=major" >> "$GITHUB_OUTPUT"
|
|
27
|
+
elif echo "$FIRST_LINE" | grep -qE '^[a-z]+(\(.+\))?!:'; then
|
|
28
|
+
echo "bump=major" >> "$GITHUB_OUTPUT"
|
|
29
|
+
elif echo "$FIRST_LINE" | grep -qE '^(feat|update)(\(.+\))?:'; then
|
|
30
|
+
echo "bump=minor" >> "$GITHUB_OUTPUT"
|
|
31
|
+
elif echo "$FIRST_LINE" | grep -qE '^(fix|docs|refactor|chore|style|perf|test|ci|build|revert)(\(.+\))?:'; then
|
|
32
|
+
echo "bump=patch" >> "$GITHUB_OUTPUT"
|
|
33
|
+
else
|
|
34
|
+
echo "bump=" >> "$GITHUB_OUTPUT"
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
- name: Skip if no conventional commit
|
|
38
|
+
if: steps.detect.outputs.bump == ''
|
|
39
|
+
run: echo "No conventional commit prefix detected — skipping version bump."
|
|
40
|
+
|
|
41
|
+
- uses: actions/checkout@v4
|
|
42
|
+
if: steps.detect.outputs.bump != ''
|
|
43
|
+
with:
|
|
44
|
+
fetch-depth: 0
|
|
45
|
+
|
|
46
|
+
- uses: astral-sh/setup-uv@v3
|
|
47
|
+
if: steps.detect.outputs.bump != ''
|
|
48
|
+
with:
|
|
49
|
+
version: "latest"
|
|
50
|
+
|
|
51
|
+
- name: Set up Python
|
|
52
|
+
if: steps.detect.outputs.bump != ''
|
|
53
|
+
run: uv python install 3.13
|
|
54
|
+
|
|
55
|
+
- name: Install dependencies
|
|
56
|
+
if: steps.detect.outputs.bump != ''
|
|
57
|
+
run: uv sync --all-extras
|
|
58
|
+
|
|
59
|
+
- name: Configure git
|
|
60
|
+
if: steps.detect.outputs.bump != ''
|
|
61
|
+
run: |
|
|
62
|
+
git config user.name "github-actions[bot]"
|
|
63
|
+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
64
|
+
|
|
65
|
+
- name: Bump version
|
|
66
|
+
if: steps.detect.outputs.bump != ''
|
|
67
|
+
run: uv run python scripts/auto_version.py ${{ steps.detect.outputs.bump }}
|
|
68
|
+
|
|
69
|
+
- name: Push commit and tag
|
|
70
|
+
if: steps.detect.outputs.bump != ''
|
|
71
|
+
run: |
|
|
72
|
+
git push
|
|
73
|
+
git push --tags
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
lint:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: astral-sh/setup-uv@v3
|
|
15
|
+
with:
|
|
16
|
+
version: "latest"
|
|
17
|
+
- name: Set up Python
|
|
18
|
+
run: uv python install 3.13
|
|
19
|
+
- name: Install dependencies
|
|
20
|
+
run: uv sync --all-extras
|
|
21
|
+
- name: Lint with ruff
|
|
22
|
+
run: uv run ruff check src/ tests/
|
|
23
|
+
- name: Format check with ruff
|
|
24
|
+
run: uv run ruff format --check src/ tests/
|
|
25
|
+
|
|
26
|
+
typecheck:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v4
|
|
30
|
+
- uses: astral-sh/setup-uv@v3
|
|
31
|
+
with:
|
|
32
|
+
version: "latest"
|
|
33
|
+
- name: Set up Python
|
|
34
|
+
run: uv python install 3.13
|
|
35
|
+
- name: Install dependencies
|
|
36
|
+
run: uv sync --all-extras
|
|
37
|
+
- name: Type check with mypy
|
|
38
|
+
run: uv run mypy src/ --strict
|
|
39
|
+
|
|
40
|
+
test:
|
|
41
|
+
runs-on: ubuntu-latest
|
|
42
|
+
strategy:
|
|
43
|
+
matrix:
|
|
44
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/checkout@v4
|
|
47
|
+
- uses: astral-sh/setup-uv@v3
|
|
48
|
+
with:
|
|
49
|
+
version: "latest"
|
|
50
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
51
|
+
run: uv python install ${{ matrix.python-version }}
|
|
52
|
+
- name: Install dependencies
|
|
53
|
+
run: uv sync --all-extras
|
|
54
|
+
- name: Configure git
|
|
55
|
+
run: |
|
|
56
|
+
git config --global user.email "test@wade.dev"
|
|
57
|
+
git config --global user.name "wade test"
|
|
58
|
+
git config --global init.defaultBranch main
|
|
59
|
+
- name: Run unit tests
|
|
60
|
+
run: ./scripts/test.sh tests/unit/
|
|
61
|
+
- name: Run integration tests
|
|
62
|
+
run: ./scripts/test.sh tests/integration/
|
|
63
|
+
- name: Run top-level CLI contract smoke
|
|
64
|
+
run: ./scripts/test.sh tests/test_cli_basics.py
|
|
65
|
+
|
|
66
|
+
e2e_docker:
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/checkout@v4
|
|
70
|
+
- name: Run deterministic e2e contract tests in Docker
|
|
71
|
+
run: ./scripts/test-e2e-docker.sh
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: PR Title Lint
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, edited, synchronize, reopened]
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
pull-requests: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
lint-title:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: amannn/action-semantic-pull-request@v5
|
|
16
|
+
env:
|
|
17
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
18
|
+
with:
|
|
19
|
+
types: |
|
|
20
|
+
feat
|
|
21
|
+
fix
|
|
22
|
+
docs
|
|
23
|
+
refactor
|
|
24
|
+
chore
|
|
25
|
+
style
|
|
26
|
+
perf
|
|
27
|
+
test
|
|
28
|
+
ci
|
|
29
|
+
build
|
|
30
|
+
revert
|
|
31
|
+
update
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.egg-info/
|
|
6
|
+
*.egg
|
|
7
|
+
dist/
|
|
8
|
+
build/
|
|
9
|
+
.eggs/
|
|
10
|
+
|
|
11
|
+
# Virtual environments
|
|
12
|
+
.venv/
|
|
13
|
+
venv/
|
|
14
|
+
env/
|
|
15
|
+
|
|
16
|
+
# IDE
|
|
17
|
+
.idea/
|
|
18
|
+
.vscode/
|
|
19
|
+
*.swp
|
|
20
|
+
*.swo
|
|
21
|
+
|
|
22
|
+
# Testing
|
|
23
|
+
.pytest_cache/
|
|
24
|
+
.coverage
|
|
25
|
+
htmlcov/
|
|
26
|
+
.mypy_cache/
|
|
27
|
+
|
|
28
|
+
# AI tool directories (wade-managed — never committed in this repo)
|
|
29
|
+
.agents/
|
|
30
|
+
.claude/
|
|
31
|
+
.copilot/
|
|
32
|
+
.cursor/
|
|
33
|
+
.gemini/
|
|
34
|
+
.github/hooks/
|
|
35
|
+
.github/skills
|
|
36
|
+
CLAUDE.md
|
|
37
|
+
PLAN.md
|
|
38
|
+
PR-SUMMARY.md
|
|
39
|
+
|
|
40
|
+
# OS
|
|
41
|
+
.DS_Store
|
|
42
|
+
Thumbs.db
|
|
43
|
+
|
|
44
|
+
# uv
|
|
45
|
+
uv.lock
|
|
46
|
+
|
|
47
|
+
# Local archive (pre-reset export)
|
|
48
|
+
archive/
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.15.2
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- id: ruff-format
|
|
8
|
+
|
|
9
|
+
- repo: local
|
|
10
|
+
hooks:
|
|
11
|
+
- id: mypy
|
|
12
|
+
name: mypy
|
|
13
|
+
language: system
|
|
14
|
+
entry: uv run mypy --strict src/
|
|
15
|
+
pass_filenames: false
|
|
16
|
+
always_run: true
|
|
17
|
+
|
|
18
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
19
|
+
rev: v5.0.0
|
|
20
|
+
hooks:
|
|
21
|
+
- id: trailing-whitespace
|
|
22
|
+
- id: end-of-file-fixer
|
|
23
|
+
- id: check-yaml
|
|
24
|
+
- id: check-added-large-files
|
|
25
|
+
args: [--maxkb=500]
|
|
26
|
+
- id: check-merge-conflict
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
project:
|
|
3
|
+
main_branch: main
|
|
4
|
+
issue_label: feature-plan
|
|
5
|
+
worktrees_dir: ../.worktrees
|
|
6
|
+
branch_prefix: feat
|
|
7
|
+
merge_strategy: PR
|
|
8
|
+
ai:
|
|
9
|
+
default_tool: claude
|
|
10
|
+
default_model: claude-sonnet-4.6
|
|
11
|
+
effort: max
|
|
12
|
+
plan:
|
|
13
|
+
tool: claude
|
|
14
|
+
model: claude-opus-4.7
|
|
15
|
+
effort: xhigh
|
|
16
|
+
yolo: true
|
|
17
|
+
deps:
|
|
18
|
+
tool: copilot
|
|
19
|
+
model: claude-sonnet-4.6
|
|
20
|
+
mode: headless
|
|
21
|
+
yolo: false
|
|
22
|
+
review_plan:
|
|
23
|
+
tool: copilot
|
|
24
|
+
model: claude-sonnet-4.6
|
|
25
|
+
mode: headless
|
|
26
|
+
enabled: true
|
|
27
|
+
yolo: false
|
|
28
|
+
review_implementation:
|
|
29
|
+
tool: copilot
|
|
30
|
+
model: claude-sonnet-4.6
|
|
31
|
+
mode: headless
|
|
32
|
+
enabled: true
|
|
33
|
+
yolo: false
|
|
34
|
+
review_batch:
|
|
35
|
+
tool: copilot
|
|
36
|
+
model: claude-sonnet-4.6
|
|
37
|
+
mode: interactive
|
|
38
|
+
enabled: true
|
|
39
|
+
yolo: true
|
|
40
|
+
yolo: true
|
|
41
|
+
models:
|
|
42
|
+
claude:
|
|
43
|
+
easy:
|
|
44
|
+
model: claude-sonnet-4.6
|
|
45
|
+
effort: xhigh
|
|
46
|
+
medium:
|
|
47
|
+
model: claude-sonnet-4.6
|
|
48
|
+
effort: max
|
|
49
|
+
complex:
|
|
50
|
+
model: claude-opus-4.7
|
|
51
|
+
effort: high
|
|
52
|
+
very_complex:
|
|
53
|
+
model: claude-opus-4.7
|
|
54
|
+
effort: xhigh
|
|
55
|
+
provider:
|
|
56
|
+
name: github
|
|
57
|
+
knowledge:
|
|
58
|
+
enabled: true
|
|
59
|
+
path: KNOWLEDGE.md
|
|
60
|
+
hooks:
|
|
61
|
+
post_worktree_create: scripts/setup-worktree.sh
|
|
62
|
+
copy_to_worktree:
|
|
63
|
+
- .env
|
|
64
|
+
- .wade.yml
|
|
65
|
+
- KNOWLEDGE.md
|
|
66
|
+
- KNOWLEDGE.ratings.yml
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to AI agents working on the WADE codebase.
|
|
4
|
+
For detailed reference on specific topics, see `docs/dev/`.
|
|
5
|
+
|
|
6
|
+
## Project Overview
|
|
7
|
+
|
|
8
|
+
**WADE** (Workflow for AI-Driven Engineering) is a Python CLI toolkit for AI-agent-driven git workflow management. It wraps `gh` CLI and native git to manage GitHub Issues as tasks, git worktrees for isolated development, branch safety checks, and installable Agent Skill files. CLI entry point: **`wade`**.
|
|
9
|
+
|
|
10
|
+
## Terminology
|
|
11
|
+
|
|
12
|
+
Two distinct worlds interact in this codebase. Always be clear which one you are working in:
|
|
13
|
+
|
|
14
|
+
| Term | Meaning |
|
|
15
|
+
|------|---------|
|
|
16
|
+
| **the WADE repo** / **this project** | This source repository — `src/wade/`, `templates/`, `tests/`, `scripts/` |
|
|
17
|
+
| **inited project** / **target project** | Any third-party repo that has run `wade init` to adopt the workflow |
|
|
18
|
+
| **skill templates** | Markdown files in `templates/skills/` — the source of truth, part of the WADE repo |
|
|
19
|
+
| **installed skills** | Copies (or symlinks) of skill templates placed in a project's `.claude/skills/` by `wade init` |
|
|
20
|
+
| **AGENTS.md pointer** | A short `## Git Workflow` block that `wade init` injects into an inited project's `AGENTS.md` |
|
|
21
|
+
|
|
22
|
+
**This `AGENTS.md` governs development of WADE itself.** Skills, the pointer, and the progressive disclosure architecture are all *outputs* of WADE — artifacts installed into inited projects, not rules for developing WADE.
|
|
23
|
+
|
|
24
|
+
**WADE uses its own workflow.** This repo is itself an inited project. Follow the `## Git Workflow` pointer at the bottom and the phase-specific skill referenced in your clipboard prompt.
|
|
25
|
+
|
|
26
|
+
## Commands
|
|
27
|
+
|
|
28
|
+
> **AI agents: always run the scripts below — never improvise raw `uv run pytest` / `mypy` / `ruff` calls.**
|
|
29
|
+
|
|
30
|
+
| Script | Purpose |
|
|
31
|
+
|--------|---------|
|
|
32
|
+
| `./scripts/test.sh` | Run all tests (excludes live) |
|
|
33
|
+
| `./scripts/test.sh tests/unit/` | Unit tests only |
|
|
34
|
+
| `./scripts/test-e2e.sh` | Deterministic E2E contract tests (host lane) |
|
|
35
|
+
| `./scripts/test-e2e-docker.sh` | Deterministic E2E contract tests in Docker (CI-equivalent) |
|
|
36
|
+
| `./scripts/check.sh` | Lint + type-check (both) |
|
|
37
|
+
| `./scripts/check.sh --lint` | Lint + format check only |
|
|
38
|
+
| `./scripts/check.sh --types` | Type check (strict mypy) only |
|
|
39
|
+
| `./scripts/fmt.sh` | Auto-format source in-place |
|
|
40
|
+
| `./scripts/check-all.sh` | Full checklist (test + check) |
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
uv pip install -e ".[dev]" # Install for development
|
|
44
|
+
uv run python scripts/auto_version.py patch # Version bump (patch/minor/major)
|
|
45
|
+
|
|
46
|
+
# Version bumps MUST be done with the script above. NEVER bump pyproject.toml
|
|
47
|
+
# manually, as the script generates CHANGELOG.md and git tags automatically.
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
> Full commands reference: see `docs/dev/architecture.md`
|
|
51
|
+
|
|
52
|
+
## Architecture
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
CLI Layer -> can import: services, models, config, logging, ui
|
|
56
|
+
Service Layer -> can import: providers, ai_tools, git, db, models, config, logging
|
|
57
|
+
Provider Layer -> can import: models, config, logging (NO service imports)
|
|
58
|
+
AI Tool Layer -> can import: models, config, logging (NO service imports)
|
|
59
|
+
Git Layer -> can import: models, config, logging (NO service imports)
|
|
60
|
+
DB Layer -> can import: models, logging (NO config imports)
|
|
61
|
+
Models Layer -> can import: nothing (leaf dependency)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
No circular dependencies. Models are pure data. Services orchestrate. **Never import a higher layer from a lower layer.**
|
|
65
|
+
|
|
66
|
+
CLI modules are thin dispatch — they parse flags via Typer, then call service methods. Business logic lives in `services/`, not in `cli/`.
|
|
67
|
+
|
|
68
|
+
> Full package structure, command dispatch, config system, and subsystem details: see `docs/dev/architecture.md`
|
|
69
|
+
|
|
70
|
+
### Key Design Patterns
|
|
71
|
+
|
|
72
|
+
- **AI Tool Self-Registration**: `AbstractAITool.__init_subclass__` auto-registers adapters. Adding a new AI tool = one file, one class.
|
|
73
|
+
- **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
|
+
- **Prompts as .md Templates**: All AI prompts live in `templates/prompts/`, not inline strings.
|
|
75
|
+
- **Synchronous Only**: No asyncio. Process-level parallelism via multiple terminals.
|
|
76
|
+
- **Pydantic Everywhere**: All data structures are Pydantic `BaseModel` subclasses, not dicts.
|
|
77
|
+
|
|
78
|
+
## Design Principles
|
|
79
|
+
|
|
80
|
+
### Determinism via Services
|
|
81
|
+
|
|
82
|
+
All deterministic operations — git commands, state transitions, file manipulation, API calls — **must live in service/utility code**, never in AI agent reasoning.
|
|
83
|
+
|
|
84
|
+
- **Code decides and executes** — fetch, merge, branch creation, worktree lifecycle, issue state changes. Codified in `services/`, `git/`, `providers/`.
|
|
85
|
+
- **Agents interpret and decide** — reading conflict diffs, choosing resolution strategies, composing commit messages. Guided by skills.
|
|
86
|
+
|
|
87
|
+
**Test**: "Can an AI agent get this wrong by reasoning about it?" If yes, put it in code.
|
|
88
|
+
|
|
89
|
+
### Two Worlds
|
|
90
|
+
|
|
91
|
+
Everything in this repo exists in one of two worlds:
|
|
92
|
+
|
|
93
|
+
| WADE repo (source) | Inited project (output) |
|
|
94
|
+
|---------------------|------------------------|
|
|
95
|
+
| `src/wade/` | installed `wade` binary |
|
|
96
|
+
| `templates/skills/<name>/SKILL.md` | `.claude/skills/<name>/SKILL.md` |
|
|
97
|
+
| `templates/agents-pointer.md` | `## Git Workflow` block in target `AGENTS.md` |
|
|
98
|
+
| `AGENTS.md` (this file) | target project's own `AGENTS.md` |
|
|
99
|
+
|
|
100
|
+
When developing WADE, **only touch the left column**. Always edit `templates/skills/<name>/SKILL.md` directly — never edit files inside `.claude/skills/` (those are symlinks in this repo, copies in inited projects).
|
|
101
|
+
|
|
102
|
+
> Skills system deep dive (symlinks, pointer markers, installation lifecycle): see `docs/dev/skills-system.md`
|
|
103
|
+
|
|
104
|
+
## Conventions
|
|
105
|
+
|
|
106
|
+
### Naming
|
|
107
|
+
|
|
108
|
+
- **Modules**: `snake_case.py` — one module per concern
|
|
109
|
+
- **Classes**: `PascalCase` — Pydantic models, ABCs, adapters
|
|
110
|
+
- **Functions**: `snake_case` — `_` prefix for private helpers
|
|
111
|
+
- **Constants**: `UPPER_SNAKE_CASE`
|
|
112
|
+
- **Enums**: `StrEnum` for string-valued enums
|
|
113
|
+
- **CLI commands**: top-level commands (`wade plan`, `wade implement`)
|
|
114
|
+
|
|
115
|
+
### Commits
|
|
116
|
+
|
|
117
|
+
Use [Conventional Commits](https://www.conventionalcommits.org/):
|
|
118
|
+
`feat:` (minor), `fix:` (patch), `docs:` (patch), `refactor:` (patch),
|
|
119
|
+
`test:` (patch), `chore:` (patch). Breaking changes (`feat!:`) -> major.
|
|
120
|
+
|
|
121
|
+
## Change Checklist
|
|
122
|
+
|
|
123
|
+
Before considering any work complete:
|
|
124
|
+
|
|
125
|
+
- [ ] **Code** — `./scripts/test.sh` passes
|
|
126
|
+
- [ ] **Types + Lint** — `./scripts/check.sh` passes (or run both at once: `./scripts/check-all.sh`)
|
|
127
|
+
- [ ] **`AGENTS.md`** — updated if architecture, conventions, or workflow changed
|
|
128
|
+
- [ ] **`README.md`** — updated if user-facing behavior changed
|
|
129
|
+
- [ ] **`templates/skills/`** — updated if agent-facing rules changed (plan-session for planning, implementation-session for implementation, review-pr-comments-session for reviews)
|
|
130
|
+
- [ ] **Commit** — uses conventional-commit prefix
|
|
131
|
+
|
|
132
|
+
> Full 10-item checklist, documentation rules, feedback loop, and correction-driven docs: see `docs/dev/documentation-policies.md`
|
|
133
|
+
|
|
134
|
+
## Detailed Reference
|
|
135
|
+
|
|
136
|
+
Read these on-demand when working in a specific area:
|
|
137
|
+
|
|
138
|
+
| When you are... | Read |
|
|
139
|
+
|-----------------|------|
|
|
140
|
+
| Modifying architecture, config, or commands | `docs/dev/architecture.md` |
|
|
141
|
+
| Adding an AI tool, provider, or subcommand | `docs/dev/extending.md` |
|
|
142
|
+
| Writing or running tests | `docs/dev/testing.md` |
|
|
143
|
+
| Working on skills, pointer system, or `wade init` | `docs/dev/skills-system.md` |
|
|
144
|
+
| Updating documentation policies | `docs/dev/documentation-policies.md` |
|