@visulima/vis 1.0.0-alpha.25 → 1.0.0-alpha.27

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 (85) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/LICENSE.md +19 -152
  3. package/README.md +24 -22
  4. package/dist/bin.js +1 -1
  5. package/dist/binx.js +1 -1
  6. package/dist/config/index.d.ts +176 -16
  7. package/dist/packem_chunks/bin.js +263 -263
  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/config.js +15 -15
  11. package/dist/packem_chunks/handler10.js +1 -1
  12. package/dist/packem_chunks/handler11.js +1 -1
  13. package/dist/packem_chunks/handler12.js +1 -1
  14. package/dist/packem_chunks/handler13.js +1 -1
  15. package/dist/packem_chunks/handler14.js +8 -9
  16. package/dist/packem_chunks/handler15.js +1 -1
  17. package/dist/packem_chunks/handler16.js +1 -1
  18. package/dist/packem_chunks/handler17.js +1 -1
  19. package/dist/packem_chunks/handler18.js +1 -1
  20. package/dist/packem_chunks/handler19.js +1 -1
  21. package/dist/packem_chunks/handler2.js +1 -1
  22. package/dist/packem_chunks/handler20.js +1 -1
  23. package/dist/packem_chunks/handler22.js +1 -1
  24. package/dist/packem_chunks/handler23.js +1 -1
  25. package/dist/packem_chunks/handler27.js +1 -1
  26. package/dist/packem_chunks/handler28.js +1 -1
  27. package/dist/packem_chunks/handler29.js +1 -1
  28. package/dist/packem_chunks/handler30.js +3 -3
  29. package/dist/packem_chunks/handler31.js +2 -2
  30. package/dist/packem_chunks/handler34.js +1 -1
  31. package/dist/packem_chunks/handler35.js +3 -22
  32. package/dist/packem_chunks/handler36.js +21 -60
  33. package/dist/packem_chunks/handler37.js +61 -6
  34. package/dist/packem_chunks/handler38.js +3 -24
  35. package/dist/packem_chunks/handler39.js +6 -153
  36. package/dist/packem_chunks/handler4.js +1 -1
  37. package/dist/packem_chunks/handler40.js +24 -10
  38. package/dist/packem_chunks/handler41.js +153 -25
  39. package/dist/packem_chunks/handler42.js +10 -708
  40. package/dist/packem_chunks/handler43.js +25 -24
  41. package/dist/packem_chunks/handler44.js +659 -273
  42. package/dist/packem_chunks/handler45.js +24 -46
  43. package/dist/packem_chunks/handler46.js +322 -3
  44. package/dist/packem_chunks/handler47.js +48 -27
  45. package/dist/packem_chunks/handler48.js +3 -186
  46. package/dist/packem_chunks/handler49.js +23 -30
  47. package/dist/packem_chunks/handler5.js +6 -6
  48. package/dist/packem_chunks/handler50.js +196 -0
  49. package/dist/packem_chunks/handler51.js +34 -0
  50. package/dist/packem_chunks/handler8.js +1 -1
  51. package/dist/packem_chunks/handler9.js +1 -1
  52. package/dist/packem_chunks/heal-accept.js +1 -1
  53. package/dist/packem_chunks/help-command.js +16 -16
  54. package/dist/packem_chunks/index.js +1 -1
  55. package/dist/packem_chunks/list.js +1 -1
  56. package/dist/packem_chunks/loader.js +1 -1
  57. package/dist/packem_chunks/prune.js +1 -1
  58. package/dist/packem_chunks/status.js +1 -1
  59. package/dist/packem_chunks/sync.js +1 -1
  60. package/dist/packem_chunks/sync2.js +1 -1
  61. package/dist/packem_chunks/tripwire.js +1 -1
  62. package/dist/packem_chunks/verify-lockfile.js +1 -1
  63. package/dist/packem_shared/{advisories-U1QKY_tg.js → advisories-xIOdLbAI.js} +1 -1
  64. package/dist/packem_shared/{cyclonedx-D6F9rAay.js → cyclonedx-B3ILsY74.js} +1 -1
  65. package/dist/packem_shared/{docker-BU-7veP5.js → docker-BynKrOLe.js} +1 -1
  66. package/dist/packem_shared/{index-PexbdLyT.js → index-B_KtN1MB.js} +1 -1
  67. package/dist/packem_shared/{index-D9ZIw4ra.js → index-efSniSRN.js} +1 -1
  68. package/dist/packem_shared/{lifecycle-ChCFTm5Q.js → lifecycle-CJRNbN3x.js} +2 -2
  69. package/dist/packem_shared/{min-release-age-heJgeP7o.js → min-release-age-aEn0x8Vy.js} +1 -1
  70. package/dist/packem_shared/{native-config-sync-BOeuyrBj.js → native-config-sync-DdhTLlKL.js} +1 -1
  71. package/dist/packem_shared/{osv-bloom-CyCDpXBl.js → osv-bloom-BJhlc_I2.js} +2 -2
  72. package/dist/packem_shared/{pm-runner-Cj76BV8q.js → pm-runner-BwX5AL3W.js} +1 -1
  73. package/dist/packem_shared/{provenance-CdvMwB2R.js → provenance-BuiEsWbI.js} +1 -1
  74. package/dist/packem_shared/{resolve-explicit-CRFybyxv.js → resolve-explicit-RgRrUDZv.js} +1 -1
  75. package/dist/packem_shared/{s1ngularity-CiZla5EP.js → s1ngularity-Bs9fUf3q.js} +1 -1
  76. package/dist/packem_shared/{scan-progress-EbvmIh4i.js → scan-progress-DjPT66jy.js} +2 -2
  77. package/dist/packem_shared/{signatures-BsEDWhME.js → signatures-LYMy8OR5.js} +1 -1
  78. package/dist/packem_shared/{typosquats-_7T7U2q2.js → typosquats-znskIR5j.js} +1 -1
  79. package/dist/packem_shared/watch-BSVsZ_1I.js +1 -0
  80. package/dist/packem_shared/watch-loop-DLlMLg_J.js +11 -0
  81. package/index.d.ts +201 -201
  82. package/index.js +751 -567
  83. package/package.json +11 -11
  84. package/schemas/project.schema.json +86 -1
  85. package/schemas/vis-config.schema.json +255 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/vis",
