@visulima/vis 4.3.1 → 6.0.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 (168) hide show
  1. package/CHANGELOG.md +598 -0
  2. package/LICENSE.md +151 -88
  3. package/README.md +2 -2
  4. package/dist/bin.js +1 -1
  5. package/dist/binx.js +1 -1
  6. package/dist/config/index.d.ts +42 -19
  7. package/dist/packem_chunks/CONFIG_FILES.js +4 -4
  8. package/dist/packem_chunks/bloom-status.js +1 -1
  9. package/dist/packem_chunks/bloom-sync.js +1 -1
  10. package/dist/packem_chunks/catalog.js +61 -51
  11. package/dist/packem_chunks/cli-exec.js +1 -1
  12. package/dist/packem_chunks/cli-main.js +202 -176
  13. package/dist/packem_chunks/dart-plan.js +1 -1
  14. package/dist/packem_chunks/dart-projects.js +1 -1
  15. package/dist/packem_chunks/dispatch.js +1 -1
  16. package/dist/packem_chunks/doctor-probe.js +1 -1
  17. package/dist/packem_chunks/fix.js +1 -1
  18. package/dist/packem_chunks/handler.js +1 -1
  19. package/dist/packem_chunks/handler10.js +4 -4
  20. package/dist/packem_chunks/handler11.js +1 -1
  21. package/dist/packem_chunks/handler12.js +1 -1
  22. package/dist/packem_chunks/handler13.js +1 -1
  23. package/dist/packem_chunks/handler14.js +1 -1
  24. package/dist/packem_chunks/handler15.js +1 -1
  25. package/dist/packem_chunks/handler16.js +1 -1
  26. package/dist/packem_chunks/handler17.js +1 -1
  27. package/dist/packem_chunks/handler18.js +1 -1
  28. package/dist/packem_chunks/handler19.js +1 -1
  29. package/dist/packem_chunks/handler2.js +1 -1
  30. package/dist/packem_chunks/handler20.js +2 -2
  31. package/dist/packem_chunks/handler21.js +1 -1
  32. package/dist/packem_chunks/handler22.js +2 -2
  33. package/dist/packem_chunks/handler23.js +1 -1
  34. package/dist/packem_chunks/handler24.js +1 -1
  35. package/dist/packem_chunks/handler26.js +5 -5
  36. package/dist/packem_chunks/handler27.js +1 -1
  37. package/dist/packem_chunks/handler28.js +1 -1
  38. package/dist/packem_chunks/handler29.js +1 -1
  39. package/dist/packem_chunks/handler3.js +1 -1
  40. package/dist/packem_chunks/handler30.js +1 -1
  41. package/dist/packem_chunks/handler39.js +6 -6
  42. package/dist/packem_chunks/handler5.js +1 -1
  43. package/dist/packem_chunks/handler50.js +2 -2
  44. package/dist/packem_chunks/handler51.js +1 -1
  45. package/dist/packem_chunks/handler53.js +1 -1
  46. package/dist/packem_chunks/handler54.js +1 -1
  47. package/dist/packem_chunks/handler55.js +1 -1
  48. package/dist/packem_chunks/handler58.js +1 -1
  49. package/dist/packem_chunks/handler59.js +1 -1
  50. package/dist/packem_chunks/handler6.js +1 -1
  51. package/dist/packem_chunks/handler60.js +7 -7
  52. package/dist/packem_chunks/handler61.js +2 -2
  53. package/dist/packem_chunks/handler62.js +10 -10
  54. package/dist/packem_chunks/handler63.js +1 -1
  55. package/dist/packem_chunks/handler64.js +6 -3
  56. package/dist/packem_chunks/handler65.js +8 -6
  57. package/dist/packem_chunks/handler66.js +2 -2
  58. package/dist/packem_chunks/handler67.js +31 -20
  59. package/dist/packem_chunks/handler68.js +1 -1
  60. package/dist/packem_chunks/handler69.js +22 -153
  61. package/dist/packem_chunks/handler7.js +1 -1
  62. package/dist/packem_chunks/handler70.js +9 -9
  63. package/dist/packem_chunks/handler71.js +153 -22
  64. package/dist/packem_chunks/handler72.js +1 -1
  65. package/dist/packem_chunks/handler73.js +1 -1
  66. package/dist/packem_chunks/handler74.js +1 -1
  67. package/dist/packem_chunks/handler75.js +35 -35
  68. package/dist/packem_chunks/handler76.js +1 -1
  69. package/dist/packem_chunks/handler77.js +3 -3
  70. package/dist/packem_chunks/handler78.js +69 -67
  71. package/dist/packem_chunks/handler8.js +1 -1
  72. package/dist/packem_chunks/handler9.js +1 -1
  73. package/dist/packem_chunks/heal-accept.js +1 -1
  74. package/dist/packem_chunks/heal.js +1 -1
  75. package/dist/packem_chunks/help-command.js +40 -7
  76. package/dist/packem_chunks/index2.js +32 -32
  77. package/dist/packem_chunks/index6.js +1 -1
  78. package/dist/packem_chunks/keys-refresh.js +1 -1
  79. package/dist/packem_chunks/lean.js +3 -4
  80. package/dist/packem_chunks/list.js +1 -1
  81. package/dist/packem_chunks/loader.js +1 -1
  82. package/dist/packem_chunks/orchestrator.js +1 -1
  83. package/dist/packem_chunks/prompts.js +1 -1
  84. package/dist/packem_chunks/status.js +1 -1
  85. package/dist/packem_chunks/sync.js +1 -1
  86. package/dist/packem_chunks/sync2.js +1 -1
  87. package/dist/packem_chunks/tar.js +1 -1
  88. package/dist/packem_chunks/tripwire.js +1 -1
  89. package/dist/packem_chunks/ts-loader.js +5 -5
  90. package/dist/packem_chunks/verify-lockfile.js +1 -1
  91. package/dist/packem_shared/{affected-selection-D4giBK2X.js → affected-selection-DDxwjwM4.js} +1 -1
  92. package/dist/packem_shared/affected-shas-BuaWvmsG.js +1 -0
  93. package/dist/packem_shared/{ai-fix-BC6aIRJT.js → ai-fix-C2BhFFhi.js} +5 -5
  94. package/dist/packem_shared/{augment-B9kSZuvW.js → augment-CxUPE8KX.js} +1 -1
  95. package/dist/packem_shared/{bin-C1XKj-O-.js → bin-Be7_QhQK.js} +1 -1
  96. package/dist/packem_shared/{build-scripts-CEDx_nJp.js → build-scripts-DxyVSkgM.js} +1 -1
  97. package/dist/packem_shared/command-runtime-BXvH5EC0.js +1 -0
  98. package/dist/packem_shared/{dart-pubspec-BK_cK2EP.js → dart-pubspec-DvmyleIr.js} +2 -2
  99. package/dist/packem_shared/{dependency-scan-B8jroa1D.js → dependency-scan-DKK3ZEZI.js} +1 -1
  100. package/dist/packem_shared/{docker-DXqV-07f.js → docker-BTuwdXaC.js} +1 -1
  101. package/dist/packem_shared/{ecosystem-gate-ddru_hOg.js → ecosystem-gate-BpQNUJzN.js} +1 -1
  102. package/dist/packem_shared/env-consistency-CUBJHENL.js +1 -0
  103. package/dist/packem_shared/{failure-log-D2x5BT8S.js → failure-log-kp0n2rbD.js} +1 -1
  104. package/dist/packem_shared/{formatBytes-BHAzNIrn-CrusHOew.js → formatBytes-BHAzNIrn-DRcKvqnb.js} +1 -1
  105. package/dist/packem_shared/git-source-DExWbfN0.js +2 -0
  106. package/dist/packem_shared/{index-BzhrR_iC.js → index-BdMIfGVZ.js} +15 -15
  107. package/dist/packem_shared/index-C9ENZqH9.js +39 -0
  108. package/dist/packem_shared/{index-Chje3u9v.js → index-DQfNpt2u.js} +1 -1
  109. package/dist/packem_shared/{index-DQ2GJzmy.js → index-DsSWb5XH.js} +1 -1
  110. package/dist/packem_shared/{index.server-sXNQYpsl.js → index.server-D8BLnYZO.js} +2 -2
  111. package/dist/packem_shared/{isAccessibleSync-DYKTrrvc-C-_5cgwu.js → isAccessibleSync-DYKTrrvc-BwaMhQs0.js} +1 -1
  112. package/dist/packem_shared/{lifecycle-D6PMPor-.js → lifecycle-BAhkhE2L.js} +1 -1
  113. package/dist/packem_shared/{lockfile-CiUtEbnt.js → lockfile-DHmlPGk1.js} +1 -1
  114. package/dist/packem_shared/{manifests-Du4yKlf_.js → manifests-Dd4Hoztt.js} +1 -1
  115. package/dist/packem_shared/{min-release-age-JViyQuBM.js → min-release-age-BJnOQaoF.js} +1 -1
  116. package/dist/packem_shared/{missing-package-json-Cu5YVAot.js → missing-package-json-DfzrGwe1.js} +1 -1
  117. package/dist/packem_shared/{multi-eco-lockfiles-B2X3yhyo.js → multi-eco-lockfiles-BIa6xvJc.js} +1 -1
  118. package/dist/packem_shared/{native-config-sync-TdTWjVgI.js → native-config-sync-Dr9XvxOf.js} +1 -1
  119. package/dist/packem_shared/osv-bloom-t40ra5U5.js +2 -0
  120. package/dist/packem_shared/{package-version-Dxirp-UO.js → package-version-CFuNUWDG.js} +2 -2
  121. package/dist/packem_shared/{packument-BQv4je9m.js → packument-C9nRiBJf.js} +1 -1
  122. package/dist/packem_shared/pm-runner-ImwtpnWY.js +1 -0
  123. package/dist/packem_shared/{project-name-filter-D6tXD8gd.js → project-name-filter-C2rkW-Vn.js} +1 -1
  124. package/dist/packem_shared/{provenance-DNyVMxNv.js → provenance-DF-ypZj3.js} +1 -1
  125. package/dist/packem_shared/{readJsonSync-CbryXYxN-EWl7_7KX.js → readJsonSync-CbryXYxN-Bm5i10UW.js} +1 -1
  126. package/dist/packem_shared/{registry-keys-DwB3ZXS_.js → registry-keys-BLuHOyZu.js} +1 -1
  127. package/dist/packem_shared/{resolve-explicit-BPsdmuty.js → resolve-explicit-BDaQRR6o.js} +1 -1
  128. package/dist/packem_shared/resolve-runtime-Cr19Pk6L.js +1 -0
  129. package/dist/packem_shared/{run-file-UBukWaha.js → run-file-XbRCF6Mp.js} +1 -1
  130. package/dist/packem_shared/{runtime-check-1U8HrQd9.js → runtime-check-Bh5q9IrT.js} +1 -1
  131. package/dist/packem_shared/{s1ngularity-QD2LD1sO.js → s1ngularity-UCZN7skW.js} +1 -1
  132. package/dist/packem_shared/{scan-progress-CkumcBG-.js → scan-progress-DcYI76zE.js} +1 -1
  133. package/dist/packem_shared/{selectors-edwcgNl3.js → selectors-DCiEU0iv.js} +2 -2
  134. package/dist/packem_shared/{signatures-t8LbOaqr.js → signatures-CicxPHN4.js} +1 -1
  135. package/dist/packem_shared/target-merge-BClIXg2k.js +14 -0
  136. package/dist/packem_shared/{target-options-DsHFmRZH.js → target-options-PgWIuJnb.js} +1 -1
  137. package/dist/packem_shared/task-env-Dl08aklA.js +2 -0
  138. package/dist/packem_shared/toolchain-DvUxlbDz.js +5 -0
  139. package/dist/packem_shared/{typosquats-8u0drCqQ.js → typosquats-DxPzyK7u.js} +1 -1
  140. package/dist/packem_shared/{verify-B_MblU_Q.js → verify-CadR9PUk.js} +1 -1
  141. package/dist/packem_shared/{vis-update-app-BCIccZfA.js → vis-update-app-DrFWQyPn.js} +1 -1
  142. package/dist/packem_shared/{vis-user-error-75VtCwMv.js → vis-user-error-k7CLTpA4.js} +15 -15
  143. package/dist/packem_shared/{watch-CcTketln.js → watch-Dr_6yz3o.js} +1 -1
  144. package/dist/packem_shared/watch-loop-BId9vT7Q.js +11 -0
  145. package/dist/packem_shared/{writeFileSync-DJoHk3Ks-BPRoepNw.js → writeFileSync-DJoHk3Ks-Dhem3Uof.js} +1 -1
  146. package/dist/release/core/version-actions/index.d.ts +1 -1
  147. package/dist/release/presets.d.ts +1 -55
  148. package/dist/release/presets.js +1 -1
  149. package/dist/release/types.d.ts +1 -18
  150. package/dist/runtime/preload.js +1 -1
  151. package/index.d.ts +204 -204
  152. package/index.js +52 -52
  153. package/package.json +10 -10
  154. package/schemas/project.schema.json +44 -1
  155. package/schemas/vis-config.schema.json +128 -35
  156. package/schemas/vis-release-config.schema.json +1 -12
  157. package/skills/vis/SKILL.md +24 -12
  158. package/dist/packem_shared/Table-BB8xHTU5-BLPS917D.js +0 -11
  159. package/dist/packem_shared/affected-shas-B2V84O0g.js +0 -1
  160. package/dist/packem_shared/command-runtime-p4IXiIf6.js +0 -1
  161. package/dist/packem_shared/giget-D8Kwb0kD.js +0 -2
  162. package/dist/packem_shared/index-BisalDCf.js +0 -39
  163. package/dist/packem_shared/osv-bloom-BCAX5ARR.js +0 -2
  164. package/dist/packem_shared/pm-runner-CMSml1Bj.js +0 -1
  165. package/dist/packem_shared/resolve-runtime-CNiHcVtx.js +0 -1
  166. package/dist/packem_shared/target-merge-DVJl-7Qz.js +0 -4
  167. package/dist/packem_shared/toolchain-BRdpaAC4.js +0 -5
  168. package/dist/packem_shared/watch-loop-qRn0IHPG.js +0 -11
