Skip to content

Commit c22a8b6

Browse files
macosmacos
authored andcommitted
feat: v2.0.7 — 自测规则精简 + TaskCompleted hook 清理 + Antigravity/Copilot IDE 支持 + permissions 自动写入
1 parent ac51f36 commit c22a8b6

10 files changed

Lines changed: 29 additions & 98 deletions

File tree

‎aivectormemory/i18n/rules/de.py‎

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -249,18 +249,9 @@
249249
"- **Kein** `lsof -ti:Port` ohne ignoreWarning (wird von Sicherheitsprüfung blockiert)\n"
250250
"- **Korrekter Ansatz**: SQL in `.sql`-Datei schreiben und `< data/xxx.sql` verwenden; Python-Verifizierungsskripte als .py-Dateien schreiben und mit `python3 xxx.py` ausführen; `lsof -ti:Port` + ignoreWarning:true für Port-Prüfungen verwenden\n\n"
251251
"---\n\n"
252-
"## ⚠️ Selbsttest-Anforderungen\n\n"
253-
"**Niemals den Benutzer bitten manuell zu operieren** — selbst machen wenn möglich. Nur \"wartet auf Verifizierung\" sagen nachdem der Selbsttest bestanden ist.\n\n"
254-
"- **Reines Backend / Nicht-Frontend-Änderungen**: pytest, API-Anfragen oder Skripte zur Überprüfung der Funktionalität verwenden\n"
255-
"- **MCP Server**: über stdio JSON-RPC-Nachrichten zur Verifizierung senden\n"
256-
"- **Änderungen an im Frontend sichtbaren Daten** (Datenbankänderungen, Änderungen der API-Rückgabewerte, Frontend-Code-Änderungen): **muss Playwright verwenden um die Frontend-Seitenanzeigeergebnisse zu verifizieren**. Es ist verboten, nur mit SQL-Abfragen, curl oder Python-Skripten zu verifizieren und \"bestanden\" zu behaupten. Wenn der Dienst nicht läuft, muss der Dienst zuerst gestartet werden. Es ist verboten, Playwright mit der Begründung \"Dienst läuft nicht\" zu überspringen\n"
257-
"- Nur \"wartet auf Verifizierung\" sagen nachdem der Selbsttest bestanden ist\n\n"
258-
"---\n\n"
259-
"## ⚠️ Entwicklungsregeln\n\n"
260-
"> Nach Abschluss der Entwicklung muss ein Selbsttest durchgeführt werden.\n"
261-
"> Keine mündlichen Versprechen — alles wird durch bestandene Tests validiert.\n"
262-
"> Muss rigoros nachdenken vor jeder Dateiänderung.\n"
263-
"> Bei Fehlern oder Ausnahmen niemals blind testen. Muss die Grundursache analysieren."
252+
"## ⚠️ Selbsttest\n\n"
253+
"Nach Änderungen an Code-Dateien **müssen Sie Tests ausführen, bevor Sie den Blockierungsstatus \"Warten auf Überprüfung\" setzen**. "
254+
"Sagen Sie nicht \"Warten auf Überprüfung\" nach Code-Änderungen ohne Tests. Nur Dokumentations-/Konfigurationsdateien (.md/.json/.yaml/.toml/.sh etc.) erfordern keinen Selbsttest."
264255
)
265256

