dsh-git-push

September 11, 2026 · View on GitHub

DSH(DeepSeek Harness)git 自动提交推送插件——统一函数入口架构(从零开发的独立实现)。

状态:开发中(v0.0.0 计划稿 → v0.1.0 框架 → 每完成一个入口递增第三位) 基线../dsh-git-push(v1.60.1,存档+自检扫描用,五份外部审计报告已核对,问题清单见 §五) 血缘:本项目按统一函数入口架构从零开发,参考既有经验与五份外部报告的教训独立实现。

目录

架构设计

核心思想:统一函数入口 + 注册表扩展,加能力不破坏主入口。

  • 规则总入口(yml 管理):所有 yml 规则槽位(nodejs/npm/html/comment/dsh/private/structure/version/template 等)统一装载→解析→编译;加字段=加函数,compileRule 主体永不修改;每个字段函数自带 dimensions 维度绑定(支持一字段多维度)
  • 审计总入口auditChanged(变动,git diff)/ auditFull(全量,非 git 目录可查);auditWithScope 统一调度;设置项控制扫描范围(auditScanScope:diff/full)、强度(auditLevel:quick 跳 AST 语义重检查 / standard 全量 / deep 扩展位)、规则包目录(auditRuleset:空=内置,指向含 audit-rules-<名>.yml 的目录即整体替换)
  • git 总入口:token / sshkey / 提交 / 推送 / clone / 建仓 / 可见性 / 版本历史 / 重建历史
  • 自身总入口:版本控制(单一事实源)/ README 模板(独立,不走拦截 yml)/ yml 模板(规则模板 + 豁免速查)/ 独立运行能力(CLI,npm test 可复现)
  • 评分总入口:10 维度加权(可读性 15 / 可维护性 15 / 健壮性 15 / 安全性 18 / 性能 10 / 测试覆盖 10 / 可观测性 5 / 可部署性 5 / 文档 4 / 开发者体验 3,合计 100),问题(dimensions) → 分维度计数 → 加权总分
  • 豁免总入口dsh-skip-* 注册表(每个豁免类型声明「能豁免哪些维度」),扫描问题输出自带 exemptHint
  • 上下文注入入口:给 AI 会话注入环境(工作目录映射 / 工具路径 / skill 清单)
  • HTTP API 入口:鉴权(Origin 校验 / CSRF / 写操作确认)
  • 测试总入口npm test 一条命令可复现全绿,失败退出非 0
  • 侧边栏(设置 UI):复用既有 client.js 骨架改造

总入口清单

#入口职责状态
1规则总入口所有 yml 字段解析 + yml 衍生新字段,编辑函数按字段指派⏳ 规划
2审计总入口变动/全量/非 git 目录,默认关闭,侧边栏开关⏳ 规划
3git 总入口token/sshkey/提交/推送/clone/建仓/可见性/历史⏳ 规划
4自身总入口版本控制/README 模板/yml 模板/CLI⏳ 规划
5侧边栏设置 UI(复用旧 client.js)⏳ 规划
6评分总入口10 维度加权⏳ 规划
7豁免总入口dsh-skip-* 注册表 + exemptHint⏳ 规划
8上下文注入AI 会话环境注入⏳ 规划
9HTTP API鉴权端点⏳ 规划
10测试总入口npm test 可复现⏳ 规划

统一问题对象

问题 = {
  file, line,
  rule, kind,
  dimensions: ['可读性', '可维护性'],   // 字段函数里写绑定,支持一字段多维度
  severity,                            // blocker / warning / info
  exemptHint,                          // 怎么豁免(含位置语义:文件头=整文件 / 位置=单点)
  scoreImpact,                         // 该问题对 10 维度评分的影响
}

每个编译函数(字段函数)声明 dimensions——func-lines 字段 → ['可读性','可维护性']empty-catch['健壮性','可观测性']

版本规划

版本内容
0.0.0README 文档(本文件):开发计划 + 问题清单 + 链接规则设计
0.1.0功能框架搭建完毕能跑(目录结构 + 入口骨架 + npm test 绿)
1.1.x每完成一个入口 commit 一次,第三位 +1(一次一入口)
全部入口完成后按实际功能跳版本

开发纪律:每次提交不推送,提交前调用旧项目(../dsh-git-push)扫描本目录自检;旧项目发现的问题修复后再提交。

问题清单(五份报告 → v2 自检)

