agent-hitch 0.1.1 → 0.2.0

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.
Files changed (92) hide show
  1. package/README.md +229 -132
  2. package/README.zh-CN.md +330 -0
  3. package/dist/bin/hitch.js +9 -0
  4. package/dist/bin/hitch.js.map +1 -0
  5. package/dist/scripts/check-release.js +25 -0
  6. package/dist/scripts/check-release.js.map +1 -0
  7. package/dist/scripts/check-syntax.js +32 -0
  8. package/dist/scripts/check-syntax.js.map +1 -0
  9. package/dist/src/adapters.js +461 -0
  10. package/dist/src/adapters.js.map +1 -0
  11. package/dist/src/artifacts.js +1081 -0
  12. package/dist/src/artifacts.js.map +1 -0
  13. package/dist/src/cli.js +699 -0
  14. package/dist/src/cli.js.map +1 -0
  15. package/dist/src/config.js +53 -0
  16. package/dist/src/config.js.map +1 -0
  17. package/dist/src/controller-runtime/hash.js +353 -0
  18. package/dist/src/controller-runtime/hash.js.map +1 -0
  19. package/dist/src/controller-runtime/store.js +323 -0
  20. package/dist/src/controller-runtime/store.js.map +1 -0
  21. package/dist/src/daemon.js +461 -0
  22. package/dist/src/daemon.js.map +1 -0
  23. package/dist/src/domain/types.js +10 -0
  24. package/dist/src/domain/types.js.map +1 -0
  25. package/dist/src/domain/validate.js +240 -0
  26. package/dist/src/domain/validate.js.map +1 -0
  27. package/dist/src/engine.js +465 -0
  28. package/dist/src/engine.js.map +1 -0
  29. package/dist/src/errors.js +14 -0
  30. package/dist/src/errors.js.map +1 -0
  31. package/dist/src/eval-tools.js +318 -0
  32. package/dist/src/eval-tools.js.map +1 -0
  33. package/dist/src/evals.js +313 -0
  34. package/dist/src/evals.js.map +1 -0
  35. package/dist/src/events.js +80 -0
  36. package/dist/src/events.js.map +1 -0
  37. package/dist/src/feedback/service.js +315 -0
  38. package/dist/src/feedback/service.js.map +1 -0
  39. package/dist/src/fs.js +45 -0
  40. package/dist/src/fs.js.map +1 -0
  41. package/dist/src/harbor-backend.js +280 -0
  42. package/dist/src/harbor-backend.js.map +1 -0
  43. package/dist/src/harness-reference.js +83 -0
  44. package/dist/src/harness-reference.js.map +1 -0
  45. package/dist/src/line-stream.js +20 -0
  46. package/dist/src/line-stream.js.map +1 -0
  47. package/dist/src/locks.js +38 -0
  48. package/dist/src/locks.js.map +1 -0
  49. package/dist/src/package-root.js +40 -0
  50. package/dist/src/package-root.js.map +1 -0
  51. package/dist/src/process.js +50 -0
  52. package/dist/src/process.js.map +1 -0
  53. package/dist/src/registry.js +81 -0
  54. package/dist/src/registry.js.map +1 -0
  55. package/dist/src/scheduler.js +162 -0
  56. package/dist/src/scheduler.js.map +1 -0
  57. package/dist/src/trajectories/contract.js +17 -0
  58. package/dist/src/trajectories/contract.js.map +1 -0
  59. package/dist/src/trajectories/format.js +127 -0
  60. package/dist/src/trajectories/format.js.map +1 -0
  61. package/dist/src/trajectories/projector.js +385 -0
  62. package/dist/src/trajectories/projector.js.map +1 -0
  63. package/dist/src/trajectories/store.js +281 -0
  64. package/dist/src/trajectories/store.js.map +1 -0
  65. package/dist/src/workspaces.js +858 -0
  66. package/dist/src/workspaces.js.map +1 -0
  67. package/docs/schemas/controller-runtime-manifest.schema.json +57 -0
  68. package/docs/schemas/controller-runtime-ref.schema.json +16 -0
  69. package/docs/schemas/message-feedback.schema.json +37 -0
  70. package/docs/schemas/trajectory-ref.schema.json +30 -0
  71. package/integrations/harbor/hitch_harbor_agent.py +176 -4
  72. package/package.json +19 -11
  73. package/bin/hitch.js +0 -9
  74. package/src/adapters.js +0 -435
  75. package/src/artifacts.js +0 -949
  76. package/src/cli.js +0 -505
  77. package/src/config.js +0 -51
  78. package/src/daemon.js +0 -416
  79. package/src/engine.js +0 -400
  80. package/src/errors.js +0 -12
  81. package/src/eval-tools.js +0 -334
  82. package/src/evals.js +0 -276
  83. package/src/events.js +0 -69
  84. package/src/fs.js +0 -43
  85. package/src/harbor-backend.js +0 -285
  86. package/src/harness-reference.js +0 -78
  87. package/src/line-stream.js +0 -17
  88. package/src/locks.js +0 -33
  89. package/src/process.js +0 -49
  90. package/src/registry.js +0 -84
  91. package/src/scheduler.js +0 -156
  92. package/src/workspaces.js +0 -893
