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.
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/CHANGELOG.md +15 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/Formula/clawforge.rb +3 -1
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/PKG-INFO +1 -1
- clawforge_cli-1.6.2/VERSION +1 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/quick-run.sh +12 -5
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/package.json +1 -1
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/pyproject.toml +1 -1
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-dx.sh +3 -3
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-observability.sh +1 -1
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-power.sh +1 -1
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-practical.sh +1 -1
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-quick-run.sh +1 -1
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-reliability.sh +1 -1
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-web.sh +1 -1
- clawforge_cli-1.6.2/tui/animation.go +192 -0
- clawforge_cli-1.6.0/VERSION +0 -1
- clawforge_cli-1.6.0/tui/animation.go +0 -192
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.github/workflows/ci.yml +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.github/workflows/publish-npm.yml +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.github/workflows/publish-pypi.yml +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.github/workflows/update-homebrew.yml +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.github/workflows/version-sync.yml +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/.gitignore +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/LICENSE +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/PRD-v05.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/PRD-v06.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/PRD-v07.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/README.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/SKILL.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/attach.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/check-agents.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/clawforge +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/clawforge-web +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/clean.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/completions.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/config.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/conflicts.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/cost.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/dashboard.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/deps.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/diff.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/doctor.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/eval.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/export.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/history.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/init.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/learn.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/logs.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/memory.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/merge-helper.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/multi-review.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/notify.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/on-complete.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/parse-cost.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/pr.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/profile.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/replay.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/resume.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/review-mode.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/review-pr.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/routing.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/scope-task.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/spawn-agent.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/sprint.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/steer.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/stop.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/summary.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/swarm.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/templates.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/bin/web.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/clawforge/__init__.py +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/clawforge/cli.py +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/completions/_clawforge +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/completions/clawforge.bash +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/completions/clawforge.fish +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/config/defaults.json +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/config/prompt-templates/default.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/config/routing-defaults.json +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/IMPLEMENTATION-v04.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/PRD-v04.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/PUBLISHING-CHECKLIST.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/README.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/RELEASE.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/architecture.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/command-reference.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/configuration.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/dashboard.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/evaluation.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/faq.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/fleet-ops.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/getting-started.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/scenarios.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/troubleshooting.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/docs/workflow-modes.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/evals/run-log.example.jsonl +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/evals/run-log.schema.json +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/evals/scorecard.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/install.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/common.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/templates/bugfix.json +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/templates/migration.json +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/templates/refactor.json +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/templates/security-audit.json +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/lib/templates/test-coverage.json +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/registry/conflicts.jsonl +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/registry/costs.jsonl +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/run-all-tests.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-ci-loop.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-clean.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-cli.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-conflicts.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-cost.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-dashboard.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-deps.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-eval.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-foundation.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-history.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-init.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-learn.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-management.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-memory.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-merge.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-modes.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-multi-repo.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-notify.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-openclaw.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-registry.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-review.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-routing.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-scope.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-spawn.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-templates.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-tui.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tests/test-watch.sh +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/PRD.md +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/agent.go +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/dashboard.go +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/filter.go +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/go.mod +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/go.sum +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/keybindings.go +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/main.go +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/model.go +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/steer.go +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/tui/styles.go +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/web/go.mod +0 -0
- {clawforge_cli-1.6.0 → clawforge_cli-1.6.2}/web/index.html +0 -0
- {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.
|
|
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.
|
|
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" ]]
|
|
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" == "
|
|
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
|
|
@@ -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.
|
|
138
|
-
echo " ✅ version is 1.6.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
+
}
|
clawforge_cli-1.6.0/VERSION
DELETED
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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
|