五份外部报告(code-quality-audit / code-analysis / 代码不足分析报告-实测版 / 代码不足分析-源码实测 / CODE-ANALYSIS-independent)已逐条实测核对。已证实问题转化为 v2 规则引擎的内置自检规则

#已证实问题(来源)v2 自检规则规则槽位
1死导入/未使用导出(execSync/commitAndPush/readdirSync/gitRaw)unused-import / unused-exportnodejs
2真空 catch / 静默吞错(readme-gen:166)empty-catchrobustness
3依赖未声明(js-yaml,三份报告都中)declared-dependencynpm
4npm test 入口坏(三份报告都中)test-entrynpm
5CLI 文档 vs 实现不一致(--depth,三份报告都中)cli-help-syncnpm
6README/注释/工具数滞后(11 vs 12)doc-syncdsh
7HTTP 写端点无鉴权http-authdsh
8quality 规则自身假阴性(checkSyncInAsync 前缀匹配等)quality-rule-selfcheckdsh
9同步 fs 204 处阻塞sync-fs(AST 全量)performance
10凭据卫生(origin 内嵌 token、/tmp PID)credential-in-url / tmp-symlinksecurity
11链接拼接错误(viewer 双协议前缀)link-check新 kind
12配置被忽略(githubOwner)config-ignoreddsh
13门禁链路漏接(requirementsConfirmed 只工具传)gateway-chaindsh
14循环依赖(git-core⇆github-api)circular-importstructure
15文档措辞被自家拦截docs-conversation + 输出附带一键改写建议comment

自检闭环:v2 自己提交前跑一遍上面的 self-check = 等价于一次外部审计——「别人发现问题」→「自己每天发现」。

链接判断规则设计

新规则 kind:link-check——扫描项目内所有 URL,访问验证,报错扣分。

- id: link/valid-url
  kind: link-check
  severity: warning
  retries: 1
  timeout_ms: 5000
  flaky_domains:            # 不稳定的知名域名,网络错误扣分打折
    - github.com
    - api.github.com
    - raw.githubusercontent.com
    - npmjs.com
  dimension: 文档            # 绑 10 维度
  concurrent: 5
错误类型基准扣分flaky 域名打折绑定维度
404/403(连得上但目标不在)31.0(不打折)文档×3
DNS 解析失败20.3文档×2
连接超时10.2文档×1
网络层其他10.2文档×1

boundary(防误报核心):github 系列域名天然不稳 → flaky 域名网络错误扣分 ×0.2;DNS 失败且域名在 flaky 列表 → 只记 debug 不记分。链接检查只跑 warning 不拦截(网络不可靠,blocker 会造成假阳性拦截)。

文件目录结构及作用

(框架搭建后填充——0.1.0 起按实际模块更新本表并 commit)

路径作用
lib/引擎模块(按总入口划分)
lib/audit-rules/yml 规则槽位
test/测试(test-.mjs,npm test 可复现)
docs/文档(本计划 / 看板 / 报告)
cli.mjs独立 CLI(git-sluice)

设置项(侧边栏 / 插件配置)

设置项三处同源保持同步:lib/index.jsConfig(服务端 schema)、lib/client/index.jsSETTINGS_SCHEMA(纯逻辑 + 单测)、client.jsSCHEMA + 中文文案(浏览器侧内联,无法 import 服务端 ESM)。新增设置项必须三处同加,一致性由 test-client.mjs 断言守着。

设置项类型默认作用
auditEnabledbooleanfalse提交前自动审计门禁(关=只提交不审计)
hardcodeFullScanbooleanfalse硬编码全量扫(换机前排查存量死路径)
injectFullSkillbooleanfalse注入全部 skill 正文(默认只注目录+清单省 token)
injectRepoIndexFullbooleanfalse注入 repo-index 全文(默认只注文件名)
auditScanScopeenumdiff扫描范围:diff=仅本次变动 / full=全量
auditLevelenumstandard审计强度:见下节三档语义
auditRulesetstring''自定规则目录:空=内置规则包
weightOverridesstring''权重覆盖 JSON:如 {"安全性":100},空=默认权重表
commitMessagestring''自动提交信息(留空则用调用方传入的 message)

审计强度三档(auditLevel)

档位检查范围适用场景
quick正则 / 凭据 / 路径 / 黑名单 / 空 catch / 同步 IO(跳过 AST 与语义重检查:函数行数、圈复杂度、嵌套深度、文件行数、重复串、语义规则、凭据文件、命名长度)大仓快速门禁、冒烟自检
standard全量(默认,与 v1.0.3 行为一致)日常提交前审计
deep当前与 standard 等效(全量);为后续追加深度检查预留需要最严格检查时

