clawforge-cli 1.5.1__tar.gz → 1.5.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 (145) hide show
  1. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/CHANGELOG.md +9 -0
  2. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/Formula/clawforge.rb +2 -1
  3. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/PKG-INFO +1 -1
  4. clawforge_cli-1.5.2/VERSION +1 -0
  5. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/package.json +1 -1
  6. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/pyproject.toml +1 -1
  7. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-ci-loop.sh +2 -2
  8. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-clean.sh +1 -1
  9. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-cli.sh +1 -1
  10. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-conflicts.sh +1 -1
  11. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-cost.sh +1 -1
  12. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-dx.sh +4 -4
  13. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-eval.sh +1 -1
  14. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-history.sh +1 -1
  15. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-init.sh +1 -1
  16. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-learn.sh +1 -1
  17. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-management.sh +1 -1
  18. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-memory.sh +1 -1
  19. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-merge.sh +1 -1
  20. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-modes.sh +1 -1
  21. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-multi-repo.sh +2 -2
  22. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-notify.sh +1 -1
  23. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-observability.sh +2 -2
  24. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-openclaw.sh +1 -1
  25. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-power.sh +2 -2
  26. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-practical.sh +2 -2
  27. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-reliability.sh +2 -2
  28. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-review.sh +1 -1
  29. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-routing.sh +1 -1
  30. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-scope.sh +1 -1
  31. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-spawn.sh +1 -1
  32. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-templates.sh +1 -1
  33. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-tui.sh +1 -1
  34. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-watch.sh +1 -1
  35. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-web.sh +2 -2
  36. clawforge_cli-1.5.1/VERSION +0 -1
  37. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/.github/workflows/ci.yml +0 -0
  38. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/.github/workflows/publish-npm.yml +0 -0
  39. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/.github/workflows/publish-pypi.yml +0 -0
  40. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/.github/workflows/update-homebrew.yml +0 -0
  41. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/.github/workflows/version-sync.yml +0 -0
  42. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/.gitignore +0 -0
  43. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/LICENSE +0 -0
  44. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/PRD-v05.md +0 -0
  45. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/PRD-v06.md +0 -0
  46. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/PRD-v07.md +0 -0
  47. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/README.md +0 -0
  48. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/SKILL.md +0 -0
  49. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/attach.sh +0 -0
  50. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/check-agents.sh +0 -0
  51. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/clawforge +0 -0
  52. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/clawforge-web +0 -0
  53. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/clean.sh +0 -0
  54. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/completions.sh +0 -0
  55. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/config.sh +0 -0
  56. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/conflicts.sh +0 -0
  57. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/cost.sh +0 -0
  58. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/dashboard.sh +0 -0
  59. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/deps.sh +0 -0
  60. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/diff.sh +0 -0
  61. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/doctor.sh +0 -0
  62. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/eval.sh +0 -0
  63. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/export.sh +0 -0
  64. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/history.sh +0 -0
  65. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/init.sh +0 -0
  66. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/learn.sh +0 -0
  67. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/logs.sh +0 -0
  68. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/memory.sh +0 -0
  69. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/merge-helper.sh +0 -0
  70. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/multi-review.sh +0 -0
  71. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/notify.sh +0 -0
  72. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/on-complete.sh +0 -0
  73. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/parse-cost.sh +0 -0
  74. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/pr.sh +0 -0
  75. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/profile.sh +0 -0
  76. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/replay.sh +0 -0
  77. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/resume.sh +0 -0
  78. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/review-mode.sh +0 -0
  79. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/review-pr.sh +0 -0
  80. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/routing.sh +0 -0
  81. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/scope-task.sh +0 -0
  82. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/spawn-agent.sh +0 -0
  83. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/sprint.sh +0 -0
  84. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/steer.sh +0 -0
  85. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/stop.sh +0 -0
  86. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/summary.sh +0 -0
  87. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/swarm.sh +0 -0
  88. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/templates.sh +0 -0
  89. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/bin/web.sh +0 -0
  90. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/clawforge/__init__.py +0 -0
  91. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/clawforge/cli.py +0 -0
  92. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/completions/_clawforge +0 -0
  93. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/completions/clawforge.bash +0 -0
  94. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/completions/clawforge.fish +0 -0
  95. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/config/defaults.json +0 -0
  96. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/config/prompt-templates/default.md +0 -0
  97. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/config/routing-defaults.json +0 -0
  98. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/IMPLEMENTATION-v04.md +0 -0
  99. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/PRD-v04.md +0 -0
  100. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/PUBLISHING-CHECKLIST.md +0 -0
  101. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/README.md +0 -0
  102. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/RELEASE.md +0 -0
  103. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/architecture.md +0 -0
  104. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/command-reference.md +0 -0
  105. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/configuration.md +0 -0
  106. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/dashboard.md +0 -0
  107. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/evaluation.md +0 -0
  108. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/faq.md +0 -0
  109. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/fleet-ops.md +0 -0
  110. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/getting-started.md +0 -0
  111. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/scenarios.md +0 -0
  112. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/troubleshooting.md +0 -0
  113. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/docs/workflow-modes.md +0 -0
  114. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/evals/run-log.example.jsonl +0 -0
  115. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/evals/run-log.schema.json +0 -0
  116. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/evals/scorecard.md +0 -0
  117. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/install.sh +0 -0
  118. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/lib/common.sh +0 -0
  119. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/lib/templates/bugfix.json +0 -0
  120. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/lib/templates/migration.json +0 -0
  121. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/lib/templates/refactor.json +0 -0
  122. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/lib/templates/security-audit.json +0 -0
  123. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/lib/templates/test-coverage.json +0 -0
  124. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/registry/conflicts.jsonl +0 -0
  125. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/registry/costs.jsonl +0 -0
  126. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/run-all-tests.sh +0 -0
  127. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-dashboard.sh +0 -0
  128. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-deps.sh +0 -0
  129. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-foundation.sh +0 -0
  130. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tests/test-registry.sh +0 -0
  131. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/PRD.md +0 -0
  132. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/agent.go +0 -0
  133. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/animation.go +0 -0
  134. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/dashboard.go +0 -0
  135. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/filter.go +0 -0
  136. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/go.mod +0 -0
  137. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/go.sum +0 -0
  138. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/keybindings.go +0 -0
  139. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/main.go +0 -0
  140. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/model.go +0 -0
  141. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/steer.go +0 -0
  142. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/tui/styles.go +0 -0
  143. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/web/go.mod +0 -0
  144. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/web/index.html +0 -0
  145. {clawforge_cli-1.5.1 → clawforge_cli-1.5.2}/web/main.go +0 -0
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.5.2 — Test Harness Stability
4
+
5
+ ### Fixed
6
+ - Replaced fragile `echo ... | grep -q` checks in test scripts with here-string checks (`grep -q <<< ...`).
7
+ - Avoids intermittent broken-pipe behavior under `set -o pipefail` on GitHub Actions.
8
+
9
+ ### Result
10
+ - Stabilizes observability/web/dashboard-related suites on clean macOS runners.
11
+
3
12
  ## v1.5.1 — CI Test Flake Fix