266257
COMPACT_RECOVERY_HINTS = (

‎aivectormemory/i18n/rules/en.py‎

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -249,18 +249,9 @@
249249
"- **No** `lsof -ti:port` without ignoreWarning (will be blocked by security check)\n"
250250
"- **Correct approach**: write SQL to `.sql` file and use `< data/xxx.sql`; write Python verification scripts as .py files and run with `python3 xxx.py`; use `lsof -ti:port` + ignoreWarning:true for port checks\n\n"
251251
"---\n\n"
252-
"## ⚠️ Self-testing Requirements\n\n"
253-
"**Never ask the user to manually operate** — do it yourself if possible. Only say \"waiting for verification\" after self-test passes.\n\n"
254-
"- **Pure backend / non-frontend changes**: use pytest, API requests, or scripts to verify functionality\n"
255-
"- **MCP Server**: verify via stdio JSON-RPC messages\n"
256-
"- **Changes involving frontend-visible data** (database modifications, API return value changes, frontend code changes): **must use Playwright to verify frontend page display results**. Using only SQL queries, curl, or python scripts to verify and claiming \"passed\" is prohibited. If the service is not running, must start the service first before verifying. Skipping Playwright with the excuse \"service not running\" is prohibited\n"
257-
"- Only say \"waiting for verification\" after self-test passes\n\n"
258-
"---\n\n"
259-
"## ⚠️ Development Rules\n\n"
260-
"> Development must be followed by self-testing.\n"
261-
"> No verbal promises — everything is validated by passing tests.\n"
262-
"> Must think rigorously before any file modification.\n"
263-
"> When encountering errors or exceptions, never test blindly. Must analyze the root cause."
252+
"## ⚠️ Self-test\n\n"
253+
"After modifying code files, **you must run tests before setting blocked status \"awaiting verification\"**. "
254+
"Do not say \"awaiting verification\" after modifying code without running tests. Only documentation/configuration files (.md/.json/.yaml/.toml/.sh etc.) do not require self-testing."
264255
)
265256

266257
COMPACT_RECOVERY_HINTS = (

‎aivectormemory/i18n/rules/es.py‎

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -249,18 +249,9 @@
249249
"- **Sin** `lsof -ti:puerto` sin ignoreWarning (será bloqueado por verificación de seguridad)\n"
250250
"- **Enfoque correcto**: escribir SQL en archivo `.sql` y usar `< data/xxx.sql`; escribir scripts de verificación Python como archivos .py y ejecutar con `python3 xxx.py`; usar `lsof -ti:puerto` + ignoreWarning:true para verificación de puertos\n\n"
251251
"---\n\n"
252-
"## ⚠️ Requisitos de Auto-prueba\n\n"
253-
"**Nunca pedir al usuario que opere manualmente** — hacerlo uno mismo si es posible. Solo decir \"esperando verificación\" después de que la auto-prueba pase.\n\n"
254-
"- **Backend puro / cambios no frontend**: usar pytest, solicitudes API o scripts para verificar la funcionalidad\n"
255-
"- **MCP Server**: verificar vía mensajes JSON-RPC por stdio\n"
256-
"- **Cambios que involucran datos visibles en el frontend** (modificaciones de base de datos, cambios en valores de retorno de API, modificaciones de código frontend): **debe usar Playwright para verificar los resultados de visualización de la página frontend**. Está prohibido verificar solo con consultas SQL, curl o scripts de python y afirmar \"aprobado\". Si el servicio no está en ejecución, debe iniciar el servicio primero antes de verificar. Está prohibido omitir Playwright con la excusa de \"servicio no en ejecución\"\n"
257-
"- Solo decir \"esperando verificación\" después de que la auto-prueba pase\n\n"
258-
"---\n\n"
259-
"## ⚠️ Reglas de Desarrollo\n\n"
260-
"> El desarrollo debe ir seguido de auto-pruebas.\n"
261-
"> Sin promesas verbales — todo se valida con pruebas que pasen.\n"
262-
"> Debe pensar rigurosamente antes de cualquier modificación de archivo.\n"
263-
"> Al encontrar errores o excepciones, nunca testear a ciegas. Debe analizar la causa raíz."
252+
"## ⚠️ Auto-test\n\n"
253+
"Después de modificar archivos de código, **debe ejecutar pruebas antes de establecer el estado de bloqueo \"esperando verificación\"**. "
254+
"No diga \"esperando verificación\" después de modificar código sin ejecutar pruebas. Solo archivos de documentación/configuración (.md/.json/.yaml/.toml/.sh etc.) no requieren auto-test."
264255
)
265256

