Skip to content

Commit 1a58169

Browse files
author
Rex
committed
breaking(cli): remove rexos command compatibility; loopforge only
1 parent 3410a9c commit 1a58169

65 files changed

Lines changed: 244 additions & 272 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/release-dry-run.yml

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,15 @@ jobs:
1818
- os: ubuntu-latest
1919
target: x86_64-unknown-linux-gnu
2020
bin: target/release/loopforge
21-
compat_bin: target/release/rexos
2221
- os: macos-15-intel
2322
target: x86_64-apple-darwin
2423
bin: target/release/loopforge
25-
compat_bin: target/release/rexos
2624
- os: macos-14
2725
target: aarch64-apple-darwin
2826
bin: target/release/loopforge
29-
compat_bin: target/release/rexos
3027
- os: windows-latest
3128
target: x86_64-pc-windows-msvc
3229
bin: target/release/loopforge.exe
33-
compat_bin: target/release/rexos.exe
3430

3531
steps:
3632
- name: Checkout
@@ -51,7 +47,7 @@ jobs:
5147
run: cargo build --release -p rexos-cli --locked
5248

5349
- name: Package (dry run)
54-
run: python scripts/package_release.py --version "dryrun-${{ github.run_id }}" --target "${{ matrix.target }}" --bin "${{ matrix.bin }}" --compat-bin "${{ matrix.compat_bin }}" --out-dir dist
50+
run: python scripts/package_release.py --version "dryrun-${{ github.run_id }}" --target "${{ matrix.target }}" --bin "${{ matrix.bin }}" --out-dir dist
5551

