@omne-harness/repo-toolchain 0.0.9 → 0.0.11
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/README.md +49 -2
- package/README_ZH.md +68 -5
- package/dist/acceptance/cli.js +2 -2
- package/dist/acceptance/cli.js.map +1 -1
- package/dist/acceptance/historical-approvals.d.ts +14 -0
- package/dist/acceptance/historical-approvals.d.ts.map +1 -0
- package/dist/acceptance/historical-approvals.js +110 -0
- package/dist/acceptance/historical-approvals.js.map +1 -0
- package/dist/acceptance/lock.d.ts +4 -0
- package/dist/acceptance/lock.d.ts.map +1 -1
- package/dist/acceptance/lock.js +31 -4
- package/dist/acceptance/lock.js.map +1 -1
- package/dist/core/toolchain-config.d.ts +1 -1
- package/dist/core/toolchain-config.d.ts.map +1 -1
- package/dist/core/toolchain-config.js +7 -2
- package/dist/core/toolchain-config.js.map +1 -1
- package/dist/declarations/api-classify.d.ts +94 -0
- package/dist/declarations/api-classify.d.ts.map +1 -0
- package/dist/declarations/api-classify.js +208 -0
- package/dist/declarations/api-classify.js.map +1 -0
- package/dist/declarations/api-cli.d.ts +3 -0
- package/dist/declarations/api-cli.d.ts.map +1 -0
- package/dist/declarations/api-cli.js +92 -0
- package/dist/declarations/api-cli.js.map +1 -0
- package/dist/declarations/api-compare.d.ts +86 -0
- package/dist/declarations/api-compare.d.ts.map +1 -0
- package/dist/declarations/api-compare.js +616 -0
- package/dist/declarations/api-compare.js.map +1 -0
- package/dist/declarations/api-format.d.ts +47 -0
- package/dist/declarations/api-format.d.ts.map +1 -0
- package/dist/declarations/api-format.js +154 -0
- package/dist/declarations/api-format.js.map +1 -0
- package/dist/declarations/api-normalize.d.ts +20 -0
- package/dist/declarations/api-normalize.d.ts.map +1 -0
- package/dist/declarations/api-normalize.js +76 -0
- package/dist/declarations/api-normalize.js.map +1 -0
- package/dist/declarations/api-snapshot.d.ts +49 -0
- package/dist/declarations/api-snapshot.d.ts.map +1 -0
- package/dist/declarations/api-snapshot.js +282 -0
- package/dist/declarations/api-snapshot.js.map +1 -0
- package/dist/declarations/api-whitelist.d.ts +25 -0
- package/dist/declarations/api-whitelist.d.ts.map +1 -0
- package/dist/declarations/api-whitelist.js +415 -0
- package/dist/declarations/api-whitelist.js.map +1 -0
- package/dist/declarations/compat.d.ts +11 -0
- package/dist/declarations/compat.d.ts.map +1 -1
- package/dist/declarations/compat.js +9 -4
- package/dist/declarations/compat.js.map +1 -1
- package/dist/declarations/contract-api.d.ts +128 -0
- package/dist/declarations/contract-api.d.ts.map +1 -0
- package/dist/declarations/contract-api.js +420 -0
- package/dist/declarations/contract-api.js.map +1 -0
- package/dist/loop/run.d.ts.map +1 -1
- package/dist/loop/run.js +11 -8
- package/dist/loop/run.js.map +1 -1
- package/dist/loop/status.js +1 -1
- package/dist/loop/status.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[中文说明](README_ZH.md)
|
|
4
4
|
|
|
5
|
-
`@omne-harness/repo-toolchain` is this repository's checker package. It is published on npm. It provides the rule engine, commit attribution, the dependency graph, declaration compatibility, structure metrics, actual architecture extraction, the review page and the clean loop. The repository pins its exact version in the catalog of `pnpm-workspace.yaml`. The root checks and the three tool members run that version from npm, not the sources in this directory. After a change here, publish a new version first, then open a PR that changes the pin. See the [development guide](../../docs/development.md#仓库工具链的版本).
|
|
5
|
+
`@omne-harness/repo-toolchain` is this repository's checker package. It is published on npm. It provides the rule engine, commit attribution, the dependency graph, declaration compatibility, contract API snapshots, structure metrics, actual architecture extraction, the review page and the clean loop. The repository pins its exact version in the catalog of `pnpm-workspace.yaml`. The root checks and the three tool members run that version from npm, not the sources in this directory. After a change here, publish a new version first, then open a PR that changes the pin. See the [development guide](../../docs/development.md#仓库工具链的版本).
|
|
6
6
|
|
|
7
7
|
Three unpublished tool members import this package through its subpaths. This package does not import them:
|
|
8
8
|
|
|
@@ -14,7 +14,7 @@ Three unpublished tool members import this package through its subpaths. This pa
|
|
|
14
14
|
|
|
15
15
|
- The checked repository is `OMNE_SUBJECT_ROOT`. When it is not set, it is the Git root of the current directory.
|
|
16
16
|
- The runner repository is `OMNE_RUNNER_ROOT`. When it is not set, it is the checked repository. Dependency rules (`.dependency-cruiser.cjs`, `tsconfig.base.json`) and configuration come only from the runner repository, so a checked tree cannot change them.
|
|
17
|
-
- Configuration is in [`repo-toolchain.config.json`](../../repo-toolchain.config.json) at the repository root, in the sections `loop`, `metrics` and `
|
|
17
|
+
- Configuration is in [`repo-toolchain.config.json`](../../repo-toolchain.config.json) at the repository root, in the sections `loop`, `metrics`, `acceptanceLock` and `contractApi`. Each command reads only its own section. A missing file, a missing section that a command reads, or an unknown section is an error. No defaults apply. Version 0.0.10 is the first version that accepts the `contractApi` section. Earlier versions reject it.
|
|
18
18
|
- dependency-cruiser needs TypeScript to parse `.ts` files. With pnpm, add `typescript` to dependency-cruiser under `packageExtensions` in `pnpm-workspace.yaml`. If TypeScript is not found, the dependency check exits with an error. It does not pass with the `.ts` files left out.
|
|
19
19
|
|
|
20
20
|
## Default baseline
|
|
@@ -41,6 +41,7 @@ The commands (`bin`) point at `dist`. Run them from the installed package:
|
|
|
41
41
|
| --- | --- | --- |
|
|
42
42
|
| `omne-deps` | `src/deps/cli.ts` | Dependency rules, and cycles between members and groups |
|
|
43
43
|
| `omne-declarations` | `src/declarations/cli.ts` | Reads member `dist` declarations with TypeScript 6 |
|
|
44
|
+
| `omne-contract-api` | `src/declarations/api-cli.ts` | Contract API snapshots: write, check, and a coarse class of the change against a base |
|
|
44
45
|
| `omne-metrics` | `src/metrics/cli.ts` | Structure metrics and the review page |
|
|
45
46
|
| `omne-loop-status` | `src/loop/cli.ts` | Clean loop status |
|
|
46
47
|
| `omne-loop-health` | `src/loop/health-cli.ts` | Process health page |
|
|
@@ -51,6 +52,29 @@ The actual architecture extraction reads only the files of one revision. A packa
|
|
|
51
52
|
|
|
52
53
|
`pnpm run check:design` checks current design sources, domain objects, and generated inputs. `pnpm run loop:health` reports trends, test timings, and Git history.
|
|
53
54
|
|
|
55
|
+
## Contract API snapshots
|
|
56
|
+
|
|
57
|
+
`omne-contract-api` keeps one API snapshot file for each contract member. The contract members are the `contracts` entries of `docs/engineering/delivery-lines.json`. The behavior contract is in the [SPEC](src/declarations/SPEC.md).
|
|
58
|
+
|
|
59
|
+
- `--write` writes the snapshots from `dist`. It does not write a member that has no `dist`, incomplete declarations or compile diagnostics.
|
|
60
|
+
- `--check` compares each snapshot file with a snapshot that it makes from `dist` now, and reports each difference. With `--json`, it gives the SHA-256 of each snapshot file. The snapshot digest is this SHA-256 of the file bytes.
|
|
61
|
+
- `--diff <base>` compares the snapshot files at a base commit with the snapshot files in the working tree. It gives `none`, `additive` or `review` for each member and reports which side a change breaks. It reads only the snapshot files, not `dist`, so run `--check` first. The member list is the union of the contract lists at the base and now. A member without a snapshot at the base counts as `additive`. To decide whether a change is additive, give the milestone baseline commit.
|
|
62
|
+
- `--check` and `--diff` only report and exit 0. `--write` exits 1 when it cannot write a member. Errors exit 2.
|
|
63
|
+
|
|
64
|
+
A snapshot has two parts: the names that each entry exports, and every declaration file of the member's `dist`, normalized by the TypeScript printer. The declaration files keep their imports, exports and module augmentations, so a snapshot can be restored to declarations that compile.
|
|
65
|
+
|
|
66
|
+
The class is a whitelist gate. Differences fall into two buckets. Any difference in global scope makes the whole member `review` without running the checker: a `declare global` block or a `declare module` block for an external module that is added, removed or changed; a script file (a `.d.ts` without imports or exports) that is added, removed, changed or switched to a module; any triple-slash directive difference; an added or removed import or `export … from` edge (bound, type-only, empty and side-effect imports all count); an added, removed or renamed `export as namespace`. A consumer's program has one global scope, so the checker cannot prove that such a change leaves existing exports untouched. In module scope a change is `additive` only with two pieces of positive evidence. First, every difference is in the whitelist. The whitelist has two kinds of change: a new export that introduces a name the old side does not know (a declaration that merges with an existing one, such as a new overload, does not count; nor does a name that an entry already exports or that resolves to an existing symbol in the file's scope, such as a local `Error` shadowing the lib's), and a new optional property (property syntax) in a module-scope interface or type literal (a change inside an augmentation of the member's own module does not count). Second, the TypeScript checker proves assignability in two directions for each export that the change touches. New to old shows that existing readers still accept the new value. Old to new shows that existing writers (providers, doubles and implementers) still produce an accepted value. Everything else is `review`, and the report names the rule: a global-scope change, a change outside the whitelist, no comparison covers the export, a direction fails, the checker did not finish, too many instance combinations, or compile diagnostics. The tool uses `@typescript/typescript6`, which repo-toolchain already depends on. It adds no new dependency.
|
|
67
|
+
|
|
68
|
+
The tool does not use API Extractor, because API Extractor does not analyze ambient declarations. It drops every `declare module` and `declare global` augmentation, and the public surface of 8 of the 27 contract members contains such augmentations.
|
|
69
|
+
|
|
70
|
+
The `contractApi` configuration section has two keys. `members` is the path of the line table. `snapshot` is the snapshot path template. It ends with `.md` and contains `{member}` or `{package}`. Any other key, a missing key or a bad value is an error.
|
|
71
|
+
|
|
72
|
+
`review` means that a person must decide. It includes changes that break the writer, the reader or both. It also includes changes that the additive-change table allows but that are outside the whitelist. Examples are a new member of a union that the contract declares open, and a new default for a type parameter. `review` is not a level for the "契约变化" section of a PR. A person decides that level (none, additive or breaking) from the additive-change table in `docs/engineering/integration.md`.
|
|
73
|
+
|
|
74
|
+
The tool reads only the shape of the declarations. It does not read behavior, documentation or runtime validation. It reports which side breaks, but it does not decide whether that break is acceptable. The gate fails closed: when the evidence is not complete, the result is `review`. So `review` results are more frequent than with the checker alone. This is a deliberate trade-off for the report-only stage. A snapshot that matches `dist` shows only that the snapshot is current. It does not show that a change is additive. See the SPEC for the known limits, including the recursion heuristic that puts additive changes to types like `ToolBindings` into `review`.
|
|
75
|
+
|
|
76
|
+
A card that changes the public surface of a contract member runs `--write` in the same PR. When the snapshot format version changes, all snapshots must be made again. See the Chinese README section "契约 API 快照" for the operating rules.
|
|
77
|
+
|
|
54
78
|
## Stop-hook revision reads
|
|
55
79
|
|
|
56
80
|
The Stop hook recalculates its baseline on each invocation. With a task context it uses `taskBase`. Without one it uses the nearest merge base among `primaryBranch` and the active tracks in `integration-policy.json`. See the Chinese README section "收工钩子" for the exact rules.
|
|
@@ -84,3 +108,26 @@ The extractor does not prove lifecycle, authorization, isolation or shared commi
|
|
|
84
108
|
Public services, member SPEC files and behavior verification own those obligations.
|
|
85
109
|
Tests cover source moves, injection additions, metadata changes, collisions, unknowns and missing inputs.
|
|
86
110
|
See [the full configuration and output description](README_ZH.md#实际装配与全局架构约束).
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
## Exact historical acceptance approvals
|
|
114
|
+
|
|
115
|
+
The acceptance lock preserves original role violations in `LockReport.violations` and `commits[].allowed`.
|
|
116
|
+
`approvedExceptions` lists approved historical changes with their complete commit, parent, path, old and new blobs, diff SHA-256, and decision URL.
|
|
117
|
+
`unresolvedViolations` lists the remaining findings. The acceptance CLI returns 1 for these findings and 2 for tool errors.
|
|
118
|
+
Loop keeps each full report in `auditRanges[].acceptance`. Its acceptance hard line contains only unresolved findings.
|
|
119
|
+
Both text reports show original violations and approvals. Other Loop hard lines still apply.
|
|
120
|
+
|
|
121
|
+
The artifact contains only the fixed [D010 decision](https://github.com/nemori-ai/omne-harness-lite/issues/638#issuecomment-6367449357).
|
|
122
|
+
It covers commit `48ad37d292796326d65055a75e8a1fde44fe4233` and `packages/agent/agent/acceptance/README.md`.
|
|
123
|
+
The tool checks real Git objects, one parent, exact blobs, and all bytes from `git diff --no-ext-diff --no-textconv --no-color --binary -U3 --src-prefix=a/ --dst-prefix=b/ --text`.
|
|
124
|
+
The call fixes `core.abbrev=8`, `diff.noprefix=false`, `diff.mnemonicPrefix=false`, `diff.algorithm=myers`, `diff.indentHeuristic=true`, `diff.context=3`, `diff.interHunkContext=0`, `diff.suppressBlankEmpty=false`, `diff.srcPrefix=a/`, `diff.dstPrefix=b/`, `core.attributesFile=/dev/null`, and `attr.tree` (the empty tree). It removes `GIT_DIFF_OPTS` and `GIT_ATTR_SOURCE` from its environment and sets `GIT_ATTR_NOSYSTEM=1`. Repository size and these settings do not change the bytes.
|
|
125
|
+
Known limits: a funcname, xfuncname or `binary` attribute in `info/attributes`, a `.gitattributes` file in the worktree on Git older than 2.43, and an object prefix collision change the bytes. D010 then does not receive approval. These cases fail as a rejection, never as a false approval.
|
|
126
|
+
Ordinary documents in that historical commit do not prevent approval. An additional protected path cannot receive this approval.
|
|
127
|
+
Uncommitted edits, future developer commits, and fingerprint or decision mismatches still fail.
|
|
128
|
+
Git read failures remain tool errors. Configuration, environment variables, arguments, and supplied URLs cannot authorize changes.
|
|
129
|
+
No runtime GitHub request is required. Adoption trusts the reviewed artifact and its npm integrity.
|
|
130
|
+
Source tests alone do not establish that consumers installed the release.
|
|
131
|
+
|
|
132
|
+
Regression tests are in `tests/acceptance-lock.spec.ts` and `tests/loop-strict.spec.ts`.
|
|
133
|
+
The real history cases require this repository's D010 Git objects.
|
package/README_ZH.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md)
|
|
4
4
|
|
|
5
|
-
`@omne-harness/repo-toolchain` 是本仓库的检查器包,发布在 npm
|
|
5
|
+
`@omne-harness/repo-toolchain` 是本仓库的检查器包,发布在 npm。它提供规则引擎、提交署名、依赖图、声明兼容、契约 API 快照、结构度量、实际架构抽取、审讯页与 clean loop。仓库在 `pnpm-workspace.yaml` 的 catalog 里钉它的精确版本,根目录的检查与三个工具成员都运行 npm 上的那个版本,不运行本目录的源码。改了本目录,要先发新版本,再开改钉子的 PR,见[开发指南](../../docs/development.md#仓库工具链的版本)。
|
|
6
6
|
|
|
7
7
|
三个不发布的工具成员经本包的子路径导入它,本包不引用它们:
|
|
8
8
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
- 被检查的仓库取 `OMNE_SUBJECT_ROOT`,未设置时取当前目录所在 Git 仓库的根。
|
|
16
16
|
- 运行检查器的仓库取 `OMNE_RUNNER_ROOT`,未设置时与被检查的仓库相同。依赖规则(`.dependency-cruiser.cjs`、`tsconfig.base.json`)与配置只从这个仓库读,被检查的检出改不了它们。
|
|
17
|
-
- 配置在仓库根的 [`repo-toolchain.config.json`](../../repo-toolchain.config.json)
|
|
17
|
+
- 配置在仓库根的 [`repo-toolchain.config.json`](../../repo-toolchain.config.json),可有 `loop`、`metrics`、`acceptanceLock`、`contractApi` 四节,每个命令只读自己的那一节。缺文件、缺所读的节或有认不出的节时报错,不使用默认值。`contractApi` 一节从 0.0.10 起认得,更早的版本见到它会报错。
|
|
18
18
|
- dependency-cruiser 需要 TypeScript 才能解析 `.ts`。用 pnpm 安装时,在 `pnpm-workspace.yaml` 的 `packageExtensions` 里给 dependency-cruiser 加上 `typescript`。找不到 TypeScript 时,依赖图检查报错退出,不会在漏掉 `.ts` 的情况下通过。
|
|
19
19
|
|
|
20
20
|
## 包内分层
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
| --- | --- | --- |
|
|
32
32
|
| `omne-deps` | `src/deps/cli.ts` | 依赖规则与成员、组之间的环 |
|
|
33
33
|
| `omne-declarations` | `src/declarations/cli.ts` | 用 TypeScript 6 读成员 dist 里的声明 |
|
|
34
|
+
| `omne-contract-api` | `src/declarations/api-cli.ts` | 契约成员的 API 快照:写、核对与相对基线的粗分类 |
|
|
34
35
|
| `omne-metrics` | `src/metrics/cli.ts` | 结构度量与审讯页 |
|
|
35
36
|
| `omne-loop-status` | `src/loop/cli.ts` | 回路状态 |
|
|
36
37
|
| `omne-loop-health` | `src/loop/health-cli.ts` | 流程体检页 |
|
|
@@ -103,20 +104,37 @@ pnpm run acceptance:lock --base <任务基线提交或分支>
|
|
|
103
104
|
|
|
104
105
|
模板生成的验收入口不算验收内容:`acceptance/` 下名为 `README.md` 或 `index.md`、变化后(删除时看变化前)仍有独立一行文档占位标记的文件,增删改都不计入;去掉标记、写入真实内容的改动照常计入(RFC-0007)。
|
|
105
106
|
|
|
106
|
-
**基线提交就是清单**:Git 按内容寻址,派发时不必另存一份哈希。工具拿基线与 HEAD
|
|
107
|
+
**基线提交就是清单**:Git 按内容寻址,派发时不必另存一份哈希。工具拿基线与 HEAD 的合并点同当前工作树比,输出以下事实:
|
|
107
108
|
|
|
108
109
|
- 基线到当前工作树,验收文件的净变化(新增、修改、删除,含未提交与未跟踪);
|
|
109
110
|
- 这段范围里**每一个**碰过验收文件的提交:短号、作者、来源 trailer 里的 `Agent-Role`、碰了哪些文件;
|
|
110
|
-
-
|
|
111
|
+
- 原始违规、已批准的精确历史例外和未解决违规。
|
|
111
112
|
|
|
112
113
|
| 判锁被破(退出 1) | 放行 |
|
|
113
114
|
| ------------------------------------------------------------------- | ----------------------------------------------- |
|
|
114
|
-
| 碰过验收文件的提交,`Agent-Role` 不在拥有者角色里(如 `developer
|
|
115
|
+
| 碰过验收文件的提交,`Agent-Role` 不在拥有者角色里(如 `developer`),且没有精确历史批准 | `Agent-Role` 是拥有者角色(`main`、`qa`)的提交 |
|
|
115
116
|
| 工作树里有未提交或未跟踪的验收改动——说不清是谁改的 | 没有来源 trailer 的提交:按人写的算 |
|
|
116
117
|
|
|
117
118
|
哪些根目录下的成员受管、验收目录叫什么、哪些角色算拥有者,只在
|
|
118
119
|
仓库根 [`repo-toolchain.config.json`](../../repo-toolchain.config.json) 的 `acceptanceLock` 一节 里定一次。用法或 Git 出错(`--base` 没给值、基线不存在)退出 2。
|
|
119
120
|
|
|
121
|
+
`LockReport.violations` 保留原始发现,`commits[].allowed` 仍表示原角色判断。
|
|
122
|
+
`approvedExceptions` 单列已批准历史例外,包含完整 commit、parent、path、oldBlob、newBlob、diffSha256 和 decisionUrl。
|
|
123
|
+
`unresolvedViolations` 表示剩余违规,独立 CLI 据它返回 0 或 1。
|
|
124
|
+
Loop 的 `auditRanges[].acceptance` 保留完整报告,`hardLines.acceptanceLock.violations` 只列未解决项。
|
|
125
|
+
Loop 的 Markdown 同时显示原始违规和批准决定;其他硬线照常判断。
|
|
126
|
+
|
|
127
|
+
当前制品只包含 [D010 的固定决定](https://github.com/nemori-ai/omne-harness-lite/issues/638#issuecomment-6367449357)。
|
|
128
|
+
它只批准提交 `48ad37d292796326d65055a75e8a1fde44fe4233` 中的 `packages/agent/agent/acceptance/README.md` 改动。
|
|
129
|
+
工具读取真实 Git 对象,核对完整提交、唯一父提交、受保护路径、旧新 blob 和完整二进制 diff 的 SHA-256。该 diff 使用 `git diff --no-ext-diff --no-textconv --no-color --binary -U3 --src-prefix=a/ --dst-prefix=b/ --text`。
|
|
130
|
+
调用固定 `core.abbrev=8`、`diff.noprefix=false`、`diff.mnemonicPrefix=false`、`diff.algorithm=myers`、`diff.indentHeuristic=true`、`diff.context=3`、`diff.interHunkContext=0`、`diff.suppressBlankEmpty=false`、`diff.srcPrefix=a/`、`diff.dstPrefix=b/`、`core.attributesFile=/dev/null` 与 `attr.tree`(空树),从环境中去掉 `GIT_DIFF_OPTS` 与 `GIT_ATTR_SOURCE`,并设 `GIT_ATTR_NOSYSTEM=1`。仓库大小与这些配置不会改变字节。
|
|
131
|
+
已知限制:`info/attributes` 中的 funcname、xfuncname 或 `binary` 属性,Git 2.43 以前版本下工作树里的 `.gitattributes`,以及对象前缀碰撞,会改变字节,D010 因此不获批准。这些情况的失败方向是拒绝,不会误批准。
|
|
132
|
+
其他普通文档可以在原提交中一起修改;多一个受保护验收路径不能命中例外。
|
|
133
|
+
未提交改动、未来 developer 提交和任一指纹或决定不匹配仍失败。Git 读取失败退出 2。
|
|
134
|
+
仓库配置、环境变量、CLI 参数和外部 URL 都不能新增批准;运行时不访问 GitHub。
|
|
135
|
+
批准记录随受审查的工具制品发布,安装版本与 npm integrity 是采用边界,源码测试通过不代表已安装修复。
|
|
136
|
+
持续验证见 `tests/acceptance-lock.spec.ts` 和 `tests/loop-strict.spec.ts`。真实历史用例需要本仓库保留上述 Git 对象。
|
|
137
|
+
|
|
120
138
|
它**不能声称**的:角色取自提交信息里的来源 trailer,那是提交的人自己写的——一个把 `Agent-Role` 写成 `main` 的实施提交它认不出来,
|
|
121
139
|
所以碰过验收的提交一律列出,由接受的人过目。先改后改回的提交照样列出、照样判破,哪怕净变化为零。
|
|
122
140
|
它不看验收的内容对不对、有没有被运行、过没过;文件名是否带卡号也不查。自测:`tests/acceptance-lock.spec.ts`。
|
|
@@ -588,3 +606,48 @@ pnpm run loop:health # --out 可改产物目录
|
|
|
588
606
|
`pnpm run check` 在构建一步之后常驻跑它。
|
|
589
607
|
|
|
590
608
|
本工具调用 `createProgram`、`createSourceFile` 等旧编程接口的模块都从 `@typescript/typescript6` 导入,行为与 TypeScript 6 相同。
|
|
609
|
+
|
|
610
|
+
## 契约 API 快照
|
|
611
|
+
|
|
612
|
+
契约成员是[线归属表](../../docs/engineering/delivery-lines.json)各线 `contracts` 列出的成员。线内的卡对它们只做可加改动,规则见[可加改动](../../docs/engineering/integration.md#可加改动)。本命令给每个契约成员一份入库的 API 快照,并把两份快照之间的差异粗分为三类:`none` 表示没有变化;`additive` 表示改动对已有的读方与写方都不破坏;`review` 表示其余一切改动,需要人判断。它只报告,不拦截。行为契约(输入、快照内容、确定性、分类规则、已知限制、退出码与配置校验)见 [SPEC](src/declarations/SPEC.md)。
|
|
613
|
+
|
|
614
|
+
```sh
|
|
615
|
+
omne-contract-api --write # 从 dist 重写快照(先构建)
|
|
616
|
+
omne-contract-api --check # 拿 dist 现场生成的快照与快照文件比
|
|
617
|
+
omne-contract-api --diff <基线提交或分支> # 基线提交上的快照对工作树的快照,逐成员粗分类
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
三个动作都可加 `--json`,把结果按 JSON 写到标准输出。`--root <检出目录>` 指定被检查的检出。
|
|
621
|
+
|
|
622
|
+
配置在 `repo-toolchain.config.json` 的 `contractApi` 一节,有两个键:
|
|
623
|
+
|
|
624
|
+
- `members`:线归属表的路径。
|
|
625
|
+
- `snapshot`:快照路径模板,以 `.md` 结尾,至少含 `{member}`(成员目录)或 `{package}`(不带 scope 的包名)之一。
|
|
626
|
+
|
|
627
|
+
这一节有别的键、缺键或值不合条件时,命令报错退出。两个成员算出同一个快照路径时,命令也报错退出。
|
|
628
|
+
|
|
629
|
+
读法与[声明兼容](#声明兼容)用同一套 TypeScript 6 选项,另建一个程序,按消费者视角读 dist。成员 dist 有编译诊断时,不生成它的快照。
|
|
630
|
+
|
|
631
|
+
快照分两部分:每个入口导出的名字(写明声明在哪个文件或哪个外部包),以及成员 dist 里经打印器规范化的全部声明文件。声明文件保留导入、导出与模块扩充,所以快照能还原成一组能编译的声明。
|
|
632
|
+
|
|
633
|
+
分类是白名单门:只有正证据成立才是 `additive`。差异分两桶。全局作用域的任何差异整份 `review`,不跑检查器:`declare global` 与对外部模块的 `declare module` 块的增删改、脚本文件的增删改或与模块之间切换、三斜线指令的变化、导入或 `export … from` 的模块边增删(带绑定、仅类型、空导入、无绑定导入都算)、`export as namespace` 的增删改。消费者程序里全局作用域只有一份,检查器证明不了「这处改动没有影响已有导出」。模块作用域的正证据有两条。第一,每一处差异都在白名单里,白名单只有两类:新增一个旧侧不知道的名字的导出(与已有同名声明合并的不算,例如新增重载;与入口已有的导出名或该文件作用域里已有符号重名的也不算,例如遮住 `export *` 导出的名字或 lib 的 `Error`),以及在模块作用域的接口或类型字面量里新增可选属性(属性写法;对本成员模块的扩充块内的改动不算)。第二,TypeScript 检查器对涉及的每个导出证明两个方向都可赋值:新 → 旧成立表示读方不破坏,旧 → 新成立表示写方(提供者、替身、实现者)不破坏。其余一律 `review`,报告写明命中哪一条:全局作用域变了、白名单外改动、没有比较覆盖、方向不成立、检查器未完成、实例组合超限、编译诊断。它用的是 repo-toolchain 已有的 `@typescript/typescript6`,不加新依赖。规则、白名单与归一化见 [SPEC](src/declarations/SPEC.md#分类)。
|
|
634
|
+
|
|
635
|
+
不用 API Extractor 的理由:它不分析 ambient 声明,`declare module` 与 `declare global` 的扩充在它的报告里全部缺失,而 27 个契约成员里有 8 个的公开面含这类扩充。探路与复核的结论记在卡 #645 的评论里。
|
|
636
|
+
|
|
637
|
+
操作要求:
|
|
638
|
+
|
|
639
|
+
- 改了契约成员公开面的卡,在同一个 PR 里构建并运行 `--write`,把快照的变化一起提交。`--check` 报不一致时,先判断改动是否有意。
|
|
640
|
+
- 本工具改了快照格式(格式版本变了)时,全部快照要重新生成。
|
|
641
|
+
- 谁写首份快照、格式变化时谁重新生成,规则见[里程碑内的规则](../../docs/engineering/integration.md#里程碑内的规则)。
|
|
642
|
+
|
|
643
|
+
`--diff` 的前提:
|
|
644
|
+
|
|
645
|
+
- 它只比快照文件,不读 dist。先用 `--check` 确认工作树的快照与 dist 一致,或先运行 `--write`。
|
|
646
|
+
- 成员取基线与当前两份线归属表的并集,每侧的快照路径按那一侧的包名算。基线上没有快照的成员整份算 `additive`。
|
|
647
|
+
- 判断改动是否可加时,传里程碑登记的基线提交。
|
|
648
|
+
|
|
649
|
+
快照摘要是快照文件字节的 SHA-256。`--check --json` 对每个有快照文件的成员给出 `sha256`。
|
|
650
|
+
|
|
651
|
+
`review` 不是 PR「契约变化」一节的级别。它包括两方都破坏的改动、只破坏一方的改动,也包括按「可加改动」表不破坏、但不在白名单里的改动(例如契约声明开放的联合加成员、给类型参数加默认值)。PR 的 none、additive 或 breaking 由人按「可加改动」表判定。
|
|
652
|
+
|
|
653
|
+
它**不能声称**的:它报出读方与写方两个方向,但不判定哪个方向的破坏可以接受。白名单门失败关闭,拿不准时给 `review`,所以 `review` 会比只用检查器时多。这是 P1 只报告阶段的有意取舍。它只看声明的形状,不看行为、文档或运行时校验。转导出的别的包的声明变化归那个包的快照。快照与 dist 一致只说明快照是最新的,不说明改动可加。其余限制(例如 `ToolBindings` 一类的递归启发式误报)见 [SPEC](src/declarations/SPEC.md#已知限制)。
|
package/dist/acceptance/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// 验收锁入口:`--base <ref>` 给任务基线;不给时按统一规则取(环境变量 BASELINE,再取任务上下文的基线,再取 origin/main,最后取 main)。退出码 0
|
|
2
|
+
// 验收锁入口:`--base <ref>` 给任务基线;不给时按统一规则取(环境变量 BASELINE,再取任务上下文的基线,再取 origin/main,最后取 main)。退出码 0 表示没有未解决违规,1 表示仍有未解决违规,2 表示用法或 Git 出错。
|
|
3
3
|
import { auditRanges, resolveBaseline } from '../core/task-context.js';
|
|
4
4
|
import { resolve } from 'node:path';
|
|
5
5
|
import { inspect, readAcceptanceLockConfig, render } from './lock.js';
|
|
@@ -31,7 +31,7 @@ function main(argv) {
|
|
|
31
31
|
for (const report of reports)
|
|
32
32
|
for (const line of render(report, config))
|
|
33
33
|
console.log(line);
|
|
34
|
-
return reports.every(report => report.
|
|
34
|
+
return reports.every(report => report.unresolvedViolations.length === 0) ? 0 : 1;
|
|
35
35
|
}
|
|
36
36
|
try {
|
|
37
37
|
process.exitCode = main(process.argv.slice(2));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/acceptance/cli.ts"],"names":[],"mappings":";AACA,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/acceptance/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface HistoricalApproval {
|
|
2
|
+
readonly commit: string;
|
|
3
|
+
readonly parent: string;
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly oldBlob: string;
|
|
6
|
+
readonly newBlob: string;
|
|
7
|
+
readonly diffSha256: string;
|
|
8
|
+
readonly decisionUrl: string;
|
|
9
|
+
}
|
|
10
|
+
/** Internal matcher: it can recognize the compiled decision, never authorize a new one. */
|
|
11
|
+
export declare function matchHistoricalApproval(candidate: Partial<HistoricalApproval>, protectedPaths: readonly string[]): HistoricalApproval | undefined;
|
|
12
|
+
/** Read immutable Git objects; errors propagate to the caller as tool failures. */
|
|
13
|
+
export declare function inspectHistoricalApproval(root: string, commit: string, protectedPaths: readonly string[]): HistoricalApproval | undefined;
|
|
14
|
+
//# sourceMappingURL=historical-approvals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historical-approvals.d.ts","sourceRoot":"","sources":["../../src/acceptance/historical-approvals.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAsED,2FAA2F;AAC3F,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACtC,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,kBAAkB,GAAG,SAAS,CAYhC;AAED,mFAAmF;AACnF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,kBAAkB,GAAG,SAAS,CAqChC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { repositoryEnv } from '../core/git-environment.js';
|
|
4
|
+
// The reviewed tool artifact owns this decision. Repository inputs cannot add approvals.
|
|
5
|
+
const D010 = Object.freeze({
|
|
6
|
+
commit: '48ad37d292796326d65055a75e8a1fde44fe4233',
|
|
7
|
+
parent: 'e7aab8ec73002713d2ef6486401816850c984fb1',
|
|
8
|
+
path: 'packages/agent/agent/acceptance/README.md',
|
|
9
|
+
oldBlob: 'f7fac2fc21bfceb51c3dd84542b866eb7bb12c89',
|
|
10
|
+
newBlob: 'fbf0d08732f5d2004c3d63cff6c8be11442da99b',
|
|
11
|
+
diffSha256: 'eee5be00ebfdf300db6978cb2981a1b989dcd977846fc3de2669bb835edf3a2c',
|
|
12
|
+
decisionUrl: 'https://github.com/nemori-ai/omne-harness-lite/issues/638#issuecomment-6367449357',
|
|
13
|
+
});
|
|
14
|
+
// Fixed diff settings: the same Git objects must give the same bytes under any user or repository
|
|
15
|
+
// configuration that these settings cover. core.abbrev=8 matches the abbreviation length at
|
|
16
|
+
// approval time. Do not use --full-index: it changes the bytes and so the approved digest.
|
|
17
|
+
// attr.tree reads attributes from the empty tree instead of the worktree (Git 2.43 and later).
|
|
18
|
+
// Not covered: funcname, xfuncname or binary attributes from info/attributes; .gitattributes in the
|
|
19
|
+
// worktree on Git older than 2.43; and object prefix collisions that lengthen the index line.
|
|
20
|
+
// They change the bytes, so the approval fails closed (rejection), never opens.
|
|
21
|
+
const EMPTY_TREE = '4b825dc642cb6eb9a060e54bf8d69288fbee4904';
|
|
22
|
+
const FINGERPRINT_DIFF_ARGS = [
|
|
23
|
+
'-c',
|
|
24
|
+
'core.abbrev=8',
|
|
25
|
+
'-c',
|
|
26
|
+
'diff.noprefix=false',
|
|
27
|
+
'-c',
|
|
28
|
+
'diff.mnemonicPrefix=false',
|
|
29
|
+
'-c',
|
|
30
|
+
'diff.algorithm=myers',
|
|
31
|
+
'-c',
|
|
32
|
+
'diff.indentHeuristic=true',
|
|
33
|
+
'-c',
|
|
34
|
+
'diff.context=3',
|
|
35
|
+
'-c',
|
|
36
|
+
'diff.interHunkContext=0',
|
|
37
|
+
'-c',
|
|
38
|
+
'diff.suppressBlankEmpty=false',
|
|
39
|
+
'-c',
|
|
40
|
+
'diff.srcPrefix=a/',
|
|
41
|
+
'-c',
|
|
42
|
+
'diff.dstPrefix=b/',
|
|
43
|
+
'-c',
|
|
44
|
+
'core.attributesFile=/dev/null',
|
|
45
|
+
'-c',
|
|
46
|
+
`attr.tree=${EMPTY_TREE}`,
|
|
47
|
+
'diff',
|
|
48
|
+
'--no-ext-diff',
|
|
49
|
+
'--no-textconv',
|
|
50
|
+
'--no-color',
|
|
51
|
+
'--binary',
|
|
52
|
+
'-U3',
|
|
53
|
+
'--src-prefix=a/',
|
|
54
|
+
'--dst-prefix=b/',
|
|
55
|
+
'--text',
|
|
56
|
+
];
|
|
57
|
+
/**
|
|
58
|
+
* GIT_DIFF_OPTS overrides the context width even over -U3, and GIT_ATTR_SOURCE overrides
|
|
59
|
+
* attr.tree, so the fingerprint call drops both. GIT_ATTR_NOSYSTEM skips system attributes.
|
|
60
|
+
*/
|
|
61
|
+
function fingerprintEnv(base) {
|
|
62
|
+
const { GIT_DIFF_OPTS: _diffOptions, GIT_ATTR_SOURCE: _attributeSource, ...env } = repositoryEnv(base);
|
|
63
|
+
return { ...env, GIT_ATTR_NOSYSTEM: '1' };
|
|
64
|
+
}
|
|
65
|
+
/** Internal matcher: it can recognize the compiled decision, never authorize a new one. */
|
|
66
|
+
export function matchHistoricalApproval(candidate, protectedPaths) {
|
|
67
|
+
return protectedPaths.length === 1 &&
|
|
68
|
+
protectedPaths[0] === D010.path &&
|
|
69
|
+
candidate.commit === D010.commit &&
|
|
70
|
+
candidate.parent === D010.parent &&
|
|
71
|
+
candidate.path === D010.path &&
|
|
72
|
+
candidate.oldBlob === D010.oldBlob &&
|
|
73
|
+
candidate.newBlob === D010.newBlob &&
|
|
74
|
+
candidate.diffSha256 === D010.diffSha256 &&
|
|
75
|
+
candidate.decisionUrl === D010.decisionUrl
|
|
76
|
+
? D010
|
|
77
|
+
: undefined;
|
|
78
|
+
}
|
|
79
|
+
/** Read immutable Git objects; errors propagate to the caller as tool failures. */
|
|
80
|
+
export function inspectHistoricalApproval(root, commit, protectedPaths) {
|
|
81
|
+
if (commit !== D010.commit || protectedPaths.length !== 1 || protectedPaths[0] !== D010.path)
|
|
82
|
+
return undefined;
|
|
83
|
+
const git = (args, env = repositoryEnv(process.env)) => execFileSync('git', args, {
|
|
84
|
+
cwd: root,
|
|
85
|
+
env,
|
|
86
|
+
maxBuffer: 256 * 1024 * 1024,
|
|
87
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
88
|
+
});
|
|
89
|
+
const objectId = (type, revision) => {
|
|
90
|
+
const bytes = git(['cat-file', type, revision]);
|
|
91
|
+
return createHash('sha1').update(`${type} ${bytes.length}\0`).update(bytes).digest('hex');
|
|
92
|
+
};
|
|
93
|
+
if (objectId('commit', commit) !== D010.commit || objectId('commit', D010.parent) !== D010.parent)
|
|
94
|
+
return undefined;
|
|
95
|
+
const identity = git(['show', '-s', '--format=%H %P', commit]).toString('utf8').trim();
|
|
96
|
+
if (identity !== `${D010.commit} ${D010.parent}`)
|
|
97
|
+
return undefined;
|
|
98
|
+
return matchHistoricalApproval({
|
|
99
|
+
commit,
|
|
100
|
+
parent: D010.parent,
|
|
101
|
+
path: D010.path,
|
|
102
|
+
oldBlob: objectId('blob', `${D010.parent}:${D010.path}`),
|
|
103
|
+
newBlob: objectId('blob', `${commit}:${D010.path}`),
|
|
104
|
+
diffSha256: createHash('sha256')
|
|
105
|
+
.update(git([...FINGERPRINT_DIFF_ARGS, D010.parent, commit, '--', D010.path], fingerprintEnv(process.env)))
|
|
106
|
+
.digest('hex'),
|
|
107
|
+
decisionUrl: D010.decisionUrl,
|
|
108
|
+
}, protectedPaths);
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=historical-approvals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historical-approvals.js","sourceRoot":"","sources":["../../src/acceptance/historical-approvals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type HistoricalApproval } from './historical-approvals.ts';
|
|
1
2
|
import { type CommitRecord } from '../commits.ts';
|
|
2
3
|
export interface AcceptanceLockConfig {
|
|
3
4
|
/** 成员所在的根目录;只有它们下面的验收目录受这把锁管。 */
|
|
@@ -41,7 +42,10 @@ export interface LockReport {
|
|
|
41
42
|
readonly commits: readonly TouchingCommit[];
|
|
42
43
|
/** 工作树里还没提交的验收改动:说不清是谁改的。 */
|
|
43
44
|
readonly uncommitted: readonly string[];
|
|
45
|
+
/** Original findings, including precisely approved historical changes. */
|
|
44
46
|
readonly violations: readonly string[];
|
|
47
|
+
readonly approvedExceptions: readonly HistoricalApproval[];
|
|
48
|
+
readonly unresolvedViolations: readonly string[];
|
|
45
49
|
}
|
|
46
50
|
export interface CommitTouch {
|
|
47
51
|
readonly record: CommitRecord;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/acceptance/lock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/acceptance/lock.ts"],"names":[],"mappings":"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"}
|
package/dist/acceptance/lock.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// 交回时拿它与当前工作树比,并把这段范围里碰过验收文件的提交逐个列出、按来源 trailer 判断是不是验收的拥有者改的。
|
|
4
4
|
// 谁算拥有者、哪个目录算验收,只在仓库根 `repo-toolchain.config.json` 的 `acceptanceLock` 一节里定一次。
|
|
5
5
|
import { execFileSync } from 'node:child_process';
|
|
6
|
+
import { inspectHistoricalApproval } from './historical-approvals.js';
|
|
6
7
|
import { readFileSync } from 'node:fs';
|
|
7
8
|
import { join } from 'node:path';
|
|
8
9
|
import { repositoryEnv } from '../core/git-environment.js';
|
|
@@ -96,8 +97,11 @@ function contentAt(root, revision, path) {
|
|
|
96
97
|
try {
|
|
97
98
|
return git(root, ['show', `${revision}:${path}`]);
|
|
98
99
|
}
|
|
99
|
-
catch {
|
|
100
|
-
|
|
100
|
+
catch (error) {
|
|
101
|
+
// A missing path is expected for additions/deletions; a failed read of an existing path is not.
|
|
102
|
+
if (git(root, ['ls-tree', revision, '--', path]) === '')
|
|
103
|
+
return undefined;
|
|
104
|
+
throw error;
|
|
101
105
|
}
|
|
102
106
|
}
|
|
103
107
|
function worktreeContent(root, path) {
|
|
@@ -173,12 +177,26 @@ function touchesSince(root, mergeBase, config, head = 'HEAD', integration = fals
|
|
|
173
177
|
export function inspect(root, base, config, head = 'HEAD', integration = false) {
|
|
174
178
|
const mergeBase = git(root, ['merge-base', base, head]);
|
|
175
179
|
const uncommitted = head === 'HEAD' ? uncommittedPaths(root, config) : [];
|
|
180
|
+
const touches = touchesSince(root, mergeBase, config, head, integration);
|
|
181
|
+
const original = judge(touches, uncommitted, config);
|
|
182
|
+
const approvedExceptions = original.commits.flatMap(commit => {
|
|
183
|
+
if (commit.allowed)
|
|
184
|
+
return [];
|
|
185
|
+
const approval = inspectHistoricalApproval(root, commit.sha, commit.files);
|
|
186
|
+
return approval === undefined ? [] : [approval];
|
|
187
|
+
});
|
|
188
|
+
const unresolvedTouches = touches.flatMap(touch => {
|
|
189
|
+
const files = touch.files.filter(path => !approvedExceptions.some(item => item.commit === touch.record.sha && item.path === path));
|
|
190
|
+
return files.length === 0 ? [] : [{ ...touch, files }];
|
|
191
|
+
});
|
|
176
192
|
return {
|
|
177
193
|
base,
|
|
178
194
|
mergeBase,
|
|
179
195
|
changes: changesSince(root, mergeBase, config, head),
|
|
180
196
|
uncommitted,
|
|
181
|
-
...
|
|
197
|
+
...original,
|
|
198
|
+
approvedExceptions,
|
|
199
|
+
unresolvedViolations: judge(unresolvedTouches, uncommitted, config).violations,
|
|
182
200
|
};
|
|
183
201
|
}
|
|
184
202
|
const STATUS_WORD = { added: '新增', modified: '修改', deleted: '删除' };
|
|
@@ -203,10 +221,19 @@ export function render(report, config) {
|
|
|
203
221
|
if (report.violations.length === 0)
|
|
204
222
|
out.push(' 没有不该改验收的角色动过它。');
|
|
205
223
|
else {
|
|
206
|
-
out.push(`
|
|
224
|
+
out.push(` 原始违规(锁被破 ${report.violations.length} 处):`);
|
|
207
225
|
for (const violation of report.violations)
|
|
208
226
|
out.push(` ${violation}`);
|
|
209
227
|
}
|
|
228
|
+
out.push(` 已批准历史例外 ${report.approvedExceptions.length} 处:`);
|
|
229
|
+
for (const approval of report.approvedExceptions) {
|
|
230
|
+
out.push(` ${approval.commit} ${approval.path}`, ` 决定:${approval.decisionUrl}`);
|
|
231
|
+
out.push(` parent: ${approval.parent}`, ` oldBlob: ${approval.oldBlob}`);
|
|
232
|
+
out.push(` newBlob: ${approval.newBlob}`, ` diffSha256: ${approval.diffSha256}`);
|
|
233
|
+
}
|
|
234
|
+
out.push(` 未解决违规 ${report.unresolvedViolations.length} 处:`);
|
|
235
|
+
for (const violation of report.unresolvedViolations)
|
|
236
|
+
out.push(` ${violation}`);
|
|
210
237
|
return out;
|
|
211
238
|
}
|
|
212
239
|
/** Every audit range of this tree with the acceptance edits it carries. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/acceptance/lock.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/acceptance/lock.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,2DAA2D;AAC3D,+DAA+D;AAC/D,8EAA8E;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAA;AAC9F,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAqB,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAWvF,SAAS,KAAK,CAAC,KAAc,EAAE,IAAY;IACzC,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEpF,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAA;IAC9C,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAY;IACpD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;IAC1E,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,GAA8B,CAAA;IAC7E,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC3C,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC;QAC9C,SAAS;QACT,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC;KAC5C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,IAAI,GAAW,mBAAmB,EAAE;IAEpC,OAAO,yBAAyB,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAA;AAChF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAA4B;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAChC,OAAO,CACL,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC;QAClC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CACjD,CAAA;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,oCAAoC,CAAA;AACtE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAA;AAEtD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAA2B;IAC1E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAClG,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,kBAAkB,CAAC,CAAA;AAC7E,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,IAAI,IAAwB,CAAA;IAC5B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtD,IAAI,KAAK,KAAK,IAAI;YAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAqCD,wCAAwC;AACxC,MAAM,UAAU,KAAK,CACnB,OAA+B,EAC/B,WAA8B,EAC9B,MAA4B;IAE5B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAkB,EAAE;QAChE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACtC,OAAO;YACL,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAC/C,MAAM,EAAE,MAAM,CAAC,UAAU;YACzB,IAAI;YACJ,KAAK;YACL,OAAO,EAAE,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;SAChE,CAAA;IACH,CAAC,CAAC,CAAA;IACF,MAAM,UAAU,GAAG,OAAO;SACvB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;SACjC,GAAG,CACF,MAAM,CAAC,EAAE,CACP,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC7F,CAAA;IACH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QACxB,UAAU,CAAC,IAAI,CACb,yBAAyB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAC/D,CAAA;IACH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;AAChC,CAAC;AAED,SAAS,GAAG,CAAC,IAAY,EAAE,IAAuB;IAChD,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;QAC/B,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC;QAC/B,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;QAC5B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC,OAAO,EAAE,CAAA;AACd,CAAC;AAED,SAAS,KAAK,CAAC,IAAY;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;AACrD,CAAC;AAED,kCAAkC;AAClC,SAAS,SAAS,CAAC,IAAY,EAAE,QAAgB,EAAE,IAAY;IAC7D,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gGAAgG;QAChG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE;YAAE,OAAO,SAAS,CAAA;QACzE,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,IAAY;IACjD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAW,CAAA;AAElF,SAAS,YAAY,CACnB,IAAY,EACZ,SAAiB,EACjB,MAA4B,EAC5B,IAAI,GAAG,MAAM;IAEb,MAAM,OAAO,GAAiB,EAAE,CAAA;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,CACtB,GAAG,CAAC,IAAI,EAAE;QACR,MAAM;QACN,cAAc;QACd,eAAe;QACf,SAAS;QACT,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KACnC,CAAC,CACH,EAAE,CAAC;QACF,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,IAA2B,CAAC,CAAA;QAClD,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAA;QAC1F,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC;YAAE,SAAQ;QAC7C,MAAM,OAAO,GACX,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC;YAClC,CAAC,CAAC,IAAI,KAAK,MAAM;gBACf,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;gBAC7B,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QACnC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IACxE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,KAAK,MAAM;QAChC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,EAAE;QACJ,IAAI,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC1F,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,MAA4B;IAClE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IACjF,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAA;IAClF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;SAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;SAC9C,MAAM,CACL,IAAI,CAAC,EAAE,CACL,CAAC,kBAAkB,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAC1F;SACA,IAAI,EAAE,CAAA;AACX,CAAC;AAED,SAAS,YAAY,CACnB,IAAY,EACZ,SAAiB,EACjB,MAA4B,EAC5B,IAAI,GAAG,MAAM,EACb,WAAW,GAAG,KAAK;IAEnB,MAAM,OAAO,GAAkB,EAAE,CAAA;IACjC,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,GAAG,SAAS,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QAChE,8CAA8C;QAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE;YACtB,WAAW;YACX,gBAAgB;YAChB,aAAa;YACb,cAAc;YACd,IAAI;YACJ,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,GAAG;SACX,CAAC,CAAA;QACF,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;aACrC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;aAC9C,MAAM,CACL,IAAI,CAAC,EAAE,CACL,CAAC,kBAAkB,CACjB,IAAI,EACJ,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAC7E,CACJ;aACA,IAAI,EAAE,CAAA;QACT,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,OAAO,CACrB,IAAY,EACZ,IAAY,EACZ,MAA4B,EAC5B,IAAI,GAAG,MAAM,EACb,WAAW,GAAG,KAAK;IAEnB,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACvD,MAAM,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACzE,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;IACxE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;IACpD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAC3D,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,CAAA;QAC7B,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1E,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IACF,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAChD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAC9B,IAAI,CAAC,EAAE,CACL,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAC3F,CAAA;QACD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IACF,OAAO;QACL,IAAI;QACJ,SAAS;QACT,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC;QACpD,WAAW;QACX,GAAG,QAAQ;QACX,kBAAkB;QAClB,oBAAoB,EAAE,KAAK,CAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,UAAU;KAC/E,CAAA;AACH,CAAC;AAED,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAW,CAAA;AAE3E,MAAM,UAAU,MAAM,CAAC,MAAkB,EAAE,MAA4B;IACrE,MAAM,GAAG,GAAG;QACV,UAAU,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB;KACxH,CAAA;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QAC5B,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAA;IAC1D,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IAClG,GAAG,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAA;IACnD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,IAAI,GACR,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,IAAI,EAAE,CAAA;QAChF,GAAG,CAAC,IAAI,CACN,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,KAAK,IAAI,KAAK,MAAM,CAAC,OAAO,EAAE,CAC7G,CAAA;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAA;IAC9D,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;SAC3D,CAAC;QACJ,GAAG,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,CAAA;QACtD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU;YAAE,GAAG,CAAC,IAAI,CAAC,OAAO,SAAS,EAAE,CAAC,CAAA;IACzE,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,CAAA;IAC5D,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI,EAAE,EAAE,YAAY,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;QACxF,GAAG,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,MAAM,EAAE,EAAE,kBAAkB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;QAClF,GAAG,CAAC,IAAI,CAAC,kBAAkB,QAAQ,CAAC,OAAO,EAAE,EAAE,qBAAqB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;IAC5F,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,CAAA;IAC5D,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,oBAAoB;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,SAAS,EAAE,CAAC,CAAA;IACjF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,YAAgC,EAChC,MAA4B;IAE5B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,KAAK,KAAK,OAAO,CAAA;IAC7D,OAAO,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnD,GAAG,KAAK;QACR,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;KACjE,CAAC,CAAC,CAAA;AACL,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const TOOLCHAIN_CONFIG_FILE = "repo-toolchain.config.json";
|
|
2
|
-
export declare const TOOLCHAIN_CONFIG_SECTIONS: readonly ['loop', 'metrics', 'acceptanceLock'];
|
|
2
|
+
export declare const TOOLCHAIN_CONFIG_SECTIONS: readonly ['loop', 'metrics', 'acceptanceLock', 'contractApi'];
|
|
3
3
|
export type ToolchainConfigSection = (typeof TOOLCHAIN_CONFIG_SECTIONS)[number];
|
|
4
4
|
export declare function toolchainConfigPath(root?: string): string;
|
|
5
5
|
/** 读一节原样的 JSON;校验各节内容归各自的读取函数。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolchain-config.d.ts","sourceRoot":"","sources":["../../src/core/toolchain-config.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,qBAAqB,+BAA+B,CAAA;AACjE,eAAO,MAAM,yBAAyB,
|
|
1
|
+
{"version":3,"file":"toolchain-config.d.ts","sourceRoot":"","sources":["../../src/core/toolchain-config.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,qBAAqB,+BAA+B,CAAA;AACjE,eAAO,MAAM,yBAAyB,YACpC,MAAM,EACN,SAAS,EACT,gBAAgB,EAChB,aAAa,CACL,CAAA;AACV,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/E,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,MAAqB,GAAG,MAAM,CAEvE;AAED,kCAAkC;AAClC,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,sBAAsB,EAC/B,IAAI,GAAE,MAA8B,GACnC,OAAO,CAUT"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
// 仓库专用的配置只在仓库根的 `repo-toolchain.config.json`
|
|
1
|
+
// 仓库专用的配置只在仓库根的 `repo-toolchain.config.json` 里定一次,按节分给回路、度量、验收锁与契约 API 快照。
|
|
2
2
|
// 文件从运行检查器的仓库读(见 subject.ts);缺文件、缺节或不是 JSON 对象都报错,不悄悄用默认。
|
|
3
3
|
import { readFileSync } from 'node:fs';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { runnerRoot } from './subject.js';
|
|
6
6
|
export const TOOLCHAIN_CONFIG_FILE = 'repo-toolchain.config.json';
|
|
7
|
-
export const TOOLCHAIN_CONFIG_SECTIONS = [
|
|
7
|
+
export const TOOLCHAIN_CONFIG_SECTIONS = [
|
|
8
|
+
'loop',
|
|
9
|
+
'metrics',
|
|
10
|
+
'acceptanceLock',
|
|
11
|
+
'contractApi',
|
|
12
|
+
];
|
|
8
13
|
export function toolchainConfigPath(root = runnerRoot()) {
|
|
9
14
|
return join(root, TOOLCHAIN_CONFIG_FILE);
|
|
10
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolchain-config.js","sourceRoot":"","sources":["../../src/core/toolchain-config.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"toolchain-config.js","sourceRoot":"","sources":["../../src/core/toolchain-config.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,0DAA0D;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,4BAA4B,CAAA;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,MAAM;IACN,SAAS;IACT,gBAAgB;IAChB,aAAa;CACL,CAAA;AAGV,MAAM,UAAU,mBAAmB,CAAC,IAAI,GAAW,UAAU,EAAE;IAC7D,OAAO,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAA;AAC1C,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,oBAAoB,CAClC,OAA+B,EAC/B,IAAI,GAAW,mBAAmB,EAAE;IAEpC,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IAC9D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,aAAa,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CACtC,GAAG,CAAC,EAAE,CAAC,CAAE,yBAA+C,CAAC,QAAQ,CAAC,GAAG,CAAC,CACvE,CAAA;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,YAAY,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC3E,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,OAAO,OAAO,KAAK,CAAC,CAAA;IACrE,OAAQ,MAAkC,CAAC,OAAO,CAAC,CAAA;AACrD,CAAC"}
|