@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
@@ -157,6 +157,13 @@
157
157
  "description": "Default giget provider for `owner/repo` shorthand inputs.",
158
158
  "default": "github"
159
159
  },
160
+ "defaultTemplate": {
161
+ "type": "string",
162
+ "description": "Template used by a bare `vis create`. Accepts any template input, including an organization scope (`@acme` opens the `@acme/create` manifest picker, `@acme:app` selects one entry directly). In a terminal the usual prompts still run, minus the template step.",
163
+ "examples": [
164
+ "@acme"
165
+ ]
166
+ },
160
167
  "gitInit": {
161
168
  "type": "boolean",
162
169
  "description": "Initialize a git repository after scaffolding standalone projects.",
@@ -248,9 +255,6 @@
248
255
  "biome": {
249
256
  "$ref": "#/$defs/LintFmtAdapterOverride"
250
257
  },
251
- "deno-fmt": {
252
- "$ref": "#/$defs/LintFmtAdapterOverride"
253
- },
254
258
  "dprint": {
255
259
  "$ref": "#/$defs/LintFmtAdapterOverride"
256
260
  },
@@ -283,7 +287,7 @@
283
287
  }
284
288
  },
285
289
  "additionalProperties": false,
286
- "description": "Configuration for `vis fmt` — the formatter orchestrator.\n\nTunes adapter detection precedence, per-extension routing, and per-adapter overrides. Flags on the CLI always win over config.\n\nThe default fmt precedence is `oxfmt → biome → dprint → prettier → deno-fmt`. When multiple adapters claim the same extension, the first in this order owns it unless overridden here."
290
+ "description": "Configuration for `vis fmt` — the formatter orchestrator.\n\nTunes adapter detection precedence, per-extension routing, and per-adapter overrides. Flags on the CLI always win over config.\n\nThe default fmt precedence is `oxfmt → biome → dprint → prettier`. When multiple adapters claim the same extension, the first in this order owns it unless overridden here."
287
291
  },
288
292
  "gem": {
289
293
  "type": "object",
@@ -360,7 +364,7 @@
360
364
  "type": "boolean"
361
365
  }
362
366
  ],