流程:配置或工具参数(code_auditauditLevel)→ code_audit / git_commit_push 传入 auditWithScope({ auditLevel })auditFull / auditChangedauditFile(..., { level })runChecks({ grouped }, { level }) 按档位跳过重检查。基础安全项(凭据、路径穿越、空 catch)在任何档位都不降级。

自定规则包(auditRuleset)与动态槽位

规则槽位由目录文件驱动:目录里每个 audit-rules-<名>.yml 即一个槽位,放文件即生效、删文件即移除——「导入/导出/删除规则包」就是对该目录的文件操作,无需改代码。内置槽位 14 个(nodejs 36 / frontend 19 / npm 10 / version 8 / dsh 7 / comment 6 / folder 4 / i18n 3 / performance 2 / docs 1 / robustness 1 / structure 1 / template 1 / private 0 条私有拦截清单)。

流程:auditRuleset 指向目录 → loadRuleFiles(order, { dir }) 从该目录装载(默认 lib/audit-rules/)→ 编译注册表认领字段 → 审计消费。指向不存在或空的目录会装载 0 条规则(loaded.errors 有记录),不会静默沿用内置规则包。

槽位加载与合并语义(细节全录见 docs/DETAILS-EXEMPT-AND-RULES.md §2):

  • 发现discoverRuleSlots() 扫目录取 audit-rules-<名>.yml,槽位集合以目录实际文件为准(常量表只是排序偏好,非槽位清单)
  • 顺序:配置显式顺序优先(数组 / 逗号串 / 环境变量 DSH_GIT_PUSH_RULE_SLOTS)→ 未覆盖的按 SLOT_ORDER_HINT 偏好排(nodejs→frontend→npm→version→dsh→comment→structure→private→docs→template)→ 仍未列出的按文件名字典序;配置声明但文件不存在静默跳过;template 槽位默认不加载
  • 合并:按顺序逐槽位装载,rules 后覆盖前(同 id 后者胜);severity_map/thresholds 对象合并;metadata 取第一个非空;ignore 追加;private_files 跨文件追加(private 槽位恒最后加载 → 清单累加不覆盖)
  • 容错:单槽位 yml 解析失败记入 errors 不中断,其余槽位照常加载;非法正则由 safeRe 收集错误返回 null,该规则跳过不抛异常
  • 编译出口ruleOut 顶层只保留 id/name/kind/severity/level/message/pattern/patterns/pathPattern/threshold/dimensions,其余 yml 字段必须挂 extra 供检查器读取
  • severity 映射:yml error → 引擎级 blocker(拦截);warningwarninginfopass
  • 正则默认不区分大小写safeRe 默认加 iapiKey/API_KEY 都命中);要区分大小写写前缀 (?-i)

权重覆盖(weightOverrides)

评分默认 10 维度权重表(合计 100,见「架构设计」)。weightOverrides 传 JSON(如 {"安全性":100})→ scoreQuality(findings, weights) 与默认表合并(未指定维度保持默认)→ 输出 quality.dims(0-10 原始维度得分)与总分随之变化。JSON 非法时回退默认权重,不中断审计。

最终得分公式(用户 2026-09-11 权威):最终得分 = Σ(维度得分 × 权重) / Σ权重 × 10(满分 100;维度得分 = 10 - 该维度问题计数,warning 扣 1 / blocker 扣 2,下限 0)。侧边栏 10 维度滑块(min 0 / max 100 / step 1)逐维写回 weightOverrides JSON,改完即生效。

独立 CLI(git-sluice)

脱离 DSH 独立运行(零第三方依赖,仅需 Node ≥18 与本机 git)。git-sluice self-check 做版本一致性 + HELP ↔ parseArgv 机器比对(选项白名单必须与 HELP 文本一致)。

git-sluice version              查看版本
git-sluice ruleset [槽位...]    编译规则包并输出统计(默认全部槽位)
git-sluice scan <root> [--depth N]   全量扫描目录(非 git 目录可查)
git-sluice audit <root> [--full] [--level quick|standard|deep] [--ruleset <目录>] [--weights <JSON>]
                                审计目录(默认 diff 范围)
git-sluice commit <repo> -m <msg> [--push|--no-push] [--dry-run] [--force] [--req-confirm] [--json]
                                审计门禁 → 提交(默认只 commit 不 push;--push 推远端;--force 强推覆盖远端历史)