3
- "version": "1.0.0-alpha.25",
3
+ "version": "1.0.0-alpha.27",
4
4
  "description": "A monorepo dev toolkit — task runner, remote caching, security scanning, git hooks, and AI agent integrations — powered by @visulima/task-runner",
5
5
  "keywords": [
6
6
  "build",
@@ -80,8 +80,8 @@
80
80
  "dependencies": {
81
81
  "@visulima/secret-scanner": "1.0.0-alpha.4",
82
82
  "@visulima/tabular": "4.0.0-alpha.12",
83
- "@visulima/task-runner": "1.0.0-alpha.16",
84
- "@visulima/tui": "1.0.0-alpha.20",
83
+ "@visulima/task-runner": "1.0.0-alpha.18",
84
+ "@visulima/tui": "1.0.0-alpha.21",
85
85
  "jiti": "^2.7.0",
86
86
  "module-replacements": "^2.11.0",
87
87
  "module-replacements-codemods": "^1.2.1",
@@ -110,14 +110,14 @@
110
110
  }
111
111
  },
112
112
  "optionalDependencies": {
113
- "@visulima/vis-binding-darwin-arm64": "1.0.0-alpha.25",
114
- "@visulima/vis-binding-darwin-x64": "1.0.0-alpha.25",
115
- "@visulima/vis-binding-linux-arm64-musl": "1.0.0-alpha.25",
116
- "@visulima/vis-binding-linux-arm64-gnu": "1.0.0-alpha.25",
117
- "@visulima/vis-binding-linux-x64-gnu": "1.0.0-alpha.25",
118
- "@visulima/vis-binding-linux-x64-musl": "1.0.0-alpha.25",
119
- "@visulima/vis-binding-win32-arm64-msvc": "1.0.0-alpha.25",
120
- "@visulima/vis-binding-win32-x64-msvc": "1.0.0-alpha.25"
113
+ "@visulima/vis-binding-darwin-arm64": "1.0.0-alpha.27",
114
+ "@visulima/vis-binding-darwin-x64": "1.0.0-alpha.27",
115
+ "@visulima/vis-binding-linux-arm64-gnu": "1.0.0-alpha.27",
116
+ "@visulima/vis-binding-linux-arm64-musl": "1.0.0-alpha.27",
117
+ "@visulima/vis-binding-linux-x64-gnu": "1.0.0-alpha.27",
118
+ "@visulima/vis-binding-win32-arm64-msvc": "1.0.0-alpha.27",
119
+ "@visulima/vis-binding-linux-x64-musl": "1.0.0-alpha.27",
120
+ "@visulima/vis-binding-win32-x64-msvc": "1.0.0-alpha.27"
121
121
  },
122
122
  "engines": {
123
123
  "node": "^22.14.0 || >=24.10.0"
@@ -178,6 +178,10 @@
178
178
  "type": "string",
179
179
  "description": "Workspace-level concurrency group this target opts into. The scheduler caps the *combined* in-flight count of every task whose target carries the same group name to the value declared in {@link TaskRunnerOptions.concurrencyGroups } . Use this when several targets share an external resource (a single Postgres, a developer's Docker daemon, an account-wide deploy lock) so the cap follows the resource, not any single target name.\n\nTargets that name a group not declared in `concurrencyGroups` run uncapped — a typo shouldn't deadlock the graph. Caps don't apply to tasks marked `always: true`; those run in a separate finalisation phase outside the scheduler."
180
180
  },