363
- "description": "Auto-create targets from detected config files (Project Crystal-style). Detectors run by default; set `false` to disable them entirely, or use the object form to disable individual ones. See the note at the bottom of this block for what \"unset\" allows versus an explicit `true`.\n\nInferred targets sit *below* explicit ones — the command from `package.json#scripts`, `project.json#targets`, or `vis.task.ts` always wins per-key, so enrichment never changes what runs. As a caching aid, when a `package.json` script's command *is* a detector's command (optionally with extra flags, no shell chaining) and the script declares no `inputs`/`outputs`, the detector's `inputs`/`outputs` are adopted so the script target can cache precisely and restore its artifacts. Customised/compound scripts are left untouched.\n\nBuilt-in detectors and the targets they synthesize:\n\n- **App frameworks** — `nuxt` (build/dev/preview/generate), `next` (build/dev/start), `remix` (build/dev/start), `astro` (build/dev), `gatsby` (build/develop/serve), `docusaurus` (build/start/serve).\n- **Bundlers** — `vite` (build/dev/preview), `rolldown` (build), `tsdown` (build), `tsup` (build), `packem` (build), `rollup` (build), `webpack` (build).\n- **Docs sites** — `vitepress` (docs:build/docs:dev/docs:preview), `typedoc` (docs).\n- **Server frameworks** — `nest` (build/start/start:dev).\n- **Test runners** — `vitest` (test/test:watch), `jest` (test/test:watch), `bun` (test), `playwright` (test:e2e), `cypress` (test:e2e/cypress:open).\n- **Stories** — `storybook` (storybook/build-storybook).\n- **Type checking** — `typescript` (typecheck via `tsc --noEmit`).\n- **Lint / format** — `eslint` (lint), `prettier` (format / format:check), `biome` (lint, format), `oxlint` (lint), `oxfmt` (format / format:check), `stylelint` (lint:css), `knip` (knip).\n- **Runtimes** — `deno` (test/lint/fmt/check).\n- **Database tooling** — `prisma` (db:generate/db:migrate/ db:push/db:studio), `drizzle` (db:generate/db:migrate/ db:push/db:studio).\n- **Codegen / release** — `graphql-codegen` (codegen), `api-extractor` (api-extract), `changeset` (changeset:version / changeset:publish / changeset:status).\n\nTrigger: presence of any matching config file in the project root. Most detectors additionally match when their framework appears in `dependencies` / `devDependencies` / `peerDependencies` / `optionalDependencies` — covering convention-only setups (e.g. vitest with default config). Detectors that intentionally require a config file (because the package frequently appears transitively and a dep-only match would synthesize broken commands): `vite`, `rolldown`, `rollup`, `webpack`, `storybook`, `nest`, `remix`, `vitepress`, `bun`, `deno`, `changeset`.\n\nConflict resolution: detectors are evaluated in registration order (see `BUILT_IN_DETECTORS`) and the first to claim a target name wins. Per-name priorities: `build` → nuxt > next > remix > astro > gatsby > docusaurus > vite > nest > rolldown > tsdown > tsup > packem > rollup > webpack; `test` → vitest > jest > bun > deno; `test:e2e` → playwright > cypress; `lint` → eslint > biome > oxlint > deno; `format` → prettier > biome > oxfmt; `db:*` → prisma > drizzle.\n\nAlso accepts an object form (`{ vite: false, vitest: true }`) to opt individual detectors in or out by name. Detectors omitted from the object run at their default (enabled). Useful when one detector misfires for a given workspace without disabling the rest.\n\n**Leaving this unset is not the same as setting `true`.** Detectors always *enrich* the targets a project already has — adopting their `type`, `inputs` and `outputs`, which is the caching aid and changes nothing about what runs. *Synthesizing* a target the project never had does change what runs, so on the unset default it is limited to projects that declare no scripts and no targets of their own. Setting this to `true` (or the object form) opts in to synthesis everywhere.\n\nThe distinction exists because a package can deliberately omit a script: a shared eslint-config ships an `eslint.config.js` but no `lint` script, because linting its own flat-config export crashes eslint. Synthesizing `lint` there turned a package `pnpm -r run lint` had always skipped into a failing task, on a workspace that had never asked for inference.\n\nDeliberately no `@default` tag: there is no single value that describes the unset behaviour, and advertising `true` would invite tooling to write it into a config and silently widen synthesis."
367
+ "description": "Auto-create targets from detected config files (Project Crystal-style). Detectors run by default; set `false` to disable them entirely, or use the object form to disable individual ones. See the note at the bottom of this block for what \"unset\" allows versus an explicit `true`.\n\nInferred targets sit *below* explicit ones — the command from `package.json#scripts`, `project.json#targets`, or `vis.task.ts` always wins per-key, so enrichment never changes what runs. As a caching aid, when a `package.json` script's command *is* a detector's command (optionally with extra flags, no shell chaining) and the script declares no `inputs`/`outputs`, the detector's `inputs`/`outputs` are adopted so the script target can cache precisely and restore its artifacts. Customised/compound scripts are left untouched.\n\nBuilt-in detectors and the targets they synthesize:\n\n- **App frameworks** — `nuxt` (build/dev/preview/generate), `next` (build/dev/start), `remix` (build/dev/start), `astro` (build/dev), `gatsby` (build/develop/serve), `docusaurus` (build/start/serve).\n- **Bundlers** — `vite` (build/dev/preview), `rolldown` (build), `tsdown` (build), `tsup` (build), `packem` (build), `rollup` (build), `webpack` (build).\n- **Docs sites** — `vitepress` (docs:build/docs:dev/docs:preview), `typedoc` (docs).\n- **Server frameworks** — `nest` (build/start/start:dev).\n- **Test runners** — `vitest` (test/test:watch), `jest` (test/test:watch), `bun` (test), `playwright` (test:e2e), `cypress` (test:e2e/cypress:open).\n- **Stories** — `storybook` (storybook/build-storybook).\n- **Type checking** — `typescript` (typecheck via `tsc --noEmit`).\n- **Lint / format** — `eslint` (lint), `prettier` (format / format:check), `biome` (lint, format), `oxlint` (lint), `oxfmt` (format / format:check), `stylelint` (lint:css), `knip` (knip).\n- **Database tooling** — `prisma` (db:generate/db:migrate/ db:push/db:studio), `drizzle` (db:generate/db:migrate/ db:push/db:studio).\n- **Codegen / release** — `graphql-codegen` (codegen), `api-extractor` (api-extract), `changeset` (changeset:version / changeset:publish / changeset:status).\n\nTrigger: presence of any matching config file in the project root. Most detectors additionally match when their framework appears in `dependencies` / `devDependencies` / `peerDependencies` / `optionalDependencies` — covering convention-only setups (e.g. vitest with default config). Detectors that intentionally require a config file (because the package frequently appears transitively and a dep-only match would synthesize broken commands): `vite`, `rolldown`, `rollup`, `webpack`, `storybook`, `nest`, `remix`, `vitepress`, `bun`, `changeset`.\n\nConflict resolution: detectors are evaluated in registration order (see `BUILT_IN_DETECTORS`) and the first to claim a target name wins. Per-name priorities: `build` → nuxt > next > remix > astro > gatsby > docusaurus > vite > nest > rolldown > tsdown > tsup > packem > rollup > webpack; `test` → vitest > jest > bun; `test:e2e` → playwright > cypress; `lint` → eslint > biome > oxlint; `format` → prettier > biome > oxfmt; `db:*` → prisma > drizzle.\n\nAlso accepts an object form (`{ vite: false, vitest: true }`) to opt individual detectors in or out by name. Detectors omitted from the object run at their default (enabled). Useful when one detector misfires for a given workspace without disabling the rest.\n\n**Leaving this unset is not the same as setting `true`.** Detectors always *enrich* the targets a project already has — adopting their `type`, `inputs` and `outputs`, which is the caching aid and changes nothing about what runs. *Synthesizing* a target the project never had does change what runs, so on the unset default it is limited to projects that declare no scripts and no targets of their own. Setting this to `true` (or the object form) opts in to synthesis everywhere.\n\nThe distinction exists because a package can deliberately omit a script: a shared eslint-config ships an `eslint.config.js` but no `lint` script, because linting its own flat-config export crashes eslint. Synthesizing `lint` there turned a package `pnpm -r run lint` had always skipped into a failing task, on a workspace that had never asked for inference.\n\nDeliberately no `@default` tag: there is no single value that describes the unset behaviour, and advertising `true` would invite tooling to write it into a config and silently widen synthesis."
364
368
  },
365
369
  "install": {
366
370
  "type": "object",
@@ -388,7 +392,7 @@
388
392
  "type": "boolean"
389
393
  }
390
394
  ],
391
- "description": "Whether to dispatch PM invocations through `corepack`.\n- `\"auto\"` (default): use corepack only when the workspace pins a PM via the `packageManager` field AND `corepack` is on PATH AND the PM is one corepack manages (pnpm/yarn/npm).\n- `true`: always prefix `corepack` when the binary is on PATH and the PM is corepack-managed (errors loudly otherwise).\n- `false`: never go through corepack — invoke the PM directly.\n\nMirrors nypm's `corepack: true` flag. Bun, deno, and aube are never wrapped — corepack does not manage them.",
395
+ "description": "Whether to dispatch PM invocations through `corepack`.\n- `\"auto\"` (default): use corepack only when the workspace pins a PM via the `packageManager` field AND `corepack` is on PATH AND the PM is one corepack manages (pnpm/yarn/npm).\n- `true`: always prefix `corepack` when the binary is on PATH and the PM is corepack-managed (errors loudly otherwise).\n- `false`: never go through corepack — invoke the PM directly.\n\nMirrors nypm's `corepack: true` flag. Bun and aube are never wrapped — corepack does not manage them.",
392
396
  "default": "auto"
393
397
  }
394
398
  },
@@ -404,9 +408,6 @@
404
408
  "biome": {
405
409
  "$ref": "#/$defs/LintFmtAdapterOverride"
406
410
  },
407
- "deno-lint": {
408
- "$ref": "#/$defs/LintFmtAdapterOverride"
409
- },
410
411
  "eslint": {
411
412
  "$ref": "#/$defs/LintFmtAdapterOverride"
412
413
  },
