强制遵守三套开发文档:README @import + PreToolUse 提醒 hook
把"必须严格遵守 docs 三套文档"从软指令变成硬机制,同时消除 SSOT 重复: - CLAUDE.md 用 @import 把三份 README(含各自红线速查/一页纸总则) 常驻每次会话上下文,删掉手写的红线摘要——红线以 README 权威源为准, 不再在 CLAUDE.md 另抄一份 - 新增 .claude/hooks/remind-docs.js:PreToolUse 钩子,编辑 client/**、 server/** 前按路径把"必须遵守的对应编号文档 + 红线"注入上下文(非阻塞) - 新增 .claude/settings.json 注册该 hook(matcher Edit|Write|MultiEdit); 已 pipe-test 各路径分支 + sentinel 验证 hook 实际触发 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env node
|
||||
// PreToolUse hook:编辑 client/** 或 server/** 前,按路径把「必须遵守的文档」
|
||||
// 注入到上下文,作为硬提醒。非阻塞——只追加 additionalContext,不拦截操作。
|
||||
// 权威说明见根目录 CLAUDE.md「文档」一节与各 README 红线速查。
|
||||
|
||||
var chunks = [];
|
||||
process.stdin.on('data', function (c) { chunks.push(c); });
|
||||
process.stdin.on('end', function () {
|
||||
var reminder = '';
|
||||
try {
|
||||
var input = JSON.parse(Buffer.concat(chunks).toString('utf8') || '{}');
|
||||
var p = (input.tool_input && input.tool_input.file_path) || '';
|
||||
p = String(p).replace(/\\/g, '/');
|
||||
|
||||
if (/\/docs\//.test(p)) {
|
||||
// 改文档本身不提醒
|
||||
reminder = '';
|
||||
} else if (/\/codes\/shared\//.test(p)) {
|
||||
reminder =
|
||||
'你在改 codes/shared/(服务端 shared/ 的只读同步副本)。红线:前端侧不改,' +
|
||||
'只改服务端权威源再跑同步脚本。详见 client 05 §「shared 只读」/ server 04 §8。';
|
||||
} else if (/\/client\/js\/gameabc-framework\//.test(p)) {
|
||||
reminder =
|
||||
'你在改 gameabc-framework/(可复用框架)。必须遵守:框架保持游戏中立,' +
|
||||
'禁渗入任何具体玩法逻辑/常量;依赖严格单向。权威见 client 01、client 05 红线速查,' +
|
||||
'设计通则见 games/engineering。动手前请先读对应编号文档。';
|
||||
} else if (/\/client\/js\/01_subgame\//i.test(p) || /\/client\/js\//.test(p)) {
|
||||
reminder =
|
||||
'你在改客户端子游戏/前端代码。必须遵守 client development-guide:' +
|
||||
'架构与加载顺序(01)、渲染与组件(02)、事件/动画/音频/Spine(03)、网络对接(04)、' +
|
||||
'红线速查(05)、接入模式(06);工程通则见 games/engineering。' +
|
||||
'红线:严格 ES5、精灵只走 SpriteManager、常量集中禁硬编码、成败只认 data.success、' +
|
||||
'服务端权威前端只展示、组件走 BaseComponent、数据优先表现延后。动手前先读对应编号文档。';
|
||||
} else if (/\/server\//.test(p)) {
|
||||
reminder =
|
||||
'你在改服务端代码。必须遵守 server development-guide:环境与框架(01)、' +
|
||||
'子游戏接入(02)、通信协议(03)、红线速查(04);工程通则见 games/engineering。' +
|
||||
'红线:严格 ES5、require 只在文件头守卫块、成败标志 data.success(推送包自带)、' +
|
||||
'数据权威缺失显式报错、模块职责单一、房间隔离(房间+seat 为 key)、' +
|
||||
'自动操作复用真人链路、下发包携带前端所需全部核心数据。动手前先读对应编号文档。';
|
||||
}
|
||||
} catch (e) {
|
||||
reminder = '';
|
||||
}
|
||||
|
||||
if (reminder) {
|
||||
process.stdout.write(JSON.stringify({
|
||||
hookSpecificOutput: {
|
||||
hookEventName: 'PreToolUse',
|
||||
additionalContext: reminder
|
||||
}
|
||||
}));
|
||||
}
|
||||
process.exit(0);
|
||||
});
|
||||
Reference in New Issue
Block a user