Files
youle_framework/.claude/hooks/remind-docs.js
T
joywayerandClaude Opus 4.8 a931143c1e 强制遵守三套开发文档: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>
2026-07-06 07:57:25 +08:00

56 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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);
});