5652
- name: Smoke test packaged binary (Unix)
5753
if: runner.os != 'Windows'
@@ -65,9 +61,7 @@ jobs:
6561
mkdir -p smoke
6662
tar -xzf "${archive}" -C smoke
6763
bin="smoke/${base}/loopforge"
68-
compat_bin="smoke/${base}/rexos"
6964
"${bin}" --help >/dev/null
70-
"${compat_bin}" --help >/dev/null
7165
doctor_json="$("${bin}" doctor --json --timeout-ms 200)"
7266
printf '%s' "${doctor_json}" | python3 -c "import json,sys; data=json.load(sys.stdin); assert 'summary' in data and 'checks' in data"
7367
@@ -82,9 +76,7 @@ jobs:
8276
Remove-Item -Recurse -Force smoke -ErrorAction SilentlyContinue
8377
Expand-Archive -Path $archive -DestinationPath smoke -Force
8478
$bin = "smoke/$base/loopforge.exe"
85-
$compatBin = "smoke/$base/rexos.exe"
8679
& $bin --help | Out-Null
87-
& $compatBin --help | Out-Null
8880
$doctor = & $bin doctor --json --timeout-ms 200
8981
$parsed = $doctor | ConvertFrom-Json
9082
if ($null -eq $parsed.summary -or $null -eq $parsed.checks) {

.github/workflows/release.yml

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,15 @@ jobs:
1818
- os: ubuntu-latest
1919
target: x86_64-unknown-linux-gnu
2020
bin: target/release/loopforge
21-
compat_bin: target/release/rexos
2221
- os: macos-15-intel
2322
target: x86_64-apple-darwin
2423
bin: target/release/loopforge
25-
compat_bin: target/release/rexos
2624
- os: macos-14
2725
target: aarch64-apple-darwin
2826
bin: target/release/loopforge
29-
compat_bin: target/release/rexos
3027
- os: windows-latest
3128
target: x86_64-pc-windows-msvc
3229
bin: target/release/loopforge.exe
33-
compat_bin: target/release/rexos.exe
3430

3531
steps:
3632
- name: Checkout
@@ -54,7 +50,7 @@ jobs:
5450
run: cargo build --release -p rexos-cli --locked
5551

5652
- name: Package
57-
run: python scripts/package_release.py --version "${{ github.ref_name }}" --target "${{ matrix.target }}" --bin "${{ matrix.bin }}" --compat-bin "${{ matrix.compat_bin }}" --out-dir dist
53+
run: python scripts/package_release.py --version "${{ github.ref_name }}" --target "${{ matrix.target }}" --bin "${{ matrix.bin }}" --out-dir dist
5854

5955
- name: Smoke test packaged binary (Unix)
6056
if: runner.os != 'Windows'
@@ -68,9 +64,7 @@ jobs:
6864
mkdir -p smoke
6965
tar -xzf "${archive}" -C smoke
7066
bin="smoke/${base}/loopforge"
71-
compat_bin="smoke/${base}/rexos"
7267
"${bin}" --help >/dev/null
73-
"${compat_bin}" --help >/dev/null
7468
doctor_json="$("${bin}" doctor --json --timeout-ms 200)"
7569
printf '%s' "${doctor_json}" | python3 -c "import json,sys; data=json.load(sys.stdin); assert 'summary' in data and 'checks' in data"
7670
@@ -85,9 +79,7 @@ jobs:
8579
Remove-Item -Recurse -Force smoke -ErrorAction SilentlyContinue
8680
Expand-Archive -Path $archive -DestinationPath smoke -Force
8781
$bin = "smoke/$base/loopforge.exe"
88-
$compatBin = "smoke/$base/rexos.exe"
8982
& $bin --help | Out-Null
90-
& $compatBin --help | Out-Null
9183
$doctor = & $bin doctor --json --timeout-ms 200
9284
$parsed = $doctor | ConvertFrom-Json
9385
if ($null -eq $parsed.summary -or $null -eq $parsed.checks) {

README.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ LoopForge (formerly RexOS) is a long-running agent operating system: persistent
88

99
- Public product name: **LoopForge**
1010
- Primary CLI command: `loopforge`
11-
- Compatibility names still in use: `rexos` (CLI alias), `~/.rexos` (config/data dir), and `rexleimo/rexos` (repo path)
12-
- Existing scripts/docs using `rexos` continue to work
11+
- Runtime data path remains `~/.rexos` for now.
1312

1413
## Documentation
1514

@@ -25,7 +24,6 @@ This repository is bootstrapped with a long-running harness (`features.json`, `i
2524
### Option A: Download a prebuilt binary (recommended)
2625

2726
Download the archive for your OS from GitHub Releases, extract it, and put `loopforge` (or `loopforge.exe`) somewhere on your `PATH`.
28-
The compatibility command `rexos` is still included during migration.
2927

3028
### Option B: Build from source
3129

@@ -53,7 +51,7 @@ LoopForge defaults to `ollama` at `http://127.0.0.1:11434/v1` in `~/.rexos/confi
5351
# 1) Start Ollama
5452
ollama serve
5553

56-
# 2) Init LoopForge (compat command: rexos init)
54+
# 2) Init LoopForge
5755
loopforge init
5856

5957
# 3) Run an agent session in a workspace directory

README.zh-CN.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ LoopForge(原 RexOS)是一个长任务的 Agent OS:持久化记忆、工
88

99
- 对外产品名:**LoopForge**
1010
- 主 CLI 命令:`loopforge`
11-
- 兼容名仍保留:`rexos`(CLI 兼容别名)、`~/.rexos`(配置/数据目录)、`rexleimo/rexos`(仓库路径)
12-
- 现有脚本和文档中的 `rexos` 命令可继续使用
11+
- 运行时数据目录暂保持为 `~/.rexos`
1312

1413
## 文档
1514

@@ -25,7 +24,6 @@ LoopForge(原 RexOS)是一个长任务的 Agent OS:持久化记忆、工
2524
### 方案 A:下载预编译二进制(推荐)
2625

2726
从 GitHub Releases 下载对应你系统的压缩包,解压后把 `loopforge`(或 `loopforge.exe`)放到 `PATH` 里即可。
28-
迁移期间仍包含 `rexos` 兼容命令。
2927

3028
### 方案 B:从源码构建
3129

@@ -53,7 +51,7 @@ LoopForge 默认配置会在 `~/.rexos/config.toml` 里把 `ollama` 指向 `http
5351
# 1) 启动 Ollama
5452
ollama serve
5553

56-
# 2) 初始化 LoopForge(兼容命令:rexos init)
54+
# 2) 初始化 LoopForge
5755
loopforge init
5856

5957
# 3) 在某个 workspace 目录里运行一次 agent session

crates/rexos-cli/Cargo.toml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@ rust-version.workspace = true
99
name = "loopforge"
1010
path = "src/main.rs"
1111

12-
[[bin]]
13-
name = "rexos"
14-
path = "src/main.rs"
15-
1612
[dependencies]
1713
anyhow.workspace = true
1814
clap.workspace = true

crates/rexos-cli/src/doctor.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ impl DoctorReport {
5555

5656
pub fn to_text(&self) -> String {
5757
let mut out = String::new();
58-
out.push_str("RexOS doctor\n\n");
58+
out.push_str("LoopForge doctor\n\n");
5959
for c in &self.checks {
6060
let prefix = match c.status {
6161
CheckStatus::Ok => "OK ",
@@ -111,7 +111,7 @@ pub async fn run_doctor(opts: DoctorOptions) -> anyhow::Result<DoctorReport> {
111111
if config_path.exists() {
112112
""
113113
} else {
114-
" (missing; run `loopforge init` or `rexos init`)"
114+
" (missing; run `loopforge init`)"
115115
}
116116
),
117117
});
@@ -129,7 +129,7 @@ pub async fn run_doctor(opts: DoctorOptions) -> anyhow::Result<DoctorReport> {
129129
if db_path.exists() {
130130
""
131131
} else {
132-
" (missing; run `loopforge init` or `rexos init`)"
132+
" (missing; run `loopforge init`)"
133133
}
134134
),
135135
});

crates/rexos-cli/src/main.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ enum Command {
4848
/// One-command onboarding check (init + config + doctor + optional first task)
4949
Onboard {
5050
/// Workspace directory for the first verification run
51-
#[arg(long, default_value = "rexos-onboard-demo")]
51+
#[arg(long, default_value = "loopforge-onboard-demo")]
5252
workspace: PathBuf,
5353
/// Prompt for the first verification run
5454
#[arg(long, default_value = "Create hello.txt with the word hi")]
@@ -977,26 +977,26 @@ mod tests {
977977

978978
#[test]
979979
fn cli_parses_config_validate_subcommand() {
980-
let parsed = Cli::try_parse_from(["rexos", "config", "validate"]);
980+
let parsed = Cli::try_parse_from(["loopforge", "config", "validate"]);
981981
assert!(
982982
parsed.is_ok(),
983-
"expected `rexos config validate` to parse, got: {parsed:?}"
983+
"expected `loopforge config validate` to parse, got: {parsed:?}"
984984
);
985985
}
986986

987987
#[test]
988988
fn cli_parses_release_check_subcommand() {
989-
let parsed = Cli::try_parse_from(["rexos", "release", "check", "--tag", "v0.1.0"]);
989+
let parsed = Cli::try_parse_from(["loopforge", "release", "check", "--tag", "v0.1.0"]);
990990
assert!(
991991
parsed.is_ok(),
992-
"expected `rexos release check` to parse, got: {parsed:?}"
992+
"expected `loopforge release check` to parse, got: {parsed:?}"
993993
);
994994
}
995995

996996
#[test]
997997
fn cli_parses_acp_events_subcommand() {
998998
let parsed = Cli::try_parse_from([
999-
"rexos",
999+
"loopforge",
10001000
"acp",
10011001
"events",
10021002
"--session",
@@ -1006,29 +1006,29 @@ mod tests {
10061006
]);
10071007
assert!(
10081008
parsed.is_ok(),
1009-
"expected `rexos acp events` to parse, got: {parsed:?}"
1009+
"expected `loopforge acp events` to parse, got: {parsed:?}"
10101010
);
10111011
}
10121012

10131013
#[test]
10141014
fn cli_parses_acp_checkpoints_subcommand() {
10151015
let parsed = Cli::try_parse_from([
1016-
"rexos",
1016+
"loopforge",
10171017
"acp",
10181018
"checkpoints",
10191019
"--session",
10201020
"s-1",
10211021
]);
10221022
assert!(
10231023
parsed.is_ok(),
1024-
"expected `rexos acp checkpoints` to parse, got: {parsed:?}"
1024+
"expected `loopforge acp checkpoints` to parse, got: {parsed:?}"
10251025
);
10261026
}
10271027

10281028
#[test]
10291029
fn cli_parses_agent_run_allowed_tools() {
10301030
let parsed = Cli::try_parse_from([
1031-
"rexos",
1031+
"loopforge",
10321032
"agent",
10331033
"run",
10341034
"--workspace",
@@ -1047,10 +1047,10 @@ mod tests {
10471047
#[test]
10481048
fn cli_parses_onboard_subcommand() {
10491049
let parsed =
1050-
Cli::try_parse_from(["rexos", "onboard", "--workspace", "rexos-onboard-demo"]);
1050+
Cli::try_parse_from(["loopforge", "onboard", "--workspace", "loopforge-onboard-demo"]);
10511051
assert!(
10521052
parsed.is_ok(),
1053-
"expected `rexos onboard` to parse, got: {parsed:?}"
1053+
"expected `loopforge onboard` to parse, got: {parsed:?}"
10541054
);
10551055
}
10561056

docs-site/blog/rexos-vs-openfang-openclaw.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ Goal: help builders choose the right tool faster.
2424
LoopForge pushes a strict engineering loop:
2525

2626
```bash
27-
rexos harness init my-repo
28-
rexos harness run my-repo --prompt "Run tests and fix one failing case"
27+
loopforge harness init my-repo
28+
loopforge harness run my-repo --prompt "Run tests and fix one failing case"
2929
```
3030

3131
If your team measures progress by repeatable checkpoints and artifact trails, this pattern is very effective.
@@ -36,8 +36,8 @@ LoopForge default path is optimized for local bring-up with Ollama:
3636

3737
```bash
3838
ollama serve
39-
rexos init
40-
rexos agent run --workspace rexos-work --prompt "Create hello.txt with the word hi"
39+
loopforge init
40+
loopforge agent run --workspace rexos-work --prompt "Create hello.txt with the word hi"
4141
```
4242

4343
This keeps first-run friction low for engineering teams.
@@ -65,8 +65,8 @@ Use this simple decision tree:
6565

6666
```bash
6767
ollama serve
68-
rexos init
69-
rexos agent run --workspace rexos-demo --prompt "Create notes/plan.md with a 7-day migration checklist"
68+
loopforge init
69+
loopforge agent run --workspace rexos-demo --prompt "Create notes/plan.md with a 7-day migration checklist"
7070
```
7171

7272
## Next reading

docs-site/blog/what-is-loopforge.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,10 @@ LoopForge is a **local-first long-running Agent OS** for engineering workflows:
1818

1919
Changed:
2020
- Product/public name: **LoopForge**
21+
- CLI command: `loopforge`
2122

22-
Unchanged for compatibility:
23-
- CLI command: `rexos`
23+
Kept for continuity:
2424
- Config and data dir: `~/.rexos`
25-
- Existing command snippets and scripts continue to work
2625

2726
## Why the name "LoopForge"
2827

@@ -34,8 +33,8 @@ Unchanged for compatibility:
3433

3534
```bash
3635
ollama serve
37-
rexos init
38-
rexos agent run --workspace loopforge-demo --prompt "Create notes/hello.md with a short intro to LoopForge."
36+
loopforge init
37+
loopforge agent run --workspace loopforge-demo --prompt "Create notes/hello.md with a short intro to LoopForge."
3938
```
4039

4140
## Brand keywords (for docs/search/community)

docs-site/examples/case-tasks/browser-evidence.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ This is a good first “browser + LLM” workflow.
1515
```bash
1616
export REXOS_BROWSER_HEADLESS=0
1717

18-
rexos agent run --workspace . --prompt "Use browser tools to open https://en.wikipedia.org/wiki/Large_language_model . Wait for #firstHeading (browser_wait). Run browser_run_js to extract document.title and the heading text. Scroll down by 800px (browser_scroll). Read the page and write notes/browser_evidence.md with: URL, title, heading, and a 5-bullet summary based only on the page text. Save a screenshot to .rexos/browser/wikipedia_llm.png. Close the browser."
18+
loopforge agent run --workspace . --prompt "Use browser tools to open https://en.wikipedia.org/wiki/Large_language_model . Wait for #firstHeading (browser_wait). Run browser_run_js to extract document.title and the heading text. Scroll down by 800px (browser_scroll). Read the page and write notes/browser_evidence.md with: URL, title, heading, and a 5-bullet summary based only on the page text. Save a screenshot to .rexos/browser/wikipedia_llm.png. Close the browser."
1919
```
2020

2121
=== "PowerShell (Windows)"
2222
```powershell
2323
$env:REXOS_BROWSER_HEADLESS = "0"
2424

25-
rexos agent run --workspace . --prompt "Use browser tools to open https://en.wikipedia.org/wiki/Large_language_model . Wait for #firstHeading (browser_wait). Run browser_run_js to extract document.title and the heading text. Scroll down by 800px (browser_scroll). Read the page and write notes/browser_evidence.md with: URL, title, heading, and a 5-bullet summary based only on the page text. Save a screenshot to .rexos/browser/wikipedia_llm.png. Close the browser."
25+
loopforge agent run --workspace . --prompt "Use browser tools to open https://en.wikipedia.org/wiki/Large_language_model . Wait for #firstHeading (browser_wait). Run browser_run_js to extract document.title and the heading text. Scroll down by 800px (browser_scroll). Read the page and write notes/browser_evidence.md with: URL, title, heading, and a 5-bullet summary based only on the page text. Save a screenshot to .rexos/browser/wikipedia_llm.png. Close the browser."
2626
```
2727

2828
## What to expect

0 commit comments

Comments
 (0)