package/CHANGELOG.md CHANGED
@@ -1,3 +1,601 @@
1
+ ## @visulima/vis [6.0.0](https://github.com/visulima/visulima/compare/@visulima/vis@5.0.0...@visulima/vis@6.0.0) (2026-10-15)
2
+
3
+ ### ⚠ BREAKING CHANGES
4
+
5
+ * Deno is no longer a supported runtime or package manager.
6
+ vis targets node/bun runtimes and aube/npm/pnpm/yarn package managers; the
7
+ deno-lint/deno-fmt adapters and deno inference targets are removed.
8
+
9
+ * fix: resolve eslint errors after deno removal
10
+
11
+ - vis: use a block body for applyIgnoreScripts (arrow-body-style)
12
+ - is-ansi-color-supported: drop stale eslint-disable directives and
13
+ replace the raw-release if/else with a ternary (unicorn/prefer-ternary)
14
+
15
+ * docs(cron-parser): remove remaining deno runtime mentions
16
+
17
+ These doc/config files arrived with main's dialect-gating commit after this
18
+ branch's base, so they still listed Deno as a supported runtime.
19
+
20
+ * feat!: remove deno runtime and tooling support
21
+
22
+ Deno is being wound down: Cloudflare is acquiring the Deno team, the runtime
23
+ gets one more year of monthly maintenance before development ends, and Deno
24
+ Deploy shuts down. Drop Deno as a supported runtime, package manager, and
25
+ lint/fmt/inference target across the monorepo.
26
+
27
+ - vis: remove the deno runtime path, deno-lint/deno-fmt adapters, the
28
+ deno.json inference detector, Deno PM handling (TypeScript + Rust native
29
+ resolver), and the devcontainer deno mount; regenerate the JSON schemas.
30
+ - libraries: drop Deno runtime detection from cerebro, ono,
31
+ is-ansi-color-supported, and task-runner command parsing; remove Deno
32
+ wording from package docs and READMEs.
33
+ - delete the examples/deno directories (ono, pail, storage) and Deno docs.
34
+ - keep JSR publishing (registry usable from Node), license/attribution
35
+ comments, the secret-scanner Deno-token rule, and the historical RFCs.
36
+ * Deno is no longer a supported runtime or package manager.
37
+ vis targets node/bun runtimes and aube/npm/pnpm/yarn package managers; the
38
+ deno-lint/deno-fmt adapters and deno inference targets are removed.
39
+
40
+ * fix: resolve eslint errors after deno removal
41
+
42
+ - vis: use a block body for applyIgnoreScripts (arrow-body-style)
43
+ - is-ansi-color-supported: drop stale eslint-disable directives and
44
+ replace the raw-release if/else with a ternary (unicorn/prefer-ternary)
45
+
46
+ * chore(vis): tidy deno-removal leftovers from review
47
+
48
+ * fix(vis): drop unused logger from x handler, restore bun typing
49
+
50
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
51
+
52
+ * docs: add migration notes for removed deno exports
53
+
54
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
55
+
56
+ * feat(vis): warn on stale adapter ids and deno-only projects
57
+
58
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
59
+
60
+ * refactor(vis): derive runtime ids and reuse bun detection
61
+
62
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
63
+
64
+ * refactor(vis): drop jsr deno option and deno auth reference
65
+
66
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
67
+
68
+ * fix(vis): restore runtime id schema description
69
+
70
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
71
+
72
+ * refactor(vis): remove jsr publishing support
73
+
74
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
75
+
76
+ * feat(bytes): port @std/bytes helpers back in
77
+
78
+ Carries the Uint8Array helpers from @std/bytes@1.0.6 (MIT, Copyright the Deno authors)
79
+ into src/std-bytes.ts and re-exports them from the package entry. Keeps the public API that
80
+ the Deno-removal commit dropped, without the jsr: devDependency. Docs and AGENTS notes are
81
+ restored to describe the ported functions.
82
+
83
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
84
+
85
+ * docs(bytes): attribute ported @std/bytes source
86
+
87
+ The license file still listed @jsr/std__bytes as a bundled dependency.
88
+ Replace it with the MIT notice for the ported src/std-bytes.ts, placed outside
89
+ the generated dependency blocks.
90
+
91
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
92
+
93
+ * fix(cron-parser): keep reviewed docs and 1.1.0 version
94
+
95
+ The rebase onto the remote branch dropped the reviewed dialect sentence in the README and
96
+ the installation table row, and the release commit's 1.1.0 version bump.
97
+
98
+ ### Features
99
+
100
+ * remove deno runtime and tooling support ([#973](https://github.com/visulima/visulima/issues/973)) ([26fada1](https://github.com/visulima/visulima/commit/26fada1ac04731cba9db8f74fe20849c0a15db74))
101
+
102
+ ## @visulima/vis [5.0.0](https://github.com/visulima/visulima/compare/@visulima/vis@4.3.1...@visulima/vis@5.0.0) (2026-10-14)
103
+
104
+ ### ⚠ BREAKING CHANGES
105
+
106
+ * **vis:** vis run <target> now exits 1 when no project defines the
107
+ target. Scripts that relied on the silent exit 0 must pass --if-present.
108
+
109
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
110
+
111
+ * feat(task-runner): add tracker kind to trace key
112
+
113
+ The trace key now includes which mechanism observed the file accesses:
114
+ seccomp, strace, interpose, iat or preload. The same workspace traced on
115
+ Linux and macOS can no longer produce the same key for different
116
+ observations.
117
+
118
+ Upgrade notes:
119
+ - Traced entries written after this change are keyed on the new digest.
120
+ Entries written before it stay reachable through the task index and
121
+ are validated against their files as before, so there is no forced
122
+ miss on upgrade.
123
+
124
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
125
+
126
+ * feat(task-runner): fall back to declared hash
127
+
128
+ A traced task whose tracker observed no workspace access was never
129
+ cached. That left targets which declare inputs uncached on hosts without
130
+ a working tracker. When the target declares inputs, such a run is now
131
+ keyed on its declared hash instead. Targets without inputs keep the
132
+ previous behaviour: no cache entry and a warning.
133
+
134
+ The declared hash is computed only when the tracker is empty, so traced
135
+ runs that observe files do no extra hashing. A fallback entry is stored
136
+ without a fingerprint, and the next run validates it by recomputing the
137
+ declared hash. A changed hash is reported as declared-changed. The task
138
+ result and the run summary record hashSource: "declared-fallback".
139
+
140
+ Upgrade notes:
141
+ - Existing entries are unchanged. Only runs that observe no workspace
142
+ access, for targets that declare inputs, gain a cache entry.
143
+
144
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
145
+
146
+ * feat(vis): show declared-fallback key in cache why
147
+
148
+ cache why and cache hash now say when a traced run was keyed on its
149
+ declared hash, and the JSON output carries hashSource. The vis config
150
+ schema is regenerated for the updated autoFingerprint description.
151
+
152
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
153
+
154
+ * docs(vis): describe declared fallback and trace key
155
+
156
+ The caching guide and configuration reference now explain when an empty
157
+ trace is keyed on the declared hash, how a trace key is built, and what
158
+ cache why reports. The RFC marks G1-B and G4 done.
159
+
160
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
161
+
162
+ * docs(task-runner): describe declared fallback for empty traces
163
+
164
+ The empty-fingerprint section now explains both outcomes: a target that
165
+ declares inputs is keyed on its declared hash, and one that does not is
166
+ left uncached with a warning.
167
+
168
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
169
+
170
+ * docs(vis): correct trace caching claim in why-vis
171
+
172
+ A run the tracker cannot observe is keyed on its declared inputs when
173
+ the target declares them. It is not cached otherwise.
174
+
175
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
176
+
177
+ * feat(task-runner): parse top-level && chains
178
+
179
+ Add splitCompoundCommand, a quote-aware splitter that cuts a shell
180
+ command on top-level && only. Anything it does not model (;, ||, a
181
+ background &, subshells, command substitution, heredocs, comments,
182
+ empty segments, cd/export/source/set/trap/exec and VAR=value prefixes)
183
+ leaves the whole command unsplit and reports why.
184
+
185
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
186
+
187
+ * feat(task-runner): add splitCompound segment chains
188
+
189
+ Add the splitCompound target option. A declared-mode target whose
190
+ * **vis:** `vis run` with --filter, --query or --tag that selects no
191
+ project now exits 1. Scripts that relied on the silent exit 0 must pass
192
+ --if-present.
193
+
194
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
195
+
196
+ * test(vis): keep empty --affected results exit 0
197
+
198
+ Pins the behaviour the empty-selection fix must not change: when a --tag
199
+ selects a project that --affected then excludes, the run prints "No
200
+ projects affected by the changes." and returns. A mutation that throws
201
+ there fails the test.
202
+
203
+ The fixture repo runs with GIT_* variables cleared, so it cannot act on
204
+ the repository that a git hook is committing.
205
+
206
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
207
+
208
+ * fix(vis): let ci and affected opt out of empty runs
209
+
210
+ vis run now fails when a target, --query or tag selects no projects, and
211
+ vis ci / vis affected hand their --query to it. A job whose query can
212
+ legitimately match nothing had no way to say so. Add --if-present to both
213
+ and forward it to vis run.
214
+
215
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
216
+
217
+ * fix(task-runner): match excludes inside the workspace
218
+
219
+ The tracker tested its exclude patterns (/dev/, /tmp/, /etc/, ...) against
220
+ the absolute path before checking containment. A workspace under any of
221
+ those directory names, such as ~/dev/project or a /tmp CI checkout,
222
+ recorded no accesses at all on the strace, seccomp, interpose and IAT
223
+ paths, so traced caching never engaged. The Windows IAT check was also a
224
+ lowercase startsWith without a separator boundary, so a workspace /ws/app
225
+ accepted /ws/app-other.
226
+
227
+ Every path now goes through resolveAccessPath: containment first, then the
228
+ patterns against the path inside the workspace.
229
+
230
+ Upgrade notes: traced targets in a workspace under a dev, tmp or etc
231
+ directory now cache where they previously never did. The IAT path no longer
232
+ accepts sibling directories that share the workspace prefix.
233
+
234
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
235
+
236
+ * fix(task-runner): key unset env names apart from empty ones
237
+
238
+ A traced key recorded an unset name and an empty value the same way, so a
239
+ name that went from unset to "" hit a stale entry. An unset name now keys
240
+ differently from an empty one, using the same presence scheme as the
241
+ declared hasher.
242
+
243
+ validate takes the env to check against. It defaults to process.env, so
244
+ existing callers see no change; the next commit passes the child env.
245
+
246
+ Upgrade notes: traced entries that key an env name miss once after
247
+ upgrading, because the stored env key format changed.
248
+
249
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
250
+
251
+ * fix(task-runner): key traced runs on the child env
252
+
253
+ A traced run keyed the parent's env values, so a value the child receives
254
+ from another source (an envFile, service env, VIS_ARG_* or a per-target env)
255
+ was not in the key, and changing it left a stale hit.
256
+
257
+ The key now reads the names it covers from the resolved child env
258
+ (TaskRunnerContext.resolveChildEnv). A name the clean policy hides hashes as
259
+ unset. Validation reads the same env, so a hit needs the values the child
260
+ will see. Untracked names stay out of the key, and the key does not cover
261
+ the whole environment.
262
+
263
+ The key also covers the command the run spawns. TaskRunnerContext.resolveCommand
264
+ supplies it, so caller-side arguments and shell wrapping change the key.
265
+ Without it the project target command is used, as before.
266
+
267
+ TaskRunnerContext.preTraceCheck runs on a cache miss before tracking. A
268
+ returned message fails the task with exit code 1; the child does not spawn
269
+ and nothing is cached.
270
+
271
+ Upgrade notes: a traced key changes when the spawned command differs from
272
+ the configured one. Traced entries that key an env name also miss once,
273
+ as in the previous commit.
274
+
275
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
276
+
277
+ * fix(vis): traced targets run the executor command
278
+
279
+ A traced target ran the raw project command. Forwarded arguments
280
+ (`vis run build -- --flag`) and `affectedFiles: "args"` paths never reached
281
+ the child, `${...}` tokens and a custom `shell` did not apply, and
282
+ `strictEnv` was not checked.
283
+
284
+ The executor and the traced run now share one resolver for the spawned
285
+ command, and one strict-env check that reads the child env the spawn gets.
286
+ Both spawn the same string, and the traced key hashes it, so the arguments
287
+ and affected files change the key.
288
+
289
+ Upgrade notes:
290
+ - Traced targets now receive forwarded arguments and `affectedFiles: "args"`
291
+ paths. A traced run with these misses once, since the key includes them.
292
+ - Traced targets now run their configured command, with tokens expanded and
293
+ any custom shell applied, as the executor does. They used to run the raw
294
+ project command.
295
+ - `strictEnv` (flag or config) now fails a traced target that references an
296
+ unset variable, before the child starts. A traced target that passed with
297
+ an unset reference now fails.
298
+ - Traced keys hash the env values the child receives (see the task-runner
299
+ commits), so traced targets with env names in the key miss once.
300
+
301
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
302
+
303
+ * docs(vis): document the traced key and strict env
304
+
305
+ The caching guide lists what a traced key covers: the spawned command and
306
+ the env values the child receives for the names the key covers. The run
307
+ guide says the strict-env check runs for traced targets too. The RFC
308
+ records the resolution and the gaps that remain: the declared hasher still
309
+ reads process.env for fingerprintEnv and envVars, and persistent targets and
310
+ the TUI retry spawn the raw command, so forwarded arguments do not reach them.
311
+
312
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
313
+
314
+ * fix(vis): persistent and retried tasks keep args
315
+
316
+ Persistent targets and a TUI retry spawned the raw override command, so
317
+ forwarded arguments, affectedFiles args and a custom shell were dropped
318
+ while the first attempt of the same task had them. Both now spawn the
319
+ command the executor and the traced run use.
320
+
321
+ Upgrade notes: vis run <persistent> -- <args> now passes the arguments to
322
+ the persistent command.
323
+
324
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
325
+
326
+ * fix(task-runner): key declared env on the child env
327
+
328
+ The declared hasher read fingerprintEnv, envVars, env:// inputs,
329
+ autoEnvVars and framework names from the parent's process.env, but the
330
+ child also gets values from envFile layering, service env, task arguments
331
+ and per-target env. A cached target keyed on a variable only its env file
332
+ defines kept serving a stale hit after the file changed, and fingerprintEnv
333
+ wildcards never matched names the parent lacked.
334
+
335
+ The hasher takes a childEnv resolver, supplied from resolveChildEnv, and
336
+ keys and expands patterns against the environment the task will receive.
337
+ globalEnv is workspace-wide and still reads the parent's.
338
+
339
+ Upgrade notes: a declared target whose child sees a different value than
340
+ the parent for a keyed name gets one new key, and so one cache miss. Keys
341
+ for names with equal values are unchanged.
342
+
343
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
344
+
345
+ * fix(vis): doctor no longer crashes without a lockfile
346
+
347
+ vis doctor looked the package manager up twice with a strict resolver that
348
+ throws when a workspace has no lockfile and no packageManager field, the
349
+ state of every new project. It crashed with a stack trace instead of
350
+ reporting. Reuse the tolerant detection the command already performed.
351
+
352
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
353
+
354
+ * docs(vis-mcp): fix lint and cache tool text
355
+
356
+ The lint description listed the default adapters without the opt-in
357
+ typecheck adapter. cache_why and cache_hash described hashDetails only,
358
+ but trace-mode tasks have no hashDetails: their reasons are in
359
+ task.cacheMissReasons and their tracked state is in trackedFingerprint.
360
+
361
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
362
+
363
+ * docs(vis): cover run, cache and lint in the skill
364
+
365
+ Add the tools the table left out, correct the tool count, and document
366
+ the empty-selection exit code, the opt-in typecheck adapter, the trace
367
+ miss reasons, and the doctor env coverage check. Replace the cache-miss
368
+ flow's invented status and stderr fields with the real summary fields.
369
+
370
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
371
+
372
+ * docs(vis): sync ai guide tool reference
373
+
374
+ The guide listed eight tools and described a run_task tool that does
375
+ not exist. Add the five missing tools and the trace-mode fields that
376
+ cache_why and cache_hash return.
377
+
378
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
379
+
380
+ * fix(vis-mcp): read the run summary vis really writes
381
+
382
+ list_runs read runId, startedAt, status and tasks[].status, none of which
383
+ the run summary has: it carries id, startTime, stats and per-task
384
+ exitCode. Every run therefore showed as a success with no failures and no
385
+ start time, including failed ones, and get_run_logs echoed an undefined
386
+ run id. Read the real fields, fall back to the old spellings, and test
387
+ against a summary shaped like the one vis writes.
388
+
389
+ Upgrade notes: list_runs now reports failed runs as failures, with their
390
+ start time and task counts.
391
+
392
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
393
+
394
+ * feat(task-runner): chain trace keys per segment
395
+
396
+ A `splitCompound` target with `hashMode: "trace"` (or workspace
397
+ `autoFingerprint`) was refused and ran whole. It now splits like a declared
398
+ target. Each segment runs through the tracker on its own command, and its
399
+ trace key folds in the trace key of the segment before it.
400
+
401
+ - fingerprint: `TaskFingerprint.chainKey` holds the predecessor's trace key.
402
+ It joins `hashFingerprint` only when set, so keys of ordinary tasks do not
403
+ move (a test pins two of them). `validateChain` checks it on lookup, after
404
+ the command and tracker checks and before any file is hashed, and a moved
405
+ predecessor misses with `chain-changed`.
406
+ - orchestrator: a segment after the first keys on its predecessor's trace key.
407
+ A segment whose predecessor has no key this run is neither served nor stored.
408
+ A traced segment publishes its key on a hit as well as on a store.
409
+ - default resolver: reads a segment's command from `overrides`, so the tracker
410
+ and the tracker-kind prediction see that segment's command, not the chain.
411
+ - Refusals kept: `{ auto: true }` outputs, `when`, `always`, custom shell and
412
+ unsupported shell syntax. The trace and auto-fingerprint refusals are removed.
413
+
414
+ Upgrade notes:
415
+
416
+ - Targets that set `splitCompound` together with `hashMode: "trace"` or
417
+ `taskRunner.autoFingerprint` now run as `target#n` segments. They used to run
418
+ whole. Their first run after upgrading misses, because the segment entries
419
+ are new.
420
+ - Keys of targets that do not split are unchanged, both traced and declared.
421
+ - `vis run --dry-run` lists the segments of these targets, each marked `(trace)`.
422
+ - `SplitCompoundOptions` (exported from `@visulima/task-runner`) no longer has
423
+ `autoFingerprint`. Passing it is now a type error. It had no effect once the
424
+ split refusal was gone.
425
+ - The `splitCompound` description in the vis config schemas is regenerated.
426
+
427
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
428
+
429
+ * fix(vis): give segments their target's service env
430
+
431
+ The service env of a run is keyed on the target's id, before a
432
+ `splitCompound` target is split. A segment runs under its own id
433
+ (`target#n`), so its spawn found no service env. A split target therefore
434
+ lost the variables of the services it depends on, in declared mode as well
435
+ as traced mode.
436
+
437
+ `resolveTaskSpawn` now reads a segment's entry from the target it runs in
438
+ place of. Every spawn path reads through that function, so the executor, the
439
+ persistent launch and the retry get the same environment.
440
+
441
+ Upgrade notes:
442
+
443
+ - A `splitCompound` target's segments now receive the service env they used
444
+ to miss. A segment's key changes once after upgrading only when it names a
445
+ service variable, because keys cover the env values the child receives.
446
+
447
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
448
+
449
+ * test(vis): cover traced segments through vis run
450
+
451
+ Runs a `hashMode: "trace"` target with `splitCompound` through the run
452
+ handler. Covers the last-segment-only re-run, the re-run of every segment
453
+ when the first segment's input changes, forwarded arguments on the last
454
+ segment only, and the `(trace)` annotation on each segment in the dry-run
455
+ plan.
456
+
457
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
458
+
459
+ * docs(vis): document traced segment keys
460
+
461
+ The `splitCompound` option no longer refuses trace hashing. The run option
462
+ row and the caching guide now describe how a traced segment's key chains to
463
+ its predecessor, and the cases where a segment is neither served nor stored.
464
+ The RFC marks G3.3 done and records the chain, the kept refusals and the
465
+ limits found while implementing it.
466
+
467
+ Upgrade notes:
468
+
469
+ - The caching guide and the run option table no longer list trace hashing as
470
+ a reason the split is refused. Targets that combine `splitCompound` with
471
+ `hashMode: "trace"` split as described in the previous commits.
472
+
473
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
474
+
475
+ * fix(vis): annotate traced tasks under auto-fingerprint
476
+
477
+ The dry-run plan marked a task `(trace)` only when its own `hashMode` was
478
+ `"trace"`. Under `taskRunner.autoFingerprint` the engine traces every task,
479
+ segments included, so their plan lines showed no trace mark.
480
+
481
+ The annotation now follows the engine: `hashMode: "trace"` or the workspace
482
+ switch.
483
+
484
+ Tests cover the dry-run annotation under the workspace switch, and
485
+ `vis cache why` on a segment that missed because the segment before it moved.
486
+
487
+ Upgrade notes:
488
+
489
+ - Under `taskRunner.autoFingerprint`, `vis run --dry-run` now marks every task
490
+ `(trace)`, including targets that do not split. Before, only per-target trace
491
+ targets were marked. The run itself is unchanged.
492
+
493
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
494
+
495
+ * test(task-runner): guard segment tests for win32
496
+
497
+ Two segment tests use a bare `true` command as a segment whose tracker sees
498
+ nothing. `true` is a POSIX builtin that cmd.exe lacks, so they now skip on
499
+ win32. The clean-environment test passes the platform's essential names
500
+ (SystemRoot on Windows) to the child, so node can start there.
501
+
502
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
503
+
504
+ * docs(vis): correct the chain miss reason in the RFC
505
+
506
+ A moved predecessor misses with `chain-changed`, which `vis cache why` prints
507
+ as `Previous segment changed`. The reason does not name the predecessor, so
508
+ the RFC no longer says it does.
509
+
510
+ Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
511
+
512
+ * fix(vis): report target properties under options
513
+
514
+ splitCompound, hashMode, fingerprintEnv and the other target-level
515
+ properties are read from the target, not from its options bag. Written
516
+ under options they parsed fine and did nothing, and the run.mdx options
517
+ table listed splitCompound there. Warn when a run finds one under options,
518
+ and move splitCompound out of the options table with a note on which keys
519
+ are target-level.
520
+
521
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
522
+
523
+ * fix(task-runner): key dependents on traced hits
524
+
525
+ A traced task published its key only when it ran and stored, not when
526
+ it was served from cache. A declared task that dependsOn it then folded
527
+ the traced key on a cold run and nothing on a warm one, so its key
528
+ flipped with whether the dependency ran. Worse, the key without the
529
+ dependency was shared across dependency states, so after the dependency
530
+ changed and then hit again the dependent was served output built from
531
+ the older state.
532
+
533
+ Publish the key on every traced hit, as segments already did.
534
+
535
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
536
+
537
+ * fix(vis): replace every match in two rewrites
538
+
539
+ CodeQL flagged two string replaces that rewrite only the first match.
540
+ Neither input holds a second match today, but replaceAll states the
541
+ intent and keeps the code scan green.
542
+
543
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
544
+
545
+ * fix(vis): check referenced tsconfigs in build mode
546
+
547
+ tsc -b rejects --noEmit once one project references another (TS6310),
548
+ so a solution-style workspace whose projects import each other could
549
+ never pass the type check. Drop the flag in build mode and document
550
+ that it writes each project's own outDir and tsbuildinfo.
551
+
552
+ Also decide config ownership with a relative path, so a root with
553
+ Windows separators still finds its own tsconfig.
554
+
555
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
556
+
557
+ * fix(vis): keep the GitLab token off self-hosted hosts
558
+
559
+ GITLAB_TOKEN belongs to gitlab.com, but a gitlab://host source names a
560
+ host the template author chose, so the token was sent wherever the URL
561
+ pointed. Skip the environment token there; create.auth, a token in the
562
+ URL and GIGET_AUTH still apply.
563
+
564
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
565
+
566
+ * fix(vis): apply review fixes to create, doctor, run
567
+
568
+ - resolve a create.defaultTemplate alias before the org preflight
569
+ - pass the config to the task overlay loader in the env check
570
+ - keep doctor running when the env coverage check throws
571
+ - retry a split target by segment id
572
+ - declare if-present with negatable() and drop the tag claim from ci
573
+ - correct the clean-env note for traced targets and the splitCompound
574
+ and if-present wording in the docs
575
+
576
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
577
+
578
+ * test: fix windows paths, quoting and env names
579
+
580
+ - pass a file path to node as an argument, not inside a JS string
581
+ - quote only values that contain whitespace, as cmd drops the first
582
+ and last quote of a command that starts with one
583
+ - match env names without regard to case and allow the names Windows
584
+ adds to every process
585
+ - compare paths in the normalised form the code returns
586
+ - expect cmd to leave $VAR unexpanded
587
+
588
+ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
589
+
590
+ ### Features
591
+
592
+ * **vis:** git templates, clean env cache keys, trace segments ([#969](https://github.com/visulima/visulima/issues/969)) ([f16cf03](https://github.com/visulima/visulima/commit/f16cf038f9827abcf814fa1c2a5821c004d6d746)), closes [id#1](https://github.com/visulima/id/issues/1) [id#2](https://github.com/visulima/id/issues/2)
593
+
594
+
595
+ ### Dependencies
596
+
597
+ * **@visulima/task-runner:** upgraded to 2.0.0
598
+
1
599
  ## @visulima/vis [4.3.1](https://github.com/visulima/visulima/compare/@visulima/vis@4.3.0...@visulima/vis@4.3.1) (2026-10-14)
2
600
 
3
601