@nodetool-ai/cli 0.8.1 → 0.8.3

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 (213) hide show
  1. package/README.md +31 -1
  2. package/dist/.nodetool-build-stamp +1 -1
  3. package/dist/affected/affected.d.ts +11 -13
  4. package/dist/affected/affected.d.ts.map +1 -1
  5. package/dist/affected/affected.js +51 -2
  6. package/dist/affected/affected.js.map +1 -1
  7. package/dist/app-debug/app-target.d.ts +1 -1
  8. package/dist/app-debug/app-target.d.ts.map +1 -1
  9. package/dist/app-debug/harness.d.ts +3 -1
  10. package/dist/app-debug/harness.d.ts.map +1 -1
  11. package/dist/app-debug/harness.js +23 -0
  12. package/dist/app-debug/harness.js.map +1 -1
  13. package/dist/app.d.ts.map +1 -1
  14. package/dist/app.js +2 -1
  15. package/dist/app.js.map +1 -1
  16. package/dist/chat-codeact.d.ts +8 -0
  17. package/dist/chat-codeact.d.ts.map +1 -1
  18. package/dist/chat-codeact.js +59 -21
  19. package/dist/chat-codeact.js.map +1 -1
  20. package/dist/chat-context.d.ts.map +1 -1
  21. package/dist/chat-context.js +7 -2
  22. package/dist/chat-context.js.map +1 -1
  23. package/dist/child-exit.d.ts +3 -0
  24. package/dist/child-exit.d.ts.map +1 -0
  25. package/dist/child-exit.js +17 -0
  26. package/dist/child-exit.js.map +1 -0
  27. package/dist/commands/__tests__/timeline-render-audio.test.js +1 -1
  28. package/dist/commands/__tests__/timeline-render-audio.test.js.map +1 -1
  29. package/dist/commands/__tests__/timeline-render-completeness.test.d.ts +2 -0
  30. package/dist/commands/__tests__/timeline-render-completeness.test.d.ts.map +1 -0
  31. package/dist/commands/__tests__/timeline-render-completeness.test.js +117 -0
  32. package/dist/commands/__tests__/timeline-render-completeness.test.js.map +1 -0
  33. package/dist/commands/__tests__/timeline-score.test.d.ts +2 -0
  34. package/dist/commands/__tests__/timeline-score.test.d.ts.map +1 -0
  35. package/dist/commands/__tests__/timeline-score.test.js +100 -0
  36. package/dist/commands/__tests__/timeline-score.test.js.map +1 -0
  37. package/dist/commands/affected.d.ts.map +1 -1
  38. package/dist/commands/affected.js +10 -5
  39. package/dist/commands/affected.js.map +1 -1
  40. package/dist/commands/agent.d.ts.map +1 -1
  41. package/dist/commands/agent.js +12 -2
  42. package/dist/commands/agent.js.map +1 -1
  43. package/dist/commands/app.d.ts.map +1 -1
  44. package/dist/commands/app.js +29 -5
  45. package/dist/commands/app.js.map +1 -1
  46. package/dist/commands/apps.d.ts.map +1 -1
  47. package/dist/commands/apps.js +126 -32
  48. package/dist/commands/apps.js.map +1 -1
  49. package/dist/commands/debug-summary-output.d.ts +22 -0
  50. package/dist/commands/debug-summary-output.d.ts.map +1 -0
  51. package/dist/commands/debug-summary-output.js +28 -0
  52. package/dist/commands/debug-summary-output.js.map +1 -0
  53. package/dist/commands/deploy-helpers.d.ts +2 -1
  54. package/dist/commands/deploy-helpers.d.ts.map +1 -1
  55. package/dist/commands/errors.d.ts +11 -0
  56. package/dist/commands/errors.d.ts.map +1 -0
  57. package/dist/commands/errors.js +177 -0
  58. package/dist/commands/errors.js.map +1 -0
  59. package/dist/commands/eval.d.ts.map +1 -1
  60. package/dist/commands/eval.js +4 -1
  61. package/dist/commands/eval.js.map +1 -1
  62. package/dist/commands/extension.d.ts +12 -0
  63. package/dist/commands/extension.d.ts.map +1 -0
  64. package/dist/commands/extension.js +30 -0
  65. package/dist/commands/extension.js.map +1 -0
  66. package/dist/commands/game-benchmark.d.ts +34 -0
  67. package/dist/commands/game-benchmark.d.ts.map +1 -0
  68. package/dist/commands/game-benchmark.js +95 -0
  69. package/dist/commands/game-benchmark.js.map +1 -0
  70. package/dist/commands/game-smoke.d.ts +3 -0
  71. package/dist/commands/game-smoke.d.ts.map +1 -0
  72. package/dist/commands/game-smoke.js +23 -0
  73. package/dist/commands/game-smoke.js.map +1 -0
  74. package/dist/commands/game.d.ts.map +1 -1
  75. package/dist/commands/game.js +291 -20
  76. package/dist/commands/game.js.map +1 -1
  77. package/dist/commands/harness.d.ts +50 -0
  78. package/dist/commands/harness.d.ts.map +1 -1
  79. package/dist/commands/harness.js +289 -73
  80. package/dist/commands/harness.js.map +1 -1
  81. package/dist/commands/js-script.d.ts.map +1 -1
  82. package/dist/commands/js-script.js +6 -22
  83. package/dist/commands/js-script.js.map +1 -1
  84. package/dist/commands/mcp.d.ts +21 -0
  85. package/dist/commands/mcp.d.ts.map +1 -0
  86. package/dist/commands/mcp.js +166 -0
  87. package/dist/commands/mcp.js.map +1 -0
  88. package/dist/commands/output.d.ts +8 -0
  89. package/dist/commands/output.d.ts.map +1 -1
  90. package/dist/commands/output.js +18 -0
  91. package/dist/commands/output.js.map +1 -1
  92. package/dist/commands/package.d.ts.map +1 -1
  93. package/dist/commands/package.js +12 -12
  94. package/dist/commands/package.js.map +1 -1
  95. package/dist/commands/resource-read.d.ts.map +1 -1
  96. package/dist/commands/resource-read.js +5 -1
  97. package/dist/commands/resource-read.js.map +1 -1
  98. package/dist/commands/runs.d.ts +7 -0
  99. package/dist/commands/runs.d.ts.map +1 -0
  100. package/dist/commands/runs.js +302 -0
  101. package/dist/commands/runs.js.map +1 -0
  102. package/dist/commands/sketch.d.ts.map +1 -1
  103. package/dist/commands/sketch.js +6 -22
  104. package/dist/commands/sketch.js.map +1 -1
  105. package/dist/commands/timeline-render.d.ts +6 -1
  106. package/dist/commands/timeline-render.d.ts.map +1 -1
  107. package/dist/commands/timeline-render.js +15 -25
  108. package/dist/commands/timeline-render.js.map +1 -1
  109. package/dist/commands/timeline-score.d.ts +16 -0
  110. package/dist/commands/timeline-score.d.ts.map +1 -0
  111. package/dist/commands/timeline-score.js +90 -0
  112. package/dist/commands/timeline-score.js.map +1 -0
  113. package/dist/commands/timeline.d.ts.map +1 -1
  114. package/dist/commands/timeline.js +8 -22
  115. package/dist/commands/timeline.js.map +1 -1
  116. package/dist/commands/version-commands.d.ts +2 -5
  117. package/dist/commands/version-commands.d.ts.map +1 -1
  118. package/dist/commands/version-commands.js.map +1 -1
  119. package/dist/commands/worker.js +1 -1
  120. package/dist/commands/worker.js.map +1 -1
  121. package/dist/debug/server-runner.d.ts +2 -0
  122. package/dist/debug/server-runner.d.ts.map +1 -1
  123. package/dist/debug/server-runner.js +45 -4
  124. package/dist/debug/server-runner.js.map +1 -1
  125. package/dist/debug-bundle.d.ts +12 -0
  126. package/dist/debug-bundle.d.ts.map +1 -0
  127. package/dist/debug-bundle.js +23 -0
  128. package/dist/debug-bundle.js.map +1 -0
  129. package/dist/document-json.d.ts +11 -0
  130. package/dist/document-json.d.ts.map +1 -0
  131. package/dist/document-json.js +27 -0
  132. package/dist/document-json.js.map +1 -0
  133. package/dist/harness/capability-coverage.d.ts +1 -1
  134. package/dist/harness/capability-coverage.d.ts.map +1 -1
  135. package/dist/harness/capability-coverage.js +1 -1
  136. package/dist/harness/capability-coverage.js.map +1 -1
  137. package/dist/harness/capability-table.d.ts.map +1 -1
  138. package/dist/harness/capability-table.js +365 -35
  139. package/dist/harness/capability-table.js.map +1 -1
  140. package/dist/harness/changed-files.d.ts +2 -0
  141. package/dist/harness/changed-files.d.ts.map +1 -1
  142. package/dist/harness/changed-files.js +14 -0
  143. package/dist/harness/changed-files.js.map +1 -1
  144. package/dist/harness/registry.d.ts +32 -4
  145. package/dist/harness/registry.d.ts.map +1 -1
  146. package/dist/harness/registry.js +377 -33
  147. package/dist/harness/registry.js.map +1 -1
  148. package/dist/index.js +4 -3
  149. package/dist/index.js.map +1 -1
  150. package/dist/interaction-script.d.ts +23 -0
  151. package/dist/interaction-script.d.ts.map +1 -1
  152. package/dist/interaction-script.js +50 -1
  153. package/dist/interaction-script.js.map +1 -1
  154. package/dist/js-script-debug/harness.d.ts +29 -1
  155. package/dist/js-script-debug/harness.d.ts.map +1 -1
  156. package/dist/js-script-debug/harness.js +29 -72
  157. package/dist/js-script-debug/harness.js.map +1 -1
  158. package/dist/js-script-debug/target.d.ts.map +1 -1
  159. package/dist/js-script-debug/target.js +1 -24
  160. package/dist/js-script-debug/target.js.map +1 -1
  161. package/dist/local-model-interfaces.d.ts.map +1 -1
  162. package/dist/local-model-interfaces.js +1 -24
  163. package/dist/local-model-interfaces.js.map +1 -1
  164. package/dist/node-registry.d.ts +14 -0
  165. package/dist/node-registry.d.ts.map +1 -1
  166. package/dist/node-registry.js +15 -18
  167. package/dist/node-registry.js.map +1 -1
  168. package/dist/nodetool-main.d.ts +15 -0
  169. package/dist/nodetool-main.d.ts.map +1 -0
  170. package/dist/nodetool-main.js +1411 -0
  171. package/dist/nodetool-main.js.map +1 -0
  172. package/dist/nodetool.d.ts +0 -13
  173. package/dist/nodetool.d.ts.map +1 -1
  174. package/dist/nodetool.js +17 -1683
  175. package/dist/nodetool.js.map +1 -1
  176. package/dist/package-assets.d.ts +8 -0
  177. package/dist/package-assets.d.ts.map +1 -0
  178. package/dist/package-assets.js +21 -0
  179. package/dist/package-assets.js.map +1 -0
  180. package/dist/providers.d.ts +1 -1
  181. package/dist/providers.d.ts.map +1 -1
  182. package/dist/providers.js +15 -1
  183. package/dist/providers.js.map +1 -1
  184. package/dist/run-dsl.d.ts +6 -0
  185. package/dist/run-dsl.d.ts.map +1 -1
  186. package/dist/run-dsl.js +4 -1
  187. package/dist/run-dsl.js.map +1 -1
  188. package/dist/sandbox-catalog.d.ts +15 -1
  189. package/dist/sandbox-catalog.d.ts.map +1 -1
  190. package/dist/sandbox-catalog.js +58 -2
  191. package/dist/sandbox-catalog.js.map +1 -1
  192. package/dist/settings.d.ts.map +1 -1
  193. package/dist/settings.js +2 -0
  194. package/dist/settings.js.map +1 -1
  195. package/dist/sketch-debug/harness.d.ts +14 -0
  196. package/dist/sketch-debug/harness.d.ts.map +1 -1
  197. package/dist/sketch-debug/harness.js +11 -66
  198. package/dist/sketch-debug/harness.js.map +1 -1
  199. package/dist/sketch-debug/target.d.ts.map +1 -1
  200. package/dist/sketch-debug/target.js +1 -24
  201. package/dist/sketch-debug/target.js.map +1 -1
  202. package/dist/stdin.d.ts +6 -1
  203. package/dist/stdin.d.ts.map +1 -1
  204. package/dist/stdin.js +10 -1
  205. package/dist/stdin.js.map +1 -1
  206. package/dist/timeline-debug/harness.d.ts +14 -0
  207. package/dist/timeline-debug/harness.d.ts.map +1 -1
  208. package/dist/timeline-debug/harness.js +11 -66
  209. package/dist/timeline-debug/harness.js.map +1 -1
  210. package/dist/timeline-debug/target.d.ts.map +1 -1
  211. package/dist/timeline-debug/target.js +1 -24
  212. package/dist/timeline-debug/target.js.map +1 -1
  213. package/package.json +39 -35