@@ -424,6 +425,9 @@
424
425
  },
425
426
  "stylelint": {
426
427
  "$ref": "#/$defs/LintFmtAdapterOverride"
428
+ },
429
+ "typecheck": {
430
+ "$ref": "#/$defs/LintFmtAdapterOverride"
427
431
  }
428
432
  },
429
433
  "additionalProperties": false,
@@ -438,7 +442,7 @@
438
442
  }
439
443
  },
440
444
  "additionalProperties": false,
441
- "description": "Configuration for `vis lint` — the linter orchestrator.\n\nTunes adapter detection precedence and per-adapter overrides. Flags on the CLI always win over config.\n\nThe default lint precedence is `oxlint → biome → eslint → stylelint → deno-lint`. Override with `order` to e.g. let biome fire before oxlint when the workspace standardises on biome."
445
+ "description": "Configuration for `vis lint` — the linter orchestrator.\n\nTunes adapter detection precedence and per-adapter overrides. Flags on the CLI always win over config.\n\nThe default lint precedence is `oxlint → biome → eslint → stylelint`. Override with `order` to e.g. let biome fire before oxlint when the workspace standardises on biome."
442
446
  },
443
447
  "maven": {
444
448
  "type": "object",
@@ -2059,7 +2063,7 @@
2059
2063
  },
2060
2064
  "autoFingerprint": {
2061
2065
  "type": "boolean",
2062
- "description": "Enable auto-fingerprinting mode (Vite Task-style). When enabled, the task runner automatically tracks which files a task accesses during execution and uses that for cache invalidation instead of requiring manual input configuration.\n\nFalls back to explicit inputs (Nx-style) when file tracking is not supported on the current platform.\n\nThis is the workspace-wide switch. To opt a single target into traced hashing without flipping it for the whole graph, set {@link TargetConfiguration.hashMode } to `\"trace\"` on that target instead.",
2066
+ "description": "Enable auto-fingerprinting mode. When enabled, the task runner automatically tracks which files a task accesses during execution and uses that for cache invalidation instead of requiring manual input configuration.\n\nWhen the tracker observes no workspace access for a run, the run is keyed on the declared hash if the target declares `inputs` (see {@link TaskResult.hashSource } ). Otherwise it is not cached (see {@link TaskResult.emptyFingerprint } ).\n\nThis is the workspace-wide switch. To opt a single target into traced hashing without flipping it for the whole graph, set {@link TargetConfiguration.hashMode } to `\"trace\"` on that target instead.",
2063
2067
  "default": false
2064
2068
  },
2065
2069
  "bail": {
@@ -2092,6 +2096,31 @@
2092
2096
  "description": "Dry-run mode: compute hashes and check cache but don't execute tasks. Useful for debugging cache hits/misses.",
2093
2097
  "default": false
2094
2098
  },
