Files
claude-code/packages/builtin-tools/src/tools/PowerShellTool/__tests__/destructiveCommandWarning.test.ts
claude-code-best 2fb1c9dcd8 feat: 工具层及 mcp 大重构 (#252)
* feat: 第一版大重构

* fix: 修复类型问题

* chore: 更新版本到 1.3.2

* Add brave as alternative WebSearchTool

* fix: 修正顺序

* fix: 修复对穷鬼模式的 auto dream 和 session memory 越过

* feat: 穷鬼模式去除 session-summary

* feat: 创建 builtin-tools 包,搬运所有工具实现

将 src/tools/ 下的全部 60 个工具目录迁移至 packages/builtin-tools/src/tools/,
内部导入路径已更新为 src/ alias 模式。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: 更新 src/ 中所有工具引用至 builtin-tools 包,删除 src/tools/

- src/tools.ts 及 178 个 src/ 文件的 import 路径从 ./tools/ 改为 builtin-tools/tools/
- 删除 src/tools/ 整个目录(已迁移至 packages/builtin-tools/)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: 添加 builtin-tools 路径别名至 tsconfig,更新 bun.lock

- tsconfig.json 新增 builtin-tools/* 和 builtin-tools 路径映射
- 新增 packages/builtin-tools/src 至 include

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: 为 builtin-tools、mcp-client、agent-tools 添加 @claude-code-best 作用域前缀

所有包名及 import 路径统一添加 @claude-code-best/ 前缀:
- builtin-tools → @claude-code-best/builtin-tools
- mcp-client → @claude-code-best/mcp-client
- agent-tools → @claude-code-best/agent-tools

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: 修复 node 环境没有 bun 的问题

---------

Co-authored-by: Eric-Guo <eric.guocz@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 09:52:05 +08:00

209 lines
6.2 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { getDestructiveCommandWarning } from "../destructiveCommandWarning";
describe("getDestructiveCommandWarning", () => {
describe("recursive force remove", () => {
test("Remove-Item -Recurse -Force", () => {
expect(getDestructiveCommandWarning("Remove-Item ./x -Recurse -Force")).toBe(
"Note: may recursively force-remove files",
);
});
test("rm -Recurse -Force alias", () => {
expect(getDestructiveCommandWarning("rm ./x -Recurse -Force")).toBe(
"Note: may recursively force-remove files",
);
});
test("ri -Recurse -Force alias", () => {
expect(getDestructiveCommandWarning("ri ./x -Recurse -Force")).toBe(
"Note: may recursively force-remove files",
);
});
test("Remove-Item -Force -Recurse (reversed order)", () => {
expect(getDestructiveCommandWarning("Remove-Item ./x -Force -Recurse")).toBe(
"Note: may recursively force-remove files",
);
});
test("Remove-Item -Recurse only", () => {
expect(getDestructiveCommandWarning("Remove-Item ./x -Recurse")).toBe(
"Note: may recursively remove files",
);
});
test("Remove-Item -Force only", () => {
expect(getDestructiveCommandWarning("Remove-Item ./x -Force")).toBe(
"Note: may force-remove files",
);
});
});
describe("safe remove commands", () => {
test("Remove-Item without -Recurse or -Force is safe", () => {
expect(getDestructiveCommandWarning("Remove-Item ./x")).toBeNull();
});
test("del without flags is safe", () => {
expect(getDestructiveCommandWarning("del ./x")).toBeNull();
});
});
describe("disk operations", () => {
test("Format-Volume is destructive", () => {
expect(getDestructiveCommandWarning("Format-Volume -DriveLetter C")).toBe(
"Note: may format a disk volume",
);
});
test("Clear-Disk is destructive", () => {
expect(getDestructiveCommandWarning("Clear-Disk -Number 0")).toBe(
"Note: may clear a disk",
);
});
});
describe("git destructive operations", () => {
test("git reset --hard", () => {
expect(getDestructiveCommandWarning("git reset --hard HEAD~1")).toBe(
"Note: may discard uncommitted changes",
);
});
test("git push --force", () => {
expect(getDestructiveCommandWarning("git push --force origin main")).toBe(
"Note: may overwrite remote history",
);
});
test("git push -f", () => {
expect(getDestructiveCommandWarning("git push -f")).toBe(
"Note: may overwrite remote history",
);
});
test("git push --force-with-lease", () => {
expect(getDestructiveCommandWarning("git push --force-with-lease")).toBe(
"Note: may overwrite remote history",
);
});
test("git clean -fd", () => {
expect(getDestructiveCommandWarning("git clean -fd")).toBe(
"Note: may permanently delete untracked files",
);
});
test("git clean -fdx", () => {
expect(getDestructiveCommandWarning("git clean -fdx")).toBe(
"Note: may permanently delete untracked files",
);
});
test("git stash drop", () => {
expect(getDestructiveCommandWarning("git stash drop")).toBe(
"Note: may permanently remove stashed changes",
);
});
test("git stash clear", () => {
expect(getDestructiveCommandWarning("git stash clear")).toBe(
"Note: may permanently remove stashed changes",
);
});
test("git push (normal) is safe", () => {
expect(getDestructiveCommandWarning("git push origin main")).toBeNull();
});
test("git clean -n (dry-run) is safe", () => {
expect(getDestructiveCommandWarning("git clean -n")).toBeNull();
});
test("git clean --dry-run is safe", () => {
expect(getDestructiveCommandWarning("git clean --dry-run")).toBeNull();
});
});
describe("database operations", () => {
test("DROP TABLE", () => {
expect(getDestructiveCommandWarning("DROP TABLE users")).toBe(
"Note: may drop or truncate database objects",
);
});
test("TRUNCATE TABLE", () => {
expect(getDestructiveCommandWarning("TRUNCATE TABLE users")).toBe(
"Note: may drop or truncate database objects",
);
});
test("DROP DATABASE", () => {
expect(getDestructiveCommandWarning("DROP DATABASE production")).toBe(
"Note: may drop or truncate database objects",
);
});
});
describe("system operations", () => {
test("Stop-Computer", () => {
expect(getDestructiveCommandWarning("Stop-Computer")).toBe(
"Note: will shut down the computer",
);
});
test("Restart-Computer", () => {
expect(getDestructiveCommandWarning("Restart-Computer")).toBe(
"Note: will restart the computer",
);
});
test("Clear-RecycleBin", () => {
expect(getDestructiveCommandWarning("Clear-RecycleBin")).toBe(
"Note: permanently deletes recycled files",
);
});
});
describe("safe commands", () => {
test("Get-Process is safe", () => {
expect(getDestructiveCommandWarning("Get-Process")).toBeNull();
});
test("Get-ChildItem is safe", () => {
expect(getDestructiveCommandWarning("Get-ChildItem")).toBeNull();
});
test("Write-Host is safe", () => {
expect(getDestructiveCommandWarning("Write-Host 'hello'")).toBeNull();
});
test("empty string is safe", () => {
expect(getDestructiveCommandWarning("")).toBeNull();
});
});
describe("piped commands", () => {
test("Remove-Item in pipeline", () => {
expect(
getDestructiveCommandWarning("Get-ChildItem | Remove-Item -Recurse -Force"),
).toBe("Note: may recursively force-remove files");
});
});
describe("case insensitive", () => {
test("REMOVE-ITEM -RECURSE -FORCE", () => {
expect(getDestructiveCommandWarning("REMOVE-ITEM ./x -RECURSE -FORCE")).toBe(
"Note: may recursively force-remove files",
);
});
test("format-volume mixed case", () => {
expect(getDestructiveCommandWarning("Format-volume")).toBe(
"Note: may format a disk volume",
);
});
});
});