@@ -25,6 +25,8 @@
25
25
  * the selfchecks of every harness covering a touched surface. The gate — not
26
26
  * the author — selects the checks.
27
27
  */
28
+ import { computeAffected } from "../affected/affected.js";
29
+ import { isGlobalGateFile } from "./changed-files.js";
28
30
  /**
29
31
  * The pure suites behind the script↔storyboard link and the guided creation
30
32
  * flows. One constant because the entry's `command` and its `selfcheck` must
@@ -54,7 +56,10 @@ const GAME_FLOW_SUITES = "npm run test --workspace=packages/protocol -- game &&
54
56
  "npm run test --workspace=packages/game-nodes && " +
55
57
  "npm run test --workspace=packages/game-runtime && " +
56
58
  "npm run test --workspace=packages/game-renderer && " +
57
- "npm run test --workspace=packages/websocket -- trpc-games";
59
+ "npm run test --workspace=packages/websocket -- trpc-games trpc-game-asset-browser gameDraftHistory style-presets && " +
60
+ "npm run test --workspace=packages/agents -- game && " +
61
+ "npm run test --workspace=packages/cli -- game-command && " +
62
+ "npm run test --workspace=web -- src/stores/game src/components/game src/components/setup/game src/hooks/game";
58
63
  /**
59
64
  * Durable generation recovery without a provider call. These suites exercise
60
65
  * acceptance and lease fencing, explicit FAL queue binding, receipt ordering,
@@ -91,8 +96,9 @@ const TIMELINE_MODEL3D_SUITES = "npm run test --workspace=packages/video-nodes -
91
96
  const TIMELINE_NATIVE_MEDIA_EDITING_SUITES = "npm run test --workspace=packages/timeline -- extension && " +
92
97
  "npm run test --workspace=packages/runtime -- video-extension && " +
93
98
  "npm run test --workspace=packages/websocket -- video-extension-inference && " +
94
- "npm run test --workspace=packages/agents -- timeline-generative-edit timeline-tool-loop && " +
95
- "npm run test --workspace=web -- useTimelineAgentBridge timelineTools nativeMediaEditingAcceptance nativeMediaEditingPreview timelineExtension useTimelineExtension ExtendClipPanel";
99
+ "npm run test --workspace=packages/agents -- timeline-headless-media-parity timeline-tool-contracts timeline-generative-edit timeline-tool-loop && " +
100
+ "npm run test --workspace=web -- useTimelineAgentBridge timelineTools nativeMediaEditingAcceptance nativeMediaEditingPreview timelineExtension useTimelineExtension ExtendClipPanel" +
101
+ " && npm run test --workspace=packages/websocket -- generation-recovery-media";
96
102
  /**
97
103
  * The audio-driven-motion suites: `bake_audio_animation`'s own arithmetic
98
104
  * (the two clock hops, the envelope/beats curve shapes) plus the end-to-end
@@ -200,6 +206,21 @@ export const HARNESSES = [
200
206
  cost: "expensive"
201
207
  }
202
208
  },
209
+ {
210
+ id: "manimgx",
211
+ title: "ManimGX scene inspection and render (nodetool.manimgx.* nodes)",
212
+ command: "npm run test:real --workspace=packages/manimgx-nodes",
213
+ kind: "execution",
214
+ capabilities: ["no-db"],
215
+ docs: "packages/manimgx-nodes/README.md",
216
+ selfcheck: {
217
+ // Renders and inspects real scenes through the nodes, with an image
218
+ // input. It needs manimgx installed (Python 3.13+, GPU or lavapipe),
219
+ // so the default gate skips it without --expensive.
220
+ command: "npm run test:real --workspace=packages/manimgx-nodes",
221
+ cost: "expensive"
222
+ }
223
+ },
203
224
  {
204
225
  id: "dsl-native-flow",
205
226
  title: "Native flow (call a node as a function, host backend + guest surface)",
@@ -214,6 +235,31 @@ export const HARNESSES = [
214
235
  docs: "docs/dsl-native-flow-design.md",
215
236
  selfcheck: {
216
237
  command: "npm run test --workspace=packages/dsl -- flow-core flow-streaming flow-abort",
238
+ cost: "cheap",
239
+ suiteOnly: true
240
+ }
241
+ },
242
+ {
243
+ id: "app-runs",
244
+ title: "Durable app operation and generation attachment check",
245
+ command: "npm run test --workspace=packages/execution -- app-operation app-run-generation",
246
+ kind: "execution",
247
+ capabilities: [],
248
+ docs: "docs/harnesses.md § App runs phase 1",
249
+ selfcheck: {
250
+ command: "npm run test --workspace=packages/execution -- app-operation app-run-generation",
251
+ cost: "cheap"
252
+ }
253
+ },
254
+ {
255
+ id: "run-traces",
256
+ title: "Durable app trace, content policy and ancestry check",
257
+ command: "npm run test --workspace=packages/execution --workspace=packages/runtime --workspace=packages/models --workspace=packages/websocket -- run-trace external-trace-privacy http-tracing",
258
+ kind: "execution",
259
+ capabilities: [],
260
+ docs: "docs/harnesses.md § Run traces phase 2",
261
+ selfcheck: {
262
+ command: "npm run test --workspace=packages/execution --workspace=packages/runtime --workspace=packages/models --workspace=packages/websocket -- run-trace external-trace-privacy http-tracing",
217
263
  cost: "cheap"
218
264
  }
219
265
  },
@@ -225,10 +271,88 @@ export const HARNESSES = [
225
271
  capabilities: ["json", "interact", "no-db"],
226
272
  docs: "docs/harnesses.md § nodetool app debug",
227
273
  selfcheck: {
228
- command: "npm run dev:nodetool -- app debug packages/base-nodes/nodetool/examples/apps/ad-maker.app.json --no-run",
274
+ // Ad Maker shows one step at a time, so the check walks both steps the
275
+ // way a person does before it judges whether every run is reachable.
276
+ command: "npm run dev:nodetool -- app debug packages/base-nodes/nodetool/examples/apps/ad-maker.app.json --no-run --interact '[{\"set\":{\"key\":\"step\",\"value\":\"settle-the-message\"}},{\"set\":{\"key\":\"step\",\"value\":\"direct-the-campaign-image\"}}]'",
277
+ cost: "cheap"
278
+ }
279
+ },
280
+ {
281
+ id: "run-readers",
282
+ title: "Run reader, debug history and CLI failure-path check",
283
+ command: "npm run test --workspace=packages/execution --workspace=packages/models --workspace=packages/websocket --workspace=packages/agents --workspace=packages/cli -- runs-phase3 app-debug-versioned-targets app-debug-workflow-inputs-phase3 capabilities-runs runs-command runs-integration run-readers job-find runs-trpc sandbox-api-coverage",
284
+ kind: "execution",
285
+ capabilities: ["json"],
286
+ docs: "docs/harnesses.md § Run readers phase 3",
287
+ selfcheck: {
288
+ command: "npm run test --workspace=packages/execution --workspace=packages/models --workspace=packages/websocket --workspace=packages/agents --workspace=packages/cli -- runs-phase3 app-debug-versioned-targets app-debug-workflow-inputs-phase3 capabilities-runs runs-command runs-integration run-readers job-find runs-trpc sandbox-api-coverage",
289
+ cost: "cheap"
290
+ }
291
+ },
292
+ {
293
+ id: "browser-run-spans",
294
+ title: "Browser run ownership, ancestry and restart check",
295
+ command: "npm run test --workspace=packages/websocket -- browser-run-spans-phase4 browser-app-run-phase4 app-runs-workflow",
296
+ kind: "execution",
297
+ capabilities: [],
298
+ docs: "docs/harnesses.md § Run inspection phase 4",
299
+ selfcheck: {
300
+ command: "npm run test --workspace=packages/websocket -- browser-run-spans-phase4 browser-app-run-phase4 app-runs-workflow",
301
+ cost: "cheap"
302
+ }
303
+ },
304
+ {
305
+ id: "run-inspection-ui",
306
+ title: "Stored trace, activity replay and browser recorder check",
307
+ command: "npm run test --workspace=web -- --runInBand --testPathPattern='browserRunTrace|browserWorkflowRunner|WorkflowRunner.test|TracePanel.test|TraceStore|useRuns|runTraceCache|appRunActivity|AgentActivityWidget|useWidgetRuntime|sketchPadWidget|workflowFormWidget|chatWidgets|mediaWidgets|buttonWidget|recorderWidgets|conditionalWidget|errorTraceReporting|ChatSurface.test|AskRunAgentButton|useAppRuntime|runJsScript.test'",
308
+ kind: "execution",
309
+ capabilities: [],
310
+ docs: "docs/harnesses.md § Run inspection phase 4",
311
+ selfcheck: {
312
+ command: "npm run test --workspace=web -- --runInBand --testPathPattern='browserRunTrace|browserWorkflowRunner|WorkflowRunner.test|TracePanel.test|TraceStore|useRuns|runTraceCache|appRunActivity|AgentActivityWidget|useWidgetRuntime|sketchPadWidget|workflowFormWidget|chatWidgets|mediaWidgets|buttonWidget|recorderWidgets|conditionalWidget|errorTraceReporting|ChatSurface.test|AskRunAgentButton|useAppRuntime|runJsScript.test'",
313
+ cost: "cheap"
314
+ }
315
+ },
316
+ {
317
+ id: "run-inspection-browser",
318
+ title: "Browser action ancestry and Trace/Logs reload journey",
319
+ command: "npm run test:journeys --workspace=web -- run-observability.spec.ts",
320
+ kind: "execution",
321
+ capabilities: ["browser"],
322
+ docs: "docs/harnesses.md § Run inspection phase 4"
323
+ },
324
+ {
325
+ id: "app-instance-history",
326
+ title: "Instance management, pinned versions and history projection check",
327
+ command: "npm run test --workspace=packages/models --workspace=packages/execution --workspace=packages/websocket -- app-instance run-list-app-metadata runs-phase3 app-operation",
328
+ kind: "execution",
329
+ capabilities: [],
330
+ docs: "docs/harnesses.md § App instances and history phase 5",
331
+ selfcheck: {
332
+ command: "npm run test --workspace=packages/models --workspace=packages/execution --workspace=packages/websocket -- app-instance run-list-app-metadata runs-phase3 app-operation",
229
333
  cost: "cheap"
230
334
  }
231
335
  },
336
+ {
337
+ id: "app-instance-history-ui",
338
+ title: "Instance tabs, management cache and app host check",
339
+ command: "npm run test --workspace=web -- --runInBand --testPathPattern='WorkspaceTabsStore|useAppInstances|useAppInstance|ApplicationSurface|ApplicationRunView|AppRuntimeView|AppRunHistory|useAppRuntime'",
340
+ kind: "execution",
341
+ capabilities: [],
342
+ docs: "docs/harnesses.md § App instances and history phase 5",
343
+ selfcheck: {
344
+ command: "npm run test --workspace=web -- --runInBand --testPathPattern='WorkspaceTabsStore|useAppInstances|useAppInstance|ApplicationSurface|ApplicationRunView|AppRuntimeView|AppRunHistory|useAppRuntime'",
345
+ cost: "cheap"
346
+ }
347
+ },
348
+ {
349
+ id: "app-instance-history-browser",
350
+ title: "Independent app instances and read-only historical results journey",
351
+ command: "npm run test:journeys --workspace=web -- app-instances.spec.ts run-observability.spec.ts",
352
+ kind: "execution",
353
+ capabilities: ["browser"],
354
+ docs: "docs/harnesses.md § App instances and history phase 5"
355
+ },
232
356
  {
233
357
  id: "app-build",
234
358
  title: "Mini-app build harness (spec→plan→author→check→run→judge)",
@@ -290,6 +414,21 @@ export const HARNESSES = [
290
414
  cost: "cheap"
291
415
  }
292
416
  },
417
+ {
418
+ id: "timeline-score",
419
+ title: "Timeline craft scorecard (agent output vs. shipped showcase examples)",
420
+ command: "nodetool timeline score <id|file.json> [--json] [--min-score <n>] [--sheet <out.png>]",
421
+ kind: "static",
422
+ capabilities: ["json", "no-db"],
423
+ docs: "docs/harnesses.md § nodetool timeline score",
424
+ selfcheck: {
425
+ // Deterministic: the metrics/formula core, plus the reference band
426
+ // computed from the shipped examples at test time — no model, no key.
427
+ command: "npm run test --workspace=packages/execution -- timeline-score && " +
428
+ "npm run test --workspace=packages/cli -- timeline-score",
429
+ cost: "cheap"
430
+ }
431
+ },
293
432
  {
294
433
  id: "serein-timeline-repro",
295
434
  title: "Serein timeline motion frame reproduction",
@@ -354,7 +493,11 @@ export const HARNESSES = [
354
493
  capabilities: ["no-db"],
355
494
  agentTool: "bake_audio_animation",
356
495
  docs: "docs/harnesses.md § Audio-driven timeline motion",
357
- selfcheck: { command: TIMELINE_AUDIO_DRIVE_SUITES, cost: "cheap" }
496
+ selfcheck: {
497
+ command: TIMELINE_AUDIO_DRIVE_SUITES,
498
+ cost: "cheap",
499
+ suiteOnly: true
500
+ }
358
501
  },
359
502
  {
360
503
  id: "timeline-generated-matte",
@@ -471,7 +614,8 @@ export const HARNESSES = [
471
614
  docs: "docs/harnesses.md § nodetool chat",
472
615
  selfcheck: {
473
616
  command: "npm run test --workspace=packages/cli -- tests/chat-app.test.ts tests/chat-media.test.ts tests/terminal-keyboard.test.ts tests/terminal-input.test.ts tests/terminal-mouse.test.ts tests/terminal-screen.test.ts tests/chat-prompts.test.ts tests/chat-sessions.test.ts tests/websocket-client.test.ts",
474
- cost: "cheap"
617
+ cost: "cheap",
618
+ suiteOnly: true
475
619
  }
476
620
  },
477
621
  {
@@ -688,6 +832,20 @@ export const HARNESSES = [
688
832
  cost: "cheap"
689
833
  }
690
834
  },
835
+ {
836
+ id: "mutator",
837
+ title: "Mutation testing (nodetool-mutator)",
838
+ command: "npm run mutate -- --base origin/main packages/<name>/src",
839
+ kind: "static",
840
+ capabilities: ["no-db"],
841
+ docs: "docs/harnesses.md § npm run mutate",
842
+ selfcheck: {
843
+ // Parses and binds every site in the tool's own source through the
844
+ // built CLI, without running a test.
845
+ command: "npm run mutate -- --scan packages/mutator/src",
846
+ cost: "cheap"
847
+ }
848
+ },
691
849
  {
692
850
  id: "recipes",
693
851
  title: "Recipe chains (shipped manifests, the app listing, the site pages)",
@@ -728,7 +886,8 @@ export const HARNESSES = [
728
886
  docs: "docs/plans/tutorial-focus-animation.md",
729
887
  selfcheck: {
730
888
  command: "npm run test --workspace=demo",
731
- cost: "cheap"
889
+ cost: "cheap",
890
+ suiteOnly: true
732
891
  }
733
892
  },
734
893
  {
@@ -760,7 +919,8 @@ export const HARNESSES = [
760
919
  // resolution, drain/shutdown. Multi-minute (255 files), so this stays
761
920
  // an --expensive selfcheck rather than the default gate.
762
921
  command: "npm run test --workspace=packages/websocket",
763
- cost: "expensive"
922
+ cost: "expensive",
923
+ suiteOnly: true
764
924
  }
765
925
  },
766
926
  {
@@ -772,7 +932,8 @@ export const HARNESSES = [
772
932
  docs: "packages/models/AGENTS.md",
773
933
  selfcheck: {
774
934
  command: "npm run test --workspace=packages/models",
775
- cost: "cheap"
935
+ cost: "cheap",
936
+ suiteOnly: true
776
937
  }
777
938
  },
778
939
  {
@@ -925,16 +1086,15 @@ export const SURFACES = [
925
1086
  // `capability-suites` covers the seam — dispatch, classification, and what
926
1087
  // a process with no action layer answers. The half below it runs in
927
1088
  // `npm run test:integration --workspace=packages/browser`, which
928
- // launches a real Chrome with the built extension loaded and drives the
929
- // production transport end to end. It is not a selfcheck: it downloads
930
- // Chrome and binds port 7777, so a diff to the relay still needs it run
931
- // by hand.
1089
+ // launches a real Chrome with the built extension loaded and its native
1090
+ // host registered, and drives the production transport end to end. It is
1091
+ // not a selfcheck: it downloads Chrome, so a diff to the relay still
1092
+ // needs it run by hand.
932
1093
  paths: [
933
1094
  "chrome-extension/",
934
1095
  "packages/browser/",
935
1096
  "packages/agents/src/capabilities/browser.ts",
936
- "packages/agents/src/capabilities/browser.specs.ts",
937
- "packages/websocket/src/extension-cdp-bridge.ts"
1097
+ "packages/agents/src/capabilities/browser.specs.ts"
938
1098
  ]
939
1099
  },
940
1100
  {
@@ -995,9 +1155,13 @@ export const SURFACES = [
995
1155
  title: "Native game creation and editing",
996
1156
  harnesses: ["game-flow", "capability-suites", "validate"],
997
1157
  paths: [
1158
+ "packages/cli/src/commands/game.ts",
1159
+ "packages/protocol/src/game.ts",
1160
+ "packages/protocol/src/game3d.ts",
998
1161
  "packages/protocol/src/game-design.ts",
999
1162
  "packages/protocol/src/game-graph.ts",
1000
1163
  "packages/protocol/src/game-flow-prompt.ts",
1164
+ "packages/protocol/src/native-game-templates.ts",
1001
1165
  "packages/protocol/src/style-presets.ts",
1002
1166
  "packages/game-nodes/",
1003
1167
  "packages/game-runtime/",
@@ -1006,9 +1170,125 @@ export const SURFACES = [
1006
1170
  "packages/godot-templates/",
1007
1171
  "packages/base-nodes/tests/game-graph-chips.test.ts",
1008
1172
  "packages/websocket/src/trpc/routers/games.ts",
1173
+ "packages/websocket/src/trpc/routers/gameDraftHistory.ts",
1009
1174
  "packages/websocket/src/lib/style-presets.ts",
1175
+ "web/src/components/game/",
1176
+ "web/src/components/setup/game/",
1177
+ "web/src/hooks/game/",
1178
+ "web/src/stores/game/",
1179
+ "web/tests/journeys/native-game3d-editor.spec.ts",
1010
1180
  "web/src/components/workspace/GameSurface.tsx",
1011
- "web/src/components/projects/NewProjectSurface.tsx"
1181
+ "web/src/components/projects/NewProjectSurface.tsx",
1182
+ "packages/protocol/src/game-script-params.ts"
1183
+ ]
1184
+ },
1185
+ {
1186
+ id: "app-runs",
1187
+ title: "App instances and durable operation runs",
1188
+ harnesses: ["app-runs"],
1189
+ paths: [
1190
+ "packages/models/src/app-instance.ts",
1191
+ "packages/models/src/migrations/versions.ts",
1192
+ "packages/protocol/src/api-schemas/app-runs.ts",
1193
+ "packages/execution/src/service/app-operation.ts",
1194
+ "packages/execution/src/app-run-generation.ts",
1195
+ "packages/websocket/src/lib/app-instances-service.ts",
1196
+ "packages/websocket/src/routes/app-runs.ts",
1197
+ "packages/websocket/src/trpc/routers/app-instances.ts",
1198
+ "packages/websocket/src/trpc/routers/app-runs.ts",
1199
+ "web/src/components/appbuilder/runtime/"
1200
+ ]
1201
+ },
1202
+ {
1203
+ id: "run-traces",
1204
+ title: "Server run trace persistence and privacy",
1205
+ harnesses: ["run-traces"],
1206
+ paths: [
1207
+ "packages/protocol/src/run-trace.ts",
1208
+ "packages/models/src/run-trace.ts",
1209
+ "packages/models/src/migrations/run-traces.ts",
1210
+ "packages/models/src/schema/run-traces.ts",
1211
+ "packages/models/src/schema-pg/run-traces.ts",
1212
+ "packages/runtime/src/run-trace-",
1213
+ "packages/runtime/src/telemetry.ts",
1214
+ "packages/runtime/src/trace-exporters.ts",
1215
+ "packages/runtime/src/providers/loop-tracing.ts",
1216
+ "packages/execution/src/run-trace-store.ts",
1217
+ "packages/execution/src/service/run-trace-lifecycle.ts",
1218
+ "packages/websocket/src/lib/http-tracing.ts",
1219
+ "packages/websocket/src/storage-retention.ts"
1220
+ ]
1221
+ },
1222
+ {
1223
+ id: "run-readers",
1224
+ title: "Common run inspection for agents and CLI",
1225
+ harnesses: ["run-readers"],
1226
+ paths: [
1227
+ "packages/protocol/src/run-readers.ts",
1228
+ "packages/protocol/src/api-schemas/runs.ts",
1229
+ "packages/models/src/run-readers.ts",
1230
+ "packages/execution/src/runs.ts",
1231
+ "packages/execution/src/app-debug/run-recording.ts",
1232
+ "packages/execution/src/service/app-debug-service.ts",
1233
+ "packages/agents/src/capabilities/runs",
1234
+ "packages/agents/src/capabilities/jobs.ts",
1235
+ "packages/agents/src/evals/codeact-api-runs.ts",
1236
+ "packages/cli/src/commands/runs.ts",
1237
+ "packages/cli/src/app-debug/harness.ts",
1238
+ "packages/websocket/src/trpc/routers/runs.ts",
1239
+ "packages/websocket/src/lib/app-debug-service.ts"
1240
+ ]
1241
+ },
1242
+ {
1243
+ id: "run-inspection",
1244
+ title: "Browser run ingestion and durable UI inspection",
1245
+ harnesses: ["browser-run-spans", "run-inspection-ui", "run-inspection-browser"],
1246
+ paths: [
1247
+ "packages/protocol/src/browser-run-traces.ts",
1248
+ "packages/execution/src/browser-app-run.ts",
1249
+ "packages/execution/src/browser-run-spans.ts",
1250
+ "packages/execution/src/browser-trace-policy.ts",
1251
+ "packages/websocket/src/routes/run-spans.ts",
1252
+ "packages/websocket/src/lib/test-ui-run-routes.ts",
1253
+ "web/src/lib/browserRunTrace.ts",
1254
+ "web/src/lib/workflow/browserWorkflowRunner.ts",
1255
+ "web/src/components/panels/TracePanel.tsx",
1256
+ "web/src/components/appbuilder/runtime/",
1257
+ "web/src/components/appbuilder/AppRuntimeView.tsx",
1258
+ "web/src/components/appbuilder/puck/useWidgetRuntime.ts",
1259
+ "web/src/components/appbuilder/puck/conditionalWidget.tsx",
1260
+ "web/src/components/workspace/ChatSurface.tsx",
1261
+ "web/src/stores/ChatDraftStore.ts",
1262
+ "web/src/components/appbuilder/puck/AgentActivityWidget.tsx",
1263
+ "web/src/components/runs/",
1264
+ "web/src/serverState/useRuns.ts",
1265
+ "web/src/serverState/runTraceCache.ts",
1266
+ "web/src/serverState/appRunActivity.ts",
1267
+ "web/src/hooks/useAppOperationRun.ts",
1268
+ "web/src/hooks/useRunInspection.ts",
1269
+ "web/src/stores/TraceStore.ts",
1270
+ "web/tests/journeys/run-observability.spec.ts"
1271
+ ]
1272
+ },
1273
+ {
1274
+ id: "app-instance-history",
1275
+ title: "App instance management and historical results",
1276
+ harnesses: ["app-instance-history", "app-instance-history-ui", "app-instance-history-browser"],
1277
+ paths: [
1278
+ "packages/models/src/app-instance",
1279
+ "packages/models/src/run-readers.ts",
1280
+ "packages/execution/src/runs.ts",
1281
+ "packages/protocol/src/api-schemas/app-runs.ts",
1282
+ "packages/websocket/src/lib/app-instances-service.ts",
1283
+ "packages/websocket/src/routes/app-runs.ts",
1284
+ "packages/websocket/src/trpc/routers/app-instances.ts",
1285
+ "web/src/components/appbuilder/",
1286
+ "web/src/components/workspace/ApplicationSurface.tsx",
1287
+ "web/src/components/workspace/TabContent.tsx",
1288
+ "web/src/stores/WorkspaceTabsStore.ts",
1289
+ "web/src/serverState/useAppInstances.ts",
1290
+ "web/src/serverState/useRuns.ts",
1291
+ "web/tests/journeys/app-instances.spec.ts"
1012
1292
  ]
1013
1293
  },
1014
1294
  {
@@ -1017,6 +1297,7 @@ export const SURFACES = [
1017
1297
  harnesses: ["app-debug", "app-build", "eval"],
1018
1298
  paths: [
1019
1299
  "packages/app-runtime/",
1300
+ "packages/app-export/",
1020
1301
  "packages/agents/src/app-build/",
1021
1302
  "packages/execution/src/app-debug/",
1022
1303
  "packages/base-nodes/nodetool/examples/apps/",
@@ -1038,6 +1319,7 @@ export const SURFACES = [
1038
1319
  "timeline-validate",
1039
1320
  "timeline-debug",
1040
1321
  "timeline-render",
1322
+ "timeline-score",
1041
1323
  "timeline-versions",
1042
1324
  "eval"
1043
1325
  ],
@@ -1048,10 +1330,12 @@ export const SURFACES = [
1048
1330
  "packages/cli/src/timeline-debug/",
1049
1331
  "packages/cli/src/commands/timeline-versions.ts",
1050
1332
  "packages/cli/src/commands/timeline-render.ts",
1333
+ "packages/cli/src/commands/timeline-score.ts",
1051
1334
  "packages/video-nodes/src/nodes/timeline/compositeRender.ts",
1052
1335
  "packages/agents/src/tools/timeline-version-tools.ts",
1053
1336
  "packages/models/src/timeline-sequence-version.ts",
1054
- "packages/websocket/src/trpc/routers/timeline.ts"
1337
+ "packages/websocket/src/trpc/routers/timeline.ts",
1338
+ "scripts/motion-craft-eval.mjs"
1055
1339
  ]
1056
1340
  },
1057
1341
  {
@@ -1084,6 +1368,14 @@ export const SURFACES = [
1084
1368
  harnesses: ["timeline-native-media-editing"],
1085
1369
  paths: [
1086
1370
  "packages/timeline/src/generative.ts",
1371
+ "packages/agents/src/capabilities/timelines.ts",
1372
+ "packages/agents/src/capabilities/timeline-media-edit.ts",
1373
+ "packages/agents/src/capabilities/timeline-clip-frames.ts",
1374
+ "packages/agents/tests/timeline-headless-media-parity.test.ts",
1375
+ "packages/runtime/src/trim-video-window.ts",
1376
+ "packages/websocket/src/timeline-generation-recovery.ts",
1377
+ "packages/websocket/src/lib/media.ts",
1378
+ "packages/websocket/tests/generation-recovery-media.test.ts",
1087
1379
  "packages/timeline/src/extension.ts",
1088
1380
  "packages/timeline/src/extensionRequest.ts",
1089
1381
  "packages/timeline/src/takes.ts",
@@ -1103,17 +1395,6 @@ export const SURFACES = [
1103
1395
  "web/src/lib/tools/builtin/timeline.ts"
1104
1396
  ]
1105
1397
  },
1106
- {
1107
- id: "timeline-native-media-editing-server-generation-gap",
1108
- title: "Server edit_timeline generative-edit submission",
1109
- harnesses: [],
1110
- paths: ["packages/agents/src/capabilities/timelines.ts"],
1111
- gap: "edit_timeline deliberately excludes ui_timeline_generatively_edit_clip: " +
1112
- "it can persist a timeline document but cannot submit or reconcile a " +
1113
- "durable media-generation job. A future harness should drive that " +
1114
- "server-side job through candidate creation, explicit apply_take, and " +
1115
- "a restored undo snapshot without inventing an asset id."
1116
- },
1117
1398
  {
1118
1399
  id: "timeline-audio-drive",
1119
1400
  title: "Audio-driven timeline motion (bake_audio_animation, audio analysis)",
@@ -1276,7 +1557,9 @@ export const SURFACES = [
1276
1557
  "packages/audio-nodes/src/nodes/game.ts",
1277
1558
  "packages/game-nodes/src/nodes/game.ts",
1278
1559
  "packages/agents/src/capabilities/game.ts",
1279
- "packages/agents/src/capabilities/game.specs.ts"
1560
+ "packages/agents/src/capabilities/game.specs.ts",
1561
+ "packages/agents/src/capabilities/game3d.ts",
1562
+ "packages/agents/src/capabilities/game-asset-source.ts"
1280
1563
  ]
1281
1564
  },
1282
1565
  {
@@ -1285,6 +1568,12 @@ export const SURFACES = [
1285
1568
  harnesses: ["blender"],
1286
1569
  paths: ["packages/blender-nodes/"]
1287
1570
  },
1571
+ {
1572
+ id: "manimgx",
1573
+ title: "ManimGX scenes (runner, nodes, authoring skill)",
1574
+ harnesses: ["manimgx"],
1575
+ paths: ["packages/manimgx-nodes/"]
1576
+ },
1288
1577
  {
1289
1578
  id: "entities",
1290
1579
  title: "Entity library (ingredients, prompt injection, ui_entity_* tools)",
@@ -1361,7 +1650,9 @@ export const SURFACES = [
1361
1650
  paths: [
1362
1651
  "demo/src/",
1363
1652
  "demo/scripts/render-tutorials.ts",
1364
- "demo/scripts/render-marketing.ts"
1653
+ "demo/scripts/render-marketing.ts",
1654
+ "demo/scripts/encode-hero.mjs",
1655
+ "demo/scripts/vibe-track.ts"
1365
1656
  ]
1366
1657
  },
1367
1658
  {
@@ -1390,6 +1681,12 @@ export const SURFACES = [
1390
1681
  "scripts/provider-codegen-check.mjs"
1391
1682
  ]
1392
1683
  },
1684
+ {
1685
+ id: "mutation-testing",
1686
+ title: "Mutation testing tool and its score report",
1687
+ harnesses: ["mutator"],
1688
+ paths: ["packages/mutator/", "scripts/mutation-score.mjs"]
1689
+ },
1393
1690
  {
1394
1691
  id: "deploy-image",
1395
1692
  title: "Deployed GHCR image (Fly.io / self-hosted)",
@@ -1499,6 +1796,7 @@ export const SURFACES = [
1499
1796
  "packages/together-nodes/",
1500
1797
  "packages/topaz-nodes/",
1501
1798
  "packages/transformers-js-nodes/",
1799
+ "packages/whisper-cpp/",
1502
1800
  "packages/video-nodes/",
1503
1801
  // Portable runner (graph + registry → a Request/Response handler); CI
1504
1802
  // groups it with the node packages for the same reason.
@@ -1666,11 +1964,21 @@ export function auditPathClaims(rootDirs, surfaces = SURFACES, unclaimed = UNCLA
1666
1964
  return !claims.some((p) => p.startsWith(prefix) || prefix.startsWith(p));
1667
1965
  });
1668
1966
  }
1669
- export function planGate(changedFiles, harnesses = HARNESSES, surfaces = SURFACES) {
1967
+ /**
1968
+ * Select checks for a diff. Without `packages`, a surface is touched only by a
1969
+ * changed path under one of its prefixes. With them, a surface is also touched
1970
+ * when one of its paths lies inside a workspace downstream of a changed one,
1971
+ * since its code then runs against changed code (`viaDependency`).
1972
+ */
1973
+ export function planGate(changedFiles, harnesses = HARNESSES, surfaces = SURFACES, packages) {
1670
1974
  const byId = new Map(harnesses.map((h) => [h.id, h]));
1671
1975
  const touched = new Map();
1976
+ const viaDependency = new Set();
1672
1977
  const unmappedFiles = [];
1978
+ const globalFiles = changedFiles.filter(isGlobalGateFile);
1673
1979
  for (const file of changedFiles) {
1980
+ if (isGlobalGateFile(file))
1981
+ continue;
1674
1982
  let matched = false;
1675
1983
  for (const s of surfaces) {
1676
1984
  if (s.paths.some((p) => file === p || file.startsWith(p))) {
@@ -1683,6 +1991,21 @@ export function planGate(changedFiles, harnesses = HARNESSES, surfaces = SURFACE
1683
1991
  if (!matched)
1684
1992
  unmappedFiles.push(file);
1685
1993
  }
1994
+ if (packages) {
1995
+ const dirs = computeAffected(changedFiles, packages)
1996
+ .affected.map((name) => packages.find((p) => p.name === name)?.dir)
1997
+ .filter((d) => d !== undefined)
1998
+ .map((d) => d.replace(/^\.\//, "").replace(/\/+$/, ""));
1999
+ for (const s of surfaces) {
2000
+ if (touched.has(s.id))
2001
+ continue;
2002
+ const inside = s.paths.some((p) => dirs.some((d) => p === d || p.startsWith(`${d}/`)));
2003
+ if (inside) {
2004
+ touched.set(s.id, []);
2005
+ viaDependency.add(s.id);
2006
+ }
2007
+ }
2008
+ }
1686
2009
  const checkByHarness = new Map();
1687
2010
  const manualByHarness = new Map();
1688
2011
  const uncoveredSurfaces = [];
@@ -1707,6 +2030,7 @@ export function planGate(changedFiles, harnesses = HARNESSES, surfaces = SURFACE
1707
2030
  harnessId: id,
1708
2031
  command: h.selfcheck.command,
1709
2032
  cost: h.selfcheck.cost,
2033
+ suiteOnly: h.selfcheck.suiteOnly ?? false,
1710
2034
  surfaces: [s.id]
1711
2035
  });
1712
2036
  }
@@ -1726,13 +2050,33 @@ export function planGate(changedFiles, harnesses = HARNESSES, surfaces = SURFACE
1726
2050
  }
1727
2051
  }
1728
2052
  }
2053
+ // A global file selects every selfcheck, as `--all` does; surfaces it
2054
+ // would not otherwise name stay with an empty list.
2055
+ if (globalFiles.length > 0) {
2056
+ for (const h of harnesses) {
2057
+ if (!h.selfcheck || checkByHarness.has(h.id))
2058
+ continue;
2059
+ checkByHarness.set(h.id, {
2060
+ harnessId: h.id,
2061
+ command: h.selfcheck.command,
2062
+ cost: h.selfcheck.cost,
2063
+ suiteOnly: h.selfcheck.suiteOnly ?? false,
2064
+ surfaces: []
2065
+ });
2066
+ }
2067
+ }
1729
2068
  return {
1730
2069
  changedFiles,
1731
- surfaces: [...touched.entries()].map(([id, files]) => ({ id, files })),
2070
+ surfaces: [...touched.entries()].map(([id, files]) => ({
2071
+ id,
2072
+ files,
2073
+ ...(viaDependency.has(id) && { viaDependency: true })
2074
+ })),
1732
2075
  checks: [...checkByHarness.values()],
1733
2076
  manual: [...manualByHarness.values()],
1734
2077
  uncoveredSurfaces,
1735
- unmappedFiles
2078
+ unmappedFiles,
2079
+ globalFiles
1736
2080
  };
1737
2081
  }
1738
2082
  //# sourceMappingURL=registry.js.map