@@ -0,0 +1,330 @@
1
+ # Hitch
2
+
3
+ [![npm version](https://img.shields.io/npm/v/agent-hitch.svg)](https://www.npmjs.com/package/agent-hitch)
4
+ [![GitHub release](https://img.shields.io/github/v/release/rsi-gear/agent-hitch)](https://github.com/rsi-gear/agent-hitch/releases)
5
+ [![Discord](https://img.shields.io/badge/Discord-加入讨论-5865F2?logo=discord&logoColor=white)](https://discord.gg/cZ4NBbHDk)
6
+
7
+ [English](README.md) | [简体中文](README.zh-CN.md)
8
+
9
+ **面向智能体 Harness 的内容寻址版本控制与证据存储。**
10
+
11
+ Hitch 让每一次智能体运行都可以追溯到确定的 Harness 版本。它将 Harness
12
+ 引用解析为不可变身份,准备内容寻址的可运行制品,通过稳定接口执行这些
13
+ 制品,并保存每次运行产生的轨迹与评测证据。
14
+
15
+ Git 可以标识发生变化的 Harness 源代码,而 Hitch 将这个身份贯穿构建与
16
+ 执行的全过程:
17
+
18
+ ```text
19
+ Harness 引用
20
+ -> 已解析版本
21
+ -> 已准备制品
22
+ -> 运行 / 评测
23
+ -> 轨迹
24
+ -> 反馈与评测证据
25
+
26
+ Hitch 控制器
27
+ -> 内容寻址的运行时包
28
+ -> 由容器化评测引用
29
+ ```
30
+
31
+ Hitch 是开发、比较和演化智能体 Harness 的系统基础设施。它负责版本解析、
32
+ 可运行制品、执行记录和证据;候选方案生成、比较策略与晋级决策则由使用
33
+ Hitch 的上层系统负责。
34
+
35
+ > **状态:** pre-alpha。核心身份与证据链路已经实现,包括不可变版本解析、
36
+ > 制品准备与缓存、直接运行与守护进程运行、Harbor 评测、内容寻址的控制器
37
+ > 运行时、兼容 DSH 的规范化轨迹,以及消息反馈。
38
+
39
+ ## 为什么 Harness 需要版本控制?
40
+
41
+ 智能体 Harness 不只是一次源代码提交。实际运行的内容还可能取决于软件包
42
+ 版本、构建产物、控制器代码、工作区模式、原生适配器,以及机器上可变的
43
+ 已安装可执行文件。如果分数或记录没有关联这些身份,就很难审计,更难复现。
44
+
45
+ Hitch 保存从请求的 Harness 引用到执行证据的完整、显式链路:
46
+
47
+ | 记录 | 标识的内容 |
48
+ | --- | --- |
49
+ | Harness 引用 | 调用方请求的软件版本、提交、本地源码或已安装可执行文件 |
50
+ | 已解析版本 | 为本次运行选定的不可变源码身份 |
51
+ | 已准备制品 | 经过验证、采用内容寻址的可运行构建产物 |
52
+ | 控制器运行时 | 上传到容器化评测中的确切 Hitch 运行时 |
53
+ | 运行或评测记录 | 请求、工作区、生命周期、结果以及各身份之间的关联 |
54
+ | 规范化轨迹 | 采用稳定、兼容 DSH 格式记录的智能体消息与工具活动 |
55
+ | 反馈与评测证据 | 消息级反馈、验证器输出、奖励及后端记录 |
56
+
57
+ 它是一个本地版本与证据层,不是 Git 的替代品,目前也不是远端制品注册表。
58
+ Hitch 当前尚未提供分支、标签、差异比较、候选晋级或回滚策略。
59
+
60
+ ## 快速开始
61
+
62
+ Hitch 要求 Node.js 22 或更高版本。通过 npm 安装:
63
+
64
+ ```bash
65
+ npm install --global agent-hitch
66
+ hitch --version
67
+ hitch list --json
68
+ ```
69
+
70
+ 解析并准备一个确定的 Harness 版本:
71
+
72
+ ```bash
73
+ hitch resolve codex@version:0.92.0 --json
74
+ hitch prepare codex@version:0.92.0 --json
75
+ ```
76
+
77
+ 在隔离的 Git worktree 中运行这个确定版本:
78
+
79
+ ```bash
80
+ hitch run \
81
+ --harness codex@version:0.92.0 \
82
+ --model gpt-5.6-terra \
83
+ --cwd /workspace/project \
84
+ --workspace-mode worktree \
85
+ --prompt-file task.md \
86
+ --output jsonl
87
+ ```
88
+
89
+ 每次运行都会在 `~/.hitch/runs/RUN_ID` 下写入原子的 manifest 与结果、原始
90
+ 进程日志、规范化事件和规范化轨迹。可以通过 CLI 检查轨迹:
91
+
92
+ ```bash
93
+ hitch trajectory inspect RUN_ID --json
94
+ ```
95
+
96
+ 从源码检出进行开发:
97
+
98
+ ```bash
99
+ npm install
100
+ npm run check
101
+ npm link
102
+ hitch list --json
103
+ ```
104
+
105
+ ## Harness 引用
106
+
107
+ 每次运行都需要显式选择 Harness。确定的软件包版本与 Git 提交会被解析为
108
+ 不可变身份,并在 Hitch 的制品存储中完成准备。
109
+
110
+ ```bash
111
+ # 使用并指纹识别本机已经安装的可执行文件。
112
+ hitch run --harness codex@installed --prompt "Inspect this repository"
113
+
114
+ # 解析、准备或运行一个确定的已发布版本。
115
+ hitch resolve codex@version:0.92.0 --json
116
+ hitch prepare codex@version:0.92.0 --json
117
+ hitch run --harness codex@version:0.92.0 --prompt "Inspect this repository"
118
+
119
+ # 从已注册的上游仓库构建一个提交。
120
+ hitch run --harness codex@commit:0123456789abcdef --prompt "Inspect this repository"
121
+
122
+ # 从本地 Harness 仓库构建一个干净的提交。
123
+ hitch run \
124
+ --harness 'pi@git+file:///workspace/pi#0123456789abcdef' \
125
+ --prompt "Inspect this repository"
126
+ ```
127
+
128
+ `codex` 之类的裸名称是 `codex@installed` 的兼容别名。已安装的可执行文件
129
+ 适合本地使用;如果需要可移植性,应优先选择确定的版本或提交引用。
130
+
131
+ 版本选择器必须使用确定的语义化版本,不接受版本范围和 `latest` 等可变
132
+ 标签。短提交 ID 会被展开,并且必须没有歧义。本地 Git 仓库必须处于干净
133
+ 状态。Codex、Pi 和 DeepSeek Harness 支持从源码提交准备制品;Claude Code
134
+ 与 OpenCode 目前支持已安装版本和确定的软件包版本。
135
+
136
+ 准备过程会以 Hitch 进程的权限执行已注册的软件包生命周期命令或源码构建
137
+ 命令。内容寻址让制品可以审计和缓存,但不会让不可信的构建代码变得安全。
138
+
139
+ ## 每次运行的证据
140
+
141
+ Hitch 将生命周期事件与智能体轨迹保存为两类相关但相互独立的记录:
142
+
143
+ - 规范化 JSONL 事件描述 Hitch 的控制平面,包括解析、准备、进程生命周期、
144
+ 取消和最终状态;
145
+ - 兼容 DSH 的规范化轨迹以明确的保真度记录智能体会话、消息、工具调用与
146
+ 工具结果;
147
+ - `trajectory.ref.json` 将运行与规范化轨迹及其 SHA-256 摘要绑定;
148
+ - 反馈 sidecar 可以为助手消息附加带版本的正向或负向评分与备注,而无需
149
+ 改写不可变轨迹。
150
+
151
+ ```bash
152
+ hitch trajectory inspect RUN_ID
153
+ hitch feedback list RUN_ID --json
154
+ hitch feedback put RUN_ID \
155
+ --message MESSAGE_ID \
156
+ --rating positive \
157
+ --note "修改保持了足够聚焦" \
158
+ --json
159
+ ```
160
+
161
+ 带版本的机器接口 Schema 位于 [`docs/schemas`](docs/schemas)。运行时校验会
162
+ 拒绝未知的请求字段,并在守护进程 HTTP 边界两侧保留类型化错误。
163
+
164
+ ## Harbor 评测
165
+
166
+ Hitch 可以通过 [Harbor](https://github.com/harbor-framework/harbor) 评测一个
167
+ 确定且可移植的 Harness 版本:
168
+
169
+ ```bash
170
+ # 将固定版本的 Harbor 安装到 ~/.hitch/tools,不修改系统 Python。
171
+ hitch eval setup harbor
172
+ hitch eval doctor
173
+
174
+ hitch eval run \
175
+ --backend harbor \
176
+ --dataset terminal-bench@2.0 \
177
+ --harness codex@version:0.92.0 \
178
+ --model openai/gpt-5.6 \
179
+ --attempts 1 \
180
+ --max-concurrent 4
181
+
182
+ hitch eval list
183
+ hitch eval inspect EVAL_ID --json
184
+ ```
185
+
186
+ Harbor 负责任务发现、Docker 生命周期、验证与奖励。它的自定义 Hitch agent
187
+ 会将最小化、采用 SHA-256 寻址的 Hitch 控制器运行时上传到每个任务容器,
188
+ 并在 `/app` 中执行选定的 Harness 版本。生成的评测记录会关联请求、已解析
189
+ 版本、控制器运行时、后端配置与日志、规范化结果、奖励摘要和轨迹证据。
190
+
191
+ 评测接受由已注册远端源码支持的确定 `version:` 引用和 `commit:` 引用。
192
+ 已安装可执行文件与本地 `git+file://` 引用无法移植到 Harbor 容器,因此会被
193
+ 拒绝。常用的模型供应商凭证通过环境变量引用转发;使用 `--pass-env NAME`
194
+ 可以额外传入一个环境变量。
195
+
196
+ 有关安装、可移植性规则和执行边界,请参阅
197
+ [Harbor 智能体评测](docs/evals.md)。
198
+
199
+ ## 稳定执行层
200
+
201
+ 带版本的制品仍然需要一致的运行方式。Hitch 为 Codex CLI、Claude Code、
202
+ Pi、OpenCode 和 DeepSeek Harness 提供适配器,并通过一个面向机器的统一
203
+ 接口规范化它们的调用方式和生命周期行为。
204
+
205
+ ```text
206
+ 调用方 -> Hitch CLI / 守护进程 -> 共享运行引擎 -> Codex CLI
207
+ \----> Claude Code
208
+ \----> Pi
209
+ \----> OpenCode
210
+ \----> DeepSeek Harness
211
+ ```
212
+
213
+ 直接 CLI 与持久化守护进程使用同一个运行引擎,因此版本解析、记录、超时、
214
+ 取消和事件行为不会发生偏移。当前运行时提供:
215
+
216
+ - 可执行文件发现、版本探测和可执行文件指纹;
217
+ - 确定的软件包版本与 Git 提交解析;
218
+ - 带完整性校验缓存的不可变制品;
219
+ - 输出规范化 JSONL 事件的直接执行;
220
+ - 具备并发上限的持久化本地守护进程;
221
+ - 队列中及运行中任务的取消、超时与完整进程树清理;
222
+ - 受管理的共享、Git worktree 和独立副本工作区模式;
223
+ - 原子的 manifest 与结果,以及原始 stdout 和 stderr 日志;
224
+ - 守护进程重启后对中断记录的保守恢复。
225
+
226
+ 需要长期运行的队列时,可以通过守护进程执行:
227
+
228
+ ```bash
229
+ hitch daemon start --max-concurrent 4
230
+
231
+ hitch run \
232
+ --daemon \
233
+ --harness codex@version:0.92.0 \
234
+ --cwd /workspace/project \
235
+ --prompt-file task.md \
236
+ --output jsonl
237
+
238
+ hitch daemon status --json
239
+ hitch daemon stop
240
+ ```
241
+
242
+ 也可以异步提交并取消:
243
+
244
+ ```bash
245
+ hitch daemon submit \
246
+ --harness claude@version:EXACT_VERSION \
247
+ --cwd /workspace/project \
248
+ --prompt-file task.md
249
+
250
+ hitch daemon cancel RUN_ID
251
+ ```
252
+
253
+ ## 状态与隔离
254
+
255
+ 状态默认存储在 `~/.hitch` 下。可以使用 `--root <path>` 或 `HITCH_ROOT`
256
+ 修改位置。每个 root 都拥有独立的制品存储、控制器运行时存储、运行与评测
257
+ 记录、守护进程令牌和队列。
258
+
259
+ 可以通过 `HITCH_CODEX_PATH`、`HITCH_CLAUDE_PATH`、`HITCH_PI_PATH`、
260
+ `HITCH_OPENCODE_PATH` 和 `HITCH_DEEPSEEK_PATH` 覆盖原生可执行文件路径。
261
+
262
+ 工作区模式会明确数据修改的边界:
263
+
264
+ - `shared` 直接在源码目录中运行;
265
+ - `worktree` 从干净的 `HEAD` 创建 detached Git worktree;
266
+ - `copy` 创建独立的文件系统副本。
267
+
268
+ 工作区隔离并不等同于进程安全沙箱。
269
+
270
+ ## 设计原则
271
+
272
+ - **默认可追溯:** 每次运行都会关联请求的引用、已解析版本、可运行制品、
273
+ 执行记录与证据。
274
+ - **不可变解析:** 在准备或执行前将可变输入解析为不可变身份,并记录该
275
+ 身份。
276
+ - **内容寻址复用:** 通过摘要复用经过验证的制品与控制器运行时,而不是为
277
+ 每次运行重复复制。
278
+ - **不以有损抽象换取证据统一:** 稳定的规范化记录与原始 Harness 输出并存,
279
+ 并明确记录轨迹保真度。
280
+ - **机器优先的接口:** 结构化输出、带版本的 Schema 和类型化错误构成公共
281
+ 接口。
282
+ - **策略位于 Hitch 之上:** 变更、排序、晋级与回滚都是调用方系统的显式
283
+ 决策。
284
+ - **安全中断:** 取消操作覆盖完整子进程树,涉及工作区修改的中断运行绝不
285
+ 隐式重放。
286
+
287
+ ## 计划中的工作
288
+
289
+ - [ ] Harness 版本及其证据的比较原语
290
+ - [ ] 命名的候选与 champion 引用
291
+ - [ ] 不内嵌晋级策略的晋级与回滚记录
292
+ - [ ] 远端制品与证据同步
293
+ - [ ] 更多 Harness 适配器
294
+ - [ ] 更多 API 供应商支持
295
+ - [ ] 本地模型推理支持
296
+
297
+ ## 动态
298
+
299
+ - **2026-08-20:** Hitch 0.2 开发版将项目迁移到编译为 ESM 的严格
300
+ TypeScript,加入共享 SHA-256 控制器运行时缓存,为每次运行记录兼容 DSH
301
+ 的规范化轨迹,并引入与生命周期绑定的消息反馈。
302
+ - **2026-08-13:** Hitch 加入对 DeepSeek Harness 的支持。
303
+
304
+ ## 文档
305
+
306
+ - [Hitch 0.2 开发规范](docs/hitch-0.2-development-spec.md)
307
+ - [设计文档](docs/design.md)
308
+ - [智能体守护进程分析与移植](docs/daemon.md)
309
+ - [工作区隔离](docs/workspaces.md)
310
+ - [Harbor 评测](docs/evals.md)
311
+ - [发布流程](docs/releasing.md)
312
+
313
+ ## 社区
314
+
315
+ 加入 [Hitch Discord 社区](https://discord.gg/cZ4NBbHDk),提问、分享反馈,
316
+ 并讨论智能体 Harness 基础设施。
317
+
318
+ ## 致谢
319
+
320
+ Hitch 的设计受到 [Multica](https://github.com/multica-ai/multica) 启发,并
321
+ 使用 [Harbor](https://github.com/harbor-framework/harbor) 作为评测后端。感谢
322
+ 这两个项目提供的基础。
323
+
324
+ ## 命名
325
+
326
+ 代码仓库名为 `agent-hitch`;产品与可执行文件分别命名为 `Hitch` 和 `hitch`。
327
+
328
+ ## 许可证
329
+
330
+ 本项目采用 [Apache License 2.0](LICENSE) 许可证。
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { main } from "../src/cli.js";
3
+ main(process.argv.slice(2)).catch((error) => {
4
+ const message = error instanceof Error ? error.message : String(error);
5
+ process.stderr.write(`hitch: ${message}\n`);
6
+ const exitCode = error.exitCode;
7
+ process.exitCode = Number.isInteger(exitCode) ? exitCode : 12;
8
+ });
9
+ //# sourceMappingURL=hitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hitch.js","sourceRoot":"","sources":["../../bin/hitch.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAI,KAAgC,CAAC,QAAQ,CAAC;IAC5D,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1E,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import { packageVersion } from "../src/package-root.js";
3
+ const [tag, prereleaseValue] = process.argv.slice(2);
4
+ const version = packageVersion();
5
+ const expectedTag = `v${version}`;
6
+ if (tag !== expectedTag) {
7
+ process.stderr.write(`release tag ${tag || "<missing>"} does not match package version ${version}; expected ${expectedTag}\n`);
8
+ process.exitCode = 1;
9
+ }
10
+ else if (!new Set(["true", "false"]).has(prereleaseValue || "")) {
11
+ process.stderr.write("release prerelease state must be true or false\n");
12
+ process.exitCode = 1;
13
+ }
14
+ else {
15
+ const packageIsPrerelease = version.includes("-");
16
+ const releaseIsPrerelease = prereleaseValue === "true";
17
+ if (packageIsPrerelease !== releaseIsPrerelease) {
18
+ process.stderr.write(`package version ${version} and GitHub prerelease state do not match\n`);
19
+ process.exitCode = 1;
20
+ }
21
+ else {
22
+ process.stdout.write(`release ${tag} matches package version ${version}\n`);
23
+ }
24
+ }
25
+ //# sourceMappingURL=check-release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-release.js","sourceRoot":"","sources":["../../scripts/check-release.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACrD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;AACjC,MAAM,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;AAElC,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,WAAW,mCAAmC,OAAO,cAAc,WAAW,IAAI,CAAC,CAAC;IAC/H,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;KAAM,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;IAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACzE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,MAAM,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,mBAAmB,GAAG,eAAe,KAAK,MAAM,CAAC;IACvD,IAAI,mBAAmB,KAAK,mBAAmB,EAAE,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,6CAA6C,CAAC,CAAC;QAC9F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,4BAA4B,OAAO,IAAI,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { readFile, readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { spawnSync } from "node:child_process";
4
+ // Validates the compiled dist output (bin/src/scripts), the JSON schemas, and
5
+ // that every compiled module resolves. Run after `npm run build`.
6
+ const roots = ["dist/bin", "dist/src", "dist/scripts"];
7
+ const files = [];
8
+ for (const root of roots) {
9
+ for (const entry of await readdir(root, { withFileTypes: true })) {
10
+ if (entry.isFile() && entry.name.endsWith(".js"))
11
+ files.push(path.join(root, entry.name));
12
+ }
13
+ }
14
+ for (const file of files) {
15
+ const result = spawnSync(process.execPath, ["--check", file], { stdio: "inherit" });
16
+ if (result.status !== 0)
17
+ process.exit(result.status || 1);
18
+ }
19
+ // Verify the compiled CLI entrypoint loads and reports a version.
20
+ const version = spawnSync(process.execPath, ["dist/bin/hitch.js", "--version"], {
21
+ encoding: "utf8",
22
+ });
23
+ if (version.status !== 0) {
24
+ process.stderr.write(`compiled hitch CLI failed to start: ${version.stderr || version.stdout}\n`);
25
+ process.exit(version.status || 1);
26
+ }
27
+ for (const entry of await readdir("docs/schemas", { withFileTypes: true })) {
28
+ if (entry.isFile() && entry.name.endsWith(".json")) {
29
+ JSON.parse(await readFile(path.join("docs/schemas", entry.name), "utf8"));
30
+ }
31
+ }
32
+ //# sourceMappingURL=check-syntax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-syntax.js","sourceRoot":"","sources":["../../scripts/check-syntax.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,8EAA8E;AAC9E,kEAAkE;AAClE,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AACvD,MAAM,KAAK,GAAa,EAAE,CAAC;AAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACpF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,kEAAkE;AAClE,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,mBAAmB,EAAE,WAAW,CAAC,EAAE;IAC9E,QAAQ,EAAE,MAAM;CACjB,CAAC,CAAC;AACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAClG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3E,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}