4
13
 
5
14
  ### Fixed
@@ -1,7 +1,8 @@
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.0.tar.gz"
4
+ url "https://github.com/cyperx84/clawforge/archive/refs/tags/v1.5.1.tar.gz"
5
+ sha256 "27cca187828366d138dbde81f99f313e065c656be7073452ccc016eb5dba16db"
5
6
  sha256 "ce9da13357fc54d20e59da5851ac04a4ebbff071ec5a7ce1b17b0cbe877b3416"
6
7
  sha256 "050e1745af5f64fe017ecc8d533a7f653935b572f45f4c9766f5746a4b58b54e"
7
8
  sha256 "4ff8f36c599e81f03291210a6044bd0cce78a953f53eb360f47ce375706104d9"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clawforge-cli
3
- Version: 1.5.1
3
+ Version: 1.5.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.5.2
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyperx/clawforge",
3
- "version": "1.5.1",
3
+ "version": "1.5.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.5.1"
3
+ version = "1.5.2"
4
4
  description = "Multi-mode coding workflow CLI for orchestrating AI coding agents"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -34,7 +34,7 @@ assert_contains() {
34
34
  local desc="$1" expected="$2"; shift 2
35
35
  local output
36
36
  output=$("$@" 2>&1 || true)
37
- if echo "$output" | grep -q "$expected"; then
37
+ if grep -q "$expected" <<< "$output"; then
38
38
  echo " ✅ $desc"
39
39
  ((PASS++)) || true
40
40
  else
@@ -113,7 +113,7 @@ assert_ok "check-agents runs on empty registry" "$CHECK" --dry-run
113
113
  echo "Test 6: check with task"
114
114
  output=$("$CHECK" --dry-run 2>&1 || true)
115
115
  # Should find our task
116
- if echo "$output" | grep -q "ci-test-1\|Agent Status"; then
116
+ if grep -q "ci-test-1\|Agent Status" <<< "$output"; then
117
117
  echo " ✅ check-agents finds registered task"
118
118
  PASS=$((PASS+1))
119
119
  else
@@ -33,7 +33,7 @@ TMPDIR=$(mktemp -d)
33
33
  # Test 1: --help
34
34
  echo "Test 1: --help flag"
35
35
  help_output=$("$BIN_DIR/clean.sh" --help 2>&1 || true)
36
- if echo "$help_output" | grep -q "Usage:"; then
36
+ if grep -q "Usage:" <<< "$help_output"; then
37
37
  assert_eq "help shows usage" "true" "true"
38
38
  else
39
39
  assert_eq "help shows usage" "true" "false"
@@ -32,7 +32,7 @@ assert_contains() {
32
32
  local desc="$1" expected="$2"; shift 2
33
33
  local output
34
34
  output=$("$@" 2>&1 || true)
35
- if echo "$output" | grep -q "$expected"; then
35
+ if grep -q "$expected" <<< "$output"; then
36
36
  echo " ✅ $desc"
37
37
  ((PASS++)) || true
38
38
  else
@@ -41,7 +41,7 @@ assert_contains() {
41
41
  local desc="$1" expected="$2"; shift 2
42
42
  local output
43
43
  output=$("$@" 2>&1 || true)
44
- if echo "$output" | grep -q "$expected"; then
44
+ if grep -q "$expected" <<< "$output"; then
45
45
  echo " ✅ $desc"
46
46
  ((PASS++)) || true
47
47
  else
@@ -52,7 +52,7 @@ assert_contains() {
52
52
  local desc="$1" expected="$2"; shift 2
53
53
  local output
54
54
  output=$("$@" 2>&1 || true)
55
- if echo "$output" | grep -q "$expected"; then
55
+ if grep -q "$expected" <<< "$output"; then
56
56
  echo " ✅ $desc"
57
57
  ((PASS++)) || true
58
58
  else
@@ -10,7 +10,7 @@ PASS=0 FAIL=0
10
10
 
11
11
  assert_contains() {
12
12
  local desc="$1" needle="$2" haystack="$3"
13
- if echo "$haystack" | grep -qF -- "$needle"; then
13
+ if grep -qF -- "$needle" <<< "$haystack"; then
14
14
  echo " ✅ $desc"; PASS=$((PASS+1))
15
15
  else
16
16
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -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.5.1" ]]; then
138
- echo " ✅ version is 1.5.1"; PASS=$((PASS+1))
137
+ if [[ "$version" == "1.5.2" ]]; then
138
+ echo " ✅ version is 1.5.2"; PASS=$((PASS+1))
139
139
  else
140
- echo " ❌ version is $version, expected 1.5.1"; FAIL=$((FAIL+1))
140
+ echo " ❌ version is $version, expected 1.5.2"; FAIL=$((FAIL+1))
141
141
  fi
142
142
 
143
143
  echo ""
@@ -17,7 +17,7 @@ assert_eq() {
17
17
 
18
18
  assert_contains() {
19
19
  local desc="$1" needle="$2" haystack="$3"
20
- if echo "$haystack" | grep -qF -- "$needle"; then
20
+ if grep -qF -- "$needle" <<< "$haystack"; then
21
21
  echo " ✅ $desc"; PASS=$((PASS+1))
22
22
  else
23
23
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -27,7 +27,7 @@ assert_eq() {
27
27
 
28
28
  assert_contains() {
29
29
  local desc="$1" needle="$2" haystack="$3"
30
- if echo "$haystack" | grep -qF "$needle"; then
30
+ if grep -qF "$needle" <<< "$haystack"; then
31
31
  echo " ✅ $desc"; PASS=$((PASS+1))
32
32
  else
33
33
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -29,7 +29,7 @@ assert_eq() {
29
29
 
30
30
  assert_contains() {
31
31
  local desc="$1" needle="$2" haystack="$3"
32
- if echo "$haystack" | grep -qF "$needle"; then
32
+ if grep -qF "$needle" <<< "$haystack"; then
33
33
  echo " ✅ $desc"; PASS=$((PASS+1))
34
34
  else
35
35
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -26,7 +26,7 @@ assert_eq() {
26
26
 
27
27
  assert_contains() {
28
28
  local desc="$1" needle="$2" haystack="$3"
29
- if echo "$haystack" | grep -qF "$needle"; then
29
+ if grep -qF "$needle" <<< "$haystack"; then
30
30
  echo " ✅ $desc"; PASS=$((PASS+1))
31
31
  else
32
32
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -48,7 +48,7 @@ assert_contains() {
48
48
  local desc="$1" expected="$2"; shift 2
49
49
  local output
50
50
  output=$("$@" 2>&1 || true)
51
- if echo "$output" | grep -q "$expected"; then
51
+ if grep -q "$expected" <<< "$output"; then
52
52
  echo " ✅ $desc"
53
53
  PASS=$((PASS+1))
54
54
  else
@@ -27,7 +27,7 @@ assert_eq() {
27
27
 
28
28
  assert_contains() {
29
29
  local desc="$1" needle="$2" haystack="$3"
30
- if echo "$haystack" | grep -qF "$needle"; then
30
+ if grep -qF "$needle" <<< "$haystack"; then
31
31
  echo " ✅ $desc"; PASS=$((PASS+1))
32
32
  else
33
33
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -24,7 +24,7 @@ assert_eq() {
24
24
 
25
25
  assert_contains() {
26
26
  local desc="$1" needle="$2" haystack="$3"
27
- if echo "$haystack" | grep -qF "$needle"; then
27
+ if grep -qF "$needle" <<< "$haystack"; then
28
28
  echo " ✅ $desc"; PASS=$((PASS+1))
29
29
  else
30
30
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -53,7 +53,7 @@ assert_contains() {
53
53
  local desc="$1" expected="$2"; shift 2
54
54
  local output
55
55
  output=$("$@" 2>&1 || true)
56
- if echo "$output" | grep -q "$expected"; then
56
+ if grep -q "$expected" <<< "$output"; then
57
57
  echo " ✅ $desc"
58
58
  PASS=$((PASS+1))
59
59
  else
@@ -56,7 +56,7 @@ assert_contains() {
56
56
  local desc="$1" expected="$2"; shift 2
57
57
  local output
58
58
  output=$("$@" 2>&1 || true)
59
- if echo "$output" | grep -q "$expected"; then
59
+ if grep -q "$expected" <<< "$output"; then
60
60
  echo " ✅ $desc"
61
61
  PASS=$((PASS+1))
62
62
  else
@@ -173,7 +173,7 @@ echo '{"tasks":[]}' > "$REGISTRY_FILE"
173
173
  output=$("$BIN_DIR/swarm.sh" "$TMPDIR/repo-api" "Migrate tests" --dry-run 2>&1 || true)
174
174
  assert_contains "normal swarm dry-run works" "Decomposition" echo "$output"
175
175
  # Should NOT have Multi-Repo in output
176
- if echo "$output" | grep -q "Multi-Repo"; then
176
+ if grep -q "Multi-Repo" <<< "$output"; then
177
177
  echo " ❌ normal swarm should not show Multi-Repo"
178
178
  FAIL=$((FAIL+1))
179
179
  else
@@ -24,7 +24,7 @@ assert_eq() {
24
24
 
25
25
  assert_contains() {
26
26
  local desc="$1" needle="$2" haystack="$3"
27
- if echo "$haystack" | grep -qF "$needle"; then
27
+ if grep -qF "$needle" <<< "$haystack"; then
28
28
  echo " ✅ $desc"; PASS=$((PASS+1))
29
29
  else
30
30
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -11,7 +11,7 @@ PASS=0 FAIL=0
11
11
 
12
12
  assert_contains() {
13
13
  local desc="$1" needle="$2" haystack="$3"
14
- if echo "$haystack" | grep -qF -- "$needle"; then
14
+ if grep -qF -- "$needle" <<< "$haystack"; then
15
15
  echo " ✅ $desc"; PASS=$((PASS+1))
16
16
  else
17
17
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -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.5.1" "1.5.1" "$version"
80
+ assert_eq "version is 1.5.2" "1.5.2" "$version"
81
81
 
82
82
  echo ""
83
83
  echo "Results: $PASS passed, $FAIL failed"
@@ -15,7 +15,7 @@ assert_contains() {
15
15
  local desc="$1" expected="$2"; shift 2
16
16
  local output
17
17
  output=$("$@" 2>&1 || true)
18
- if echo "$output" | grep -q "$expected"; then
18
+ if grep -q "$expected" <<< "$output"; then
19
19
  echo " ✅ $desc"
20
20
  ((PASS++)) || true
21
21
  else
@@ -10,7 +10,7 @@ PASS=0 FAIL=0
10
10
 
11
11
  assert_contains() {
12
12
  local desc="$1" needle="$2" haystack="$3"
13
- if echo "$haystack" | grep -qF -- "$needle"; then
13
+ if grep -qF -- "$needle" <<< "$haystack"; then
14
14
  echo " ✅ $desc"; PASS=$((PASS+1))
15
15
  else
16
16
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -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.5.1" "1.5.1" "$version"
124
+ assert_eq "version is 1.5.2" "1.5.2" "$version"
125
125
 
126
126
  echo ""
127
127
  echo "Results: $PASS passed, $FAIL failed"
@@ -10,7 +10,7 @@ PASS=0 FAIL=0
10
10
 
11
11
  assert_contains() {
12
12
  local desc="$1" needle="$2" haystack="$3"
13
- if echo "$haystack" | grep -qF -- "$needle"; then
13
+ if grep -qF -- "$needle" <<< "$haystack"; then
14
14
  echo " ✅ $desc"; PASS=$((PASS+1))
15
15
  else
16
16
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -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.5.1" "1.5.1" "$version"
99
+ assert_eq "version is 1.5.2" "1.5.2" "$version"
100
100
 
101
101
  echo ""
102
102
  echo "Results: $PASS passed, $FAIL failed"
@@ -10,7 +10,7 @@ PASS=0 FAIL=0
10
10
 
11
11
  assert_contains() {
12
12
  local desc="$1" needle="$2" haystack="$3"
13
- if echo "$haystack" | grep -qF -- "$needle"; then
13
+ if grep -qF -- "$needle" <<< "$haystack"; then
14
14
  echo " ✅ $desc"; PASS=$((PASS+1))
15
15
  else
16
16
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -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.5.1" "1.5.1" "$version"
99
+ assert_eq "version is 1.5.2" "1.5.2" "$version"
100
100
 
101
101
  # Test 12: doctor --fix runs without errors
102
102
  echo "Test 12: doctor --fix"
@@ -24,7 +24,7 @@ echo "=== test-review.sh ==="
24
24
  # Test 1: --help flag
25
25
  echo "Test 1: --help flag"
26
26
  help_output=$("$BIN_DIR/review-pr.sh" --help 2>&1 || true)
27
- if echo "$help_output" | grep -q "Usage:"; then
27
+ if grep -q "Usage:" <<< "$help_output"; then
28
28
  assert_eq "help shows usage" "true" "true"
29
29
  else
30
30
  assert_eq "help shows usage" "true" "false"
@@ -50,7 +50,7 @@ assert_contains() {
50
50
  local desc="$1" expected="$2"; shift 2
51
51
  local output
52
52
  output=$("$@" 2>&1 || true)
53
- if echo "$output" | grep -q "$expected"; then
53
+ if grep -q "$expected" <<< "$output"; then
54
54
  echo " ✅ $desc"
55
55
  PASS=$((PASS+1))
56
56
  else
@@ -25,7 +25,7 @@ assert_eq() {
25
25
 
26
26
  assert_contains() {
27
27
  local desc="$1" needle="$2" haystack="$3"
28
- if echo "$haystack" | grep -qF "$needle"; then
28
+ if grep -qF "$needle" <<< "$haystack"; then
29
29
  echo " ✅ $desc"; PASS=$((PASS+1))
30
30
  else
31
31
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -58,7 +58,7 @@ echo '{"tasks":[]}' > "$REGISTRY_FILE"
58
58
  # Test 1: --help flag
59
59
  echo "Test 1: --help flag"
60
60
  help_output=$("$BIN_DIR/spawn-agent.sh" --help 2>&1 || true)
61
- if echo "$help_output" | grep -q "Usage:"; then
61
+ if grep -q "Usage:" <<< "$help_output"; then
62
62
  assert_eq "help shows usage" "true" "true"
63
63
  else
64
64
  assert_eq "help shows usage" "true" "false"
@@ -36,7 +36,7 @@ assert_contains() {
36
36
  local desc="$1" expected="$2"; shift 2
37
37
  local output
38
38
  output=$("$@" 2>&1 || true)
39
- if echo "$output" | grep -q "$expected"; then
39
+ if grep -q "$expected" <<< "$output"; then
40
40
  echo " ✅ $desc"
41
41
  ((PASS++)) || true
42
42
  else
@@ -34,7 +34,7 @@ assert_contains() {
34
34
  local desc="$1" expected="$2"; shift 2
35
35
  local output
36
36
  output=$("$@" 2>&1 || true)
37
- if echo "$output" | grep -q "$expected"; then
37
+ if grep -q "$expected" <<< "$output"; then
38
38
  echo " ✅ $desc"
39
39
  ((PASS++)) || true
40
40
  else
@@ -74,7 +74,7 @@ assert_eq "dead session detected as failed" "failed" "$detected_status"
74
74
  # Test 4: --help flag
75
75
  echo "Test 4: --help flag"
76
76
  help_output=$("$BIN_DIR/check-agents.sh" --help 2>&1 || true)
77
- if echo "$help_output" | grep -q "Usage:"; then
77
+ if grep -q "Usage:" <<< "$help_output"; then
78
78
  assert_eq "help shows usage" "true" "true"
79
79
  else
80
80
  assert_eq "help shows usage" "true" "false"
@@ -10,7 +10,7 @@ PASS=0 FAIL=0
10
10
 
11
11
  assert_contains() {
12
12
  local desc="$1" needle="$2" haystack="$3"
13
- if echo "$haystack" | grep -qF -- "$needle"; then
13
+ if grep -qF -- "$needle" <<< "$haystack"; then
14
14
  echo " ✅ $desc"; PASS=$((PASS+1))
15
15
  else
16
16
  echo " ❌ $desc (missing: $needle)"; FAIL=$((FAIL+1))
@@ -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.5.1" "1.5.1" "$version"
110
+ assert_eq "version is 1.5.2" "1.5.2" "$version"
111
111
 
112
112
  echo ""
113
113
  echo "Results: $PASS passed, $FAIL failed"
@@ -1 +0,0 @@
1
- 1.5.1
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