clawforge-cli 1.5.5__tar.gz → 1.6.1__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.5.5 → clawforge_cli-1.6.1}/CHANGELOG.md +22 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/Formula/clawforge.rb +3 -1
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/PKG-INFO +1 -1
- clawforge_cli-1.6.1/VERSION +1 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/clawforge +2 -0
- clawforge_cli-1.6.1/bin/quick-run.sh +211 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/package.json +1 -1
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/pyproject.toml +1 -1
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/run-all-tests.sh +1 -1
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-dx.sh +3 -3
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-observability.sh +1 -1
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-power.sh +1 -1
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-practical.sh +1 -1
- clawforge_cli-1.6.1/tests/test-quick-run.sh +105 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-reliability.sh +1 -1
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-web.sh +1 -1
- clawforge_cli-1.5.5/VERSION +0 -1
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/.github/workflows/ci.yml +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/.github/workflows/publish-npm.yml +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/.github/workflows/publish-pypi.yml +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/.github/workflows/update-homebrew.yml +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/.github/workflows/version-sync.yml +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/.gitignore +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/LICENSE +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/PRD-v05.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/PRD-v06.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/PRD-v07.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/README.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/SKILL.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/attach.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/check-agents.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/clawforge-web +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/clean.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/completions.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/config.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/conflicts.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/cost.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/dashboard.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/deps.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/diff.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/doctor.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/eval.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/export.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/history.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/init.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/learn.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/logs.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/memory.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/merge-helper.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/multi-review.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/notify.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/on-complete.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/parse-cost.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/pr.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/profile.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/replay.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/resume.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/review-mode.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/review-pr.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/routing.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/scope-task.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/spawn-agent.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/sprint.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/steer.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/stop.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/summary.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/swarm.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/templates.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/bin/web.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/clawforge/__init__.py +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/clawforge/cli.py +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/completions/_clawforge +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/completions/clawforge.bash +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/completions/clawforge.fish +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/config/defaults.json +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/config/prompt-templates/default.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/config/routing-defaults.json +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/IMPLEMENTATION-v04.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/PRD-v04.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/PUBLISHING-CHECKLIST.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/README.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/RELEASE.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/architecture.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/command-reference.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/configuration.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/dashboard.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/evaluation.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/faq.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/fleet-ops.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/getting-started.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/scenarios.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/troubleshooting.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/docs/workflow-modes.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/evals/run-log.example.jsonl +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/evals/run-log.schema.json +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/evals/scorecard.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/install.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/lib/common.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/lib/templates/bugfix.json +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/lib/templates/migration.json +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/lib/templates/refactor.json +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/lib/templates/security-audit.json +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/lib/templates/test-coverage.json +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/registry/conflicts.jsonl +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/registry/costs.jsonl +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-ci-loop.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-clean.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-cli.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-conflicts.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-cost.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-dashboard.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-deps.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-eval.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-foundation.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-history.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-init.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-learn.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-management.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-memory.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-merge.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-modes.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-multi-repo.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-notify.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-openclaw.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-registry.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-review.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-routing.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-scope.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-spawn.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-templates.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-tui.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tests/test-watch.sh +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/PRD.md +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/agent.go +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/animation.go +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/dashboard.go +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/filter.go +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/go.mod +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/go.sum +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/keybindings.go +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/main.go +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/model.go +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/steer.go +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/tui/styles.go +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/web/go.mod +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/web/index.html +0 -0
- {clawforge_cli-1.5.5 → clawforge_cli-1.6.1}/web/main.go +0 -0
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.6.1 — quick-run CI Fix
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- `quick-run` dry-run now works even when no agent (claude/codex) is installed
|
|
7
|
+
- Agent placeholder used for dry-run/help; real runs still validate agent is present
|
|
8
|
+
- Fixes test-quick-run failures on CI environments without Claude/Codex
|
|
9
|
+
|
|
10
|
+
## v1.6.0 — quick-run: Zero-Overhead Direct Execution
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- New `clawforge quick-run "<task>"` command
|
|
14
|
+
- Runs agent directly in current directory (or `--dir <path>`)
|
|
15
|
+
- No worktree, no branch, no tmux — streams output to terminal
|
|
16
|
+
- Flags: `--agent`, `--model`, `--save`, `--budget`, `--no-track`, `--dir`, `--dry-run`
|
|
17
|
+
- Output teed to log file (`~/.clawforge/registry/logs/`) and registered in task history
|
|
18
|
+
- Appears in `clawforge status` unless `--no-track` used
|
|
19
|
+
- 34 test suites (new: `test-quick-run`)
|
|
20
|
+
|
|
21
|
+
### Use case
|
|
22
|
+
For quick questions, codebase exploration, or small fixes that don't need a branch/PR workflow.
|
|
23
|
+
Use `clawforge sprint` when you need a branch, worktree, CI loop, and PR.
|
|
24
|
+
|
|
3
25
|
## v1.5.5 — TUI Observability: Logs + Diff Keys
|
|
4
26
|
|
|
5
27
|
### 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.0.tar.gz"
|
|
5
|
+
sha256 "240927908d5b2738b2e22156eeb360d09c5b20c3bde04b46a2b11d9de7466eba"
|
|
6
|
+
sha256 "b2d483778e83b9007b22bb4c421c90b71e7343cc4f244d116b99eaa2810dc433"
|
|
5
7
|
sha256 "549b3ebf95c953cd4f366b5a251786c994726761c9d4ed6255b996b6458cf695"
|
|
6
8
|
sha256 "2730fca0066fda9d3c864802c4346ab7c39d0daee39a254cc5cebd2694d4a1db"
|
|
7
9
|
sha256 "a026cb0df5b7c3efae439a9ca912e728843deb56c70441591c9064f81a1041ae"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clawforge-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.1
|
|
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.1
|
|
@@ -43,6 +43,7 @@ Multi-mode coding workflow CLI — from quick patches to parallel agent orchestr
|
|
|
43
43
|
Usage: clawforge <command> [options]
|
|
44
44
|
|
|
45
45
|
Workflow Modes:
|
|
46
|
+
quick-run Direct agent execution in cwd (no branch/worktree overhead)
|
|
46
47
|
sprint Single agent, full dev cycle (the workhorse)
|
|
47
48
|
review Quality gate on an existing PR (analysis only)
|
|
48
49
|
swarm Parallel multi-agent orchestration
|
|
@@ -260,6 +261,7 @@ doctor) exec "${BIN_DIR}/doctor.sh" "$@" ;;
|
|
|
260
261
|
spawn) exec "${BIN_DIR}/spawn-agent.sh" "$@" ;;
|
|
261
262
|
notify) exec "${BIN_DIR}/notify.sh" "$@" ;;
|
|
262
263
|
merge) exec "${BIN_DIR}/merge-helper.sh" "$@" ;;
|
|
264
|
+
quick-run) exec "${BIN_DIR}/quick-run.sh" "$@" ;;
|
|
263
265
|
run) run_combined "$@" ;;
|
|
264
266
|
|
|
265
267
|
# Meta
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# quick-run.sh — Zero-overhead direct agent execution in current directory.
|
|
3
|
+
# No worktree, no branch, no tmux. Just runs the agent and streams output.
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
7
|
+
source "${SCRIPT_DIR}/../lib/common.sh"
|
|
8
|
+
|
|
9
|
+
usage() {
|
|
10
|
+
cat <<EOF
|
|
11
|
+
Usage: clawforge quick-run "<task>" [options]
|
|
12
|
+
|
|
13
|
+
Run an agent directly in the current (or specified) directory.
|
|
14
|
+
No worktree, no branch, no tmux overhead — just streams output to your terminal.
|
|
15
|
+
|
|
16
|
+
Arguments:
|
|
17
|
+
<task> Task description (required)
|
|
18
|
+
|
|
19
|
+
Options:
|
|
20
|
+
--dir <path> Directory to run in (default: current working directory)
|
|
21
|
+
--agent <name> Agent to use: claude or codex (default: auto-detect)
|
|
22
|
+
--model <model> Model override
|
|
23
|
+
--no-track Don't register in task registry
|
|
24
|
+
--save <file> Save output to file (in addition to stdout)
|
|
25
|
+
--budget <usd> Max spend cap (passed to agent if supported)
|
|
26
|
+
--dry-run Show what would run without executing
|
|
27
|
+
--help Show this help
|
|
28
|
+
|
|
29
|
+
Examples:
|
|
30
|
+
clawforge quick-run "Explain what this codebase does"
|
|
31
|
+
clawforge quick-run "Add docstrings to all exported functions" --dir ~/github/mylib
|
|
32
|
+
clawforge quick-run "Fix the failing test" --agent codex --model gpt-5.3-codex
|
|
33
|
+
clawforge quick-run "Summarize recent git changes" --no-track
|
|
34
|
+
clawforge quick-run "Refactor auth.ts" --save /tmp/agent-output.log
|
|
35
|
+
|
|
36
|
+
Notes:
|
|
37
|
+
- Output streams directly to your terminal (and optionally a file).
|
|
38
|
+
- The agent runs in the target directory with full file access.
|
|
39
|
+
- Results are tracked in the registry (use --no-track to skip).
|
|
40
|
+
- For tasks requiring a branch/PR, use: clawforge sprint "<task>"
|
|
41
|
+
EOF
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
# ── Parse args ─────────────────────────────────────────────────────────
|
|
45
|
+
TASK="" DIR="" AGENT="" MODEL="" NO_TRACK=false SAVE_PATH="" BUDGET="" DRY_RUN=false
|
|
46
|
+
|
|
47
|
+
while [[ $# -gt 0 ]]; do
|
|
48
|
+
case "$1" in
|
|
49
|
+
--dir) DIR="$2"; shift 2 ;;
|
|
50
|
+
--agent) AGENT="$2"; shift 2 ;;
|
|
51
|
+
--model) MODEL="$2"; shift 2 ;;
|
|
52
|
+
--no-track) NO_TRACK=true; shift ;;
|
|
53
|
+
--save) SAVE_PATH="$2"; shift 2 ;;
|
|
54
|
+
--budget) BUDGET="$2"; shift 2 ;;
|
|
55
|
+
--dry-run) DRY_RUN=true; shift ;;
|
|
56
|
+
--help|-h) usage; exit 0 ;;
|
|
57
|
+
-*) log_error "Unknown option: $1"; usage; exit 1 ;;
|
|
58
|
+
*)
|
|
59
|
+
if [[ -z "$TASK" ]]; then
|
|
60
|
+
TASK="$1"; shift
|
|
61
|
+
else
|
|
62
|
+
log_error "Unexpected argument: $1"; usage; exit 1
|
|
63
|
+
fi
|
|
64
|
+
;;
|
|
65
|
+
esac
|
|
66
|
+
done
|
|
67
|
+
|
|
68
|
+
[[ -z "$TASK" ]] && { log_error "Task description is required"; usage; exit 1; }
|
|
69
|
+
|
|
70
|
+
# ── Resolve directory ──────────────────────────────────────────────────
|
|
71
|
+
if [[ -n "$DIR" ]]; then
|
|
72
|
+
[[ -d "$DIR" ]] || { log_error "Directory not found: $DIR"; exit 1; }
|
|
73
|
+
TARGET_DIR="$(cd "$DIR" && pwd)"
|
|
74
|
+
else
|
|
75
|
+
TARGET_DIR="$(pwd)"
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
# ── Resolve 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
|
|
83
|
+
|
|
84
|
+
# ── Resolve model ──────────────────────────────────────────────────────
|
|
85
|
+
if [[ -z "$MODEL" ]]; then
|
|
86
|
+
if [[ "$RESOLVED_AGENT" == "codex" ]]; then
|
|
87
|
+
MODEL=$(config_get default_model_codex "gpt-5.3-codex")
|
|
88
|
+
else
|
|
89
|
+
MODEL=$(config_get default_model_claude "claude-sonnet-4-5")
|
|
90
|
+
fi
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# ── Build task ID ──────────────────────────────────────────────────────
|
|
94
|
+
SAFE_SLUG=$(slugify_task "$TASK" 32)
|
|
95
|
+
TASK_ID="qr-${SAFE_SLUG}"
|
|
96
|
+
NOW=$(epoch_ms)
|
|
97
|
+
|
|
98
|
+
# ── Dry-run ────────────────────────────────────────────────────────────
|
|
99
|
+
if $DRY_RUN; then
|
|
100
|
+
echo "──────────────────────────────────────────"
|
|
101
|
+
echo " clawforge quick-run [dry-run]"
|
|
102
|
+
echo "──────────────────────────────────────────"
|
|
103
|
+
echo " task: $TASK"
|
|
104
|
+
echo " dir: $TARGET_DIR"
|
|
105
|
+
echo " agent: $RESOLVED_AGENT"
|
|
106
|
+
echo " model: $MODEL"
|
|
107
|
+
echo " track: $( $NO_TRACK && echo no || echo yes)"
|
|
108
|
+
[[ -n "$SAVE_PATH" ]] && echo " Save to: $SAVE_PATH"
|
|
109
|
+
[[ -n "$BUDGET" ]] && echo " Budget: \$$BUDGET"
|
|
110
|
+
echo "──────────────────────────────────────────"
|
|
111
|
+
exit 0
|
|
112
|
+
fi
|
|
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
|
+
|
|
119
|
+
# ── Register task ──────────────────────────────────────────────────────
|
|
120
|
+
SHORT_ID=""
|
|
121
|
+
if ! $NO_TRACK; then
|
|
122
|
+
_ensure_registry
|
|
123
|
+
TASK_JSON=$(jq -n \
|
|
124
|
+
--arg id "$TASK_ID" \
|
|
125
|
+
--arg agent "$RESOLVED_AGENT" \
|
|
126
|
+
--arg model "$MODEL" \
|
|
127
|
+
--arg desc "$TASK" \
|
|
128
|
+
--arg dir "$TARGET_DIR" \
|
|
129
|
+
--argjson started "$NOW" \
|
|
130
|
+
'{
|
|
131
|
+
id: $id,
|
|
132
|
+
agent: $agent,
|
|
133
|
+
model: $model,
|
|
134
|
+
description: $desc,
|
|
135
|
+
repo: $dir,
|
|
136
|
+
worktree: $dir,
|
|
137
|
+
branch: "",
|
|
138
|
+
mode: "quick-run",
|
|
139
|
+
status: "running",
|
|
140
|
+
started_at: $started,
|
|
141
|
+
files_touched: [],
|
|
142
|
+
ci_retries: 0
|
|
143
|
+
}')
|
|
144
|
+
registry_add "$TASK_JSON"
|
|
145
|
+
SHORT_ID=$(registry_get "$TASK_ID" | jq -r '.short_id // empty')
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
# ── Set up output capture ──────────────────────────────────────────────
|
|
149
|
+
LOG_DIR="${CLAWFORGE_DIR}/registry/logs"
|
|
150
|
+
mkdir -p "$LOG_DIR"
|
|
151
|
+
LOG_FILE="${LOG_DIR}/${TASK_ID}.log"
|
|
152
|
+
|
|
153
|
+
if ! $NO_TRACK; then
|
|
154
|
+
registry_update "$TASK_ID" "log_path" "\"$LOG_FILE\""
|
|
155
|
+
fi
|
|
156
|
+
|
|
157
|
+
# ── Build agent command ────────────────────────────────────────────────
|
|
158
|
+
ESCAPED_TASK=$(printf '%s' "$TASK" | sed "s/'/'\\''/g")
|
|
159
|
+
|
|
160
|
+
if [[ "$RESOLVED_AGENT" == "claude" ]]; then
|
|
161
|
+
BUDGET_FLAG=""
|
|
162
|
+
[[ -n "$BUDGET" ]] && BUDGET_FLAG="--max-budget-usd $BUDGET"
|
|
163
|
+
AGENT_CMD=(claude --model "$MODEL" --dangerously-skip-permissions -p "$TASK" $BUDGET_FLAG)
|
|
164
|
+
elif [[ "$RESOLVED_AGENT" == "codex" ]]; then
|
|
165
|
+
AGENT_CMD=(codex --model "$MODEL" --dangerously-bypass-approvals-and-sandbox "$TASK")
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
# ── Run ────────────────────────────────────────────────────────────────
|
|
169
|
+
ID_LABEL=""
|
|
170
|
+
[[ -n "$SHORT_ID" ]] && ID_LABEL=" [#${SHORT_ID}]"
|
|
171
|
+
|
|
172
|
+
echo "──────────────────────────────────────────"
|
|
173
|
+
echo " ⚡ clawforge quick-run${ID_LABEL}"
|
|
174
|
+
echo "──────────────────────────────────────────"
|
|
175
|
+
echo " Task: $TASK"
|
|
176
|
+
echo " Dir: $TARGET_DIR"
|
|
177
|
+
echo " Agent: $RESOLVED_AGENT ($MODEL)"
|
|
178
|
+
echo "──────────────────────────────────────────"
|
|
179
|
+
echo ""
|
|
180
|
+
|
|
181
|
+
EXIT_CODE=0
|
|
182
|
+
START_MS=$NOW
|
|
183
|
+
|
|
184
|
+
if [[ -n "$SAVE_PATH" ]]; then
|
|
185
|
+
(cd "$TARGET_DIR" && "${AGENT_CMD[@]}" 2>&1) | tee "$LOG_FILE" "$SAVE_PATH" || EXIT_CODE=$?
|
|
186
|
+
else
|
|
187
|
+
(cd "$TARGET_DIR" && "${AGENT_CMD[@]}" 2>&1) | tee "$LOG_FILE" || EXIT_CODE=$?
|
|
188
|
+
fi
|
|
189
|
+
|
|
190
|
+
END_MS=$(epoch_ms)
|
|
191
|
+
DURATION_S=$(( (END_MS - START_MS) / 1000 ))
|
|
192
|
+
|
|
193
|
+
echo ""
|
|
194
|
+
echo "──────────────────────────────────────────"
|
|
195
|
+
if [[ $EXIT_CODE -eq 0 ]]; then
|
|
196
|
+
echo " ✅ Done in ${DURATION_S}s"
|
|
197
|
+
else
|
|
198
|
+
echo " ❌ Agent exited with code $EXIT_CODE (${DURATION_S}s)"
|
|
199
|
+
fi
|
|
200
|
+
[[ -n "$SAVE_PATH" ]] && echo " 📄 Saved to: $SAVE_PATH"
|
|
201
|
+
echo "──────────────────────────────────────────"
|
|
202
|
+
|
|
203
|
+
# ── Update registry ────────────────────────────────────────────────────
|
|
204
|
+
if ! $NO_TRACK; then
|
|
205
|
+
FINAL_STATUS="done"
|
|
206
|
+
[[ $EXIT_CODE -ne 0 ]] && FINAL_STATUS="failed"
|
|
207
|
+
registry_update "$TASK_ID" "status" "\"$FINAL_STATUS\""
|
|
208
|
+
registry_update "$TASK_ID" "finished_at" "$(epoch_ms)"
|
|
209
|
+
fi
|
|
210
|
+
|
|
211
|
+
exit $EXIT_CODE
|
|
@@ -11,7 +11,7 @@ echo ""
|
|
|
11
11
|
|
|
12
12
|
TOTAL_PASS=0
|
|
13
13
|
TOTAL_FAIL=0
|
|
14
|
-
TESTS=(test-cli test-registry test-spawn test-watch test-review test-scope test-notify test-merge test-clean test-learn test-foundation test-modes test-management test-dashboard test-tui test-cost test-templates test-conflicts test-ci-loop test-openclaw test-multi-repo test-routing test-memory test-init test-history test-eval test-reliability test-observability test-practical test-power test-dx test-web test-deps)
|
|
14
|
+
TESTS=(test-cli test-registry test-spawn test-watch test-review test-scope test-notify test-merge test-clean test-learn test-foundation test-modes test-management test-dashboard test-tui test-cost test-templates test-conflicts test-ci-loop test-openclaw test-multi-repo test-routing test-memory test-init test-history test-eval test-reliability test-observability test-practical test-power test-dx test-web test-deps test-quick-run)
|
|
15
15
|
|
|
16
16
|
for test in "${TESTS[@]}"; do
|
|
17
17
|
echo "────────────────────────────────────────"
|
|
@@ -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.
|
|
138
|
-
echo " ✅ version is 1.
|
|
137
|
+
if [[ "$version" == "1.6.1" ]]; then
|
|
138
|
+
echo " ✅ version is 1.6.1"; PASS=$((PASS+1))
|
|
139
139
|
else
|
|
140
|
-
echo " ❌ version is $version, expected 1.
|
|
140
|
+
echo " ❌ version is $version, expected 1.6.1"; 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.
|
|
80
|
+
assert_eq "version is 1.6.1" "1.6.1" "$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.
|
|
124
|
+
assert_eq "version is 1.6.1" "1.6.1" "$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.
|
|
99
|
+
assert_eq "version is 1.6.1" "1.6.1" "$version"
|
|
100
100
|
|
|
101
101
|
echo ""
|
|
102
102
|
echo "Results: $PASS passed, $FAIL failed"
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# test-quick-run.sh — Tests for clawforge quick-run
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
6
|
+
CLI="${SCRIPT_DIR}/../bin/clawforge"
|
|
7
|
+
QR="${SCRIPT_DIR}/../bin/quick-run.sh"
|
|
8
|
+
|
|
9
|
+
PASS=0 FAIL=0
|
|
10
|
+
|
|
11
|
+
assert_ok() {
|
|
12
|
+
local desc="$1"; shift
|
|
13
|
+
if "$@" >/dev/null 2>&1; then
|
|
14
|
+
echo " ✅ $desc"; ((PASS++)) || true
|
|
15
|
+
else
|
|
16
|
+
echo " ❌ $desc"; ((FAIL++)) || true
|
|
17
|
+
fi
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
assert_fail() {
|
|
21
|
+
local desc="$1"; shift
|
|
22
|
+
if ! "$@" >/dev/null 2>&1; then
|
|
23
|
+
echo " ✅ $desc"; ((PASS++)) || true
|
|
24
|
+
else
|
|
25
|
+
echo " ❌ $desc"; ((FAIL++)) || true
|
|
26
|
+
fi
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
assert_contains() {
|
|
30
|
+
local desc="$1" needle="$2"; shift 2
|
|
31
|
+
local output
|
|
32
|
+
output=$("$@" 2>&1 || true)
|
|
33
|
+
if grep -q "$needle" <<< "$output"; then
|
|
34
|
+
echo " ✅ $desc"; ((PASS++)) || true
|
|
35
|
+
else
|
|
36
|
+
echo " ❌ $desc (expected '$needle' in output)"; ((FAIL++)) || true
|
|
37
|
+
fi
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
echo "=== test-quick-run.sh ==="
|
|
41
|
+
|
|
42
|
+
# Test 1: script exists and is executable
|
|
43
|
+
echo "Test 1: script exists"
|
|
44
|
+
assert_ok "quick-run.sh exists" test -f "$QR"
|
|
45
|
+
assert_ok "quick-run.sh is executable" test -x "$QR"
|
|
46
|
+
|
|
47
|
+
# Test 2: --help
|
|
48
|
+
echo "Test 2: --help"
|
|
49
|
+
assert_ok "help exits 0" "$QR" --help
|
|
50
|
+
assert_contains "help shows usage" "Usage:" "$QR" --help
|
|
51
|
+
assert_contains "help shows --dir" "\-\-dir" "$QR" --help
|
|
52
|
+
assert_contains "help shows --agent" "\-\-agent" "$QR" --help
|
|
53
|
+
assert_contains "help shows --model" "\-\-model" "$QR" --help
|
|
54
|
+
assert_contains "help shows --save" "\-\-save" "$QR" --help
|
|
55
|
+
assert_contains "help shows --budget" "\-\-budget" "$QR" --help
|
|
56
|
+
assert_contains "help shows --no-track" "\-\-no-track" "$QR" --help
|
|
57
|
+
assert_contains "help shows --dry-run" "\-\-dry-run" "$QR" --help
|
|
58
|
+
|
|
59
|
+
# Test 3: missing task fails
|
|
60
|
+
echo "Test 3: missing task"
|
|
61
|
+
assert_fail "no task fails" "$QR"
|
|
62
|
+
|
|
63
|
+
# Test 4: bad dir fails
|
|
64
|
+
echo "Test 4: bad dir"
|
|
65
|
+
assert_fail "nonexistent dir fails" "$QR" "task" --dir /nonexistent/path
|
|
66
|
+
|
|
67
|
+
# Test 5: dry-run
|
|
68
|
+
echo "Test 5: dry-run"
|
|
69
|
+
TMPDIR_TEST=$(mktemp -d)
|
|
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:" "$QR" "Explain the code" --dir "$TMPDIR_TEST" --dry-run
|
|
72
|
+
assert_contains "dry-run shows dir" "$TMPDIR_TEST" "$QR" "Explain the code" --dir "$TMPDIR_TEST" --dry-run
|
|
73
|
+
assert_contains "dry-run shows model" "model" "$QR" "Explain the code" --dir "$TMPDIR_TEST" --dry-run
|
|
74
|
+
assert_contains "dry-run no-track shows no" "no" "$QR" "Explain the code" --dir "$TMPDIR_TEST" --dry-run --no-track
|
|
75
|
+
rm -rf "$TMPDIR_TEST"
|
|
76
|
+
|
|
77
|
+
# Test 6: CLI routes quick-run
|
|
78
|
+
echo "Test 6: CLI routing"
|
|
79
|
+
assert_contains "CLI help shows quick-run" "quick-run" "$CLI" help
|
|
80
|
+
assert_contains "CLI routes to script" "Usage:" "$CLI" quick-run --help
|
|
81
|
+
|
|
82
|
+
# Test 7: dry-run with options
|
|
83
|
+
echo "Test 7: dry-run with budget + save"
|
|
84
|
+
TMPDIR_TEST=$(mktemp -d)
|
|
85
|
+
assert_contains "dry-run shows budget" "Budget" \
|
|
86
|
+
"$QR" "Fix the bug" --dir "$TMPDIR_TEST" --dry-run --budget 1.50
|
|
87
|
+
assert_contains "dry-run shows save path" "/tmp" \
|
|
88
|
+
"$QR" "Fix the bug" --dir "$TMPDIR_TEST" --dry-run --save /tmp/out.log
|
|
89
|
+
rm -rf "$TMPDIR_TEST"
|
|
90
|
+
|
|
91
|
+
# Test 8: registry + log setup (with --no-track, no agent needed)
|
|
92
|
+
echo "Test 8: source inspection"
|
|
93
|
+
assert_contains "has epoch_ms" "epoch_ms" cat "$QR"
|
|
94
|
+
assert_contains "has registry_add" "registry_add" cat "$QR"
|
|
95
|
+
assert_contains "has log_path" "log_path" cat "$QR"
|
|
96
|
+
assert_contains "has tee" "tee" cat "$QR"
|
|
97
|
+
assert_contains "has quick-run mode" "quick-run" cat "$QR"
|
|
98
|
+
assert_contains "has detect_agent" "detect_agent" cat "$QR"
|
|
99
|
+
assert_contains "has no-track flag" "NO_TRACK" cat "$QR"
|
|
100
|
+
assert_contains "has budget flag" "BUDGET" cat "$QR"
|
|
101
|
+
assert_contains "has save flag" "SAVE_PATH" cat "$QR"
|
|
102
|
+
|
|
103
|
+
echo ""
|
|
104
|
+
echo "Results: $PASS passed, $FAIL failed"
|
|
105
|
+
[[ $FAIL -eq 0 ]] && exit 0 || exit 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.
|
|
99
|
+
assert_eq "version is 1.6.1" "1.6.1" "$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.
|
|
110
|
+
assert_eq "version is 1.6.1" "1.6.1" "$version"
|
|
111
111
|
|
|
112
112
|
echo ""
|
|
113
113
|
echo "Results: $PASS passed, $FAIL failed"
|
clawforge_cli-1.5.5/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
1.5.5
|
|
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
|