181
+ "concurrencyWeight": {
182
+ "type": "number",
183
+ "description": "Per-task slot weight against the global `parallel` cap. Defaults to `1`. A task with `concurrencyWeight: 2` consumes two slots; with `parallel: 4` only two such tasks can run concurrently (or one weight-2 plus two weight-1). Use for CPU-pinning tasks — bundlers, `tsc`, native compiles — where the runner shouldn't keep over-subscribing the box just because slots are nominally free.\n\nThe scheduler always lets a single task run even if its weight exceeds the remaining budget; otherwise a heavy task on a `parallel: 1` pool would deadlock. Values `<= 0`, non-finite, or non-integer are ignored (treated as `1`)."
184
+ },
181
185
  "configurations": {
182
186
  "type": "object",
183
187
  "additionalProperties": {
@@ -380,6 +384,10 @@
380
384
  "type": "boolean",
381
385
  "description": "Whether this target supports parallel execution"
382
386
  },
387
+ "pty": {
388
+ "type": "boolean",
389
+ "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."
390
+ },
383
391
  "warningPattern": {
384
392
  "anyOf": [
385
393
  {
@@ -651,9 +659,16 @@
651
659
  },
652
660
  "description": "Alternate names that resolve to this target on the CLI. Useful for shortening long canonical names (`test` ↔ `t`) or for offering migration-friendly aliases when renaming targets. Aliases must be globally unique within the workspace."
653
661
  },
662
+ "arguments": {
663
+ "type": "array",
664
+ "items": {
665
+ "$ref": "#/$defs/TaskArgument"
666
+ },
667
+ "description": "Declarative argument schema for this target. Forwarded CLI args (`vis run <target> -- --flag value`) are validated against it, surfaced by per-task `--help`, and exposed to the command as `VIS_ARG_<NAME>` environment variables."
668
+ },
654
669
  "description": {
655
670
  "type": "string",
656
- "description": "One-line description surfaced by `vis list` and (in future) per-task `--help`. Kept short — longer docs belong in project READMEs or vis.config.ts comments."
671
+ "description": "One-line description surfaced by `vis list` and per-task `--help`. Kept short — longer docs belong in project READMEs or vis.config.ts comments."
657
672
  },
658
673
  "inferred": {
659
674
  "type": "boolean",
@@ -676,6 +691,69 @@
676
691
  "additionalProperties": false,
677
692
  "description": "An extended target configuration that adds the vis-specific options on top of task-runner's `TargetConfiguration`."
678
693
  },
694
+ "TaskArgument": {
695
+ "type": "object",
696
+ "properties": {
697
+ "alias": {
698
+ "type": "string",
699
+ "description": "Short single-character alias (e.g. `r` for `--reporter`, used as `-r`). Must be exactly one character — enforced at run time by {@link validateArgumentSchema } ."
700
+ },
701
+ "choices": {
702
+ "type": "array",
703
+ "items": {
704
+ "type": "string"
705
+ },
706
+ "description": "Allowed values when {@link TaskArgument.type } is `\"enum\"`. Must be non-empty (and is required) for `enum` — enforced at run time by {@link validateArgumentSchema } ."
707
+ },
708
+ "default": {
709
+ "$ref": "#/$defs/TaskArgumentValue",
710
+ "description": "Value applied when the argument is omitted. Skips the required check."
711
+ },
712
+ "description": {
713
+ "type": "string",
714
+ "description": "One-line help text surfaced by per-task `--help`."
715
+ },
716
+ "name": {
717
+ "type": "string",
718
+ "description": "Canonical name, without the leading `--` (kebab-case by convention). Must start with a letter and contain only letters, digits, `-`, `_` — enforced at run time by {@link validateArgumentSchema } ."
719
+ },
720
+ "positional": {
721
+ "type": "boolean",
722
+ "description": "Consume the value from the next free positional argument instead of a `--flag`. Positional args are filled in declaration order."
723
+ },
724
+ "required": {
725
+ "type": "boolean",
726
+ "description": "Fail the task when the argument is absent and has no `default`."
727
+ },
728
+ "type": {
729
+ "$ref": "#/$defs/TaskArgumentType",
730
+ "description": "Value type for coercion + validation. Defaults to `\"string\"`."
731
+ }
732
+ },
733
+ "required": [
734
+ "name"
735
+ ],
736
+ "additionalProperties": false,
737
+ "description": "A single declared argument for a task target."
738
+ },
739
+ "TaskArgumentValue": {
740
+ "type": [
741
+ "boolean",
742
+ "number",
743
+ "string"
744
+ ],
745
+ "description": "A coerced task-argument value."
746
+ },
747
+ "TaskArgumentType": {
748
+ "type": "string",
749
+ "enum": [
750
+ "boolean",
751
+ "enum",
752
+ "number",
753
+ "string"
754
+ ],
755
+ "description": "Value type a {@link TaskArgument } coerces to and validates against."
756
+ },
679
757
  "VisTargetOptions": {
680
758
  "type": "object",
681
759
  "properties": {
@@ -785,6 +863,13 @@
785
863
  "type": "string",
786
864
  "description": "Per-target shell override. When set, the command runs through this shell instead of the platform default."
787
865
  },
866
+ "shellArgs": {
867
+ "type": "array",
868
+ "items": {
869
+ "type": "string"
870
+ },
871
+ "description": "Arguments passed to the per-target shell/interpreter before the command string. Defaults to `[\"-c\"]` (POSIX shells, pwsh). Set this to run the command under an interpreter that uses a different flag — e.g. `shell: \"node\", shellArgs: [\"-e\"]` runs the command as inline JS (\"script mode\"), or `shellArgs: [\"-lc\"]` for a login shell. Only applies when `shell`/`unixShell`/`windowsShell` resolves to a custom shell.\n\nMust be non-empty when set — an empty array would drop the interpreter flag entirely, so the runtime falls back to `-c` defensively."
872
+ },
788
873
  "strictEnv": {
789
874
  "type": "boolean",
790
875
  "description": "Override the workspace `strictEnv` setting for this target. When truthy, the target fails if its command references an env var that resolves to neither the task's effective env nor `process.env`. When `false`, the target opts out of a workspace `strictEnv: true` (e.g. for a one-off command that legitimately tolerates an unset variable)."
@@ -36,11 +36,6 @@
36
36
  "$ref": "#/$defs/CodeownersConfig",
37
37
  "description": "Code ownership configuration. Controls how `vis sync codeowners` renders the generated CODEOWNERS file."
38
38
  },
39
- "defaultBase": {
40
- "type": "string",
41
- "description": "Default base branch used by `vis affected`, `vis ci`, and `vis run --affected` when no explicit `--base` is passed and no CI smart-resolver fires.\n\nResolved as `origin/<defaultBase>` against the local clone; should be a branch name (not a fully-qualified ref) such as `main`, `master`, or `trunk`. Falls back to `main` when omitted.\n\nMigrated automatically from `nx.json#affected.defaultBase` / `nx.json#defaultBase` by `vis migrate nx`.",
42
- "default": "main"
43
- },
44
39
  "constraints": {
45
40
  "type": "object",
46
41
  "properties": {
@@ -176,6 +171,11 @@
176
171
  "additionalProperties": false,
177
172
  "description": "Configuration for the `vis create` scaffolding command. Controls template downloads (via giget), default options, and post-creation behavior."
178
173
  },
174
+ "defaultBase": {
175
+ "type": "string",
176
+ "description": "Default base branch used by `vis affected`, `vis ci`, and `vis run --affected` when no explicit `--base` is passed and no CI smart-resolver fires.\n\nResolved as `origin/&lt;defaultBase>` against the local clone; should be a branch name (not a fully-qualified ref) such as `main`, `master`, or `trunk`. Falls back to `main` when omitted.\n\nMigrated automatically from `nx.json#affected.defaultBase` / `nx.json#defaultBase` by `vis migrate nx`.",
177
+ "default": "main"
178
+ },
179
179
  "editorconfig": {
180
180
  "type": "boolean",
181
181
  "description": "Discover `.editorconfig` for indent / line-ending defaults during file transformations (sort-package-json, migrate, hook, pm overrides, workspace catalog rewrites). Per-command flags can still override.",
@@ -205,6 +205,52 @@
205
205
  },
206
206
  "description": "Named file-group patterns, reusable from target `inputs` via the `@filegroup:&lt;name>` token. File groups are resolved relative to each project root at discovery time."
207
207
  },
208
+ "fmt": {
209
+ "type": "object",
210
+ "properties": {
211
+ "adapters": {
212
+ "type": "object",
213
+ "properties": {
214
+ "biome": {
215
+ "$ref": "#/$defs/LintFmtAdapterOverride"
216
+ },
217
+ "deno-fmt": {
218
+ "$ref": "#/$defs/LintFmtAdapterOverride"
219
+ },
220
+ "dprint": {
221
+ "$ref": "#/$defs/LintFmtAdapterOverride"
222
+ },
223
+ "oxfmt": {
224
+ "$ref": "#/$defs/LintFmtAdapterOverride"
225
+ },
226
+ "prettier": {
227
+ "$ref": "#/$defs/LintFmtAdapterOverride"
228
+ },
229
+ "ruff-fmt": {
230
+ "$ref": "#/$defs/LintFmtAdapterOverride"
231
+ }
232
+ },
233
+ "additionalProperties": false,
234
+ "description": "Per-adapter overrides. Keyed by `AdapterId`. Set `enabled: false` to skip an adapter even when detected, or `extraArgs` to append flags verbatim."
235
+ },
236
+ "extensionOverrides": {
237
+ "type": "object",
238
+ "additionalProperties": {
239
+ "$ref": "#/$defs/FmtAdapterId"
240
+ },
241
+ "description": "Pin a file extension (without the leading dot) to a specific adapter, overriding the registry's \"first detected adapter wins\" routing. Use to e.g. send `.md` to `dprint` even when both prettier and dprint are present."
242
+ },
243
+ "order": {
244
+ "type": "array",
245
+ "items": {
246
+ "$ref": "#/$defs/FmtAdapterId"
247
+ },
248
+ "description": "Override the adapter precedence order. Adapters omitted from this list still run (appended at the end in registry order), but those listed earlier get priority for extension routing."
249
+ }
250
+ },
251
+ "additionalProperties": false,
252
+ "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."
253
+ },
208
254
  "generator": {
209
255
  "type": "object",
210
256
  "properties": {
@@ -276,6 +322,51 @@
276
322
  "additionalProperties": false,
277
323
  "description": "Installer backend selection for `vis install` / `vis add` / `vis remove` / `vis update` / `vis ci`.\n\nLets users opt into [aube](https://github.com/endevco/aube) — a Rust-native package manager that reads/writes pnpm/npm/yarn/bun lockfiles in place — as the default installer, while keeping a single switch to fall back to the conventional PM detected from the lockfile.\n\nResolution precedence (highest first): 1. CLI flag (`--installer &lt;name>` / `--no-aube`) 2. Env var `VIS_INSTALLER` 3. This config field 4. Auto-detect (the default)\n\nAube must be installed separately — `vis` does not bundle it. Install via npm (`@endevco/aube`), `mise use -g aube`, or `brew install endevco/tap/aube`."
278
324
  },
325
+ "lint": {
326
+ "type": "object",
327
+ "properties": {
328
+ "adapters": {
329
+ "type": "object",
330
+ "properties": {
331
+ "biome": {
332
+ "$ref": "#/$defs/LintFmtAdapterOverride"
333
+ },
334
+ "deno-lint": {
335
+ "$ref": "#/$defs/LintFmtAdapterOverride"
336
+ },
337
+ "eslint": {
338
+ "$ref": "#/$defs/LintFmtAdapterOverride"
339
+ },
340
+ "markdownlint": {
341
+ "$ref": "#/$defs/LintFmtAdapterOverride"
342
+ },
343
+ "oxlint": {
344
+ "$ref": "#/$defs/LintFmtAdapterOverride"
345
+ },
346
+ "ruff-check": {
347
+ "$ref": "#/$defs/LintFmtAdapterOverride"
348
+ },
349
+ "shellcheck": {
350
+ "$ref": "#/$defs/LintFmtAdapterOverride"
351
+ },
352
+ "stylelint": {
353
+ "$ref": "#/$defs/LintFmtAdapterOverride"
354
+ }
355
+ },
356
+ "additionalProperties": false,
357
+ "description": "Per-adapter overrides. Keyed by `AdapterId`. Set `enabled: false` to skip an adapter even when detected, or `extraArgs` to append flags verbatim."
358
+ },
359
+ "order": {
360
+ "type": "array",
361
+ "items": {
362
+ "$ref": "#/$defs/LintAdapterId"
363
+ },
364
+ "description": "Override the adapter precedence order. Adapters omitted from this list still run (appended at the end in registry order) unless explicitly disabled under `adapters[id].enabled`."
365
+ }
366
+ },
367
+ "additionalProperties": false,
368
+ "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."
369
+ },
279
370
  "mcpPromote": {
280
371
  "type": "object",
281
372
  "properties": {
@@ -1823,6 +1914,11 @@
1823
1914
  "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.",
1824
1915
  "default": false
1825
1916
  },
1917
+ "bail": {
1918
+ "type": "boolean",
1919
+ "description": "Failure-propagation policy.\n\n- `false` (default) — when a task fails, its transitive dependents are marked `skipped`. Tasks not downstream of the failure still run. Prevents cascade failures from running a dependent on a missing `dist/` produced by the failed dep.\n- `true` — fail-fast. On the first failure every not-yet-started task is marked `skipped`; in-flight tasks finish naturally.",
1920
+ "default": false
1921
+ },
1826
1922
  "cacheDiagnostics": {
1827
1923
  "type": "boolean",
1828
1924
  "description": "Whether to show cache miss diagnostics (why a cache miss occurred).",
@@ -2241,6 +2337,10 @@
2241
2337
  "type": "string",
2242
2338
  "description": "Workspace-level concurrency group this target opts into. The scheduler caps the *combined* in-flight count of every task whose target carries the same group name to the value declared in {@link TaskRunnerOptions.concurrencyGroups } . Use this when several targets share an external resource (a single Postgres, a developer's Docker daemon, an account-wide deploy lock) so the cap follows the resource, not any single target name.\n\nTargets that name a group not declared in `concurrencyGroups` run uncapped — a typo shouldn't deadlock the graph. Caps don't apply to tasks marked `always: true`; those run in a separate finalisation phase outside the scheduler."
2243
2339
  },
2340
+ "concurrencyWeight": {
2341
+ "type": "number",
2342
+ "description": "Per-task slot weight against the global `parallel` cap. Defaults to `1`. A task with `concurrencyWeight: 2` consumes two slots; with `parallel: 4` only two such tasks can run concurrently (or one weight-2 plus two weight-1). Use for CPU-pinning tasks — bundlers, `tsc`, native compiles — where the runner shouldn't keep over-subscribing the box just because slots are nominally free.\n\nThe scheduler always lets a single task run even if its weight exceeds the remaining budget; otherwise a heavy task on a `parallel: 1` pool would deadlock. Values `&lt;= 0`, non-finite, or non-integer are ignored (treated as `1`)."
2343
+ },
2244
2344
  "configurations": {
2245
2345
  "type": "object",
2246
2346
  "additionalProperties": {
@@ -2448,6 +2548,10 @@
2448
2548
  "type": "boolean",
2449
2549
  "description": "Whether this target supports parallel execution"
2450
2550
  },
2551
+ "pty": {
2552
+ "type": "boolean",
2553
+ "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."
2554
+ },
2451
2555
  "warningPattern": {
2452
2556
  "anyOf": [
2453
2557
  {
@@ -2740,9 +2844,16 @@
2740
2844
  },
2741
2845
  "description": "Alternate names that resolve to this target on the CLI. Useful for shortening long canonical names (`test` ↔ `t`) or for offering migration-friendly aliases when renaming targets. Aliases must be globally unique within the workspace."
2742
2846
  },
2847
+ "arguments": {
2848
+ "type": "array",
2849
+ "items": {
2850
+ "$ref": "#/$defs/TaskArgument"
2851
+ },
2852
+ "description": "Declarative argument schema for this target. Forwarded CLI args (`vis run &lt;target> -- --flag value`) are validated against it, surfaced by per-task `--help`, and exposed to the command as `VIS_ARG_&lt;NAME>` environment variables."
2853
+ },
2743
2854
  "description": {
2744
2855
  "type": "string",
2745
- "description": "One-line description surfaced by `vis list` and (in future) per-task `--help`. Kept short — longer docs belong in project READMEs or vis.config.ts comments."
2856
+ "description": "One-line description surfaced by `vis list` and per-task `--help`. Kept short — longer docs belong in project READMEs or vis.config.ts comments."
2746
2857
  },
2747
2858
  "inferred": {
2748
2859
  "type": "boolean",
@@ -2796,6 +2907,10 @@
2796
2907
  "type": "string",
2797
2908
  "description": "Workspace-level concurrency group this target opts into. The scheduler caps the *combined* in-flight count of every task whose target carries the same group name to the value declared in {@link TaskRunnerOptions.concurrencyGroups } . Use this when several targets share an external resource (a single Postgres, a developer's Docker daemon, an account-wide deploy lock) so the cap follows the resource, not any single target name.\n\nTargets that name a group not declared in `concurrencyGroups` run uncapped — a typo shouldn't deadlock the graph. Caps don't apply to tasks marked `always: true`; those run in a separate finalisation phase outside the scheduler."
2798
2909
  },
2910
+ "concurrencyWeight": {
2911
+ "type": "number",
2912
+ "description": "Per-task slot weight against the global `parallel` cap. Defaults to `1`. A task with `concurrencyWeight: 2` consumes two slots; with `parallel: 4` only two such tasks can run concurrently (or one weight-2 plus two weight-1). Use for CPU-pinning tasks — bundlers, `tsc`, native compiles — where the runner shouldn't keep over-subscribing the box just because slots are nominally free.\n\nThe scheduler always lets a single task run even if its weight exceeds the remaining budget; otherwise a heavy task on a `parallel: 1` pool would deadlock. Values `&lt;= 0`, non-finite, or non-integer are ignored (treated as `1`)."
2913
+ },
2799
2914
  "configurations": {
2800
2915
  "type": "object",
2801
2916
  "additionalProperties": {
@@ -2998,6 +3113,10 @@
2998
3113
  "type": "boolean",
2999
3114
  "description": "Whether this target supports parallel execution"
3000
3115
  },
3116
+ "pty": {
3117
+ "type": "boolean",
3118
+ "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."
3119
+ },
3001
3120
  "warningPattern": {
3002
3121
  "anyOf": [
3003
3122
  {
@@ -3565,6 +3684,50 @@
3565
3684
  ],
3566
3685
  "description": "Recognised input sources for the codeowners aggregator.\n\n- `project-json` — owners declared on each project's `project.json`. Canonical source; takes precedence over the other two on path conflicts.\n- `nested-codeowners` — `CODEOWNERS` files placed at arbitrary depth in the workspace tree (excluding the generated root file).\n- `package-json-maintainers` — fallback that reads each project's `package.json#maintainers` and emits one entry per project root for projects with no `project.json owners`. GitHub handles are extracted from each maintainer's `url` (e.g. `https://github.com/&lt;handle&gt;`)."
3567
3686
  },
3687
+ "LintFmtAdapterOverride": {
3688
+ "type": "object",
3689
+ "properties": {
3690
+ "enabled": {
3691
+ "type": "boolean",
3692
+ "description": "Set to `false` to skip this adapter even when its config file or package.json entry is detected. Defaults to `true` (run when detected)."
3693
+ },
3694
+ "extraArgs": {
3695
+ "type": "array",
3696
+ "items": {
3697
+ "type": "string"
3698
+ },
3699
+ "description": "Extra arguments appended verbatim to every invocation of this adapter. Useful for tool-specific flags vis doesn't expose directly (e.g. `eslint --rulesdir`)."
3700
+ }
3701
+ },
3702
+ "additionalProperties": false,
3703
+ "description": "Per-adapter override applied by `vis lint` / `vis fmt`. Keyed by adapter id under `lint.adapters` / `fmt.adapters`. Every field is optional — set only what you need to change."
3704
+ },
3705
+ "FmtAdapterId": {
3706
+ "type": "string",
3707
+ "enum": [
3708
+ "biome",
3709
+ "deno-fmt",
3710
+ "dprint",
3711
+ "oxfmt",
3712
+ "prettier",
3713
+ "ruff-fmt"
3714
+ ],
3715
+ "description": "Adapter IDs that can format (adapter `kind` is `\"fmt\"` or `\"both\"`)."
3716
+ },
3717
+ "LintAdapterId": {
3718
+ "type": "string",
3719
+ "enum": [
3720
+ "biome",
3721
+ "deno-lint",
3722
+ "eslint",
3723
+ "markdownlint",
3724
+ "oxlint",
3725
+ "ruff-check",
3726
+ "shellcheck",
3727
+ "stylelint"
3728
+ ],
3729
+ "description": "Adapter IDs that can lint (adapter `kind` is `\"lint\"` or `\"both\"`)."
3730
+ },
3568
3731
  "VisPlugin": {
3569
3732
  "type": "object",
3570
3733
  "properties": {
@@ -3769,9 +3932,16 @@
3769
3932
  },
3770
3933
  "description": "Alternate names that resolve to this target on the CLI. Useful for shortening long canonical names (`test` ↔ `t`) or for offering migration-friendly aliases when renaming targets. Aliases must be globally unique within the workspace."
3771
3934
  },
3935
+ "arguments": {
3936
+ "type": "array",
3937
+ "items": {
3938
+ "$ref": "#/$defs/TaskArgument"
3939
+ },
3940
+ "description": "Declarative argument schema for this target. Forwarded CLI args (`vis run &lt;target> -- --flag value`) are validated against it, surfaced by per-task `--help`, and exposed to the command as `VIS_ARG_&lt;NAME>` environment variables."
3941
+ },
3772
3942
  "description": {
3773
3943
  "type": "string",
3774
- "description": "One-line description surfaced by `vis list` and (in future) per-task `--help`. Kept short — longer docs belong in project READMEs or vis.config.ts comments."
3944
+ "description": "One-line description surfaced by `vis list` and per-task `--help`. Kept short — longer docs belong in project READMEs or vis.config.ts comments."
3775
3945
  },
3776
3946
  "inferred": {
3777
3947
  "type": "boolean",
@@ -3825,6 +3995,10 @@
3825
3995
  "type": "string",
3826
3996
  "description": "Workspace-level concurrency group this target opts into. The scheduler caps the *combined* in-flight count of every task whose target carries the same group name to the value declared in {@link TaskRunnerOptions.concurrencyGroups } . Use this when several targets share an external resource (a single Postgres, a developer's Docker daemon, an account-wide deploy lock) so the cap follows the resource, not any single target name.\n\nTargets that name a group not declared in `concurrencyGroups` run uncapped — a typo shouldn't deadlock the graph. Caps don't apply to tasks marked `always: true`; those run in a separate finalisation phase outside the scheduler."
3827
3997
  },
3998
+ "concurrencyWeight": {
3999
+ "type": "number",
4000
+ "description": "Per-task slot weight against the global `parallel` cap. Defaults to `1`. A task with `concurrencyWeight: 2` consumes two slots; with `parallel: 4` only two such tasks can run concurrently (or one weight-2 plus two weight-1). Use for CPU-pinning tasks — bundlers, `tsc`, native compiles — where the runner shouldn't keep over-subscribing the box just because slots are nominally free.\n\nThe scheduler always lets a single task run even if its weight exceeds the remaining budget; otherwise a heavy task on a `parallel: 1` pool would deadlock. Values `&lt;= 0`, non-finite, or non-integer are ignored (treated as `1`)."
4001
+ },
3828
4002
  "configurations": {
3829
4003
  "type": "object",
3830
4004
  "additionalProperties": {
@@ -4027,6 +4201,10 @@
4027
4201
  "type": "boolean",
4028
4202
  "description": "Whether this target supports parallel execution"
4029
4203
  },
4204
+ "pty": {
4205
+ "type": "boolean",
4206
+ "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."
4207
+ },
4030
4208
  "warningPattern": {
4031
4209
  "anyOf": [
4032
4210
  {
@@ -4440,6 +4618,69 @@
4440
4618
  "additionalProperties": false,
4441
4619
  "description": "A predicate used by {@link VisConfig.scopedTasks } . All listed constraints must match for the block to apply."
4442
4620
  },
4621
+ "TaskArgument": {
4622
+ "type": "object",
4623
+ "properties": {
4624
+ "alias": {
4625
+ "type": "string",
4626
+ "description": "Short single-character alias (e.g. `r` for `--reporter`, used as `-r`). Must be exactly one character — enforced at run time by {@link validateArgumentSchema } ."
4627
+ },
4628
+ "choices": {
4629
+ "type": "array",
4630
+ "items": {
4631
+ "type": "string"
4632
+ },
4633
+ "description": "Allowed values when {@link TaskArgument.type } is `\"enum\"`. Must be non-empty (and is required) for `enum` — enforced at run time by {@link validateArgumentSchema } ."
4634
+ },
4635
+ "default": {
4636
+ "$ref": "#/$defs/TaskArgumentValue",
4637
+ "description": "Value applied when the argument is omitted. Skips the required check."
4638
+ },
4639
+ "description": {
4640
+ "type": "string",
4641
+ "description": "One-line help text surfaced by per-task `--help`."
4642
+ },
4643
+ "name": {
4644
+ "type": "string",
4645
+ "description": "Canonical name, without the leading `--` (kebab-case by convention). Must start with a letter and contain only letters, digits, `-`, `_` — enforced at run time by {@link validateArgumentSchema } ."
4646
+ },
4647
+ "positional": {
4648
+ "type": "boolean",
4649
+ "description": "Consume the value from the next free positional argument instead of a `--flag`. Positional args are filled in declaration order."
4650
+ },
4651
+ "required": {
4652
+ "type": "boolean",
4653
+ "description": "Fail the task when the argument is absent and has no `default`."
4654
+ },
4655
+ "type": {
4656
+ "$ref": "#/$defs/TaskArgumentType",
4657
+ "description": "Value type for coercion + validation. Defaults to `\"string\"`."
4658
+ }
4659
+ },
4660
+ "required": [
4661
+ "name"
4662
+ ],
4663
+ "additionalProperties": false,
4664
+ "description": "A single declared argument for a task target."
4665
+ },
4666
+ "TaskArgumentValue": {
4667
+ "type": [
4668
+ "boolean",
4669
+ "number",
4670
+ "string"
4671
+ ],
4672
+ "description": "A coerced task-argument value."
4673
+ },
4674
+ "TaskArgumentType": {
4675
+ "type": "string",
4676
+ "enum": [
4677
+ "boolean",
4678
+ "enum",
4679
+ "number",
4680
+ "string"
4681
+ ],
4682
+ "description": "Value type a {@link TaskArgument } coerces to and validates against."
4683
+ },
4443
4684
  "VisTargetOptions": {
4444
4685
  "type": "object",
4445
4686
  "properties": {
@@ -4549,6 +4790,13 @@
4549
4790
  "type": "string",
4550
4791
  "description": "Per-target shell override. When set, the command runs through this shell instead of the platform default."
4551
4792
  },
4793
+ "shellArgs": {
4794
+ "type": "array",
4795
+ "items": {
4796
+ "type": "string"
4797
+ },
4798
+ "description": "Arguments passed to the per-target shell/interpreter before the command string. Defaults to `[\"-c\"]` (POSIX shells, pwsh). Set this to run the command under an interpreter that uses a different flag — e.g. `shell: \"node\", shellArgs: [\"-e\"]` runs the command as inline JS (\"script mode\"), or `shellArgs: [\"-lc\"]` for a login shell. Only applies when `shell`/`unixShell`/`windowsShell` resolves to a custom shell.\n\nMust be non-empty when set — an empty array would drop the interpreter flag entirely, so the runtime falls back to `-c` defensively."
4799
+ },
4552
4800
  "strictEnv": {
4553
4801
  "type": "boolean",
4554
4802
  "description": "Override the workspace `strictEnv` setting for this target. When truthy, the target fails if its command references an env var that resolves to neither the task's effective env nor `process.env`. When `false`, the target opts out of a workspace `strictEnv: true` (e.g. for a one-off command that legitimately tolerates an unset variable)."