git-sluice link-check <路径>    检查 md/文本中的链接有效性(只 warning)
git-sluice yaml-template        输出规则 yml 模板(含 kind + dimensions 示范)
git-sluice readme-template      输出 README 模板({{name}} {{version}} 占位符)
git-sluice self-check           版本一致性 + HELP↔parseArgv 机器比对

audit 参数与服务端设置项对应:--fullauditScanScope=full--levelauditLevel(非法取值直接报错,不静默降级)、--rulesetauditRuleset(自定规则目录)、--weightsweightOverrides(非法 JSON 回退默认权重表并提示)。

版本列表

版本说明
1.0.9(当前 · 误报清理:语义豁免 + exts 过滤 + patch 语义检查)按 dsh-skill-scoreboard 实测的 8 类真实误报逐条修复(2026-09-13):① npm/undeclared-js-yaml 全仓证据:规则语义=「import 了 js-yaml 但未声明依赖」,此前文件级 fallback 把零依赖插件(全仓无 js-yaml 引用)的 package.json 误报 blocker——新增 detectRepoJsYamlImport(auditFull/auditChanged 双通道全仓扫描 import/require 证据),无引用不报,有引用照报(depProj 对照测试证明规则未变哑);② timeout-on-external-api 同调用识别:纯 regex 匹配 fetch( 看不到同调用内 AbortSignal.timeout(30000)/AbortController/timeout:hasExternalCallTimeout(行内联超时 / 后续 12 行括号闭合区间超时)语义豁免,真无超时仍报;③ client-module-loader-id 契约语义:pattern 匹配的是正确写法 window.__ModuleLoader__.load({id,factory}) 本身(规则写反)→ 改为「文件已按统一契约注册即通过」,缺契约的 client 半部才报;④ concat-in-t 词边界(?<![A-Za-z]) 排除 split('{'+...t((方法名尾字母)误匹配;⑤ mkdir-before-write 函数级识别:命中行同函数(前 60 行函数起点 → 后 20 行)含 mkdir(Sync)/ensureDataDir/recursive:true 即豁免——saveData 先 ensureDataDir 再写的常规安全写法不再误报;⑥ patch-insert-unique-id 语义化 + exts 限定:旧「命中 insert: 即提示」把纯 insert(只新建不覆盖)误报 duplicate-id——改为新 kind patch-insert(checkPatchInsert 解析 insert 块内 id 与顶层覆盖行 id 求交集,同 id 才报),且规则声明 exts: [yml, yaml];⑦ exts 过滤机制落地(新引擎能力):filterRulesByExt 在 runChecks 入口按当前文件扩展名裁剪声明了 exts 的规则——README 等 md 文件的 insert 示例代码块不再命中 yml-only 规则;⑧ semantic 只对代码文件报:checkSemantic 加 CODE_EXTS 门控,.gitignore/.npmignore/README 等非代码文件不再被安全/a11y/dependency 占位 notice 轰炸(7 文件 × 4 规则空报 → 0);⑨ version 路径上下文豁免isVersionInPathContext——安装路径/文件名里的 dsh-v0.1.2-alpha.4(如 README 数据示例的 DSH runtime 目录)不再触发 version/embedded-major-zero 与 readme-zero-title,README 版本记录标题仍报;⑩ 新增 test/test-false-positive-fixes.mjs 10 条回归测试(含正反对照:真风险仍报、误报场景不报)|全量 418 全绿,dsh-skill-scoreboard 实测 blocker 4→0、目标误报规则全清零
1.0.8(扫描智能提示 + 评分对数衰减)两处智能升级:① 扫描智能提示(test 路径/文件名豁免告知):审计扫描出 warning/blocker 时,若文件路径或文件名带 test 特征(`test
1.0.7(硬编码魔数检测·版本号豁免版)魔数检测智能升级(整合进原有 audit-rules-nodejs.yml,kind=magic-number-smart):检测 \b\d{2,}\b / \b0x[0-9a-fA-F]+\b / \b\d+\.\d+\b,但自动豁免五类:① 版本号(v1.2.3 / 1.2.3 / VERSION 常量 / version 上下文)② 日期时间(2026-09-12 / 时间戳 / 时间 / year~time 上下文)③ HTTP 状态码(100-504 清单,http/status 上下文)④ 常见合法常量(0/1/-1/60/100/1000/1024/3600/86400/65535 等)⑤ 状态枚举(pending/completed 等字符串);上下文关键字分流:magic_number_hints(timeout/retry/max/min/limit/size/count/port/interval/delay/duration/threshold/buffer/chunk,前缀匹配兼容 maxRetry/max_count 组合词)内数字报魔数,legitimate_hints(version/date/year/month/day/hour/minute/second/http/status)内数字豁免;同一数字文件内出现 ≥3 次强制标记(跨行合并 1 条,重复计数按 1 个算——scoring_impact 可维护性);与既有 readability/magic-number(纯 regex 快速版)并存,纯 regex 无法豁免版本号/日期的痛点由 smart 版补齐;实测:timeout=30000/limit=100 命中、VERSION="1.2.3"/status===404/KB=1024 豁免、777×3 合并 1 条 | test-magic-number.mjs 5 例 + auditFull 集成实测
1.0.6(规则机制 .test 豁免 + 按钮绑定交叉比对)规则引擎两项机制升级:① .test 空文件豁免(整目录扫描跳过):目录放 0 字节 .test 空文件 → 审计(collectTextFiles)与敏感扫描(scanSensitiveFiles)双通道整目录跳过(含子目录),比 .samples「照常出结果不拦截」更强——.samples 出结果只不拦截,.test 完全跳过;防逃逸(非空 .test 文件不豁免);② button-bind 交叉比对 kind(按钮事件归属):同文件交叉比对 HTML 按钮(innerHTML/outerHTML/insertAdjacentHTML 赋值 chunk + 模板字符串 chunk + createElement('button'/'input'))与 JS 绑定证据(addEventListener/onclick/onChange 赋值 + jQuery $("#id")/$(".cls") + querySelectorAll("button[data-x]") 属性选择器 + .closest() 事件委托)——识别出绑定即不报,识别出事件委托(addEventListener('click') 或 .closest())整文件豁免;油猴脚本(HTML 在 JS 字符串、事件 addEventListener/委托绑定)不再误报「按钮无事件」;扩展场景(popup.html 按钮在 popup.js 绑定)forms/button-missing-event 降级 info;③ 7 条 button/ 规则*:inline-binding-in-string(JS 字符串内联绑定,负向后瞻排除 .on( 方法链)/ unbound(无绑定)/ create-element-binding(createElement 绑定)/ event-delegation-detected(事件委托)/ dynamic-selector(querySelector+拼接等动态选择器)/ wrapped-binding / csp-compatible(CSP 兼容 info)|实测 gamebanana-mods-downloader:unbound=0 误报 0、button/* 8 条 info 均不阻断
1.0.5(侧边栏账号卡)侧边栏账号/SSH 能力补齐(对齐 v1 账号区)+ Origin 同源放行 + 评分公式定稿:① 侧边栏账号卡(client.js):AccountCheckCard(填 GitHub Token / SSH 公钥 → POST /api/git-push/account-check 在线校验账号状态)+ AccountKeyGenCard(填邮箱 → POST /api/git-push/gen-ssh-key 生成 ssh-rsa 4096 密钥对,公钥整行回显 + 一键复制;私钥只落本机插件配置目录);React 状态本地化(token/公钥仅浏览器内存,关闭即消失,不进配置);两组件均 ≤50 行防 func-lines;② Origin 同源放行(D35 升级):checkOrigin 新增第 4 参 host——写请求 Origin 主机 ≡ 请求 Host 头即同源放行(局域网 GUI 10.10.10.4 下侧边栏按钮 POST 不再 403),跨站 Origin 仍拒、本机回环白名单兜底,CSRF 防护语义不削弱;③ 评分公式定稿(用户权威公式)最终得分 = Σ(维度得分×权重)/Σ权重×10quality.dims 存 0-10 原始维度得分,侧边栏 10 维度滑块逐维写回 weightOverrides JSON(修复 saveDimWeights 未传 props 的接线 bug,滑块此前改值不生效);④ 账号/SSH 工具与端点(D34 补齐):工具 git_account_check / git_gen_ssh_key + HTTP 端点 /api/git-push/account-check/api/git-push/gen-ssh-key(maskToken/readSshPub/persistSshPub/checkGithubAccount/generateSshKey/formatGithubAccountBlock 迁入 lib/git/index.js)+ test-account-ssh.mjs 13 例 + test-http.mjs Origin 同源 4 例;⑤ 敏感扫描修复(2026-09-12):只认真实硬编码凭据——account: '账号检查' 等 UI 文案键名不再误判(username 键组移除 account + 值含中文即排除,实测 client.js 由误判 → 0 命中);扫描到敏感文件只报告不改动 .gitignore/不解除跟踪(基线 node_modules 与自定义忽略照常写)|394 全绿
1.0.4(规则引擎加固 + 侧边栏配置面)规则引擎 + 配置面双线:① regex 子模式:patterns 支持对象子模式 {id, pattern, message},命中输出 per-pattern 专属 message;② performance 槽位(新):memory-bomb 7 子模式(全量读入/循环内 push/链式 push/数组展开/无限循环/execSync/大对象序列化)+ busy-wait,push 宽正则 91 假阳性 → 精确子模式降噪;③ 同形字符防再犯(G3):lib/rule/homoglyph.js 西里尔/希腊→ASCII 映射表(28 项)+ compileRule 入口拦截 kind/id 同形(с→c/д→d),静默失效 → 显式报错;④ 规则字段全认领(G6):旧项目 29 字段逐一核对,scoring→threshold 兜底 / action / suggestions / examples / minLines 走 extra 透传,blacklist 阈值 40→60 真实生效;⑤ private 槽位(T1-T33 考古验收):loader 合并顶层 private_files 13 条 + lib/audit/glob.js(**/*/{a,b} 零依赖 glob→RegExp)+ checkPrivateFiles(git ls-files 全量 × 分级 public→blocker / private→warning),auditFull/auditChanged 双路径接线;⑥ 侧边栏三项(G7):审计强度 quick/standard/deep(quick 跳 AST/语义重检查)+ 自定规则目录 auditRuleset(放 yml 即整体替换规则包)+ 权重覆盖 weightOverrides(JSON),三处同步(Config / SETTINGS_SCHEMA / client.js 内联);⑦ i18n 降噪新增 dsh-skip-i18n 豁免标记;⑧ dual-scan 补旧项目 full-scan 通道;⑨ 真实接线修复(装后实测):apply 四段注册 API 全错且静默失效(工具用 ctx.tools.define、注入 callback 返回对象而非调 section()、HTTP 用 ctx.http.route、虚构 ctx.inject(['slots']))→ 全部改为真实 API(ctx.inject(['tools'])get('tools').register(defineTool(...)) / systemPrompt.section({name,order,text}) / webServer.register({kind:'prefix'})),新增独立接线层 lib/plugin/index.js 并以 mock ctx 单测断言「真 API 被调用」;⑩ git_gen_readme 迁移(工具 7→8):lib/readme-gen/index.js(模板优先级 template/README.md > readme.yml > 内置兜底;版本表 git log 版本号聚合,补丁并入主版本)+ lib/readme-templates/readme.yml;⑪ .samples 目录豁免:目录放 0 字节 .samples 空文件 → 整目录照常出审计/敏感扫描结果但不构成提交推送拦截(blocker 不算门禁、敏感文件不写 .gitignore);⑫ CLI commit 子命令 + force 强推(对齐 v1 CLI):git-sluice commit <repo> -m <msg>(复用 commitWithAudit,审计独立调用;--push/--no-push/--dry-run/--force/--req-confirm/--json),工具 git_commit_push 与 pushViaSsh 同步支持 force(覆盖远端历史)|373 全绿
1.0.3(规则包对齐)旧项目规则包全量复制 + 3 新槽位 + 同名函数扩展:① 复制旧项目 9 槽位 86 条规则(nodejs/frontend/npm/version/dsh/comment/structure/private/template),v2 规则从 12 条 → 96 条;② 新槽位 robustness(mkdir-before-write 写文件目录保障)、folder(文件夹数量审计 4 条:目录总数/单目录文件数/解包特征/.gitignore 覆盖,目录级检查器挂 auditFull)、i18n(国际化审计 3 条:硬编码文案 t() 包裹/插值/语言包分文件);③ 新 kind 按「同名函数 + 注册一行」铁律:blacklist(comment 槽位黑名单加分制,24 黑名单+22 白名单+6 附加特征)+ folder + npm-json(两条旧「命中即提示」死规则改为 JSON 结构化真判定)+ npm-json(files 含 lib / js-yaml 已声明依赖即不报);④ 修复测试暴露的真缺陷:dsh-skip-sensitive 对 regex 宽声明的安全类规则豁免失效(17 条假阳性)、func-lines/max-lines 识别中文「函数」名(旧项目 34 条规则误归类)、detectionMethod 顶层展开读取(test-file/locale-file 三处 rule.extra? 失效);⑤ 保留 v2 独有能力(secret-aws-access-key 等合并回 nodejs 槽位防覆盖丢失);⑥ skill 文档措辞中性化(去除文档中的对话措辞残留,符合 comment 审计规则)+ 新增 docs/DETAILS-EXEMPT-AND-RULES.md 细节权威;⑦ 测试 315→320 断言全绿(含 5 个新 kind 编译断言)|双扫描 0 blocker(旧项目扫描 v2 区 0 blocker)
1.0.2(修 bug)测试按入口重组 + 审计健壮性加固:① 测试一脚本对一入口(test-framework 溶解归位:注册表/装载→规则、评分→评分、豁免→豁免、CLI/同步/打包→自身,test-cli 更名 test-self);② G9 匹配器空值崩溃checkRegexRules/checkPathRegexRulesrules=undefinedrules is not iterable)→ rules || [];③ G10 重复串死检测(tokenizer 产出 str/tmpl,检查器却过滤 string/number → 永不命中)→ 按实际类型名收集 + tmpl 入列 + 去引号;④ G11 重复串泛滥(修复后自审 343 条,多为文档数字/域名词汇)→ 排除 num/纯标识符/dotfile/短期望词 + 文档/测试目录豁免 maintainability 检查;⑤ G12 node_modules.orig 入 .gitignoreensureGitignore 基线忽略 node_modules/+node_modules.orig/,扫描器跳过该目录(用户定稿);⑥ 提取 HINT_QUALITY/MSG_REPO_REQUIRED 常量消除重复字面量;⑦ 审计入口测试 13→33 断言(315 总全绿)
1.0.1(修 bug)六个真实缺陷修复:① summarize 漏统 error 级(出现「0 blocker 0 warning 但 total=3」矛盾统计)→ error 归拦截级 + notice 单列;② 9 个 kind 死桶(编译后无人消费,旧项目被批评的同一问题)→ 补 checkNameLengthAst/checkComplexityAst/checkNestingDepthAst/checkFileLines/checkRepeatedStringsAst 5 个 AST 检查器 + credential-file/min-length/max-complexity/max-depth/max-lines/repeated-string/min-occurrences/semantic 全接线;③ [FUNC]- 规则被 regex 抢走(detect 前缀 /^[FUNC]-/ 是字符集非字面量)→ /^(\[FUNC\]|secret)-/;④ 豁免完全失效——checks/exempt 读的键名与编译产出 kind 不一致(secret vs [FUNC]),全仓统一;⑤ 槽位仍半硬编码(RULE_SLOTS 当默认基准)→ 纯动态发现 + SLOT_ORDER_HINT 仅排序偏好,放 yml 即生效;⑥ 同步漏真实加载源(只同步 node_modules/)→ detectTargets 双目标(local-plugins/ 优先 + node_modules/),修旧项目「改动刷新看不到」根因;另加 capSeverity 规则 severity 上限约束(规则声明 warning 不得被检查器升为 blocker)|278 断言全绿
1.0.0(首发)DSH 插件接线完成:lib/index.js(apply + 7 工具注册 + HTTP 鉴权分发 + Config schema)+ client.js(DSH 客户端插件,手写 createElement/零外部资源/开关默认关)+ scripts/sync-plugin.mjs(双副本同步,默认 dry-run)+ cordis.patch.yml + scanRepos;test-plugin 25 + test-client 21 断言(263 总全绿)
0.2.0链接判断落地:lib/link-check/index.js(extractLinks 去重去占位符 / gradeResult 分级:404·403→-3、DNS→-2、超时·5xx→-1 / flaky 域名网络错误 ×0.2 / probeLinks 并发受限 / checkLinks 统一问题对象,只 warning 永不 blocker)+ audit-rules-docs.yml 槽位(link-check kind)+ CLI link-check <路径>;test-link-check 24 断言(233 总全绿)
0.1.7上下文注入 + HTTP 总入口落地:lib/http/index.js 纯函数鉴权(checkOrigin 同源判定忽略端口/路径 → 无 Origin/跨源 403、checkWriteConfirm 破坏性操作缺 confirm → 400、checkBodySize 5MB → 413、authPipeline、routeRequest 路由分发、readJsonBody 流式 413 防护)+ lib/context/index.js(createEnvInjectionText/parseEnvInjection/isWithinRoot 防目录穿越);test-http 30 + test-context 7 断言(190 总全绿)+ 旧项目扫描 0 blocker
0.1.6豁免总入口落地:exemptForFinding 注册表驱动统一消费(7 标记全接入,blocked/lineLevel/hint 声明式)+ 位置语义(文件头前 3 行=整文件 / sensitive/func-length/residue 行内单点)+ residue/style 仅代码文件生效 + audit-rules-*.yml 规则定义文件自动豁免自举命中(修复 §2.5 记录的 6 个 debugger 假阳性);test-exempt 25 断言(153 总全绿)+ v2 自审 0 blocker(98/100 A)+ 旧项目扫描 0 blocker
0.1.5评分总入口落地:lib/score/ast.js 轻量 tokenizer(字符串/模板/注释感知)+ AST 质量检查器(checkSyncFs 修 named-import 假阴性、checkEmptyCatchAst 修多行空块、checkFuncLinesAst 精确行数)+ runChecks 接入(func-lines 行数+语句密度互补)+ scoreQuality weights 覆盖;test-quality 31 断言(128 总全绿)+ 旧项目扫描 0 blocker
0.1.4自身总入口落地:VERSION 单一事实源 + versionInfo 机器校验(scripts/scan-version.mjs,三处一致)/ readmeTemplate({{name}} {{version}} {{versionTable}} 占位符渲染)/ yamlTemplate(kind+dimensions 示范)/ helpSync(HELP↔parseArgv 机器比对,防 --depth 类回归)/ parseArgv --depth 缺值报错 / CLI 新增 yaml-template/readme-template/self-check 子命令;test-cli 18 断言(97 总全绿)+ 旧项目扫描 0 blocker
0.1.3git 总入口落地:runGit(数组参数零注入)/ resolveToken(三层:显式→env→配置目录/项目 token,格式校验)/ commitAndPush(预检+敏感文件自动 .gitignore+add+commit+push)/ pushViaApi(Git Data API blob→tree→commit→ref,分支免疫,401→pushViaSsh 回退 ssh.github.com:443)/ cloneViaApi(trees+blobs 写文件转 git 仓)/ ensureRemoteRepo(建仓+设 origin,dryRun)/ setVisibility(PATCH)/ githubFetch(api.github.com 硬闸拒 302)+ parseGithubOwnerRepo + isBadCredentials;test-git 35 断言(79 总全绿)+ 旧项目扫描 0 blocker
0.1.2审计总入口落地:collector(gitignore 感知 + collectChangedFiles 变动收集)/ checks 全部检查器(regex/path-regex/func-lines 含单行多语句识别/empty-catch)/ auditFile 豁免接线 / auditFull(非 git 可查)/ auditChanged 真 git diff(git status --porcelain,删除文件跳过)/ 统一问题对象 + exemptHint;44 测试全绿 + 旧项目扫描 0 blocker;修 §2.5 patterns→RegExp 卡点
0.1.1规则总入口落地:13 编译函数注册(credential-ref/file/secret/func-lines/6 数值/regex/path-regex/semantic)+ 三统一(kind kebab-case ↔ 函数 ↔ 字段)+ dimensions 声明(一字段多维度)+ 首个 yml 槽位 audit-rules-nodejs.yml(11 条规则示范)+ 未知规则报错不静默;31 测试全绿
0.1.0功能框架搭建完毕能跑:8 入口骨架(规则/审计/git/自身/评分/豁免/上下文)+ cli.mjs 最小可用(version/ruleset/scan/audit + --depth/--full 解析)+ scripts/check.mjs 全量语法检查 + test/test-framework.mjs 16 断言全绿;详细任务看板 docs/WORKBOARD-v2.md(每入口含思路与验收标准)
0.0.0README 文档(开发计划):10 总入口架构确定、统一问题对象确定、版本规范确定、15 条自检问题清单(五份报告已核对)、链接判断规则设计(flaky 域名扣分打折)

注意事项

  • 开发中不推送、不发布;每次提交前用旧项目(../dsh-git-push)扫描自检
  • 规则加载器铁律:加字段 = 加函数 + 注册一行,compileRule 主体永不修改
  • 命名格式统一:一个功能一个根词,各层(函数/服务字段/工具/路由/yml 段)只做格式转换,对外 API 与函数名完全一致、无别名
  • 审计默认关闭:审计功能默认不开,由侧边栏设置开启(本项目自身开发中保持一致开启)
  • npm 发布完整性:dependencies(js-yaml 等)显式声明,files 白名单含 cli.mjs,npm test 一条命令可复现