266257
COMPACT_RECOVERY_HINTS = (

‎aivectormemory/i18n/rules/fr.py‎

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -249,18 +249,9 @@
249249
"- **Pas de** `lsof -ti:port` sans ignoreWarning (sera bloqué par la vérification de sécurité)\n"
250250
"- **Approche correcte** : écrire SQL dans un fichier `.sql` et utiliser `< data/xxx.sql` ; écrire les scripts de vérification Python comme fichiers .py et exécuter avec `python3 xxx.py` ; utiliser `lsof -ti:port` + ignoreWarning:true pour les vérifications de port\n\n"
251251
"---\n\n"
252-
"## ⚠️ Exigences d'Auto-test\n\n"
253-
"**Ne jamais demander à l'utilisateur d'opérer manuellement** — le faire soi-même si possible. Ne dire \"en attente de vérification\" qu'après que l'auto-test a réussi.\n\n"
254-
"- **Backend pur / changements non-frontend** : utiliser pytest, requêtes API ou scripts pour vérifier la fonctionnalité\n"
255-
"- **MCP Server** : vérifier via messages JSON-RPC par stdio\n"
256-
"- **Changements impliquant des données visibles sur le frontend** (modifications de base de données, changements de valeurs de retour API, modifications du code frontend) : **doit utiliser Playwright pour vérifier les résultats d'affichage de la page frontend**. Il est interdit de vérifier uniquement avec des requêtes SQL, curl ou des scripts python et de prétendre \"réussi\". Si le service n'est pas en cours d'exécution, le service doit être démarré en premier avant de vérifier. Il est interdit de sauter Playwright avec l'excuse \"service non démarré\"\n"
257-
"- Ne dire \"en attente de vérification\" qu'après que l'auto-test a réussi\n\n"
258-
"---\n\n"
259-
"## ⚠️ Règles de Développement\n\n"
260-
"> Le développement doit être suivi d'auto-tests.\n"
261-
"> Pas de promesses verbales — tout est validé par des tests qui passent.\n"
262-
"> Doit réfléchir rigoureusement avant toute modification de fichier.\n"
263-
"> Face à des erreurs ou exceptions, ne jamais tester aveuglément. Doit analyser la cause racine."
252+
"## ⚠️ Auto-test\n\n"
253+
"Après avoir modifié des fichiers de code, **vous devez exécuter des tests avant de définir le statut de blocage \"en attente de vérification\"**. "
254+
"Ne dites pas \"en attente de vérification\" après avoir modifié le code sans exécuter de tests. Seuls les fichiers de documentation/configuration (.md/.json/.yaml/.toml/.sh etc.) ne nécessitent pas d'auto-test."
264255
)
265256

266257
COMPACT_RECOVERY_HINTS = (

‎aivectormemory/i18n/rules/ja.py‎

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -249,18 +249,9 @@
249249
"- **禁止** `lsof -ti:ポート` に ignoreWarning を付けない(セキュリティチェックでブロックされる)\n"
250250
"- **正しいやり方**:SQL は `.sql` ファイルに書いて `< data/xxx.sql` で実行;Python 検証スクリプトは .py ファイルに書いて `python3 xxx.py` で実行;ポート確認は `lsof -ti:ポート` + ignoreWarning:true\n\n"
251251
"---\n\n"
252-
"## ⚠️ セルフテスト要件\n\n"
253-
"**ユーザーに手動操作を依頼することは禁止** - 自分で実行できることは、ユーザーにやらせない。セルフテスト合格後のみ「検証待ち」と言える。\n\n"
254-
"- **純粋なバックエンド/非フロントエンド変更**:pytest、APIリクエスト、またはスクリプトで機能の正確性を検証\n"
255-
"- **MCP Server**:stdio 経由で JSON-RPC メッセージを送信して検証\n"
256-
"- **フロントエンドで表示されるデータの変更を含む場合**(データベース変更、APIレスポンス値の変更、フロントエンドコードの変更):**必ず Playwright を使用してフロントエントページの表示結果を検証すること**。SQLクエリ、curl、pythonスクリプトのみで検証して「合格」と主張することは禁止。サービスが起動していない場合は先にサービスを起動してから検証すること。「サービスが起動していない」を理由に Playwright をスキップすることは禁止\n"
257-
"- セルフテスト合格後のみ「検証待ち」と言える\n\n"
258-
"---\n\n"
259-
"## ⚠️ 開発ルール\n\n"
260-
"> 開発完了後は必ずセルフテストを実施すること。\n"
261-
"> 口頭での約束禁止、すべてはテスト合格を基準とする。\n"
262-
"> いかなるファイル修正の前にも厳密に考えること。\n"
263-
"> エラーや異常に遭遇した際は盲目的なテストを厳禁、問題の根本原因を分析すること。"
252+
"## ⚠️ 自己テスト\n\n"
253+
"コードファイルを修正した後、**テストを実行してから「検証待ち」のブロック状態を設定してください**。"
254+
"コード修正後、テストを実行せずに「検証待ち」と言うことは禁止です。ドキュメント/設定ファイル(.md/.json/.yaml/.toml/.sh 等)のみの修正は自己テスト不要です。"
264255
)
265256

