mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-21 15:55:50 +00:00
* 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>
209 lines
6.2 KiB
TypeScript
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",
|
|
);
|
|
});
|
|
});
|
|
});
|