clawforge-cli 1.6.0__tar.gz → 1.6.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.
Files changed (148) hide show
  1. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/CHANGELOG.md +15 -0
  2. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/Formula/clawforge.rb +3 -1
  3. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/PKG-INFO +1 -1
  4. clawforge_cli-1.6.2/VERSION +1 -0
  5. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/quick-run.sh +12 -5
  6. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/package.json +1 -1
  7. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/pyproject.toml +1 -1
  8. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-dx.sh +3 -3
  9. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-observability.sh +1 -1
  10. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-power.sh +1 -1
  11. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-practical.sh +1 -1
  12. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-quick-run.sh +1 -1
  13. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-reliability.sh +1 -1
  14. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-web.sh +1 -1
  15. clawforge_cli-1.6.2/tui/animation.go +192 -0
  16. clawforge_cli-1.6.0/VERSION +0 -1
  17. clawforge_cli-1.6.0/tui/animation.go +0 -192
  18. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.github/workflows/ci.yml +0 -0
  19. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.github/workflows/publish-npm.yml +0 -0
  20. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.github/workflows/publish-pypi.yml +0 -0
  21. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.github/workflows/update-homebrew.yml +0 -0
  22. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.github/workflows/version-sync.yml +0 -0
  23. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.gitignore +0 -0
  24. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/LICENSE +0 -0
  25. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/PRD-v05.md +0 -0
  26. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/PRD-v06.md +0 -0
  27. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/PRD-v07.md +0 -0
  28. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/README.md +0 -0
  29. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/SKILL.md +0 -0
  30. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/attach.sh +0 -0
  31. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/check-agents.sh +0 -0
  32. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/clawforge +0 -0
  33. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/clawforge-web +0 -0
  34. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/clean.sh +0 -0
  35. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/completions.sh +0 -0
  36. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/config.sh +0 -0
  37. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/conflicts.sh +0 -0
  38. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/cost.sh +0 -0
  39. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/dashboard.sh +0 -0
  40. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/deps.sh +0 -0
  41. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/diff.sh +0 -0
  42. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/doctor.sh +0 -0
  43. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/eval.sh +0 -0
  44. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/export.sh +0 -0
  45. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/history.sh +0 -0
  46. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/init.sh +0 -0
  47. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/learn.sh +0 -0
  48. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/logs.sh +0 -0
  49. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/memory.sh +0 -0
  50. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/merge-helper.sh +0 -0
  51. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/multi-review.sh +0 -0
  52. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/notify.sh +0 -0
  53. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/on-complete.sh +0 -0
  54. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/parse-cost.sh +0 -0
  55. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/pr.sh +0 -0
  56. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/profile.sh +0 -0
  57. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/replay.sh +0 -0
  58. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/resume.sh +0 -0
  59. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/review-mode.sh +0 -0
  60. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/review-pr.sh +0 -0
  61. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/routing.sh +0 -0
  62. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/scope-task.sh +0 -0
  63. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/spawn-agent.sh +0 -0
  64. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/sprint.sh +0 -0
  65. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/steer.sh +0 -0
  66. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/stop.sh +0 -0
  67. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/summary.sh +0 -0
  68. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/swarm.sh +0 -0
  69. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/templates.sh +0 -0
  70. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/web.sh +0 -0
  71. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/clawforge/__init__.py +0 -0
  72. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/clawforge/cli.py +0 -0
  73. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/completions/_clawforge +0 -0
  74. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/completions/clawforge.bash +0 -0
  75. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/completions/clawforge.fish +0 -0
  76. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/config/defaults.json +0 -0
  77. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/config/prompt-templates/default.md +0 -0
  78. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/config/routing-defaults.json +0 -0
  79. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/IMPLEMENTATION-v04.md +0 -0
  80. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/PRD-v04.md +0 -0
  81. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/PUBLISHING-CHECKLIST.md +0 -0
  82. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/README.md +0 -0
  83. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/RELEASE.md +0 -0
  84. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/architecture.md +0 -0
  85. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/command-reference.md +0 -0
  86. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/configuration.md +0 -0
  87. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/dashboard.md +0 -0
  88. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/evaluation.md +0 -0
  89. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/faq.md +0 -0
  90. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/fleet-ops.md +0 -0
  91. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/getting-started.md +0 -0
  92. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/scenarios.md +0 -0
  93. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/troubleshooting.md +0 -0
  94. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/workflow-modes.md +0 -0
  95. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/evals/run-log.example.jsonl +0 -0
  96. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/evals/run-log.schema.json +0 -0
  97. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/evals/scorecard.md +0 -0
  98. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/install.sh +0 -0
  99. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/common.sh +0 -0
  100. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/templates/bugfix.json +0 -0
  101. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/templates/migration.json +0 -0
  102. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/templates/refactor.json +0 -0
  103. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/templates/security-audit.json +0 -0
  104. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/templates/test-coverage.json +0 -0
  105. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/registry/conflicts.jsonl +0 -0
  106. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/registry/costs.jsonl +0 -0
  107. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/run-all-tests.sh +0 -0
  108. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-ci-loop.sh +0 -0
  109. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-clean.sh +0 -0
  110. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-cli.sh +0 -0
  111. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-conflicts.sh +0 -0
  112. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-cost.sh +0 -0
  113. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-dashboard.sh +0 -0
  114. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-deps.sh +0 -0
  115. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-eval.sh +0 -0
  116. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-foundation.sh +0 -0
  117. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-history.sh +0 -0
  118. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-init.sh +0 -0
  119. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-learn.sh +0 -0
  120. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-management.sh +0 -0
  121. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-memory.sh +0 -0
  122. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-merge.sh +0 -0
  123. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-modes.sh +0 -0
  124. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-multi-repo.sh +0 -0
  125. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-notify.sh +0 -0
  126. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-openclaw.sh +0 -0
  127. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-registry.sh +0 -0
  128. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-review.sh +0 -0
  129. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-routing.sh +0 -0
  130. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-scope.sh +0 -0
  131. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-spawn.sh +0 -0
  132. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-templates.sh +0 -0
  133. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-tui.sh +0 -0
  134. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-watch.sh +0 -0
  135. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/PRD.md +0 -0
  136. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/agent.go +0 -0
  137. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/dashboard.go +0 -0
  138. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/filter.go +0 -0
  139. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/go.mod +0 -0
  140. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/go.sum +0 -0
  141. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/keybindings.go +0 -0
  142. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/main.go +0 -0
  143. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/model.go +0 -0
  144. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/steer.go +0 -0
  145. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/styles.go +0 -0
  146. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/web/go.mod +0 -0
  147. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/web/index.html +0 -0
  148. {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/web/main.go +0 -0
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.6.2 — Emoji Forge Animation
4
+
5
+ ### Changed
6
+ - TUI startup animation replaced with 10-frame emoji sequence
7
+ - Cold forge (⬛) → embers (🟠) → fire (🔥) → hammer up (🔨) → STRIKE (💥⚡✨)
8
+ - Sparks flying → quench (💧🌊) → agents emerge (🤖) → fleet online (✅)
9
+ - Frame timing tuned to 140ms for smooth progression (~1.4s total)
10
+
11
+ ## v1.6.1 — quick-run CI Fix
12
+
13
+ ### Fixed
14
+ - `quick-run` dry-run now works even when no agent (claude/codex) is installed
15
+ - Agent placeholder used for dry-run/help; real runs still validate agent is present
16
+ - Fixes test-quick-run failures on CI environments without Claude/Codex
17
+
3
18
  ## v1.6.0 — quick-run: Zero-Overhead Direct Execution
4
19
 
5
20
  ### Added
@@ -1,7 +1,9 @@
1
1
  class Clawforge < Formula
2
2
  desc "Multi-mode coding workflow CLI for orchestrating AI coding agents"
3
3
  homepage "https://github.com/cyperx84/clawforge"
4
- url "https://github.com/cyperx84/clawforge/archive/refs/tags/v1.5.5.tar.gz"
4
+ url "https://github.com/cyperx84/clawforge/archive/refs/tags/v1.6.1.tar.gz"
5
+ sha256 "555c7b03fe52ff1d748ae942d259eea8b362b562d5b2b35cbfa1e40e3bc34597"
6
+ sha256 "240927908d5b2738b2e22156eeb360d09c5b20c3bde04b46a2b11d9de7466eba"
5
7
  sha256 "b2d483778e83b9007b22bb4c421c90b71e7343cc4f244d116b99eaa2810dc433"
6
8
  sha256 "549b3ebf95c953cd4f366b5a251786c994726761c9d4ed6255b996b6458cf695"
7
9
  sha256 "2730fca0066fda9d3c864802c4346ab7c39d0daee39a254cc5cebd2694d4a1db"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clawforge-cli
3
- Version: 1.6.0
3
+ Version: 1.6.2
4
4
  Summary: Multi-mode coding workflow CLI for orchestrating AI coding agents
5
5
  Project-URL: Homepage, https://github.com/cyperx84/clawforge
6
6
  Project-URL: Repository, https://github.com/cyperx84/clawforge
@@ -0,0 +1 @@
1
+ 1.6.2
@@ -76,15 +76,17 @@ else
76
76
  fi
77
77
 
78
78
  # ── Resolve agent ──────────────────────────────────────────────────────
79
- RESOLVED_AGENT=$(detect_agent "${AGENT:-}")
80
- [[ -z "$RESOLVED_AGENT" ]] && { log_error "No agent (claude/codex) found in PATH"; exit 1; }
79
+ RESOLVED_AGENT=$(detect_agent "${AGENT:-}" 2>/dev/null || echo "")
80
+ if [[ -z "$RESOLVED_AGENT" ]]; then
81
+ RESOLVED_AGENT="${AGENT:-claude}" # Use placeholder for dry-run/help; real run validates below
82
+ fi
81
83
 
82
84
  # ── Resolve model ──────────────────────────────────────────────────────
83
85
  if [[ -z "$MODEL" ]]; then
84
- if [[ "$RESOLVED_AGENT" == "claude" ]]; then
85
- MODEL=$(config_get default_model_claude "claude-sonnet-4-5")
86
- else
86
+ if [[ "$RESOLVED_AGENT" == "codex" ]]; then
87
87
  MODEL=$(config_get default_model_codex "gpt-5.3-codex")
88
+ else
89
+ MODEL=$(config_get default_model_claude "claude-sonnet-4-5")
88
90
  fi
89
91
  fi
90
92
 
@@ -109,6 +111,11 @@ if $DRY_RUN; then
109
111
  exit 0
110
112
  fi
111
113
 
114
+ # ── Validate agent is actually installed for real runs ────────────────
115
+ REAL_AGENT=$(detect_agent "${AGENT:-}" 2>/dev/null || echo "")
116
+ [[ -z "$REAL_AGENT" ]] && { log_error "No agent (claude/codex) found in PATH. Install Claude Code or Codex."; exit 1; }
117
+ RESOLVED_AGENT="$REAL_AGENT"
118
+
112
119
  # ── Register task ──────────────────────────────────────────────────────
113
120
  SHORT_ID=""
114
121
  if ! $NO_TRACK; then
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyperx/clawforge",
3
- "version": "1.6.0",
3
+ "version": "1.6.2",
4
4
  "description": "Multi-mode coding workflow CLI for orchestrating AI coding agents",
5
5
  "bin": {
6
6
  "@cyperx/clawforge": "./bin/clawforge"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "clawforge-cli"
3
- version = "1.6.0"
3
+ version = "1.6.2"
4
4
  description = "Multi-mode coding workflow CLI for orchestrating AI coding agents"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -134,10 +134,10 @@ assert_contains "help shows Developer Experience" "Developer Experience" "$cli_h
134
134
  # Test 11: version
135
135
  echo "Test 11: version"
136
136
  version=$(cat "${SCRIPT_DIR}/../VERSION")
137
- if [[ "$version" == "1.6.0" ]]; then
138
- echo " ✅ version is 1.6.0"; PASS=$((PASS+1))
137
+ if [[ "$version" == "1.6.2" ]]; then
138
+ echo " ✅ version is 1.6.2"; PASS=$((PASS+1))
139
139
  else
140
- echo " ❌ version is $version, expected 1.6.0"; FAIL=$((FAIL+1))
140
+ echo " ❌ version is $version, expected 1.6.2"; FAIL=$((FAIL+1))
141
141
  fi
142
142
 
143
143
  echo ""
@@ -77,7 +77,7 @@ assert_contains "dashboard help shows p key" "preview" "$tui_help"
77
77
  # Test 7: version
78
78
  echo "Test 7: version"
79
79
  version=$(cat "${SCRIPT_DIR}/../VERSION")
80
- assert_eq "version is 1.6.0" "1.6.0" "$version"
80
+ assert_eq "version is 1.6.2" "1.6.2" "$version"
81
81
 
82
82
  echo ""
83
83
  echo "Results: $PASS passed, $FAIL failed"
@@ -121,7 +121,7 @@ assert_contains "help shows Power Features" "Power Features" "$cli_help"
121
121
  # Test 13: version
122
122
  echo "Test 13: version"
123
123
  version=$(cat "${SCRIPT_DIR}/../VERSION")
124
- assert_eq "version is 1.6.0" "1.6.0" "$version"
124
+ assert_eq "version is 1.6.2" "1.6.2" "$version"
125
125
 
126
126
  echo ""
127
127
  echo "Results: $PASS passed, $FAIL failed"
@@ -96,7 +96,7 @@ assert_contains "watch checks terminal states" "done|failed|timeout|cancelled" "
96
96
  # Test 9: version
97
97
  echo "Test 9: version"
98
98
  version=$(cat "${SCRIPT_DIR}/../VERSION")
99
- assert_eq "version is 1.6.0" "1.6.0" "$version"
99
+ assert_eq "version is 1.6.2" "1.6.2" "$version"
100
100
 
101
101
  echo ""
102
102
  echo "Results: $PASS passed, $FAIL failed"
@@ -68,7 +68,7 @@ assert_fail "nonexistent dir fails" "$QR" "task" --dir /nonexistent/path
68
68
  echo "Test 5: dry-run"
69
69
  TMPDIR_TEST=$(mktemp -d)
70
70
  assert_contains "dry-run shows task" "task" "$QR" "Explain the code" --dir "$TMPDIR_TEST" --dry-run
71
- assert_contains "dry-run shows agent" "agent\|claude\|codex" "$QR" "Explain the code" --dir "$TMPDIR_TEST" --dry-run
71
+ assert_contains "dry-run shows agent" "agent:" "$QR" "Explain the code" --dir "$TMPDIR_TEST" --dry-run
72
72
  assert_contains "dry-run shows dir" "$TMPDIR_TEST" "$QR" "Explain the code" --dir "$TMPDIR_TEST" --dry-run
73
73
  assert_contains "dry-run shows model" "model" "$QR" "Explain the code" --dir "$TMPDIR_TEST" --dry-run
74
74
  assert_contains "dry-run no-track shows no" "no" "$QR" "Explain the code" --dir "$TMPDIR_TEST" --dry-run --no-track
@@ -96,7 +96,7 @@ assert_contains "help shows Reliability" "Reliability" "$cli_help"
96
96
  # Test 11: version bump
97
97
  echo "Test 11: version"
98
98
  version=$(cat "${SCRIPT_DIR}/../VERSION")
99
- assert_eq "version is 1.6.0" "1.6.0" "$version"
99
+ assert_eq "version is 1.6.2" "1.6.2" "$version"
100
100
 
101
101
  # Test 12: doctor --fix runs without errors
102
102
  echo "Test 12: doctor --fix"
@@ -107,7 +107,7 @@ assert_contains "help shows Web Dashboard" "Web Dashboard" "$cli_help"
107
107
  # Test 7: version
108
108
  echo "Test 7: version"
109
109
  version=$(cat "${SCRIPT_DIR}/../VERSION")
110
- assert_eq "version is 1.6.0" "1.6.0" "$version"
110
+ assert_eq "version is 1.6.2" "1.6.2" "$version"
111
111
 
112
112
  echo ""
113
113
  echo "Results: $PASS passed, $FAIL failed"
@@ -0,0 +1,192 @@
1
+ package main
2
+
3
+ import (
4
+ "time"
5
+
6
+ tea "charm.land/bubbletea/v2"
7
+ "charm.land/lipgloss/v2"
8
+ )
9
+
10
+ // AnimationTickMsg advances the forge startup animation by one frame.
11
+ type AnimationTickMsg time.Time
12
+
13
+ // AnimationDoneMsg signals that the startup animation has completed.
14
+ type AnimationDoneMsg struct{}
15
+
16
+ const frameDuration = 140 * time.Millisecond
17
+
18
+ // forgeFrames contains the emoji animation frames for the forge startup sequence.
19
+ // 10 frames @ 140ms = ~1.4s total.
20
+ // Each frame is centered by lipgloss — emoji are kept spaced to avoid double-width
21
+ // alignment drift across different terminal emulators.
22
+ var forgeFrames = [...]string{
23
+
24
+ // Frame 0 — Cold forge: nothing active yet
25
+ `
26
+ ⚒️ C L A W F O R G E ⚒️
27
+
28
+
29
+ ⬛ ⬛ ⬛ ⬛ ⬛
30
+
31
+ ⬛ ⬛
32
+
33
+ ⬛ ⬛ ⬛ ⬛ ⬛
34
+
35
+
36
+ · · · initializing · · ·
37
+ `,
38
+
39
+ // Frame 1 — First ember: a single spark at the base
40
+ `
41
+ ⚒️ C L A W F O R G E ⚒️
42
+
43
+
44
+ ⬛ ⬛ ⬛ ⬛ ⬛
45
+
46
+ ⬛ 🟠 ⬛
47
+
48
+ ⬛ ⬛ ⬛ ⬛ ⬛
49
+
50
+
51
+ · · · heating forge · · ·
52
+ `,
53
+
54
+ // Frame 2 — Embers glow: fire building
55
+ `
56
+ ⚒️ C L A W F O R G E ⚒️
57
+
58
+
59
+ ⬛ ⬛ ⬛ ⬛ ⬛
60
+
61
+ ⬛ 🔥 🟠 🔥 ⬛
62
+
63
+ ⬛ ⬛ ⬛ ⬛ ⬛
64
+
65
+
66
+ · · · fire rising · · ·
67
+ `,
68
+
69
+ // Frame 3 — Full fire: forge is hot
70
+ `
71
+ ⚒️ C L A W F O R G E ⚒️
72
+
73
+
74
+ 🟥 🟥 🟥 🟥 🟥
75
+
76
+ 🟥 🔥 🔥 🔥 🟥
77
+
78
+ 🟥 🟥 🟥 🟥 🟥
79
+
80
+
81
+ · · · forge is hot · · ·
82
+ `,
83
+
84
+ // Frame 4 — Hammer raised: agent ready to strike
85
+ `
86
+ ⚒️ C L A W F O R G E ⚒️
87
+
88
+ 🔨
89
+
90
+ 🟥 🟥 🟥 🟥 🟥
91
+
92
+ 🟥 🔥 🔥 🔥 🟥
93
+
94
+ 🟥 🟥 🟥 🟥 🟥
95
+
96
+
97
+ · · · agents loading · · ·
98
+ `,
99
+
100
+ // Frame 5 — STRIKE: hammer hits the forge
101
+ `
102
+ ⚒️ C L A W F O R G E ⚒️
103
+
104
+
105
+ ⚡ ⚡ 💥 ⚡ ⚡
106
+
107
+ ⚡ 🔥 🔨 🔥 ⚡
108
+
109
+ ⚡ ⚡ ✨ ⚡ ⚡
110
+
111
+
112
+ · · · FORGING AGENTS · · ·
113
+ `,
114
+
115
+ // Frame 6 — Sparks fly: maximum energy
116
+ `
117
+ ⚒️ C L A W F O R G E ⚒️
118
+
119
+ ✨ ⚡ 💥 ⚡ ✨
120
+
121
+ ⚡ 🔥 🔥 🔥 ⚡
122
+
123
+ ✨ ⚡ ✨ ⚡ ✨
124
+
125
+
126
+ · · · SPARKS FLYING · · ·
127
+ `,
128
+
129
+ // Frame 7 — Cooling: quench in blue
130
+ `
131
+ ⚒️ C L A W F O R G E ⚒️
132
+
133
+
134
+ 💧 💧 💧 💧 💧
135
+
136
+ 💧 🌊 🔵 🌊 💧
137
+
138
+ 💧 💧 💧 💧 💧
139
+
140
+
141
+ · · · quenching · · ·
142
+ `,
143
+
144
+ // Frame 8 — Agents emerge: bots ready
145
+ `
146
+ ⚒️ C L A W F O R G E ⚒️
147
+
148
+
149
+ 🤖 🤖 🤖
150
+
151
+
152
+ ready to deploy
153
+
154
+
155
+ · · · spawning fleet · · ·
156
+ `,
157
+
158
+ // Frame 9 — READY: full fleet online
159
+ `
160
+ ✅ C L A W F O R G E ✅
161
+
162
+
163
+ 🤖 🤖 🤖 🤖 🤖
164
+
165
+ ONLINE
166
+
167
+ ⚒️ fleet forged ⚒️
168
+
169
+
170
+ `,
171
+ }
172
+
173
+ // animationTick returns a command that sends an AnimationTickMsg after frameDuration.
174
+ func animationTick() tea.Cmd {
175
+ return tea.Tick(frameDuration, func(t time.Time) tea.Msg {
176
+ return AnimationTickMsg(t)
177
+ })
178
+ }
179
+
180
+ // renderAnimation renders the current animation frame centered in the terminal.
181
+ func renderAnimation(frame int, width, height int) string {
182
+ if frame < 0 || frame >= len(forgeFrames) {
183
+ return ""
184
+ }
185
+
186
+ content := animFrameStyle.Render(forgeFrames[frame])
187
+
188
+ if width > 0 && height > 0 {
189
+ return lipgloss.Place(width, height, lipgloss.Center, lipgloss.Center, content)
190
+ }
191
+ return content
192
+ }
@@ -1 +0,0 @@
1
- 1.6.0
@@ -1,192 +0,0 @@
1
- package main
2
-
3
- import (
4
- "time"
5
-
6
- tea "charm.land/bubbletea/v2"
7
- "charm.land/lipgloss/v2"
8
- )
9
-
10
- // AnimationTickMsg advances the forge startup animation by one frame.
11
- type AnimationTickMsg time.Time
12
-
13
- // AnimationDoneMsg signals that the startup animation has completed.
14
- type AnimationDoneMsg struct{}
15
-
16
- const frameDuration = 120 * time.Millisecond
17
-
18
- // forgeFrames contains the ASCII art frames for the forge startup animation.
19
- // 10 frames of a hammering/sparks effect at ~120ms each = ~1.2s total.
20
- var forgeFrames = [...]string{
21
- // Frame 0: Forge cold
22
- `
23
- _______________
24
- / \
25
- / C L A W \
26
- / F O R G E \
27
- / \
28
- /_______________________\
29
- | |
30
- | |
31
- | ___ |
32
- | | | |
33
- _______|_|___|_|________
34
- |________________________|
35
- `,
36
- // Frame 1: Embers glow
37
- `
38
- _______________
39
- / \
40
- / C L A W \
41
- / F O R G E \
42
- / . \
43
- /_______________________\
44
- | |
45
- | * |
46
- | ___ |
47
- | | | |
48
- _______|_|___|_|________
49
- |_______.....____________|
50
- `,
51
- // Frame 2: Fire rising
52
- `
53
- _______________
54
- / \
55
- / C L A W \
56
- / F O R G E \
57
- / . . \
58
- /_______________________\
59
- | * * |
60
- | /|\ |
61
- | ___ |
62
- | |^^^| |
63
- _______|_|___|_|________
64
- |______*..^^^..*_________|
65
- `,
66
- // Frame 3: Hammer up
67
- `
68
- _______________
69
- / \ _____
70
- / C L A W \ | |
71
- / F O R G E \ | ))) |
72
- / * . * \|_____|
73
- /_______________________\ |
74
- | *** * | |
75
- | /|\ | /
76
- | ___ | /
77
- | |^^^| |
78
- _______|_|___|_|________
79
- |______*..^^^..*_________|
80
- `,
81
- // Frame 4: Hammer strike!
82
- `
83
- _______________
84
- / \
85
- / C L A W \
86
- / F O R G E \ _____
87
- / * * . * * \ | |
88
- /________________________| ))) |
89
- | ***** | |_____|
90
- | /|\ |
91
- | ___ |
92
- | |^^^| |
93
- _______|_|___|_|________
94
- |______*..^^^..*_________|
95
- `,
96
- // Frame 5: SPARKS!
97
- `
98
- _______________
99
- / * * \
100
- / C L A W * \
101
- / F O R G E * \ _____
102
- / * * * . * * * \ | |
103
- /________________________\| ))) |
104
- * | ***** | * |_____|
105
- * | /|\ | *
106
- | ___ |
107
- | |^^^| |
108
- _______|_|___|_|________
109
- |______*..^^^..*_________|
110
- `,
111
- // Frame 6: Sparks fade, hammer lifts
112
- `
113
- _______________
114
- / * \
115
- / C L A W \
116
- / F O R G E \ _____
117
- / * . . * \ | |
118
- /_______________________\ | ))) |
119
- | * * * | |_____|
120
- | /|\ | |
121
- | ___ | /
122
- | |^^^| |
123
- _______|_|___|_|________
124
- |______*..^^^..*_________|
125
- `,
126
- // Frame 7: Second strike!
127
- `
128
- _______________
129
- / \
130
- / C L A W \
131
- / F O R G E \ _____
132
- / * * . * * \ | |
133
- /________________________| ))) |
134
- | ***** | |_____|
135
- | /|\ |
136
- | ___ |
137
- | |^^^| |
138
- _______|_|___|_|________
139
- |______*..^^^..*_________|
140
- `,
141
- // Frame 8: BIG SPARKS!
142
- `
143
- * _______________ *
144
- * / * * * \ *
145
- / C L A W * * \
146
- * / F O R G E * \ _____
147
- / * * * * . * * * * \ | |
148
- /________________________\| ))) |
149
- * * | ***** | * * |_____|
150
- * * | /|\ | * *
151
- * | ___ | *
152
- | |^^^| |
153
- _______|_|___|_|________
154
- |______*..^^^..*_________|
155
- `,
156
- // Frame 9: Forge ready — blade forged
157
- `
158
- _______________
159
- / \
160
- / C L A W \
161
- / F O R G E \
162
- / READY \
163
- /_______________________\
164
- | |
165
- | --- |
166
- | ___ |
167
- | |===| |
168
- _______|_|___|_|________
169
- |_______ FORGED _________|
170
- `,
171
- }
172
-
173
- // animationTick returns a command that sends an AnimationTickMsg after frameDuration.
174
- func animationTick() tea.Cmd {
175
- return tea.Tick(frameDuration, func(t time.Time) tea.Msg {
176
- return AnimationTickMsg(t)
177
- })
178
- }
179
-
180
- // renderAnimation renders the current animation frame centered in the terminal.
181
- func renderAnimation(frame int, width, height int) string {
182
- if frame < 0 || frame >= len(forgeFrames) {
183
- return ""
184
- }
185
-
186
- content := animFrameStyle.Render(forgeFrames[frame])
187
-
188
- if width > 0 && height > 0 {
189
- return lipgloss.Place(width, height, lipgloss.Center, lipgloss.Center, content)
190
- }
191
- return content
192
- }
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