266257
COMPACT_RECOVERY_HINTS = (

‎aivectormemory/i18n/rules/zh_CN.py‎

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -257,18 +257,9 @@
257257
"- **禁止** `lsof -ti:端口` 不加 ignoreWarning(会被安全检查拦截)\n"
258258
"- **正确做法**:SQL 写入 `.sql` 文件用 `< data/xxx.sql` 执行;Python 验证脚本写成 .py 文件用 `python3 xxx.py` 执行;端口检查用 `lsof -ti:端口` + ignoreWarning:true\n\n"
259259
"---\n\n"
260-
"## ⚠️ 自测要求\n\n"
261-
"**禁止让用户手动操作** - 能自己执行的,不要让用户做,自测通过后才能说\"等待验证\"。\n\n"
262-
"- **纯后端/非前端变更**:用 pytest、API 请求或脚本验证功能正确性\n"
263-
"- **MCP Server**:通过 stdio 发送 JSON-RPC 消息验证\n"
264-
"- **涉及前端可见数据变更**(数据库修改、API 返回值变更、前端代码修改):**必须使用 Playwright 验证前端页面展示结果**,禁止仅用 SQL 查询、curl、python 脚本验证就声称\"已通过\"。服务未启动时必须先启动服务再验证,禁止以\"服务未启动\"为由跳过 Playwright\n"
265-
"- 自测通过后才能说\"等待验证\"\n\n"
266-
"---\n\n"
267-
"## ⚠️ 开发规则\n\n"
268-
"> 开发完成必须进行自测。\n"
269-
"> 禁止口头承诺,一切以测试通过为准。\n"
270-
"> 任何文件修改前必须强制严谨思考。\n"
271-
"> 遇到报错或异常时严禁盲目测试,必须分析问题根本原因。"
260+
"## ⚠️ 自测检查\n\n"
261+
"修改了代码文件后,**必须先运行测试验证再设阻塞\"等待验证\"**。"
262+
"禁止修改代码后直接说\"等待验证\"而不跑测试。仅修改文档/配置文件(.md/.json/.yaml/.toml/.sh 等非代码文件)时不要求自测。"
272263
)
273264

274265
COMPACT_RECOVERY_HINTS = (

‎aivectormemory/i18n/rules/zh_TW.py‎

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -249,18 +249,9 @@
249249
"- **禁止** `lsof -ti:埠號` 不加 ignoreWarning(會被安全檢查攔截)\n"
250250
"- **正確做法**:SQL 寫入 `.sql` 檔案用 `< data/xxx.sql` 執行;Python 驗證腳本寫成 .py 檔案用 `python3 xxx.py` 執行;埠號檢查用 `lsof -ti:埠號` + ignoreWarning:true\n\n"
251251
"---\n\n"
252-
"## ⚠️ 自測要求\n\n"
253-
"**禁止讓使用者手動操作** - 能自己執行的,不要讓使用者做,自測通過後才能說「等待驗證」。\n\n"
254-
"- **純後端/非前端變更**:用 pytest、API 請求或腳本驗證功能正確性\n"
255-
"- **MCP Server**:透過 stdio 發送 JSON-RPC 訊息驗證\n"
256-
"- **涉及前端可見資料變更**(資料庫修改、API 回傳值變更、前端程式碼修改):**必須使用 Playwright 驗證前端頁面展示結果**,禁止僅用 SQL 查詢、curl、python 腳本驗證就聲稱「已通過」。服務未啟動時必須先啟動服務再驗證,禁止以「服務未啟動」為由跳過 Playwright\n"
257-
"- 自測通過後才能說「等待驗證」\n\n"
258-
"---\n\n"
259-
"## ⚠️ 開發規則\n\n"
260-
"> 開發完成必須進行自測。\n"
261-
"> 禁止口頭承諾,一切以測試通過為準。\n"
262-
"> 任何檔案修改前必須強制嚴謹思考。\n"
263-
"> 遇到報錯或異常時嚴禁盲目測試,必須分析問題根本原因。"
252+
"## ⚠️ 自測檢查\n\n"
253+
"修改了程式碼檔案後,**必須先執行測試驗證再設定阻塞「等待驗證」**。"
254+
"禁止修改程式碼後直接說「等待驗證」而不執行測試。僅修改文件/設定檔(.md/.json/.yaml/.toml/.sh 等非程式碼檔案)時不要求自測。"
264255
)
265256

