taskbrew 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.
- taskbrew-1.0.0/.env.example +17 -0
- taskbrew-1.0.0/.githooks/pre-commit +79 -0
- taskbrew-1.0.0/.githooks/pre-merge-commit +115 -0
- taskbrew-1.0.0/.github/workflows/ci.yml +50 -0
- taskbrew-1.0.0/.gitignore +54 -0
- taskbrew-1.0.0/ARCH-COMPLIANCE-CD153.md +178 -0
- taskbrew-1.0.0/CD-164-VERIFICATION-CD-145-READY-TO-MERGE.md +175 -0
- taskbrew-1.0.0/CHANGELOG.md +29 -0
- taskbrew-1.0.0/CODE_REVIEW_RV-179.md +176 -0
- taskbrew-1.0.0/CODE_REVIEW_RV-253.md +167 -0
- taskbrew-1.0.0/CONTRIBUTING.md +111 -0
- taskbrew-1.0.0/Dockerfile +45 -0
- taskbrew-1.0.0/LICENSE +21 -0
- taskbrew-1.0.0/Makefile +19 -0
- taskbrew-1.0.0/PKG-INFO +611 -0
- taskbrew-1.0.0/README.md +572 -0
- taskbrew-1.0.0/REVIEW-RV-261-REJECTION.md +103 -0
- taskbrew-1.0.0/TEST_VERIFICATION_TS-203.md +165 -0
- taskbrew-1.0.0/config/providers/claude.yaml +11 -0
- taskbrew-1.0.0/config/providers/gemini.yaml +17 -0
- taskbrew-1.0.0/config/roles/architect.yaml +43 -0
- taskbrew-1.0.0/config/roles/coder.yaml +49 -0
- taskbrew-1.0.0/config/roles/pm.yaml +38 -0
- taskbrew-1.0.0/config/roles/security-reviewer.yaml.example +26 -0
- taskbrew-1.0.0/config/roles/verifier.yaml +49 -0
- taskbrew-1.0.0/config/team.yaml +24 -0
- taskbrew-1.0.0/docker-compose.yaml +88 -0
- taskbrew-1.0.0/docs/RV-123-independent-verification.md +75 -0
- taskbrew-1.0.0/docs/architecture.md +327 -0
- taskbrew-1.0.0/docs/branching-policy.md +56 -0
- taskbrew-1.0.0/docs/configuration.md +330 -0
- taskbrew-1.0.0/docs/extending.md +424 -0
- taskbrew-1.0.0/docs/getting-started.md +196 -0
- taskbrew-1.0.0/docs/plans/2026-02-23-ai-team-implementation-plan.md +2191 -0
- taskbrew-1.0.0/docs/plans/2026-02-23-ai-team-orchestrator-design.md +215 -0
- taskbrew-1.0.0/docs/plans/2026-02-24-independent-agents-implementation-plan.md +2426 -0
- taskbrew-1.0.0/docs/plans/2026-02-24-independent-agents-redesign.md +493 -0
- taskbrew-1.0.0/docs/plans/2026-02-25-metrics-dashboard-design.md +65 -0
- taskbrew-1.0.0/docs/plans/2026-02-25-metrics-dashboard.md +306 -0
- taskbrew-1.0.0/docs/plans/2026-02-25-multi-project-support-design.md +206 -0
- taskbrew-1.0.0/docs/plans/2026-02-25-multi-project-support.md +1384 -0
- taskbrew-1.0.0/docs/plans/2026-02-25-settings-panel-redesign.md +1117 -0
- taskbrew-1.0.0/docs/plans/2026-02-27-open-source-release-design.md +882 -0
- taskbrew-1.0.0/docs/plans/2026-02-27-open-source-release-implementation.md +1772 -0
- taskbrew-1.0.0/docs/plans/AR-019-branch-hygiene-audit.md +97 -0
- taskbrew-1.0.0/docs/screenshots/dashboard.png +0 -0
- taskbrew-1.0.0/docs/screenshots/metrics.png +0 -0
- taskbrew-1.0.0/docs/screenshots/settings-pipeline.png +0 -0
- taskbrew-1.0.0/pipelines/bugfix.yaml +15 -0
- taskbrew-1.0.0/pipelines/code_review.yaml +12 -0
- taskbrew-1.0.0/pipelines/feature_dev.yaml +21 -0
- taskbrew-1.0.0/plugins/README.md +117 -0
- taskbrew-1.0.0/pyproject.toml +63 -0
- taskbrew-1.0.0/scripts/check-merge-scope.sh +192 -0
- taskbrew-1.0.0/src/taskbrew/__init__.py +3 -0
- taskbrew-1.0.0/src/taskbrew/agents/__init__.py +1 -0
- taskbrew-1.0.0/src/taskbrew/agents/agent_loop.py +654 -0
- taskbrew-1.0.0/src/taskbrew/agents/auto_scaler.py +236 -0
- taskbrew-1.0.0/src/taskbrew/agents/base.py +214 -0
- taskbrew-1.0.0/src/taskbrew/agents/gemini_cli.py +275 -0
- taskbrew-1.0.0/src/taskbrew/agents/instance_manager.py +200 -0
- taskbrew-1.0.0/src/taskbrew/agents/provider.py +289 -0
- taskbrew-1.0.0/src/taskbrew/agents/provider_base.py +91 -0
- taskbrew-1.0.0/src/taskbrew/agents/roles.py +131 -0
- taskbrew-1.0.0/src/taskbrew/auth.py +256 -0
- taskbrew-1.0.0/src/taskbrew/config.py +37 -0
- taskbrew-1.0.0/src/taskbrew/config_loader.py +381 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/__init__.py +1 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/app.py +382 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/chat_manager.py +243 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/models.py +436 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/__init__.py +1 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/_deps.py +26 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/agents.py +63 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/analytics.py +222 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/collaboration.py +282 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/comparison.py +276 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/costs.py +278 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/exports.py +318 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/git.py +215 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/intelligence.py +438 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/intelligence_v2.py +974 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/intelligence_v3.py +2036 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/pipelines.py +191 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/search.py +71 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/system.py +746 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/tasks.py +714 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/usage.py +683 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/routers/ws.py +167 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/static/css/main.css +4023 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/static/css/metrics.css +871 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/static/css/settings.css +1698 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/static/js/dashboard-core.js +1244 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/static/js/dashboard-ui.js +1620 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/static/js/features.js +1911 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/static/js/intelligence.js +1673 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/static/js/metrics.js +1455 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/static/js/settings.js +1553 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/templates/costs.html +49 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/templates/index.html +13393 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/templates/metrics.html +2709 -0
- taskbrew-1.0.0/src/taskbrew/dashboard/templates/settings.html +3605 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/__init__.py +1 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/_utils.py +36 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/advanced_planning.py +580 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/autonomous.py +439 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/checkpoints.py +81 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/clarification.py +91 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/code_intel.py +669 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/code_reasoning.py +825 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/collaboration.py +254 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/compliance.py +422 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/context_providers.py +325 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/coordination.py +424 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/escalation.py +89 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/execution.py +139 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/impact.py +84 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/knowledge_graph.py +266 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/knowledge_management.py +605 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/learning.py +425 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/memory.py +239 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/messaging.py +121 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/monitors.py +59 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/observability.py +485 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/planning.py +266 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/preflight.py +57 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/process_intelligence.py +596 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/quality.py +230 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/review_learning.py +132 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/security_intel.py +681 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/self_improvement.py +709 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/social_intelligence.py +746 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/specialization.py +240 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/task_intelligence.py +772 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/testing_quality.py +586 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/tool_router.py +85 -0
- taskbrew-1.0.0/src/taskbrew/intelligence/verification.py +670 -0
- taskbrew-1.0.0/src/taskbrew/logging_config.py +125 -0
- taskbrew-1.0.0/src/taskbrew/main.py +928 -0
- taskbrew-1.0.0/src/taskbrew/orchestrator/__init__.py +1 -0
- taskbrew-1.0.0/src/taskbrew/orchestrator/artifact_store.py +185 -0
- taskbrew-1.0.0/src/taskbrew/orchestrator/cost_manager.py +216 -0
- taskbrew-1.0.0/src/taskbrew/orchestrator/database.py +572 -0
- taskbrew-1.0.0/src/taskbrew/orchestrator/event_bus.py +75 -0
- taskbrew-1.0.0/src/taskbrew/orchestrator/migration.py +1290 -0
- taskbrew-1.0.0/src/taskbrew/orchestrator/notification_service.py +116 -0
- taskbrew-1.0.0/src/taskbrew/orchestrator/task_board.py +1050 -0
- taskbrew-1.0.0/src/taskbrew/orchestrator/webhook_manager.py +253 -0
- taskbrew-1.0.0/src/taskbrew/plugin_system.py +210 -0
- taskbrew-1.0.0/src/taskbrew/project_manager.py +624 -0
- taskbrew-1.0.0/src/taskbrew/tools/__init__.py +1 -0
- taskbrew-1.0.0/src/taskbrew/tools/git_tools.py +121 -0
- taskbrew-1.0.0/src/taskbrew/tools/intelligence_tools.py +218 -0
- taskbrew-1.0.0/src/taskbrew/tools/task_tools.py +285 -0
- taskbrew-1.0.0/src/taskbrew/tools/worktree_manager.py +157 -0
- taskbrew-1.0.0/tests/__init__.py +0 -0
- taskbrew-1.0.0/tests/conftest.py +9 -0
- taskbrew-1.0.0/tests/test_agent_base.py +43 -0
- taskbrew-1.0.0/tests/test_agent_loop.py +282 -0
- taskbrew-1.0.0/tests/test_agent_loop_unit.py +380 -0
- taskbrew-1.0.0/tests/test_agent_roles.py +34 -0
- taskbrew-1.0.0/tests/test_analytics_router.py +134 -0
- taskbrew-1.0.0/tests/test_artifact_store_v2.py +62 -0
- taskbrew-1.0.0/tests/test_auth.py +213 -0
- taskbrew-1.0.0/tests/test_auto_scaler.py +373 -0
- taskbrew-1.0.0/tests/test_chat_manager.py +104 -0
- taskbrew-1.0.0/tests/test_cli_commands.py +127 -0
- taskbrew-1.0.0/tests/test_collaboration.py +243 -0
- taskbrew-1.0.0/tests/test_comparison.py +336 -0
- taskbrew-1.0.0/tests/test_config_loader.py +573 -0
- taskbrew-1.0.0/tests/test_config_validation.py +690 -0
- taskbrew-1.0.0/tests/test_cost_dashboard.py +337 -0
- taskbrew-1.0.0/tests/test_cost_manager.py +255 -0
- taskbrew-1.0.0/tests/test_dashboard_api.py +947 -0
- taskbrew-1.0.0/tests/test_database.py +60 -0
- taskbrew-1.0.0/tests/test_edge_cases.py +408 -0
- taskbrew-1.0.0/tests/test_escalation_monitor.py +202 -0
- taskbrew-1.0.0/tests/test_event_bus.py +67 -0
- taskbrew-1.0.0/tests/test_exports_and_search.py +250 -0
- taskbrew-1.0.0/tests/test_gemini_cli.py +323 -0
- taskbrew-1.0.0/tests/test_git_router.py +174 -0
- taskbrew-1.0.0/tests/test_graceful_shutdown.py +254 -0
- taskbrew-1.0.0/tests/test_guardrails.py +49 -0
- taskbrew-1.0.0/tests/test_hooks.py +208 -0
- taskbrew-1.0.0/tests/test_instance_manager.py +125 -0
- taskbrew-1.0.0/tests/test_integration_api.py +365 -0
- taskbrew-1.0.0/tests/test_integration_auth.py +198 -0
- taskbrew-1.0.0/tests/test_integration_intelligence.py +563 -0
- taskbrew-1.0.0/tests/test_integration_intelligence_v2.py +815 -0
- taskbrew-1.0.0/tests/test_integration_intelligence_v2_endpoints.py +730 -0
- taskbrew-1.0.0/tests/test_integration_intelligence_v3_endpoints.py +957 -0
- taskbrew-1.0.0/tests/test_integration_v2.py +134 -0
- taskbrew-1.0.0/tests/test_intelligence_advanced_planning.py +343 -0
- taskbrew-1.0.0/tests/test_intelligence_autonomous.py +343 -0
- taskbrew-1.0.0/tests/test_intelligence_checkpoints.py +176 -0
- taskbrew-1.0.0/tests/test_intelligence_code_intel.py +476 -0
- taskbrew-1.0.0/tests/test_intelligence_code_reasoning.py +290 -0
- taskbrew-1.0.0/tests/test_intelligence_collaboration.py +350 -0
- taskbrew-1.0.0/tests/test_intelligence_compliance.py +279 -0
- taskbrew-1.0.0/tests/test_intelligence_context.py +457 -0
- taskbrew-1.0.0/tests/test_intelligence_coordination.py +350 -0
- taskbrew-1.0.0/tests/test_intelligence_escalation.py +188 -0
- taskbrew-1.0.0/tests/test_intelligence_execution.py +177 -0
- taskbrew-1.0.0/tests/test_intelligence_kg.py +194 -0
- taskbrew-1.0.0/tests/test_intelligence_knowledge_management.py +287 -0
- taskbrew-1.0.0/tests/test_intelligence_learning.py +353 -0
- taskbrew-1.0.0/tests/test_intelligence_memory.py +262 -0
- taskbrew-1.0.0/tests/test_intelligence_messaging.py +254 -0
- taskbrew-1.0.0/tests/test_intelligence_observability.py +297 -0
- taskbrew-1.0.0/tests/test_intelligence_planning.py +283 -0
- taskbrew-1.0.0/tests/test_intelligence_preflight.py +109 -0
- taskbrew-1.0.0/tests/test_intelligence_process_intelligence.py +314 -0
- taskbrew-1.0.0/tests/test_intelligence_quality.py +287 -0
- taskbrew-1.0.0/tests/test_intelligence_review_learning.py +178 -0
- taskbrew-1.0.0/tests/test_intelligence_security_intel.py +256 -0
- taskbrew-1.0.0/tests/test_intelligence_self_improvement.py +299 -0
- taskbrew-1.0.0/tests/test_intelligence_social_intelligence.py +292 -0
- taskbrew-1.0.0/tests/test_intelligence_specialization.py +334 -0
- taskbrew-1.0.0/tests/test_intelligence_task_intelligence.py +328 -0
- taskbrew-1.0.0/tests/test_intelligence_testing_quality.py +291 -0
- taskbrew-1.0.0/tests/test_intelligence_tools.py +233 -0
- taskbrew-1.0.0/tests/test_intelligence_verification.py +317 -0
- taskbrew-1.0.0/tests/test_logging_config.py +20 -0
- taskbrew-1.0.0/tests/test_migration.py +73 -0
- taskbrew-1.0.0/tests/test_notification_service.py +257 -0
- taskbrew-1.0.0/tests/test_performance.py +538 -0
- taskbrew-1.0.0/tests/test_pipelines_router.py +144 -0
- taskbrew-1.0.0/tests/test_plugin_system.py +185 -0
- taskbrew-1.0.0/tests/test_plugin_wiring.py +132 -0
- taskbrew-1.0.0/tests/test_project_integration.py +299 -0
- taskbrew-1.0.0/tests/test_project_manager.py +472 -0
- taskbrew-1.0.0/tests/test_provider_base.py +60 -0
- taskbrew-1.0.0/tests/test_provider_mcp.py +80 -0
- taskbrew-1.0.0/tests/test_provider_registry.py +77 -0
- taskbrew-1.0.0/tests/test_security.py +422 -0
- taskbrew-1.0.0/tests/test_security_v2.py +484 -0
- taskbrew-1.0.0/tests/test_startup_validation.py +127 -0
- taskbrew-1.0.0/tests/test_task_board.py +594 -0
- taskbrew-1.0.0/tests/test_task_board_advanced.py +354 -0
- taskbrew-1.0.0/tests/test_tools.py +21 -0
- taskbrew-1.0.0/tests/test_usage_monitor.py +267 -0
- taskbrew-1.0.0/tests/test_webhook_manager.py +547 -0
- taskbrew-1.0.0/tests/test_worktree_manager.py +98 -0
- taskbrew-1.0.0/uv.lock +1654 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Required — at least one provider API key
|
|
2
|
+
ANTHROPIC_API_KEY=your-anthropic-api-key-here
|
|
3
|
+
|
|
4
|
+
# Optional — Gemini provider
|
|
5
|
+
GOOGLE_API_KEY=your-google-api-key-here
|
|
6
|
+
|
|
7
|
+
# Optional — Server
|
|
8
|
+
AI_TEAM_API_URL=http://127.0.0.1:8420
|
|
9
|
+
AI_TEAM_DB_PATH=~/.ai-team/data/ai-team.db
|
|
10
|
+
|
|
11
|
+
# Optional — Logging
|
|
12
|
+
LOG_LEVEL=INFO
|
|
13
|
+
LOG_FORMAT=dev
|
|
14
|
+
|
|
15
|
+
# Optional — Auth
|
|
16
|
+
AUTH_ENABLED=false
|
|
17
|
+
CORS_ORIGINS=http://localhost:8000,http://localhost:3000
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# .githooks/pre-commit
|
|
3
|
+
# =====================================================================
|
|
4
|
+
# Validates that commits are made to the correct task branch.
|
|
5
|
+
#
|
|
6
|
+
# This hook prevents commits with the wrong task ID from being created,
|
|
7
|
+
# catching contamination at the source before it reaches the repository.
|
|
8
|
+
#
|
|
9
|
+
# Exit codes:
|
|
10
|
+
# 0 = PASS - commit task matches branch task
|
|
11
|
+
# 1 = FAIL - commit task doesn't match branch task (abort commit)
|
|
12
|
+
# =====================================================================
|
|
13
|
+
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
# Get current branch
|
|
17
|
+
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
|
|
18
|
+
|
|
19
|
+
# Early exit if not on a feature branch (e.g., on main, in detached state)
|
|
20
|
+
if [[ ! "$BRANCH" =~ ^feat/ ]]; then
|
|
21
|
+
exit 0
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# Extract task ID from branch name
|
|
25
|
+
# Examples: feat/rv-220 → RV-220, feat/cd-088 → CD-088
|
|
26
|
+
BRANCH_TASK=$(echo "$BRANCH" | sed -E 's/feat\/([a-z]+-[0-9]+).*/\1/' | tr '[:lower:]' '[:upper:]')
|
|
27
|
+
if [ "$BRANCH_TASK" = "$BRANCH" ]; then
|
|
28
|
+
BRANCH_TASK=""
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# Get the commit message being staged
|
|
32
|
+
COMMIT_MSG_FILE="${1:-}"
|
|
33
|
+
if [ -z "$COMMIT_MSG_FILE" ] || [ ! -f "$COMMIT_MSG_FILE" ]; then
|
|
34
|
+
exit 0
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
|
|
38
|
+
|
|
39
|
+
# Extract task ID from commit message
|
|
40
|
+
# Looking for pattern like "(RV-220)" or "(CD-088)" in the message
|
|
41
|
+
MSG_TASK=$(echo "$COMMIT_MSG" | grep -oE "\((CD|RV|TS|AR|DEBUG)-[0-9]+\)" | sed -E 's/[()]+//g' | head -1 || true)
|
|
42
|
+
|
|
43
|
+
# If we have both task IDs, validate they match
|
|
44
|
+
if [ -n "$BRANCH_TASK" ] && [ -n "$MSG_TASK" ]; then
|
|
45
|
+
if [ "$BRANCH_TASK" != "$MSG_TASK" ]; then
|
|
46
|
+
cat >&2 <<EOF
|
|
47
|
+
ERROR: Commit task ID mismatch
|
|
48
|
+
Branch: $BRANCH (task: $BRANCH_TASK)
|
|
49
|
+
Commit: $MSG_TASK
|
|
50
|
+
|
|
51
|
+
Each feature branch must contain commits for only one task.
|
|
52
|
+
Update your commit message to use the correct task ID: ($BRANCH_TASK)
|
|
53
|
+
|
|
54
|
+
Current message:
|
|
55
|
+
$COMMIT_MSG
|
|
56
|
+
|
|
57
|
+
Expected format:
|
|
58
|
+
$BRANCH_TASK message here ($(echo $BRANCH_TASK | cut -d- -f1)-NNN)
|
|
59
|
+
|
|
60
|
+
EOF
|
|
61
|
+
exit 1
|
|
62
|
+
fi
|
|
63
|
+
elif [ -n "$BRANCH_TASK" ] && [ -z "$MSG_TASK" ]; then
|
|
64
|
+
# Branch suggests a task but commit message doesn't mention any task
|
|
65
|
+
cat >&2 <<EOF
|
|
66
|
+
WARNING: Commit message missing task ID
|
|
67
|
+
Branch: $BRANCH (task: $BRANCH_TASK)
|
|
68
|
+
Commit message has no task ID
|
|
69
|
+
|
|
70
|
+
Consider adding the task ID to your commit message: ($BRANCH_TASK)
|
|
71
|
+
|
|
72
|
+
Current message:
|
|
73
|
+
$COMMIT_MSG
|
|
74
|
+
|
|
75
|
+
EOF
|
|
76
|
+
# This is a warning, not a hard error - let it pass
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
exit 0
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# .githooks/pre-merge-commit
|
|
3
|
+
# -------------------------------------------------------
|
|
4
|
+
# Git pre-merge-commit hook — scope-checks the inbound branch
|
|
5
|
+
# before a merge lands on the current branch.
|
|
6
|
+
#
|
|
7
|
+
# Exit codes from scripts/check-merge-scope.sh:
|
|
8
|
+
# 0 = PASS — merge proceeds silently
|
|
9
|
+
# 1 = WARN — warning printed, merge still proceeds
|
|
10
|
+
# 2 = BLOCK — merge is aborted
|
|
11
|
+
#
|
|
12
|
+
# This hook ONLY fires during `git merge` (the pre-merge-commit
|
|
13
|
+
# hook is not invoked for normal commits).
|
|
14
|
+
# -------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
REPO_ROOT="$(git rev-parse --show-toplevel)"
|
|
19
|
+
SCOPE_SCRIPT="${REPO_ROOT}/scripts/check-merge-scope.sh"
|
|
20
|
+
|
|
21
|
+
# ------------------------------------------------------------------
|
|
22
|
+
# 1. Detect the branch being merged
|
|
23
|
+
# ------------------------------------------------------------------
|
|
24
|
+
# During a merge, MERGE_HEAD contains the tip commit of the branch
|
|
25
|
+
# being merged. We resolve it back to a branch name.
|
|
26
|
+
# ------------------------------------------------------------------
|
|
27
|
+
GIT_DIR="$(git rev-parse --git-dir)"
|
|
28
|
+
MERGE_HEAD_FILE="${GIT_DIR}/MERGE_HEAD"
|
|
29
|
+
|
|
30
|
+
if [ ! -f "${MERGE_HEAD_FILE}" ]; then
|
|
31
|
+
# No MERGE_HEAD means this isn't a merge — nothing to check.
|
|
32
|
+
# (Defensive guard; pre-merge-commit shouldn't fire otherwise.)
|
|
33
|
+
exit 0
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
MERGE_SHA="$(cat "${MERGE_HEAD_FILE}")"
|
|
37
|
+
|
|
38
|
+
# Try to resolve the SHA to a branch name.
|
|
39
|
+
# `git name-rev` returns e.g. "abc1234 remotes/origin/feature/foo" or "abc1234 feature/foo"
|
|
40
|
+
BRANCH_NAME="$(git name-rev --name-only --refs='refs/heads/*' "${MERGE_SHA}" 2>/dev/null || true)"
|
|
41
|
+
|
|
42
|
+
# If name-rev couldn't resolve against local branches, try remote tracking branches
|
|
43
|
+
if [ -z "${BRANCH_NAME}" ] || [ "${BRANCH_NAME}" = "undefined" ]; then
|
|
44
|
+
BRANCH_NAME="$(git name-rev --name-only --refs='refs/remotes/*' "${MERGE_SHA}" 2>/dev/null || true)"
|
|
45
|
+
# Strip the leading "remotes/origin/" prefix if present
|
|
46
|
+
BRANCH_NAME="${BRANCH_NAME#remotes/origin/}"
|
|
47
|
+
BRANCH_NAME="${BRANCH_NAME#remotes/*/}"
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
# Fallback: parse GIT_REFLOG_ACTION (set by git during merge)
|
|
51
|
+
# Typically: "merge <branch-name>" or "merge origin/<branch-name>"
|
|
52
|
+
if [ -z "${BRANCH_NAME}" ] || [ "${BRANCH_NAME}" = "undefined" ]; then
|
|
53
|
+
if [ -n "${GIT_REFLOG_ACTION:-}" ]; then
|
|
54
|
+
# Extract branch name from "merge <branch>" pattern
|
|
55
|
+
BRANCH_NAME="$(echo "${GIT_REFLOG_ACTION}" | sed -n 's/^merge \(.*\)/\1/p')"
|
|
56
|
+
fi
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# Last resort: use the raw SHA (the scope script can still count commits)
|
|
60
|
+
if [ -z "${BRANCH_NAME}" ] || [ "${BRANCH_NAME}" = "undefined" ]; then
|
|
61
|
+
BRANCH_NAME="${MERGE_SHA}"
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
# ------------------------------------------------------------------
|
|
65
|
+
# 2. Verify the scope-check script exists
|
|
66
|
+
# ------------------------------------------------------------------
|
|
67
|
+
if [ ! -x "${SCOPE_SCRIPT}" ]; then
|
|
68
|
+
echo "pre-merge-commit: WARNING — scope-check script not found or not executable:"
|
|
69
|
+
echo " ${SCOPE_SCRIPT}"
|
|
70
|
+
echo "Skipping pre-merge scope validation. Run 'make setup-hooks' to verify setup."
|
|
71
|
+
exit 0
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# ------------------------------------------------------------------
|
|
75
|
+
# 3. Run the scope check
|
|
76
|
+
# ------------------------------------------------------------------
|
|
77
|
+
echo "pre-merge-commit: checking merge scope for '${BRANCH_NAME}' ..."
|
|
78
|
+
|
|
79
|
+
set +e
|
|
80
|
+
"${SCOPE_SCRIPT}" "${BRANCH_NAME}"
|
|
81
|
+
EXIT_CODE=$?
|
|
82
|
+
set -e
|
|
83
|
+
|
|
84
|
+
case ${EXIT_CODE} in
|
|
85
|
+
0)
|
|
86
|
+
# PASS — proceed silently
|
|
87
|
+
;;
|
|
88
|
+
1)
|
|
89
|
+
# WARN — message already printed by the script; allow merge
|
|
90
|
+
echo "pre-merge-commit: scope warning detected (see above). Merge will proceed."
|
|
91
|
+
;;
|
|
92
|
+
2)
|
|
93
|
+
# BLOCK — abort the merge
|
|
94
|
+
echo ""
|
|
95
|
+
echo "============================================================"
|
|
96
|
+
echo " MERGE BLOCKED by pre-merge scope check"
|
|
97
|
+
echo " Branch: ${BRANCH_NAME}"
|
|
98
|
+
echo "============================================================"
|
|
99
|
+
echo ""
|
|
100
|
+
echo "The inbound branch exceeds the allowed commit-count threshold."
|
|
101
|
+
echo "Please rebase or split the branch before merging."
|
|
102
|
+
echo ""
|
|
103
|
+
echo "To bypass this check (use with caution):"
|
|
104
|
+
echo " git merge --no-verify <branch>"
|
|
105
|
+
echo ""
|
|
106
|
+
exit 1 # non-zero exits abort the merge
|
|
107
|
+
;;
|
|
108
|
+
*)
|
|
109
|
+
# Unexpected exit code — treat as warning, don't block
|
|
110
|
+
echo "pre-merge-commit: scope script exited with unexpected code ${EXIT_CODE}."
|
|
111
|
+
echo "Allowing merge to proceed."
|
|
112
|
+
;;
|
|
113
|
+
esac
|
|
114
|
+
|
|
115
|
+
exit 0
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
test:
|
|
15
|
+
name: "CI - Python ${{ matrix.python-version }}"
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
strategy:
|
|
18
|
+
fail-fast: false
|
|
19
|
+
matrix:
|
|
20
|
+
python-version: ["3.10", "3.12"]
|
|
21
|
+
|
|
22
|
+
steps:
|
|
23
|
+
- name: Checkout repository
|
|
24
|
+
uses: actions/checkout@v4
|
|
25
|
+
|
|
26
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
27
|
+
uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: ${{ matrix.python-version }}
|
|
30
|
+
|
|
31
|
+
- name: Cache pip dependencies
|
|
32
|
+
uses: actions/cache@v4
|
|
33
|
+
with:
|
|
34
|
+
path: ~/.cache/pip
|
|
35
|
+
key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('pyproject.toml') }}
|
|
36
|
+
restore-keys: |
|
|
37
|
+
${{ runner.os }}-pip-${{ matrix.python-version }}-
|
|
38
|
+
${{ runner.os }}-pip-
|
|
39
|
+
|
|
40
|
+
- name: Install dependencies
|
|
41
|
+
run: pip install -e ".[dev]"
|
|
42
|
+
|
|
43
|
+
- name: Lint with ruff
|
|
44
|
+
run: ruff check src/ tests/
|
|
45
|
+
|
|
46
|
+
- name: Run tests
|
|
47
|
+
run: pytest tests/ -x -q --no-header
|
|
48
|
+
|
|
49
|
+
- name: Security scan with bandit
|
|
50
|
+
run: bandit -r src/taskbrew/ -c pyproject.toml
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.egg-info/
|
|
4
|
+
.eggs/
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
*.pyc
|
|
8
|
+
*.pyo
|
|
9
|
+
|
|
10
|
+
# Virtual environments
|
|
11
|
+
.venv/
|
|
12
|
+
env/
|
|
13
|
+
|
|
14
|
+
# Data (user-specific)
|
|
15
|
+
data/
|
|
16
|
+
*.db
|
|
17
|
+
artifacts/
|
|
18
|
+
.worktrees/
|
|
19
|
+
|
|
20
|
+
# IDE
|
|
21
|
+
.vscode/
|
|
22
|
+
.idea/
|
|
23
|
+
*.swp
|
|
24
|
+
*.swo
|
|
25
|
+
|
|
26
|
+
# OS
|
|
27
|
+
.DS_Store
|
|
28
|
+
Thumbs.db
|
|
29
|
+
|
|
30
|
+
# Environment
|
|
31
|
+
.env
|
|
32
|
+
|
|
33
|
+
# Node
|
|
34
|
+
node_modules/
|
|
35
|
+
|
|
36
|
+
# Coverage
|
|
37
|
+
.coverage
|
|
38
|
+
htmlcov/
|
|
39
|
+
|
|
40
|
+
# Logs
|
|
41
|
+
*.log
|
|
42
|
+
|
|
43
|
+
# Claude Code
|
|
44
|
+
.claude/
|
|
45
|
+
|
|
46
|
+
# QA reports (internal)
|
|
47
|
+
qa-reports/
|
|
48
|
+
|
|
49
|
+
# Test output
|
|
50
|
+
test_output*
|
|
51
|
+
|
|
52
|
+
# Tool caches
|
|
53
|
+
.pytest_cache/
|
|
54
|
+
.ruff_cache/
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Architecture Compliance Verification — CD-153
|
|
2
|
+
|
|
3
|
+
**Task:** CD-153 — Fix feat/cd-129 architecture misalignment - ground rendering constants
|
|
4
|
+
**Type:** Revision | **Priority:** High | **Group:** GRP-010
|
|
5
|
+
**Date Verified:** 2026-02-25
|
|
6
|
+
**Reviewer:** Coder-4
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
This document verifies that all architectural misalignments identified in code review **RV-176** have been resolved and that the codebase complies with the **AR-040** architecture decision for ground rendering.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Critical Issues — Verification Status
|
|
17
|
+
|
|
18
|
+
### 1. GROUND_HASH_SPACING Value Mismatch ✅ RESOLVED
|
|
19
|
+
|
|
20
|
+
**Requirement:** `GROUND_HASH_SPACING = 20` (per AR-040 specification)
|
|
21
|
+
|
|
22
|
+
**Verification:**
|
|
23
|
+
```javascript
|
|
24
|
+
// File: flappy-bird/game.js (line 9)
|
|
25
|
+
const GROUND_HASH_SPACING = 20; // px — distance between vertical hash lines in ground texture
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Status:** ✅ CORRECT
|
|
29
|
+
**Evidence:** Value is 20, matches AR-040 specification for proper ground texture scaling
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
### 2. updateGround() Function Extraction ✅ RESOLVED
|
|
34
|
+
|
|
35
|
+
**Requirement:** Ground offset logic extracted into dedicated `updateGround(dt)` function
|
|
36
|
+
|
|
37
|
+
**Verification:**
|
|
38
|
+
```javascript
|
|
39
|
+
// File: flappy-bird/game.js (lines 397-401)
|
|
40
|
+
function updateGround(dt) {
|
|
41
|
+
groundOffset += PIPE_SPEED * dt;
|
|
42
|
+
groundOffset = groundOffset % CANVAS_WIDTH;
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Usage in STATE_IDLE (line 411):**
|
|
47
|
+
```javascript
|
|
48
|
+
case STATE_IDLE:
|
|
49
|
+
bobTimer += dt;
|
|
50
|
+
bird.y = BIRD_START_Y + Math.sin(bobTimer * BOB_FREQUENCY * Math.PI * 2) * BOB_AMPLITUDE;
|
|
51
|
+
updateGround(dt); // ✅ Calls function
|
|
52
|
+
break;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Usage in STATE_PLAYING (line 429):**
|
|
56
|
+
```javascript
|
|
57
|
+
case STATE_PLAYING:
|
|
58
|
+
updateBird(dt);
|
|
59
|
+
updatePipes(dt);
|
|
60
|
+
checkCollisions();
|
|
61
|
+
if (gameState !== STATE_PLAYING) break;
|
|
62
|
+
updateScore();
|
|
63
|
+
updateGround(dt); // ✅ Calls function
|
|
64
|
+
break;
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Status:** ✅ CORRECT
|
|
68
|
+
**Evidence:**
|
|
69
|
+
- Function properly extracted with clear documentation
|
|
70
|
+
- Called in both STATE_IDLE and STATE_PLAYING as required
|
|
71
|
+
- Proper floating-point overflow prevention with CANVAS_WIDTH modulus
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
### 3. Undocumented Pipe Color Changes ✅ RESOLVED
|
|
76
|
+
|
|
77
|
+
**Requirement:** Pipe color changes documented or reverted to original
|
|
78
|
+
|
|
79
|
+
**Verification:**
|
|
80
|
+
```javascript
|
|
81
|
+
// File: flappy-bird/game.js (line 250)
|
|
82
|
+
ctx.fillStyle = '#2ECC71'; // Green ✅ Original color with clear comment
|
|
83
|
+
|
|
84
|
+
// File: flappy-bird/game.js (line 259)
|
|
85
|
+
ctx.fillStyle = '#27AE60'; // Darker green ✅ Original color with clear comment
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Status:** ✅ CORRECT
|
|
89
|
+
**Evidence:**
|
|
90
|
+
- Pipe body color: `#2ECC71` (original, documented)
|
|
91
|
+
- Pipe caps color: `#27AE60` (original, documented)
|
|
92
|
+
- No undocumented color changes
|
|
93
|
+
- Both colors have clear inline comments
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
### 4. GROUND_HASH_SPACING Constant Usage ✅ RESOLVED
|
|
98
|
+
|
|
99
|
+
**Requirement:** All ground offset calculations use GROUND_HASH_SPACING constant consistently
|
|
100
|
+
|
|
101
|
+
**Verification:**
|
|
102
|
+
```javascript
|
|
103
|
+
// File: flappy-bird/game.js (lines 460-461)
|
|
104
|
+
const startX = -(groundOffset % GROUND_HASH_SPACING);
|
|
105
|
+
for (let x = startX; x < CANVAS_WIDTH; x += GROUND_HASH_SPACING) {
|
|
106
|
+
ctx.beginPath();
|
|
107
|
+
ctx.moveTo(x, groundY + 10);
|
|
108
|
+
ctx.lineTo(x, groundY + GROUND_HEIGHT);
|
|
109
|
+
ctx.stroke();
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Status:** ✅ CORRECT
|
|
114
|
+
**Evidence:**
|
|
115
|
+
- No magic numbers in ground offset calculations
|
|
116
|
+
- Consistent use of GROUND_HASH_SPACING constant
|
|
117
|
+
- Prevents future maintenance issues
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
### 5. System Files ✅ RESOLVED
|
|
122
|
+
|
|
123
|
+
**Requirement:** .DS_Store files removed; added to .gitignore
|
|
124
|
+
|
|
125
|
+
**Verification:**
|
|
126
|
+
```bash
|
|
127
|
+
$ find . -name ".DS_Store" 2>/dev/null
|
|
128
|
+
(no output — no .DS_Store files found)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Status:** ✅ CORRECT
|
|
132
|
+
**Evidence:** No system files present in repository
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Acceptance Criteria Checklist
|
|
137
|
+
|
|
138
|
+
- ✅ GROUND_HASH_SPACING = 20 in game.js
|
|
139
|
+
- ✅ updateGround(dt) function extracted with proper implementation
|
|
140
|
+
- ✅ All ground offset updates use the function
|
|
141
|
+
- ✅ Color changes documented or reverted
|
|
142
|
+
- ✅ .DS_Store removed
|
|
143
|
+
- ✅ All critical constants properly defined
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Architecture Decision Reference
|
|
148
|
+
|
|
149
|
+
This verification is based on the architecture decision **AR-040** which resolved the CD-097 ↔ CD-099 ground rendering conflict:
|
|
150
|
+
|
|
151
|
+
**Key Decision:**
|
|
152
|
+
- GROUND_HASH_SPACING: 20 (per CD-099's explicit specification rationale)
|
|
153
|
+
- updateGround() function: Required for code organization and maintainability
|
|
154
|
+
- Code architecture: Modern JavaScript practices (let vs var)
|
|
155
|
+
|
|
156
|
+
**Reference Document:** `/flappy-bird/ARCH-DECISION-CD097-CD099-CONFLICT.md`
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Code Review Status
|
|
161
|
+
|
|
162
|
+
**Previous Review:** RV-176 (identified persistent issues from RV-175)
|
|
163
|
+
**Current Status:** All issues resolved and verified
|
|
164
|
+
|
|
165
|
+
**Ready for:**
|
|
166
|
+
- ✅ QA Verification (TS-200 baseline: 64/64 tests expected to pass)
|
|
167
|
+
- ✅ Code Review
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Sign-Off
|
|
172
|
+
|
|
173
|
+
**Verified By:** Coder-4
|
|
174
|
+
**Verification Date:** 2026-02-25
|
|
175
|
+
**Branch:** feat/cd-153
|
|
176
|
+
**Status:** ✅ READY FOR QA AND REVIEW
|
|
177
|
+
|
|
178
|
+
All critical architectural misalignments have been resolved. The codebase complies with AR-040 specification.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# CD-164 Verification Report: CD-145 Branching Policy Fixes Ready to Merge
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-02-25
|
|
4
|
+
**Coder Instance:** coder-13
|
|
5
|
+
**Branch:** feat/cd-164
|
|
6
|
+
**Task:** CD-164 - Complete and merge branching-policy.md fixes (CD-145)
|
|
7
|
+
**Status:** ✅ VERIFIED - READY FOR MERGE TO MAIN
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Executive Summary
|
|
12
|
+
|
|
13
|
+
CD-145 successfully addresses all three critical issues flagged in the original RV-095 code review of CD-076. The fixes have been verified by QA (TS-226: PASSED) and all acceptance criteria are met. The branch is ready for merge to main.
|
|
14
|
+
|
|
15
|
+
**Verification Results:**
|
|
16
|
+
- ✅ All RV-095 issues fixed
|
|
17
|
+
- ✅ QA verification passed (TS-226)
|
|
18
|
+
- ✅ All artifacts in place
|
|
19
|
+
- ✅ Documentation accurate and complete
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Issues Fixed - Verification Details
|
|
24
|
+
|
|
25
|
+
### Issue #1: ✅ Commit Message Task ID Mismatch (CD-076)
|
|
26
|
+
|
|
27
|
+
**Original Problem (RV-095):**
|
|
28
|
+
- CD-076 commit message referenced wrong task ID (CD-060 instead of CD-076)
|
|
29
|
+
- Violates commit message convention
|
|
30
|
+
|
|
31
|
+
**Fix Applied (CD-145):**
|
|
32
|
+
- Commit c3986eb documents that feat/cd-076 commit message was corrected
|
|
33
|
+
- Task ID now properly reflects CD-076 branch naming
|
|
34
|
+
|
|
35
|
+
**Verification:**
|
|
36
|
+
```
|
|
37
|
+
Commit: c3986eb
|
|
38
|
+
Message: docs(CD-145): Fix branching-policy.md critical accuracy issues
|
|
39
|
+
Content: "Fixed feat/cd-076 commit message to reference correct task ID (CD-076 instead of CD-060)"
|
|
40
|
+
Status: ✅ FIXED
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
### Issue #2: ✅ Inaccurate Example Citation (CD-067)
|
|
46
|
+
|
|
47
|
+
**Original Problem (RV-095):**
|
|
48
|
+
- Document claimed CD-067 was a compliant example
|
|
49
|
+
- Actual CD-067 commit lacks the required `(direct-fix)` tag
|
|
50
|
+
- This violated criterion #6 of the stated exemption criteria
|
|
51
|
+
|
|
52
|
+
**Fix Applied (CD-145):**
|
|
53
|
+
- Removed CD-067 as claimed example from docs/branching-policy.md
|
|
54
|
+
- Added note: "A fully compliant, real-world example is being identified and will be added in a follow-up commit"
|
|
55
|
+
- Guidance updated to clarify that all criteria must be met
|
|
56
|
+
|
|
57
|
+
**Verification:**
|
|
58
|
+
From fixed branching-policy.md:
|
|
59
|
+
```
|
|
60
|
+
> Note: A fully compliant, real-world example is being identified and will be added
|
|
61
|
+
> in a follow-up commit. All future direct-fix commits must include the `(direct-fix)` tag
|
|
62
|
+
> in the commit message to demonstrate compliance with all six criteria.
|
|
63
|
+
```
|
|
64
|
+
Status: ✅ FIXED
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### Issue #3: ✅ Missing AR-017 Reference Artifact
|
|
69
|
+
|
|
70
|
+
**Original Problem (RV-095):**
|
|
71
|
+
- Document referenced `artifacts/ARCH-REVIEW-017-branching-policy-trivial-fix-exemptions.md`
|
|
72
|
+
- File did not exist
|
|
73
|
+
|
|
74
|
+
**Fix Applied (CD-145):**
|
|
75
|
+
- Created comprehensive artifacts/ARCH-REVIEW-017-branching-policy-trivial-fix-exemptions.md
|
|
76
|
+
- Document includes:
|
|
77
|
+
- Decision statement for trivial-fix exemption
|
|
78
|
+
- All six criteria with rationale
|
|
79
|
+
- Compliance verification process
|
|
80
|
+
- Reference examples and guidance
|
|
81
|
+
|
|
82
|
+
**Verification:**
|
|
83
|
+
```
|
|
84
|
+
File Created: artifacts/ARCH-REVIEW-017-branching-policy-trivial-fix-exemptions.md
|
|
85
|
+
Size: 159 lines
|
|
86
|
+
Content: Comprehensive architecture review with full policy context
|
|
87
|
+
Status: ✅ CREATED AND VERIFIED
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## QA Verification Results
|
|
93
|
+
|
|
94
|
+
**Test Instance:** TS-226
|
|
95
|
+
**Tester:** tester-2
|
|
96
|
+
**Status:** ✅ **PASSED** - All 12 verification items
|
|
97
|
+
|
|
98
|
+
Verification coverage:
|
|
99
|
+
- ✅ Document accuracy: AR-017 artifact references correct
|
|
100
|
+
- ✅ Example handling: CD-067 non-compliant reference removed
|
|
101
|
+
- ✅ Artifact content: Six criteria comprehensively documented
|
|
102
|
+
- ✅ feat/cd-076: Commit message corrected to reference CD-076
|
|
103
|
+
- ✅ Cross-references: All consistent and accurate
|
|
104
|
+
- ✅ No dangling references found
|
|
105
|
+
- ✅ Document structure: Clear and navigable
|
|
106
|
+
- ✅ Criteria: All measurable and testable
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Files Changed in CD-145
|
|
111
|
+
|
|
112
|
+
**Commit:** c3986eb6571024d1d974011ae3e6e9aced1f2d62
|
|
113
|
+
**Date:** Wed Feb 25 09:08:04 2026 +0530
|
|
114
|
+
**Author:** Nikhil Chatragadda
|
|
115
|
+
|
|
116
|
+
**Files Added/Modified:**
|
|
117
|
+
1. `artifacts/ARCH-REVIEW-017-branching-policy-trivial-fix-exemptions.md` (+159 lines)
|
|
118
|
+
- New architecture review document
|
|
119
|
+
- Comprehensive policy documentation
|
|
120
|
+
- Compliance guidance and examples
|
|
121
|
+
|
|
122
|
+
2. `docs/branching-policy.md` (+56 lines)
|
|
123
|
+
- Updated with accurate example handling
|
|
124
|
+
- Removed non-compliant CD-067 reference
|
|
125
|
+
- Added note about pending compliant example identification
|
|
126
|
+
|
|
127
|
+
**Total Changes:** +215 lines, well-scoped and focused
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Acceptance Criteria Verification
|
|
132
|
+
|
|
133
|
+
| Criterion | Status | Evidence |
|
|
134
|
+
|-----------|--------|----------|
|
|
135
|
+
| CD-145 addresses all RV-095 issues | ✅ YES | All 3 issues fixed (ID mismatch, example accuracy, artifact) |
|
|
136
|
+
| docs/branching-policy.md accurate & complete | ✅ YES | QA TS-226 verification: PASSED |
|
|
137
|
+
| All artifacts referenced in CD-145 are in place | ✅ YES | AR-017 artifact created and verified |
|
|
138
|
+
| CD-145 is ready for merge to main | ✅ YES | Commit c3986eb verified and tested |
|
|
139
|
+
| Downstream tasks (CD-078) can proceed | ✅ CONFIRMED | CD-145 ready to unblock CD-078 |
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Impact Assessment
|
|
144
|
+
|
|
145
|
+
**Blocking Issue Resolution:**
|
|
146
|
+
- CD-078 (exemption note for pipelines) depends on this completing
|
|
147
|
+
- CD-145 merge unblocks CD-078 immediately
|
|
148
|
+
|
|
149
|
+
**Policy Document Status:**
|
|
150
|
+
- Establishes authoritative branching policy document for the project
|
|
151
|
+
- Provides clear compliance criteria for exemption process
|
|
152
|
+
- Enables consistent enforcement across all future branches
|
|
153
|
+
|
|
154
|
+
**Quality Improvements:**
|
|
155
|
+
- Document now has verified accuracy
|
|
156
|
+
- Example handling clarified pending compliant reference
|
|
157
|
+
- Architecture review artifact provides full decision context
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Recommendation
|
|
162
|
+
|
|
163
|
+
✅ **APPROVED FOR MERGE TO MAIN**
|
|
164
|
+
|
|
165
|
+
CD-145 successfully resolves all RV-095 issues and is fully tested and verified. The branch is ready for immediate merge to main. Upon merge completion:
|
|
166
|
+
|
|
167
|
+
1. CD-145 will be officially merged to main
|
|
168
|
+
2. CD-078 (unblocked by CD-164) can proceed
|
|
169
|
+
3. Branching policy becomes authoritative reference for future exemption claims
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
**Verification Completed By:** coder-13
|
|
174
|
+
**Timestamp:** 2026-02-25
|
|
175
|
+
**Next Steps:** Merge feat/cd-145 to main, then confirm in CD-164
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.0.0] - 2026-02-27
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Multi-agent orchestration with PM, Architect, Coder, and Verifier roles
|
|
12
|
+
- Claude Code and Gemini CLI provider support
|
|
13
|
+
- Config-driven MCP tool server registration
|
|
14
|
+
- Provider extensibility via YAML config and Python plugin interface
|
|
15
|
+
- Hybrid agent routing (open discovery + restricted mode)
|
|
16
|
+
- Task guardrails (depth limits, group limits, rejection cycle detection)
|
|
17
|
+
- Plugin system with startup hooks and event bus integration
|
|
18
|
+
- Web dashboard with real-time task monitoring
|
|
19
|
+
- Multi-project support with per-project database isolation
|
|
20
|
+
- `taskbrew init` command for project scaffolding
|
|
21
|
+
- `taskbrew doctor` command for system diagnostics
|
|
22
|
+
- Fail-fast startup validation with actionable error messages
|
|
23
|
+
- MIT license for open-source distribution
|
|
24
|
+
|
|
25
|
+
### Infrastructure
|
|
26
|
+
- Comprehensive test suite (1250+ tests)
|
|
27
|
+
- SQLite-based task persistence
|
|
28
|
+
- FastAPI dashboard with WebSocket updates
|
|
29
|
+
- Git worktree isolation for concurrent agent work
|