repo-audit-tool 1.3.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PUBLISHING.md +9 -3
- package/docs/AGENT-INDEX.json +5 -3
- package/docs/repo-audit/AGENT-GUIDE.md +9 -1
- package/docs/repo-audit/HUMAN-GUIDE.md +23 -0
- package/package.json +1 -1
- package/repo-audit.mjs +57 -8
package/PUBLISHING.md
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
# 发布记录:repo-audit-tool
|
|
2
2
|
|
|
3
|
-
## 发布状态(2026-09-
|
|
3
|
+
## 发布状态(2026-09-07 更新)
|
|
4
4
|
|
|
5
5
|
| 项 | 状态 |
|
|
6
6
|
|---|---|
|
|
7
|
-
| npm | `repo-audit-tool` v1.
|
|
7
|
+
| npm | `repo-audit-tool` v1.3.1(latest,CI 自动发布);v1.3.2 发版中 |
|
|
8
8
|
| GitHub | `NinjaSln-labs/repo-audit` master;发版 tag `v*` |
|
|
9
|
-
| 本地验证 | 自审计 100/A,验证链 4/4,测试
|
|
9
|
+
| 本地验证 | 自审计 100/A,验证链 4/4,测试 12/12,CI 双平台(ubuntu + windows) |
|
|
10
10
|
|
|
11
11
|
## 版本历史
|
|
12
12
|
|
|
13
|
+
- **1.3.2** — Issue#4 修复:入口守卫 `pathToFileURL` 归一化,修复 Windows 全形态
|
|
14
|
+
静默不执行(v1.3.1 回归);守卫 stderr 诊断提示;command 检查器 Git Bash 探测;
|
|
15
|
+
CI 加 windows-latest 矩阵 + npm 安装 smoke 步骤(2026-09-07)
|
|
16
|
+
- **1.3.1** — 入口守卫 realpath 归一化,修复 npm bin symlink 下主流程不执行(2026-09-06)
|
|
17
|
+
- **1.3.0** — 反馈修复 Issue#1/#2/#3:yaml_field 注释剥离、SEC-004 job 级 fallback、
|
|
18
|
+
AGENTS 来源声明、QUA-004 消费意图、--update 动线成文(2026-09-06)
|
|
13
19
|
- **1.2.3** — package.json 补充 `repository` 字段,修复 npm provenance E422;
|
|
14
20
|
首次 Trusted Publisher(OIDC)tag 触发自动发布(2026-09-06)
|
|
15
21
|
- **1.2.2** — publish CI 修复:node 20→22 + npm 条件升级,修复 EBADENGINE;
|
package/docs/AGENT-INDEX.json
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"title": "repo-audit 文档索引",
|
|
4
4
|
"description": "AI Agent 可读的文档索引 — 包含所有文档的元数据、结构、和调用协议",
|
|
5
|
-
"version": "1.3.
|
|
6
|
-
"updated": "2026-09-
|
|
5
|
+
"version": "1.3.2",
|
|
6
|
+
"updated": "2026-09-07",
|
|
7
7
|
"repo": "NinjaSln-labs/repo-audit",
|
|
8
8
|
"npm": "repo-audit-tool",
|
|
9
9
|
"pages": "https://ninjasln-labs.github.io/repo-audit/",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"name": "repo-audit",
|
|
21
21
|
"description": "仓库标准化审计工具 + 工程脚手架生成器(零依赖)",
|
|
22
22
|
"bin": "repo-audit",
|
|
23
|
-
"version": "1.3.
|
|
23
|
+
"version": "1.3.2",
|
|
24
24
|
"language": "JavaScript (ESM)",
|
|
25
25
|
"runtime": "Node.js >= 18",
|
|
26
26
|
"dependencies": [],
|
|
@@ -231,6 +231,8 @@
|
|
|
231
231
|
},
|
|
232
232
|
|
|
233
233
|
"changelog": {
|
|
234
|
+
"1.3.2": "Issue#4 修复:入口守卫 pathToFileURL 归一化——修复 Windows 全形态静默不执行(v1.3.1 回归);守卫不命中时 stderr 诊断提示;command 检查器 Git Bash 探测;CI 双平台矩阵 + npm 安装 smoke",
|
|
235
|
+
"1.3.1": "入口守卫 realpath 归一化——修复 npm bin symlink 下主流程不执行;1.3.0 反馈修复:注释剥离/SEC-004/AGENTS 声明/QUA-004/--update 动线",
|
|
234
236
|
"1.3.0": "反馈修复:yaml_field 行内注释剥离 + fallback_field 通配(SEC-004 兼容 job 级权限);AGENTS-core 来源声明二选一;QUA-004 锁文件消费意图;手册补 --update 存量补齐动线",
|
|
235
237
|
"1.2.3": "package.json 补充 repository 字段,修复 npm provenance E422;完成 Trusted Publisher tag 自动发布",
|
|
236
238
|
"1.2.2": "publish CI 改用 node 22 + 条件升级 npm,修复 EBADENGINE(tag 发布因 1.2.1 已存在未出包)",
|
|
@@ -321,6 +321,14 @@ fi
|
|
|
321
321
|
|
|
322
322
|
如果自定义规则文件不存在或格式错误,工具会输出警告并继续(只加载成功的规则)。
|
|
323
323
|
|
|
324
|
+
### 5.5 Windows 调用形态(v1.3.2 起)
|
|
325
|
+
|
|
326
|
+
v1.3.2 修复了 v1.3.1 在 Windows 上 CLI 全形态静默不执行的回归(Issue#4)。Agent 在 Windows 上的注意事项:
|
|
327
|
+
|
|
328
|
+
- 入口守卫已跨平台归一化(`pathToFileURL`),`node repo-audit.mjs` / npm bin / shim 全形态可用
|
|
329
|
+
- `command`/`command_result` 检查(GIT-001/GIT-003/QUA-002)自动探测 Git for Windows bash;未装 Git for Windows 时这些项降级 fail,其余规则正常
|
|
330
|
+
- 守卫不命中时 stderr 有 `ℹ 未作为 CLI 入口执行` 诊断提示——若审计"成功"但 0 规则输出,先查 stderr 这一行
|
|
331
|
+
|
|
324
332
|
---
|
|
325
333
|
|
|
326
334
|
## 六、性能参考
|
|
@@ -546,4 +554,4 @@ GitHub Issues 修复 / 文档 / 不采纳
|
|
|
546
554
|
3. `minor` — 功能部分受损(1 周内响应)
|
|
547
555
|
4. `info` — 建议改进(排期处理)
|
|
548
556
|
|
|
549
|
-
*Agent 操作手册 v1.3 · 2026-09-
|
|
557
|
+
*Agent 操作手册 v1.3.2 · 2026-09-07(§5.5 Windows 调用形态;v1.3.2 修复 Windows 入口回归 Issue#4)*
|
|
@@ -500,6 +500,20 @@ node repo-audit.mjs --repo ./my-repo --type python-app
|
|
|
500
500
|
|
|
501
501
|
或通过 `REPO_AUDIT_TYPES` 环境变量添加自定义分类。
|
|
502
502
|
|
|
503
|
+
### Windows 上 CLI 无输出(v1.3.1 已修,v1.3.2 起)
|
|
504
|
+
|
|
505
|
+
v1.3.1 的入口守卫在 Windows 上存在回归:CLI 全形态静默不执行(exit 0 无输出)。v1.3.2 改用 `pathToFileURL` 归一化后修复。升级:
|
|
506
|
+
|
|
507
|
+
```bash
|
|
508
|
+
npm install -g repo-audit-tool@latest
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
若仍见 `ℹ 未作为 CLI 入口执行` 提示(stderr),说明调用形态未被守卫识别——请附带该提示行(含两侧 URL/路径形态)提交反馈。
|
|
512
|
+
|
|
513
|
+
### Windows 无 POSIX shell(command 检查器降级)
|
|
514
|
+
|
|
515
|
+
`command`/`command_result` 类检查(GIT-001/GIT-003/QUA-002)需 POSIX shell。Windows 上引擎自动探测 Git for Windows 自带的 bash(PATH 中的 `sh` → `Program Files\\Git\\bin\\bash.exe` 等常见位置)。未装 Git for Windows 时这些检查项降级为 fail 并给出提示,不影响其余规则。
|
|
516
|
+
|
|
503
517
|
---
|
|
504
518
|
|
|
505
519
|
## 十、与 scaffold 的配合
|
|
@@ -779,4 +793,13 @@ gh issue view <NUMBER> --repo NinjaSln-labs/repo-audit
|
|
|
779
793
|
gh issue close <NUMBER> --repo NinjaSln-labs/repo-audit --comment "已处理,感谢反馈"
|
|
780
794
|
```
|
|
781
795
|
|
|
796
|
+
### 12.9 Windows 支持(v1.3.2)
|
|
797
|
+
|
|
798
|
+
v1.3.2 起完整支持 Windows:
|
|
799
|
+
|
|
800
|
+
- **入口守卫跨平台**:`pathToFileURL` 归一化替代 `file://` 手工拼接,win32 上 CLI 正常执行(v1.3.1 回归修复,见 [Issue #4](https://github.com/NinjaSln-labs/repo-audit/issues/4))
|
|
801
|
+
- **守卫诊断提示**:调用形态未被识别时 stderr 输出 `ℹ 未作为 CLI 入口执行` 一行提示(不再静默 exit 0)
|
|
802
|
+
- **command 检查器跨平台**:自动探测 Git for Windows bash(PATH `sh` → `Git\bin\bash.exe`),未装时相关检查降级提示
|
|
803
|
+
- **CI 双平台矩阵**:master push/PR 在 ubuntu-latest + windows-latest 上同时跑验证链与 npm 安装 smoke
|
|
804
|
+
|
|
782
805
|
|
package/package.json
CHANGED
package/repo-audit.mjs
CHANGED
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
* REPO_AUDIT_TYPES - 自定义分类列表(JSON 数组)
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
import { existsSync, readdirSync, readFileSync, writeFileSync, mkdirSync, statSync } from 'node:fs'
|
|
21
|
+
import { existsSync, readdirSync, readFileSync, writeFileSync, mkdirSync, statSync, realpathSync } from 'node:fs'
|
|
22
22
|
import { join, resolve, dirname, relative } from 'node:path'
|
|
23
23
|
import { spawnSync } from 'node:child_process'
|
|
24
24
|
import { createHash } from 'node:crypto'
|
|
25
|
-
import { fileURLToPath } from 'node:url'
|
|
25
|
+
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
26
26
|
import { platform } from 'node:os'
|
|
27
27
|
|
|
28
28
|
const ROOT = dirname(fileURLToPath(import.meta.url))
|
|
@@ -332,9 +332,44 @@ function countMdFiles(path) {
|
|
|
332
332
|
}
|
|
333
333
|
|
|
334
334
|
// ============================================================
|
|
335
|
-
//
|
|
335
|
+
// Shell 工具(跨平台)
|
|
336
336
|
// ============================================================
|
|
337
337
|
|
|
338
|
+
// Windows 无原生 sh;command 检查器需 POSIX shell 语义。
|
|
339
|
+
// 优先 Git for Windows 自带的 bash(npm/CI/开发者机几乎必装),探测顺序:
|
|
340
|
+
// 1. sh 在 PATH(posix 或 Git Bash 已入 PATH)
|
|
341
|
+
// 2. 常见安装位置的 bash.exe(Git for Windows / scoop / winget)
|
|
342
|
+
// 3. 兜底 null(调用方降级为「检查器不可用」而非崩溃)
|
|
343
|
+
let winShellCache
|
|
344
|
+
function findShell() {
|
|
345
|
+
if (process.platform !== 'win32') return { cmd: 'sh', args: ['-c'] }
|
|
346
|
+
if (winShellCache !== undefined) return winShellCache
|
|
347
|
+
const probe = (exe) => spawnSync(exe, ['-c', 'echo ok'], { encoding: 'utf-8' }).status === 0
|
|
348
|
+
// 1) PATH 中的 sh(可能已是 Git Bash 的 sh.exe)
|
|
349
|
+
const pathSh = spawnSync('where', ['sh'], { encoding: 'utf-8' })
|
|
350
|
+
const candidates = []
|
|
351
|
+
if (pathSh.status === 0) candidates.push(pathSh.stdout.trim().split('\n')[0].trim())
|
|
352
|
+
// 2) 常见安装位置
|
|
353
|
+
const common = [
|
|
354
|
+
process.env.ProgramFiles && `${process.env.ProgramFiles}\\Git\\bin\\bash.exe`,
|
|
355
|
+
process.env['ProgramFiles(x86)'] && `${process.env['ProgramFiles(x86)']}\\Git\\bin\\bash.exe`,
|
|
356
|
+
process.env.LOCALAPPDATA && `${process.env.LOCALAPPDATA}\\Programs\\Git\\bin\\bash.exe`,
|
|
357
|
+
].filter(Boolean)
|
|
358
|
+
for (const p of common) { try { if (existsSync(p)) candidates.push(p) } catch {} }
|
|
359
|
+
for (const c of candidates) {
|
|
360
|
+
if (probe(c)) { winShellCache = { cmd: c, args: ['-c'] }; return winShellCache }
|
|
361
|
+
}
|
|
362
|
+
winShellCache = null
|
|
363
|
+
return null
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// command 检查器统一入口:跨平台执行 shell 命令
|
|
367
|
+
function runShellCommand(command, cwd) {
|
|
368
|
+
const shell = findShell()
|
|
369
|
+
if (!shell) return { status: -1, stdout: '', stderr: 'no POSIX shell found on win32 (Git Bash 未安装?)', error: { code: 'ENOENT' } }
|
|
370
|
+
return spawnSync(shell.cmd, [...shell.args, command], { cwd, encoding: 'utf-8' })
|
|
371
|
+
}
|
|
372
|
+
|
|
338
373
|
function git(args, cwd) {
|
|
339
374
|
const r = spawnSync('git', args, { cwd, encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] })
|
|
340
375
|
return r.status === 0 ? r.stdout.trim() : null
|
|
@@ -847,7 +882,7 @@ function runCheck(rule, repoPath, mpj = null) {
|
|
|
847
882
|
|
|
848
883
|
case 'regex': {
|
|
849
884
|
if (params?.command) {
|
|
850
|
-
const r =
|
|
885
|
+
const r = runShellCommand(params.command, repoPath)
|
|
851
886
|
if (r.status !== 0) { passed = false; evidence = `命令失败: ${r.stderr?.trim() || 'exit ' + r.status}`; break }
|
|
852
887
|
const re = new RegExp(params.pattern)
|
|
853
888
|
const lines = r.stdout.split('\n').filter(Boolean)
|
|
@@ -912,7 +947,7 @@ function runCheck(rule, repoPath, mpj = null) {
|
|
|
912
947
|
}
|
|
913
948
|
|
|
914
949
|
case 'command_result': {
|
|
915
|
-
const r =
|
|
950
|
+
const r = runShellCommand(params?.command, repoPath)
|
|
916
951
|
if (r.status !== 0) { passed = false; evidence = `命令失败 (exit ${r.status})`; break }
|
|
917
952
|
const val = parseInt(r.stdout.trim())
|
|
918
953
|
// P3: skip_if_zero — 命令结果为 0 时豁免(如零提交仓、空文件等)
|
|
@@ -1651,11 +1686,25 @@ ${message}
|
|
|
1651
1686
|
process.exit(hasCritical && strict ? 1 : 0)
|
|
1652
1687
|
}
|
|
1653
1688
|
|
|
1654
|
-
// Issue#1 fix: 入口守卫——仅直接作为 CLI 运行时执行主流程;被 import
|
|
1655
|
-
|
|
1656
|
-
|
|
1689
|
+
// Issue#1 fix: 入口守卫——仅直接作为 CLI 运行时执行主流程;被 import(测试/编程复用)不跑。
|
|
1690
|
+
// Issue#4 fix: pathToFileURL 归一化(跨平台语义正确)——`file://` 手工拼接在 Windows 上产生
|
|
1691
|
+
// 非法 URL 形态(file://C:\... 反斜杠),与 import.meta.url(file:///C:/...)永不相等,
|
|
1692
|
+
// 导致 v1.3.1 在 Windows 全形态静默不执行(exit 0 无输出)。
|
|
1693
|
+
// pathToFileURL 在 win32 产出 file:///C:/...(正斜杠三斜杠),posix 行为与手工拼接一致。
|
|
1694
|
+
// argv[1] 仍经 realpathSync 归一化(npm bin symlink,P-006)。
|
|
1695
|
+
export function isCliEntry(metaUrl, argv1) {
|
|
1696
|
+
if (!argv1) return false
|
|
1697
|
+
let real
|
|
1698
|
+
try { real = realpathSync(argv1) } catch { return false }
|
|
1699
|
+
return metaUrl === pathToFileURL(real).href
|
|
1700
|
+
}
|
|
1701
|
+
const entryArg = process.argv[1]
|
|
1702
|
+
if (isCliEntry(import.meta.url, entryArg)) {
|
|
1657
1703
|
main().catch(err => {
|
|
1658
1704
|
console.error(`✗ 运行时错误: ${err.message}`)
|
|
1659
1705
|
process.exit(2)
|
|
1660
1706
|
})
|
|
1707
|
+
} else if (entryArg && !process.env.NODE_TEST_CONTEXT) {
|
|
1708
|
+
// 守卫不命中且非测试形态:提示而非静默——exit 0 无输出会让入口回归极难发现(Issue#4 教训)
|
|
1709
|
+
console.error(`ℹ 未作为 CLI 入口执行(import.meta.url=${import.meta.url}, argv[1]=${entryArg})。若您直接运行了本文件,请通过 node <本文件> 或安装后的 bin 调用。`)
|
|
1661
1710
|
}
|