266257
COMPACT_RECOVERY_HINTS = (

‎aivectormemory/install.py‎

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@
3232
lambda root: root / ".opencode/plugins"),
3333
("Codex", lambda root: root / ".codex/config.toml", "codex", False,
3434
lambda root: root / "AGENTS.md", "append", None),
35+
("Antigravity", lambda root: Path.home() / ".gemini/antigravity/mcp_config.json", "standard", True,
36+
lambda root: root / "GEMINI.md", "file", None),
37+
("Copilot", lambda root: root / ".github/copilot/mcp.json", "standard", False,
38+
lambda root: root / ".github/copilot-instructions.md", "append", None),
3539
]
3640

3741
RUNNERS = [
@@ -117,17 +121,6 @@ def _check_track_script_path() -> Path:
117121
}
118122
]
119123
}
120-
],
121-
"TaskCompleted": [
122-
{
123-
"hooks": [
124-
{
125-
"type": "agent",
126-
"prompt": "你是自测检查员。检查当前会话中是否有文件被修改(Edit/Write工具调用),如果有,检查修改后是否执行了相关测试(Bash工具调用中包含 pytest、curl、go test、playwright、npm run 等测试命令)。如果有文件修改但未执行任何测试,返回 {\"ok\": false, \"reason\": \"有文件被修改但未执行自测,禁止标记任务完成。请先运行相关测试验证功能正确性。\"}。如果已执行测试或没有文件修改,返回 {\"ok\": true}。",
127-
"timeout": 60,
128-
}
129-
]
130-
}
131124
]
132125
}
133126
}
@@ -298,7 +291,7 @@ def _write_claude_code_hooks(hooks_dir: Path, lang: str | None = None) -> list[s
298291
config = {}
299292
existing = config.get("hooks", {})
300293
new_hooks = new_hooks_cfg["hooks"]
301-
hook_keys = ["PreToolUse", "UserPromptSubmit", "SessionStart", "TaskCompleted"]
294+
hook_keys = ["PreToolUse", "UserPromptSubmit", "SessionStart"]
302295
changed = any(existing.get(k) != new_hooks.get(k) for k in hook_keys)
303296
# 清理旧的 Stop hook
304297
has_old_stop = "Stop" in existing
@@ -307,6 +300,7 @@ def _write_claude_code_hooks(hooks_dir: Path, lang: str | None = None) -> list[s
307300
for k in hook_keys:
308301
config["hooks"][k] = new_hooks[k]
309302
config["hooks"].pop("Stop", None)
303+
config["hooks"].pop("TaskCompleted", None)
310304
# 写入 permissions.allow(MCP 工具 + Bash 自动授权)
311305
required_perms = [f"mcp__{DEFAULT_SERVER_NAME}__{t}" for t in AUTO_APPROVE_TOOLS] + ["Bash(*)", "Edit(*)", "Write(*)", "Read(*)"]
312306
existing_perms = set(config.get("permissions", {}).get("allow", []))

‎desktop/app.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
wailsRuntime "github.com/wailsapp/wails/v2/pkg/runtime"
2626
)
2727

28-
const AppVersion = "2.0.6"
28+
const AppVersion = "2.0.7"
2929

3030
type App struct {
3131
ctx context.Context

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "aivectormemory"
7-
version = "2.0.6"
7+
version = "2.0.7"
88
description = "轻量级 MCP Server,为 AI 编程助手提供跨会话持久记忆能力"
99
readme = "README.md"
1010
requires-python = ">=3.10"

0 commit comments

Comments
 (0)