Grant-Felix/dsh-ian-rules ↗★ 0
dsh-ian-rules
项目开发规则:DSH 开源插件(MIT,供所有人使用、学习和研究)。在 Web GUI 右侧栏提供「开发规则」面板(与「Docker 容器」并列,全局规则 + 按项目覆盖),并把当前项目生效的规则自动注入每个会话的系统提示,让 agent 开发项目时自动遵守;另含 ian_rules 工具,便于在对话里直接维护规则。 适合进行项目开发,需要让AI Agent严格遵守特定开发规范的开发者。
インストール
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Grant-Felix/dsh-ian-rulesドキュメント
README 全文を読む ↗想验「使用者装到的到底是什么」:把来源换成发布的那份再起
DSH_SANDBOX_SOURCE=github:Grant-Felix/dsh-ian-rules npm run sandbox DSH_SANDBOX_SOURCE=git+https://gitee.com/Grant-Felix/dev-rules.git npm run sandbox
沙箱有独立的 `DSH_HOME`,所以它读写的是自己的 `ian-rules.json`,**不会碰你的真实规则文件**;脚本还会拒绝把沙箱 home 指到真实 home。默认端口可用 `DSH_SANDBOX_PORT` 改。
- `lib/rules.js` 纯逻辑(规范化 / 路径匹配 / 生效规则 / 渲染 / 分组 / token 估算 / Markdown 往返),宿主、面板与测试共用;路径匹配的 win32 分支通过 platform 参数可测。
- `lib/index.js` 宿主半体:存储、提示变量注入、按场景注入(`agent/pre-step`)、`/ian-rules/*` 接口、`ian_rules` 工具。
- `lib/scene.js` 场景匹配器:分词、打分、挑选(纯函数、零依赖、可 `node --test` 直跑)。
- `lib/client.js` 浏览器半体:手写的 `window.__ModuleLoader__.load({ id, factory })` bundle,只依赖 `react`,不需要打包器;纯函数内部件(token 估算 / 导入合并 / 更新提示判定)通过 `exports.__internal` 暴露给测试。
- `scripts/sandbox.sh`:上面那套隔离环境的实现(独立 `DSH_HOME` + 独立端口 + 安全闸)。
- 测试:`test/rules.test.mjs`(逻辑 / 两级标题渲染)、`test/host.test.mjs`(接口 / 备份 / 409 / 403 / 415 / 400 / 软链回退 / 工具 / 多字节请求体跨块解码 / revision 不被自己的写盘事件推高)、`test/client.test.mjs`(槽位接线 / 服务晚出现 / 内部件 / 两列网格与卡片统一的源码级守卫)。
- CI:`.github/workflows/ci.yml` 在 node 20 / 22 / 24 上跑语法检查 + 测试。
## 八、代码托管
本仓遵循「本地 Forgejo 开发 / GitHub 与 Gitee 对外并受理反馈」的三平台分工:代码与提交历史以**本地 Forgejo** 为准,两个公开平台只做对外窗口与镜像。
| 平台 | 角色 | 状态 |
| --- | --- | --- |
| 本地 Forgejo(私有,走回环) | **开发主仓**,代码与历史以它为准 | 已建仓并推送(默认分支 `main`) |
| GitHub | 对外窗口 + 反馈受理 | 已发布(公开,MIT) |
| Gitee | 国内镜像 + 同样受理反馈 | 已发布(由 GitHub 单向同步) |
代码**单向**流动:本地 Forgejo → GitHub → Gitee,禁止把某个平台的提交反向直推到另一个平台(会造成历史分叉与重复改动)。两个平台上的 Issue 与 PR 都一样受理,但同一个问题只在**先提出的那一侧**开正式讨论,另一侧贴链接引导过去,避免两边各说各话。
> **2026-10-05 更名**:GitHub 仓库由 `dsh-agent-rules` 更名为 `dsh-ian-rules`(GitHub 对旧地址自动重定向),插件包名与全部派生标识(slug `ian-rules`、路由 `/ian-rules`、数据文件 `ian-rules.json`、页签 kind、提示变量 `ian_rules_body`、模型工具 `ian_rules`)同步更换;上一代的名字只留在迁移与兼容那一小块里(见前文「更名迁移」)。Gitee 镜像地址仍是 `dev-rules`,未随更名改动。
推送凭据按平台分开配置:每个 host 各有一个 git credential helper,且都**校验 `host=`**、只对自己那一个平台应答,其它 host 一律静默退出 —— 否则会把 A 平台的令牌回给 B 平台。
发版版本号用**发布日期式**:`..-`,如 `26.9.21-1`(2026-09-21 当天第 1 个版本),同日第 2 个是 `26.9.21-2`;年月日**不补零**(`26.09.21-1` 不合法——semver 禁止数字标识符带前导零)。标签、清单 `version`、Release 标题与产物名用**同一串**(tag 加 `v` 前缀),三个平台推同一个 tag。
> `-x` 在 semver 里是 **prerelease**,两点要记住:**一直用它、别与不带序号的 `26.9.21` 混用**(排序上 `26.9.21-1 **代码与规则内容分开。** 本仓只装插件(开源,MIT);作者本人维护的规则内容不在本仓、也不随本仓分发,只存在于作者本机。这条边界由文件位置本身保证,不靠约定去守 —— 详见 [`NOTICE.md`](https://github.com/Grant-Felix/dsh-ian-rules/blob/a7310ffd32fa282ef65c56463fbbb4eda51e23cc/NOTICE.md)。
## 九、许可
**代码开源、规则内容闭源**:
| 范围 | 许可 |
| --- | --- |
| 本仓源代码(`lib/`、`test/` 等) | **MIT**(见 `LICENSE`) |
| 本仓内的示例规则 | 随代码 MIT —— **全部虚构**,不是作者的真实规则 |
| 作者本人的规则内容 | **不开源,也不在本仓**:只存在于作者本机的 `~/.dsh/ian-rules.json` |
| 使用者自己的规则内容 | 归使用者所有,与本项目许可无关 |
范围与边界见 [`NOTICE.md`](https://github.com/Grant-Felix/dsh-ian-rules/blob/a7310ffd32fa282ef65c56463fbbb4eda51e23cc/NOTICE.md)。