2099
+ "env": {
2100
+ "type": "object",
2101
+ "properties": {
2102
+ "allow": {
2103
+ "type": "array",
2104
+ "items": {
2105
+ "type": "string"
2106
+ },
2107
+ "description": "Names and `*` wildcard patterns kept from the parent environment in `clean` mode. Ignored under `inherit`. Matching is case-insensitive on Windows, where environment names are case-insensitive."
2108
+ },
2109
+ "mode": {
2110
+ "type": "string",
2111
+ "enum": [
2112
+ "inherit",
2113
+ "clean"
2114
+ ],
2115
+ "description": "Whether the child inherits the parent environment."
2116
+ }
2117
+ },
2118
+ "required": [
2119
+ "mode"
2120
+ ],
2121
+ "additionalProperties": false,
2122
+ "description": "Workspace child-environment policy. `clean` gives every task a child with only the allow-listed parent variables, `PATH`, `HOME`, `TERM`, `CI`, the platform essentials, and whatever the executor injects. Default `inherit` (the whole parent environment).\n\nThe executor that spawns the task applies the policy. `vis run` does. The cache key follows it only when the runner context also carries a `childEnvPolicy` hook (see {@link TaskRunnerContext } ). Then a name the clean child cannot see hashes as unset. Without that hook every name is keyed as the parent sees it. Allow-listed names are not added to the key."
2123
+ },
2095
2124
  "envVars": {
2096
2125
  "type": "array",
2097
2126
  "items": {
@@ -2104,7 +2133,7 @@
2104
2133
  "items": {
2105
2134
  "type": "string"
2106
2135
  },
2107
- "description": "Environment variable patterns to include in auto-fingerprint. Supports wildcard patterns like \"VITE_*\". Only used when autoFingerprint is enabled."
2136
+ "description": "Environment variable patterns to include in the trace-mode fingerprint (`autoFingerprint` or a `hashMode: \"trace\"` target). Supports `*` wildcards anywhere in a pattern, e.g. \"VITE_*\" or \"*_TOKEN\". Per-target additions go in {@link TargetConfiguration.fingerprintEnv } ."
2108
2137
  },
2109
2138
  "frameworkInference": {
2110
2139
  "type": "boolean",
@@ -2556,13 +2585,20 @@
2556
2585
  "type": "string",
2557
2586
  "description": "The executor/command to run"
2558
2587
  },
2588
+ "fingerprintEnv": {
2589
+ "type": "array",
2590
+ "items": {
2591
+ "type": "string"
2592
+ },
2593
+ "description": "Env vars folded into this target's cache key, as names or `*` patterns (`\"VITE_*\"`). In `\"declared\"` mode each match becomes an env input, the same as `env://NAME`; in `\"trace\"` mode it extends {@link TaskRunnerOptions.fingerprintEnvPatterns } for this target."
2594
+ },
2559
2595
  "hashMode": {
2560
2596
  "type": "string",
2561
2597
  "enum": [
2562
2598
  "declared",
2563
2599
  "trace"
2564
2600
  ],
2565
- "description": "How this target's cache key is derived.\n\n- `\"declared\"` (default): the Nx-style path — the hash is built up-front from explicitly declared `inputs` (plus named/global inputs and the lockfile). Deterministic and portable across machines: two runners with the same workspace state produce the same key regardless of OS or syscall surface.\n- `\"trace\"`: the task is run under the file-access tracker (strace on Linux, an fs preload shim elsewhere) and the cache key is derived from the files it actually *read* during execution — no `inputs` declaration required. Mirrors the shipped `{ auto: true }` output capture, but for the input side. Use for compound or opaque commands whose real input set is impractical to enumerate.\n\nOpt-in per target precisely because trace mode trades reproducibility for convenience: the observed read set can differ across runners with different syscall surfaces (a static binary on a host without strace records nothing), so a trace key is **not** guaranteed portable between machines. Leave targets on `\"declared\"` whenever the input set can reasonably be listed.\n\nEquivalent to flipping {@link TaskRunnerOptions.autoFingerprint } on for this one target while every other target stays declared."
2601
+ "description": "How this target's cache key is derived.\n\n- `\"declared\"` (default): the Nx-style path — the hash is built up-front from explicitly declared `inputs` (plus named/global inputs and the lockfile). Deterministic and portable across machines: two runners with the same workspace state produce the same key regardless of OS or syscall surface.\n- `\"trace\"`: the task is run under the file-access tracker (strace or seccomp on Linux; DYLD/IAT interposition on macOS and Windows for directly-executed commands; a Node preload otherwise) and the cache key is derived from the files it actually *read* during execution — no `inputs` declaration required. Mirrors the shipped `{ auto: true }` output capture, but for the input side. Use for compound or opaque commands whose real input set is impractical to enumerate.\n\nOpt-in per target precisely because trace mode trades reproducibility for convenience: the observed read set can differ across runners with different syscall surfaces (a static binary on a host without strace records nothing), so a trace key is **not** guaranteed portable between machines. Leave targets on `\"declared\"` whenever the input set can reasonably be listed.\n\nEquivalent to flipping {@link TaskRunnerOptions.autoFingerprint } on for this one target while every other target stays declared."
2566
2602
  },
2567
2603
  "inputs": {
2568
2604
  "type": "array",
@@ -2704,6 +2740,17 @@
2704
2740
  "type": "boolean",
2705
2741
  "description": "Per-target PTY override. When `true`, every task spawned from this target runs inside a pseudo-terminal (so `isatty()` returns true and the child preserves color / progress UI). When `false`, the workspace-level PTY toggle is suppressed for this target. Useful when most targets are happy with piped stdio but one tool (vitest, prettier, a colorising linter) needs a real TTY, or vice versa.\n\nAbsent means \"follow the workspace default\" — the executor decides based on its own toggles."
2706
2742
  },
2743
+ "splitCompound": {
2744
+ "type": "boolean",
2745
+ "description": "Split the target's command on top-level `&&` into one chained task per segment, each with its own cache key. Segment _n_ folds in the key of segment _n−1_, so changing a later segment re-runs only that segment and later ones, and a failing segment stops the chain. Works in declared and trace mode. A traced segment is tracked on its own command, and its trace key folds in the trace key of the segment before it.\n\nDeclared `outputs` attach to the last segment, so a cache hit on the whole chain restores them. A partial hit does not restore an earlier segment's files, so a later segment that reads a file written by an earlier segment needs that file to be a declared output of its own target. Opt-in. The split is refused, with a diagnostic and the target run whole, when the command contains a construct the splitter does not model (`;`, `||`, subshells, `cd`, `export`, `VAR=…` prefixes, command substitution, …), when an output is `{ auto: true }` (write tracking covers the whole target, not one segment), when it has a `when` condition, or when it is `always`."
2746
+ },
2747
+ "untrackedEnv": {
2748
+ "type": "array",
2749
+ "items": {
2750
+ "type": "string"
2751
+ },
2752
+ "description": "Env vars this target receives but keeps out of its cache key, as names or `*` patterns (`\"CI_*\"`). Applies on top of {@link TaskRunnerOptions.untrackedEnvVars } and wins over `fingerprintEnv`, `autoEnvVars`, framework inference and trace-mode fingerprint patterns. Explicit `env://` inputs and the workspace `envVars` / `globalEnv` lists are not affected."
2753
+ },
2707
2754
  "warningPattern": {
2708
2755
  "anyOf": [
2709
2756
  {
@@ -2978,7 +3025,7 @@
2978
3025
  "items": {
2979
3026
  "type": "string"
2980
3027
  },
2981
- "description": "Environment variables that should be passed to tasks but NOT included in the cache fingerprint. Useful for CI-specific vars. Only used when autoFingerprint is enabled."
3028
+ "description": "Environment variables that are passed to tasks but kept out of their cache key. Accepts names and `*` wildcard patterns (e.g. \"CI_*\"). Applies to the trace-mode fingerprint and to the implicit env sources of declared-mode hashing (`autoEnvVars`, framework inference). Explicit `env://` inputs and `envVars` / `globalEnv` are not affected. Per-target overrides go in {@link TargetConfiguration.untrackedEnv } ."
2982
3029
  }
2983
3030
  },
2984
3031
  "additionalProperties": false,
@@ -3126,13 +3173,20 @@
3126
3173
  "type": "string",
3127
3174
  "description": "The executor/command to run"
3128
3175
  },
3176
+ "fingerprintEnv": {
3177
+ "type": "array",
3178
+ "items": {
3179
+ "type": "string"
3180
+ },
3181
+ "description": "Env vars folded into this target's cache key, as names or `*` patterns (`\"VITE_*\"`). In `\"declared\"` mode each match becomes an env input, the same as `env://NAME`; in `\"trace\"` mode it extends {@link TaskRunnerOptions.fingerprintEnvPatterns } for this target."
3182
+ },
3129
3183
  "hashMode": {
3130
3184
  "type": "string",
3131
3185
  "enum": [
3132
3186
  "declared",
3133
3187
  "trace"
3134
3188
  ],
3135
- "description": "How this target's cache key is derived.\n\n- `\"declared\"` (default): the Nx-style path — the hash is built up-front from explicitly declared `inputs` (plus named/global inputs and the lockfile). Deterministic and portable across machines: two runners with the same workspace state produce the same key regardless of OS or syscall surface.\n- `\"trace\"`: the task is run under the file-access tracker (strace on Linux, an fs preload shim elsewhere) and the cache key is derived from the files it actually *read* during execution — no `inputs` declaration required. Mirrors the shipped `{ auto: true }` output capture, but for the input side. Use for compound or opaque commands whose real input set is impractical to enumerate.\n\nOpt-in per target precisely because trace mode trades reproducibility for convenience: the observed read set can differ across runners with different syscall surfaces (a static binary on a host without strace records nothing), so a trace key is **not** guaranteed portable between machines. Leave targets on `\"declared\"` whenever the input set can reasonably be listed.\n\nEquivalent to flipping {@link TaskRunnerOptions.autoFingerprint } on for this one target while every other target stays declared."
3189
+ "description": "How this target's cache key is derived.\n\n- `\"declared\"` (default): the Nx-style path — the hash is built up-front from explicitly declared `inputs` (plus named/global inputs and the lockfile). Deterministic and portable across machines: two runners with the same workspace state produce the same key regardless of OS or syscall surface.\n- `\"trace\"`: the task is run under the file-access tracker (strace or seccomp on Linux; DYLD/IAT interposition on macOS and Windows for directly-executed commands; a Node preload otherwise) and the cache key is derived from the files it actually *read* during execution — no `inputs` declaration required. Mirrors the shipped `{ auto: true }` output capture, but for the input side. Use for compound or opaque commands whose real input set is impractical to enumerate.\n\nOpt-in per target precisely because trace mode trades reproducibility for convenience: the observed read set can differ across runners with different syscall surfaces (a static binary on a host without strace records nothing), so a trace key is **not** guaranteed portable between machines. Leave targets on `\"declared\"` whenever the input set can reasonably be listed.\n\nEquivalent to flipping {@link TaskRunnerOptions.autoFingerprint } on for this one target while every other target stays declared."
3136
3190
  },
3137
3191
  "inputs": {
3138
3192
  "type": "array",
@@ -3269,6 +3323,17 @@
3269
3323
  "type": "boolean",
3270
3324
  "description": "Per-target PTY override. When `true`, every task spawned from this target runs inside a pseudo-terminal (so `isatty()` returns true and the child preserves color / progress UI). When `false`, the workspace-level PTY toggle is suppressed for this target. Useful when most targets are happy with piped stdio but one tool (vitest, prettier, a colorising linter) needs a real TTY, or vice versa.\n\nAbsent means \"follow the workspace default\" — the executor decides based on its own toggles."
3271
3325
  },
3326
+ "splitCompound": {
3327
+ "type": "boolean",
3328
+ "description": "Split the target's command on top-level `&&` into one chained task per segment, each with its own cache key. Segment _n_ folds in the key of segment _n−1_, so changing a later segment re-runs only that segment and later ones, and a failing segment stops the chain. Works in declared and trace mode. A traced segment is tracked on its own command, and its trace key folds in the trace key of the segment before it.\n\nDeclared `outputs` attach to the last segment, so a cache hit on the whole chain restores them. A partial hit does not restore an earlier segment's files, so a later segment that reads a file written by an earlier segment needs that file to be a declared output of its own target. Opt-in. The split is refused, with a diagnostic and the target run whole, when the command contains a construct the splitter does not model (`;`, `||`, subshells, `cd`, `export`, `VAR=…` prefixes, command substitution, …), when an output is `{ auto: true }` (write tracking covers the whole target, not one segment), when it has a `when` condition, or when it is `always`."
3329
+ },
3330
+ "untrackedEnv": {
3331
+ "type": "array",
3332
+ "items": {
3333
+ "type": "string"
3334
+ },
3335
+ "description": "Env vars this target receives but keeps out of its cache key, as names or `*` patterns (`\"CI_*\"`). Applies on top of {@link TaskRunnerOptions.untrackedEnvVars } and wins over `fingerprintEnv`, `autoEnvVars`, framework inference and trace-mode fingerprint patterns. Explicit `env://` inputs and the workspace `envVars` / `globalEnv` lists are not affected."
3336
+ },
3272
3337
  "warningPattern": {
3273
3338
  "anyOf": [
3274
3339
  {
@@ -3568,9 +3633,6 @@
3568
3633
  "bun": {
3569
3634
  "type": "string"
3570
3635
  },
3571
- "deno": {
3572
- "type": "string"
3573
- },
3574
3636
  "go": {
3575
3637
  "type": "string"
3576
3638
  },
@@ -3868,7 +3930,6 @@
3868
3930
  "type": "string",
3869
3931
  "enum": [
3870
3932
  "biome",
3871
- "deno-fmt",
3872
3933
  "dprint",
3873
3934
  "oxfmt",
3874
3935
  "prettier",
@@ -3880,13 +3941,13 @@
3880
3941
  "type": "string",
3881
3942
  "enum": [
3882
3943
  "biome",
3883
- "deno-lint",
3884
3944
  "eslint",
3885
3945
  "markdownlint",
3886
3946
  "oxlint",
3887
3947
  "ruff-check",
3888
3948
  "shellcheck",
3889
- "stylelint"
3949
+ "stylelint",
3950
+ "typecheck"
3890
3951
  ],
3891
3952
  "description": "Adapter IDs that can lint (adapter `kind` is `\"lint\"` or `\"both\"`)."
3892
3953
  },
@@ -5050,17 +5111,6 @@
5050
5111
  },
5051
5112
  "description": "Per-package `extra-files` rules with paths relative to the package directory. Merged with workspace-level `release.publish.extraFiles` (per-package wins on path collision)."
5052
5113
  },
5053
- "jsrConfigPath": {
5054
- "type": "string",
5055
- "description": "Relative path from the package directory to the JSR manifest (`jsr.json` or `deno.json`) for the `jsr` versionActions. Set automatically by the `jsr()` preset from its `manifestPath` option. Defaults to `\"jsr.json\"`."
5056
- },
5057
- "jsrPublishArgs": {
5058
- "type": "array",
5059
- "items": {
5060
- "type": "string"
5061
- },
5062
- "description": "Extra arguments forwarded verbatim to `jsr publish` for the `jsr` versionActions (the `jsr()` preset wires this from its `publishArgs` / `allowSlowTypes` options). The most common entry is `\"--allow-slow-types\"`, which JSR requires for packages whose public API has types it can't statically infer. `--allow-dirty` is always passed by vis (the version is bumped on disk before publish) and need not be listed here."
5063
- },
5064
5114
  "managed": {
5065
5115
  "type": "boolean",
5066
5116
  "description": "Hard opt-in/out — overrides every other rule."
@@ -5122,7 +5172,7 @@
5122
5172
  },
5123
5173
  "versionActions": {
5124
5174
  "type": "string",
5125
- "description": "Built-in id (`\"npm\"`, `\"native-addon\"`, `\"private\"`, `\"shell\"`, `\"cargo\"`, `\"python\"`, `\"maven\"`, `\"container\"`, `\"jsr\"`) or a path to a custom implementation module."
5175
+ "description": "Built-in id (`\"npm\"`, `\"native-addon\"`, `\"private\"`, `\"shell\"`, `\"cargo\"`, `\"python\"`, `\"maven\"`, `\"container\"`) or a path to a custom implementation module."
5126
5176
  },
5127
5177
  "versionFiles": {
5128
5178
  "type": "array",
@@ -5643,7 +5693,7 @@
5643
5693
  "bun",
5644
5694
  "node"
5645
5695
  ],
5646
- "description": "JS runtimes vis can target today. `\"deno\"` is deferred."
5696
+ "description": "JS runtimes vis can target today."
5647
5697
  },
5648
5698
  "ScopedTasksBlock": {
5649
5699
  "type": "object",
@@ -5794,13 +5844,20 @@
5794
5844
  "type": "string",
5795
5845
  "description": "The executor/command to run"
5796
5846
  },
5847
+ "fingerprintEnv": {
5848
+ "type": "array",
5849
+ "items": {
5850
+ "type": "string"
5851
+ },
5852
+ "description": "Env vars folded into this target's cache key, as names or `*` patterns (`\"VITE_*\"`). In `\"declared\"` mode each match becomes an env input, the same as `env://NAME`; in `\"trace\"` mode it extends {@link TaskRunnerOptions.fingerprintEnvPatterns } for this target."
5853
+ },
5797
5854
  "hashMode": {
5798
5855
  "type": "string",
5799
5856
  "enum": [
5800
5857
  "declared",
5801
5858
  "trace"
5802
5859
  ],
5803
- "description": "How this target's cache key is derived.\n\n- `\"declared\"` (default): the Nx-style path — the hash is built up-front from explicitly declared `inputs` (plus named/global inputs and the lockfile). Deterministic and portable across machines: two runners with the same workspace state produce the same key regardless of OS or syscall surface.\n- `\"trace\"`: the task is run under the file-access tracker (strace on Linux, an fs preload shim elsewhere) and the cache key is derived from the files it actually *read* during execution — no `inputs` declaration required. Mirrors the shipped `{ auto: true }` output capture, but for the input side. Use for compound or opaque commands whose real input set is impractical to enumerate.\n\nOpt-in per target precisely because trace mode trades reproducibility for convenience: the observed read set can differ across runners with different syscall surfaces (a static binary on a host without strace records nothing), so a trace key is **not** guaranteed portable between machines. Leave targets on `\"declared\"` whenever the input set can reasonably be listed.\n\nEquivalent to flipping {@link TaskRunnerOptions.autoFingerprint } on for this one target while every other target stays declared."
5860
+ "description": "How this target's cache key is derived.\n\n- `\"declared\"` (default): the Nx-style path — the hash is built up-front from explicitly declared `inputs` (plus named/global inputs and the lockfile). Deterministic and portable across machines: two runners with the same workspace state produce the same key regardless of OS or syscall surface.\n- `\"trace\"`: the task is run under the file-access tracker (strace or seccomp on Linux; DYLD/IAT interposition on macOS and Windows for directly-executed commands; a Node preload otherwise) and the cache key is derived from the files it actually *read* during execution — no `inputs` declaration required. Mirrors the shipped `{ auto: true }` output capture, but for the input side. Use for compound or opaque commands whose real input set is impractical to enumerate.\n\nOpt-in per target precisely because trace mode trades reproducibility for convenience: the observed read set can differ across runners with different syscall surfaces (a static binary on a host without strace records nothing), so a trace key is **not** guaranteed portable between machines. Leave targets on `\"declared\"` whenever the input set can reasonably be listed.\n\nEquivalent to flipping {@link TaskRunnerOptions.autoFingerprint } on for this one target while every other target stays declared."
5804
5861
  },
5805
5862
  "inputs": {
5806
5863
  "type": "array",
@@ -5937,6 +5994,17 @@
5937
5994
  "type": "boolean",
5938
5995
  "description": "Per-target PTY override. When `true`, every task spawned from this target runs inside a pseudo-terminal (so `isatty()` returns true and the child preserves color / progress UI). When `false`, the workspace-level PTY toggle is suppressed for this target. Useful when most targets are happy with piped stdio but one tool (vitest, prettier, a colorising linter) needs a real TTY, or vice versa.\n\nAbsent means \"follow the workspace default\" — the executor decides based on its own toggles."
5939
5996
  },
5997
+ "splitCompound": {
5998
+ "type": "boolean",
5999
+ "description": "Split the target's command on top-level `&&` into one chained task per segment, each with its own cache key. Segment _n_ folds in the key of segment _n−1_, so changing a later segment re-runs only that segment and later ones, and a failing segment stops the chain. Works in declared and trace mode. A traced segment is tracked on its own command, and its trace key folds in the trace key of the segment before it.\n\nDeclared `outputs` attach to the last segment, so a cache hit on the whole chain restores them. A partial hit does not restore an earlier segment's files, so a later segment that reads a file written by an earlier segment needs that file to be a declared output of its own target. Opt-in. The split is refused, with a diagnostic and the target run whole, when the command contains a construct the splitter does not model (`;`, `||`, subshells, `cd`, `export`, `VAR=…` prefixes, command substitution, …), when an output is `{ auto: true }` (write tracking covers the whole target, not one segment), when it has a `when` condition, or when it is `always`."
6000
+ },
6001
+ "untrackedEnv": {
6002
+ "type": "array",
6003
+ "items": {
6004
+ "type": "string"
6005
+ },
6006
+ "description": "Env vars this target receives but keeps out of its cache key, as names or `*` patterns (`\"CI_*\"`). Applies on top of {@link TaskRunnerOptions.untrackedEnvVars } and wins over `fingerprintEnv`, `autoEnvVars`, framework inference and trace-mode fingerprint patterns. Explicit `env://` inputs and the workspace `envVars` / `globalEnv` lists are not affected."
6007
+ },
5940
6008
  "warningPattern": {
5941
6009
  "anyOf": [
5942
6010
  {
@@ -6427,6 +6495,31 @@
6427
6495
  "description": "How to forward affected files to the task process. Only used when invoked via `vis affected <target>`.",
6428
6496
  "default": false
6429
6497
  },
6498
+ "env": {
6499
+ "type": "object",
6500
+ "properties": {
6501
+ "allow": {
6502
+ "type": "array",
6503
+ "items": {
6504
+ "type": "string"
6505
+ },
6506
+ "description": "Names and `*` wildcard patterns kept from the parent environment in `clean` mode. Ignored under `inherit`. Matching is case-insensitive on Windows, where environment names are case-insensitive."
6507
+ },
6508
+ "mode": {
6509
+ "type": "string",
6510
+ "enum": [
6511
+ "inherit",
6512
+ "clean"
6513
+ ],
6514
+ "description": "Whether the child inherits the parent environment."
6515
+ }
6516
+ },
6517
+ "required": [
6518
+ "mode"
6519
+ ],
6520
+ "additionalProperties": false,
6521
+ "description": "Child-process environment for this target. Overrides the workspace `taskRunner.env`.\n- `mode: \"inherit\"`: the child gets the whole parent environment, even when the workspace is `clean`.\n- `mode: \"clean\"`: the child gets only the allow-listed names, `PATH`, `HOME`, `TERM`, `CI`, the platform essentials and what vis injects (`VIS_TASK_SLOTS`, `VIS_ARG_*`, `envFile` values, service env).\n- `allow`: names and `*` wildcard patterns kept under `clean`. Added to the workspace allow-list when the workspace is also `clean`.\n\nA traced target (`hashMode: \"trace\"`, or a workspace `autoFingerprint`) can be `clean` too: it gets the same environment plus the tracker's own variables, and the tracker then runs without its native backends. Without this option the workspace `taskRunner.env` applies, and that defaults to `inherit`."
6522
+ },
6430
6523
  "envFile": {
6431
6524
  "anyOf": [
6432
6525
  {
@@ -977,17 +977,6 @@
977
977
  },
978
978
  "description": "Per-package `extra-files` rules with paths relative to the package directory. Merged with workspace-level `release.publish.extraFiles` (per-package wins on path collision)."
979
979
  },
980
- "jsrConfigPath": {
981
- "type": "string",
982
- "description": "Relative path from the package directory to the JSR manifest (`jsr.json` or `deno.json`) for the `jsr` versionActions. Set automatically by the `jsr()` preset from its `manifestPath` option. Defaults to `\"jsr.json\"`."
983
- },
984
- "jsrPublishArgs": {
985
- "type": "array",
986
- "items": {
987
- "type": "string"
988
- },
989
- "description": "Extra arguments forwarded verbatim to `jsr publish` for the `jsr` versionActions (the `jsr()` preset wires this from its `publishArgs` / `allowSlowTypes` options). The most common entry is `\"--allow-slow-types\"`, which JSR requires for packages whose public API has types it can't statically infer. `--allow-dirty` is always passed by vis (the version is bumped on disk before publish) and need not be listed here."
990
- },
991
980
  "managed": {
992
981
  "type": "boolean",
993
982
  "description": "Hard opt-in/out — overrides every other rule."
@@ -1049,7 +1038,7 @@
1049
1038
  },
1050
1039
  "versionActions": {
1051
1040
  "type": "string",
1052
- "description": "Built-in id (`\"npm\"`, `\"native-addon\"`, `\"private\"`, `\"shell\"`, `\"cargo\"`, `\"python\"`, `\"maven\"`, `\"container\"`, `\"jsr\"`) or a path to a custom implementation module."
1041
+ "description": "Built-in id (`\"npm\"`, `\"native-addon\"`, `\"private\"`, `\"shell\"`, `\"cargo\"`, `\"python\"`, `\"maven\"`, `\"container\"`) or a path to a custom implementation module."
1053
1042
  },
1054
1043
  "versionFiles": {
1055
1044
  "type": "array",
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: vis
3
- description: Use when the workspace contains a vis.config.ts (or vis.config.js/json) at the repo root, or when the user mentions "vis", "task-runner", or "@visulima/vis". This skill orchestrates the vis MCP server's eight read-only tools to inspect projects, plan task graphs, and diagnose remote-cache rotations.
3
+ description: Use when the workspace contains a vis.config.ts (or vis.config.js/json) at the repo root, or when the user mentions "vis", "task-runner", or "@visulima/vis". This skill orchestrates the vis MCP server's thirteen read-only tools to inspect projects, plan task graphs, lint, and diagnose remote-cache rotations.
4
4
  ---
5
5
 
6
6
  # Working with the `vis` task runner
7
7
 
8
- `vis` is the Visulima monorepo task runner — a Turborepo/Nx-class tool with a remote cache, REAPI gRPC backend, and project graph. When this skill is active you have the **`@visulima/vis-mcp` server** mounted, exposing eight read-only tools. Use them in preference to running `vis` shell commands yourself: the tools give you structured JSON and run faster.
8
+ `vis` is the Visulima monorepo task runner — a Turborepo/Nx-class tool with a remote cache, REAPI gRPC backend, and project graph. When this skill is active you have the **`@visulima/vis-mcp` server** mounted, exposing thirteen read-only tools. Use them in preference to running `vis` shell commands yourself: the tools give you structured JSON and run faster.
9
9
 
10
10
  The MCP server deliberately does NOT execute targets or scaffold templates — Nx-style "agent prepares, human executes". When the user wants to run `<project>:<target>` or `vis generate <template>`, prepare the command (use `list_targets`/`describe_template` to confirm it exists and capture required arguments) and ask the user to run it themselves; afterwards use `get_run_logs` to read the result of any task run.
11
11
 
@@ -18,9 +18,14 @@ The MCP server deliberately does NOT execute targets or scaffold templates — N
18
18
  | `list_targets` | Per-target rows across the workspace, optionally narrowed to a single project |
19
19
  | `list_templates` | Scaffolding templates discovered in `.vis/templates/`, `.moon/templates/`, and `vis.config.ts` `generator.templates` |
20
20
  | `describe_template` | Variable schema, default destination, and description for a single template — required before suggesting a `vis generate` command |
21
- | `get_run_logs` | Most recent run summary from `.vis/`, or a specific `runId`, optionally filtered to one task |
21
+ | `list_runs` | Recorded runs in `.vis/runs/`, newest first — the IDs feed `get_run_logs` and the cache tools |
22
+ | `get_run_logs` | Most recent run summary from `.vis/`, or a specific `runId`, optionally filtered to one task |
22
23
  | `cache_why` | Diff a task's cache hash against the previous run — pinpoints what changed (command, nodes, runtime, implicit deps) |
23
- | `cache_hash` | Recorded hash and per-input hash details for a task |
24
+ | `cache_hash` | Recorded hash and per-input hash details for a task (trace-mode tasks: the tracked files and env instead) |
25
+ | `lint` | Check-only lint across the detected linters, merged findings (never applies fixes) |
26
+ | `fmt` | Check-only formatting: each finding is a file that would change (never writes) |
27
+ | `audit` | Vulnerability audit of installed packages; uses the offline advisory cache when one exists |
28
+ | `advisory_status` | Freshness of the local advisory database — check it before an offline `audit` |
24
29
 
25
30
  ## Workflow patterns
26
31
 
@@ -34,16 +39,23 @@ Default opening move when the user asks about the workspace:
34
39
  ### Plan a build
35
40
 
36
41
  1. `list_targets` (optionally with `project: "@scope/name"`) to see what `build`/`test`/`lint`/etc. targets exist.
37
- 2. Tell the user the exact command (`vis run @scope/name:build`) and let them run it.
38
- 3. Use `get_run_logs` afterwards to inspect status, cache hits, and stderr tails.
42
+ 2. Tell the user the exact command (`vis run @scope/name:build`) and let them run it. `vis run` exits 1 when the target is missing, or when `--filter`, `--query` or `--tag` selects no project; `vis ci` and `vis affected` behave the same. Suggest `--if-present` (exit 0 with a one-line notice) only when an empty selection is acceptable, such as one script shared across repos that don't all define the target. An empty `--affected` set is not an error.
43
+ 3. Use `get_run_logs` afterwards to read each task's `exitCode`, `cacheStatus`, and the run's `stats`.
44
+
45
+ ### Check lint and formatting
46
+
47
+ 1. `lint` and `fmt` are check-only: `lint` returns findings, `fmt` returns the files that would change. `files` narrows either one.
48
+ 2. A clean `lint` does not mean the types check. The `typecheck` adapter (`tsc`) runs only when the workspace sets `lint.adapters.typecheck.enabled`, and then it checks the whole project, not just the listed files.
49
+ 3. Hand the user `vis lint --fix` or `vis fmt` to apply changes.
39
50
 
40
51
  ### Investigate a cache miss
41
52
 
42
53
  When a build that should have been cached re-ran:
43
54
 
44
- 1. `get_run_logs` (no args → latest summary) — surfaces all task statuses for the last run.
45
- 2. For any task with status `success` but `cacheStatus: "miss"`, call `cache_why` with that `taskId`. It diffs hashDetails against the previous run and tells you which input rotated (command string, file content, `implicitDependency`, runtime version, …).
46
- 3. If `cache_why` shows the change but the user wants to see the raw hash inputs, `cache_hash` returns the full per-input breakdown.
55
+ 1. `get_run_logs` (no args → latest summary) — each task carries `exitCode` and `cacheStatus` (`HIT`, `MISS`, `REMOTE_HIT`, `SKIPPED`).
56
+ 2. For a task with `exitCode: 0` and `cacheStatus: "MISS"` that should have hit, call `cache_why` with that `taskId`. For a task with declared inputs it diffs `hashDetails` against the previous run and names the bucket that rotated (`command`, `nodes`, `runtime`, `implicitDeps`). A `hashMode: "trace"` task has no `hashDetails`; read `task.cacheMissReasons` instead. These are `{ type, detail }` entries such as `file-changed`, `env-changed`, or `tracker-changed` (the run used a different tracker than the stored trace). The field is `null` on a hit. `task.hashSource: "declared-fallback"` means the run was keyed on its declared inputs because the tracker saw no workspace access.
57
+ 3. If `cache_why` shows the change but the user wants the raw inputs, `cache_hash` returns the per-input breakdown. For a trace-mode task it returns `trackedFingerprint` (the files, env names, and missing paths the run tracked) instead.
58
+ 4. If `cache_why` shows nothing changed, the result was a hit, and it is still wrong, one possible cause is an env var the command reads that no cache key covers. Ask the user to run `vis doctor`: its Env Coverage section lists those variables per target, with the fixes (`fingerprintEnv`, `autoEnvVars`, or `untrackedEnv`). It is a warning; `vis doctor --exit-code --strict` turns it into a failure.
47
59
 
48
60
  ### Scaffold a new package or component
49
61
 
@@ -76,9 +88,9 @@ User: _"Scaffold a new React button component called PrimaryButton."_
76
88
 
77
89
  ### Diagnose a failed run
78
90
 
79
- 1. `get_run_logs` to see which task(s) failed.
80
- 2. `get_run_logs` with `taskId` set to the failing task — returns just that entry, including the captured stderr tail.
81
- 3. Decide: is it a code bug (read the project's source), a cache poisoning issue (`cache_why`), or environmental (look at the run summary's `runtime` block)?
91
+ 1. `get_run_logs` to see which task(s) failed; `stats.failed` counts them.
92
+ 2. `get_run_logs` with `taskId` set to the failing task — returns just that entry. The summary records the exit code, cache status, and hash, not the task's output, so ask the user for the failing output if you need it.
93
+ 3. Decide: is it a code bug (read the project's source), a cache poisoning issue (`cache_why`), or environmental (the summary's `environment` block gives platform, arch, and Node version)?
82
94
 
83
95
  ## Safety rules
84
96