mirror of
https://bitbucket.org/siakitem/my-pi.git
synced 2026-10-26 10:45:22 +00:00
真实会话里模型仍习惯性先调 bash grep,被拒后才改用 grep 工具;系统提示词里已有 4 处 提醒,但模型下调用决定时看的是工具 schema 描述,而 Pi 内置 bash 描述对此只字未提。 - 新增 extensions/bash-override.ts:用 Pi 的 createBashToolDefinition 重新注册 bash, 执行、输出结构与 codemode 说明完全沿用上游;shellPath/commandPrefix 按 ctx.cwd 经 SettingsManager 惰性解析,与内置一致 - tools.jsonc 新增 descriptionAppend 字段,由 prompt-guard 注册时拼接到上游描述后 - bash 增加命令→工具对照规则(grep -n / grep -rl / find -name),并提示 文件清单用 $(git ls-files) 传参、不要接 xargs(会触发权限审核) Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
108 lines
8.0 KiB
JSON
108 lines
8.0 KiB
JSON
{
|
|
// Bundle-authoritative tool guidance, owned by extensions/system-prompt.ts.
|
|
//
|
|
// Every tool the bundle can expose must have an entry. Per field:
|
|
// "snippet" — replaces the tool's one-line <tools> entry (null hides it)
|
|
// "guidelines" — replaces the tool's <rules> lines
|
|
// "description" — replaces the tool description at registration
|
|
// "descriptionAppend" — appended to the description at registration (on top
|
|
// of "description" when both are set)
|
|
// "description"/"descriptionAppend" only apply to tools registered through a
|
|
// bundle adapter (prompt-guard), which includes the bash override and the
|
|
// third-party wrappers; other in-repo tools edit their own source instead.
|
|
// An absent field keeps the upstream text. "inherit": true means the
|
|
// upstream text was reviewed against this bundle and is kept as-is.
|
|
"version": 1,
|
|
"tools": {
|
|
"bash": {
|
|
"snippet": "Run shell commands for builds, tests, git, package scripts, and other programs; search files with the find/grep tools, not bash",
|
|
"descriptionAppend": "Not for searching files: use the grep tool for file contents and the find tool for paths (e.g. `grep -n X src/*.ts` → grep {pattern: \"X\", path: \"src/*.ts\"}); grep, rg, find, fd, and git grep are denied here. When a program needs many files, pass $(git ls-files '<glob>') as arguments instead of piping into xargs, which triggers a permission review.",
|
|
"guidelines": [
|
|
"You can inspect PI_* environment variables for current model and session details.",
|
|
"Search commands are denied in bash; call the tools instead: `grep -n X src/*.ts` → grep {pattern: \"X\", path: \"src/*.ts\"}; `grep -rl X src` → grep {pattern: \"X\", path: \"src/\"} and take the file names; `find . -name '*.ts'` → find {pattern: \"\", path: \"**/*.ts\"}.",
|
|
"When a program needs many files (wc, node, tsc), pass $(git ls-files '<glob>') as arguments; piping into xargs triggers a permission review."
|
|
]
|
|
},
|
|
"read": { "inherit": true },
|
|
"edit": {
|
|
"guidelines": [
|
|
"Use edit with LINE#HASH anchors from the latest read or edit result for all file changes; batch every change to one file into a single edit call.",
|
|
"find/grep results carry plain line numbers, not LINE#HASH anchors; read the exact target range before editing.",
|
|
"Never reuse anchors from an earlier read or edit response once a newer one exists for the same file; treat only the most recent response as carrying valid anchors.",
|
|
"After a successful edit, the returned --- Anchors --- block replaces a re-read for nearby follow-up edits.",
|
|
"On [E_STALE_ANCHOR], the error lists the stale refs and any content-matched candidate anchors; re-read the file to get current anchors before retrying."
|
|
],
|
|
"description": "Patch a text file at `LINE#HASH` anchors copied verbatim from the latest read result or the anchors block of a previous edit. find/grep results have no anchors — read the target range first.\n\nBatch every change to a file into one `edit` call: all operations go in the `edits` array, every edit sets `op`, and all anchors must come from the same pre-edit read. Edits validate against one snapshot and apply together, so line numbers never shift between entries of the same call.\n\nOps:\n- `replace` — replace the single line at `pos`, or the inclusive span `pos`..`end`. `lines` is the complete new content for the whole span; `lines: []` deletes it. Without `end`, exactly one line is replaced no matter how many entries `lines` has.\n- `append` — insert `lines` after `pos`; omit `pos` to append at end of file.\n- `prepend` — insert `lines` before `pos`; omit `pos` to insert at start of file.\n\nExample — single-line and span replace in one call:\n```json\n{ \"path\": \"src/main.ts\", \"edits\": [\n { \"op\": \"replace\", \"pos\": \"12#MQ\", \"lines\": [\"const x = 1;\"] },\n { \"op\": \"replace\", \"pos\": \"5#VR\", \"end\": \"8#QV\", \"lines\": [\n \"function greet(name) {\",\n \" return `Hello, ${name}`;\",\n \"}\"\n ] }\n] }\n```\n\nRules:\n- `lines` is literal file content with exact indentation. Never include `LINE#HASH:` or bare `HH:` prefixes, diff `+`/`-` markers, or a copy of a neighboring line — the `:content` part of an anchor is context for you, not payload, and repeating a boundary line duplicates it in the file.\n- Anchors are opaque: copy them exactly, never compute, shift, or guess one.\n- An anchor may keep the `:content` suffix from read output (`\"12#MQ: const x = 1;\"`). The runtime cross-checks that content against the file — catching hash collisions and recovering whitespace-only drift — so keep it for high-risk anchors such as range endpoints. Copy the content as rendered; if you shorten it, keep the start of the line and mark the cut with `...`.\n- Edits in one call must not overlap or touch adjacent lines — merge such changes into a single edit."
|
|
},
|
|
"write": { "inherit": true },
|
|
"ls": { "inherit": true },
|
|
"powershell": { "inherit": true },
|
|
"grep": { "snippet": "Search file contents via the FFF index (git-aware, smart-case, frecency-ranked, regex or literal); replaces bash grep/rg" },
|
|
"find": { "snippet": "Find files by fuzzy path or glob via the FFF index; replaces bash find/fd" },
|
|
"tool_search": { "inherit": true },
|
|
"codemode": {
|
|
"guidelines": [
|
|
"Use codemode to batch two or more independent tool calls (Promise.allSettled), chain dependent lookups, or filter large output down to what you need; call a single tool directly instead of wrapping it in a script.",
|
|
"Call edit, write, ssh_connect, ssh_cd, ask_user_question, and Agent directly, never from a codemode script.",
|
|
"Inside scripts, search with tools.grep or tools.find and do extraction, dedup, and counting in JavaScript; never run grep, find, rg, or fd through tools.bash."
|
|
]
|
|
},
|
|
|
|
"codegraph_explore": { "snippet": "Explore code structure from the CodeGraph index: symbols, relationships, call flows, and their source" },
|
|
"lsp_diagnostics": { "inherit": true },
|
|
"lsp_definition": { "inherit": true },
|
|
"lsp_references": { "inherit": true },
|
|
"lsp_hover": { "inherit": true },
|
|
"lsp_symbols": { "inherit": true },
|
|
|
|
"web_search": { "inherit": true },
|
|
"web_fetch": { "inherit": true },
|
|
|
|
"memory_search": { "inherit": true },
|
|
"session_search": { "inherit": true },
|
|
"memory_add": { "inherit": true },
|
|
"memory_replace": { "inherit": true },
|
|
"memory_remove": { "inherit": true },
|
|
"skill_manage": { "inherit": true },
|
|
"context_tree_query": { "inherit": true },
|
|
"overflow_query": { "inherit": true },
|
|
|
|
"ask_user_question": { "inherit": true },
|
|
|
|
"ssh_connect": { "inherit": true },
|
|
"ssh_cd": { "inherit": true },
|
|
"ssh_read": { "inherit": true },
|
|
"ssh_write": { "inherit": true },
|
|
"ssh_edit": { "inherit": true },
|
|
"ssh_find": { "inherit": true },
|
|
"ssh_grep": { "inherit": true },
|
|
"ssh_bash": { "inherit": true },
|
|
|
|
"Agent": { "inherit": true },
|
|
"get_subagent_result": { "inherit": true },
|
|
"steer_subagent": { "inherit": true },
|
|
|
|
"chrome_launch": { "inherit": true },
|
|
"chrome_tab": { "inherit": true },
|
|
"chrome_navigate": { "inherit": true },
|
|
"chrome_snapshot": { "inherit": true },
|
|
"chrome_find": { "inherit": true },
|
|
"chrome_inspect": { "inherit": true },
|
|
"chrome_wait_for": { "inherit": true },
|
|
"chrome_screenshot": { "inherit": true },
|
|
"chrome_click": { "inherit": true },
|
|
"chrome_type": { "inherit": true },
|
|
"chrome_fill": { "inherit": true },
|
|
"chrome_key": { "inherit": true },
|
|
"chrome_hover": { "inherit": true },
|
|
"chrome_drag": { "inherit": true },
|
|
"chrome_tap": { "inherit": true },
|
|
"chrome_scroll": { "inherit": true },
|
|
"chrome_evaluate": { "inherit": true },
|
|
"chrome_list_console_messages": { "inherit": true },
|
|
"chrome_list_network_requests": { "inherit": true },
|
|
"chrome_get_network_request": { "inherit": true },
|
|
"chrome_upload_file": { "inherit": true }
|
|
}
|
|
}
|