arashi 1.31.0 → 1.32.1

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.
package/README.md CHANGED
@@ -8,6 +8,8 @@ Arashi is a Git worktree manager for meta-repositories.
8
8
 
9
9
  It keeps related repositories aligned while you work on a feature branch across a shared workspace.
10
10
 
11
+ Arashi makes a polyrepo work like a monorepo during development, while every repository keeps its own history, CI, and pull requests.
12
+
11
13
  [Documentation](https://arashi.haphazard.dev)
12
14
 
13
15
  ## Installation
@@ -33,13 +35,13 @@ curl -fsSL https://arashi.haphazard.dev/install | ARASHI_VERSION=1.4.0 bash
33
35
  Verify install:
34
36
 
35
37
  ```bash
36
- arashi --version
38
+ aw --version
37
39
  ```
38
40
 
39
- By default, the installer places `arashi` in `~/.arashi/bin`, adds that path to your shell config, and in interactive installs offers to enable shell integration for `arashi switch --cd`.
40
- Supported installations provide both canonical `arashi` and the first-class `aw` shorthand (“Arashi Workspace”). Both run the same implementation; product names, configuration, environment variables, help, and documentation remain canonical `arashi`.
41
+ By default, the installer places `arashi` in `~/.arashi/bin`, adds that path to your shell config, and in interactive installs offers to enable shell integration for `aw switch --cd`.
42
+ Use `aw` for documented workflows. The `arashi` executable remains supported for existing scripts and workflows, and both names run the same implementation. Product names, configuration, environment variables, packages, and native binaries retain their established Arashi names.
41
43
 
42
- The installer transaction verifies identical, non-empty `arashi --version` and `aw --version` output before declaring success.
44
+ The installer transaction verifies that both executable entrypoints report the same non-empty version before declaring success.
43
45
 
44
46
  If curl installation fails, or if the smoke test reports a bad release artifact, use npm installation below or the manual release instructions in [`docs/INSTALLATION.md`](./docs/INSTALLATION.md).
45
47
 
@@ -51,7 +53,7 @@ PowerShell is the canonical Windows installer:
51
53
  powershell -c "irm https://arashi.haphazard.dev/install.ps1 | iex"
52
54
  ```
53
55
 
54
- It verifies and installs one `arashi.bin.exe` plus `arashi`/`aw` wrappers for Git Bash, `arashi.ps1`/`aw.ps1`, and `arashi.bat`/`aw.bat` from the same release. The default directory is `%USERPROFILE%\.arashi\bin`; the installer adds it to the persistent user PATH. It does not create or modify `.bashrc` or another shell profile. Open a new Git Bash window before running `arashi --version` or `aw --version` so it inherits the PATH change.
56
+ It verifies and installs one `arashi.bin.exe` plus `arashi`/`aw` wrappers for Git Bash, `arashi.ps1`/`aw.ps1`, and `arashi.bat`/`aw.bat` from the same release. The default directory is `%USERPROFILE%\.arashi\bin`; the installer adds it to the persistent user PATH. It does not create or modify `.bashrc` or another shell profile. Open a new Git Bash window before verifying the installed version so it inherits the PATH change.
55
57
 
56
58
  ### Option 3: Install with npm
57
59
 
@@ -64,23 +66,23 @@ The npm package is script-free: it does not require package-manager lifecycle sc
64
66
  To preinstall the binary explicitly, run:
65
67
 
66
68
  ```bash
67
- arashi install
69
+ aw install
68
70
  ```
69
71
 
70
72
  To check for package updates or refresh the matching platform binary, run:
71
73
 
72
74
  ```bash
73
- arashi update --check
74
- arashi update --dry-run
75
- arashi update --yes
75
+ aw update --check
76
+ aw update --dry-run
77
+ aw update --yes
76
78
  ```
77
79
 
78
- `arashi update` can update npm-managed installs when it can confidently detect the package manager, including npm, pnpm, Yarn, Bun, and Vite+ (`vp update -g arashi`). For official direct-installer installs, `arashi update --yes` reruns the platform installer against the current binary directory: the POSIX curl installer on macOS/Linux and a deferred PowerShell installer on Windows after the current Arashi process exits.
80
+ `aw update` can update npm-managed installs when it can confidently detect the package manager, including npm, pnpm, Yarn, Bun, and Vite+ (`vp update -g arashi`). For official direct-installer installs, `aw update --yes` reruns the platform installer against the current binary directory: the POSIX curl installer on macOS/Linux and a deferred PowerShell installer on Windows after the current Arashi process exits.
79
81
 
80
82
  Verify install:
81
83
 
82
84
  ```bash
83
- arashi --version
85
+ aw --version
84
86
  ```
85
87
 
86
88
  If npm is unavailable or binary installation fails, use the curl installer command above or the manual release instructions in [`docs/INSTALLATION.md`](./docs/INSTALLATION.md).
@@ -133,58 +135,60 @@ pnpm run build
133
135
 
134
136
  Arashi currently provides these commands:
135
137
 
136
- - `arashi init`
137
- - [`arashi init --zero-config`](docs/standalone.md) for a single repository with `.worktrees/<branch>` paths and no persisted Arashi configuration
138
- - `arashi install`
139
- - `arashi update [--check] [--dry-run] [--yes]`
140
- - `arashi add <git-url>`
141
- - `arashi clone [--all]`
142
- - `arashi create <branch> [--base <branch>] [--tab] [--tmux|--sesh|--herdr]`
143
- - `arashi list`
144
- - `arashi status`
145
- - `arashi remove <branch|path>`
146
- - `arashi prune [--dry-run]` - clean stale Git worktree metadata
147
- - `arashi switch [filter] [--repos|--all] [--tab] [--cd|--launch] [--tmux|--sesh|--herdr] [--ignore-configured-launcher]`
148
- - `arashi completion <bash|zsh|fish>`
149
- - `arashi shell init <bash|zsh|fish>`
150
- - `arashi shell install`
151
- - `arashi pull`
152
- - `arashi push [--set-upstream] [--dry-run] [--only <repo>] [--json]`
153
- - `arashi sync`
154
- - `arashi setup [--only <repo>] [--verbose]`
138
+ - `aw init`
139
+ - [`aw init --zero-config`](docs/standalone.md) for a single repository with `.worktrees/<branch>` paths and no persisted Arashi configuration
140
+ - `aw install`
141
+ - `aw update [--check] [--dry-run] [--yes]`
142
+ - `aw add <git-url>`
143
+ - `aw clone [--all] [--base <branch>] [--repo-base <repository=branch>]`
144
+ - `aw create <branch> [--base <branch>] [--repo-base <repository=branch>] [--tab] [--tmux|--sesh|--herdr]`
145
+ - `aw list`
146
+ - `aw status`
147
+ - `aw remove <branch|path>`
148
+ - `aw prune [--dry-run]` - clean stale Git worktree metadata
149
+ - `aw switch [filter] [--repos|--all] [--tab] [--cd|--launch] [--tmux|--sesh|--herdr] [--ignore-configured-launcher]`
150
+ - `aw completion <bash|zsh|fish>`
151
+ - `aw shell init <bash|zsh|fish>`
152
+ - `aw shell install`
153
+ - `aw pull`
154
+ - `aw push [--set-upstream] [--dry-run] [--only <repo>] [--json]`
155
+ - `aw sync`
156
+ - `aw setup [--only <repo>] [--verbose]`
155
157
 
156
158
  ## Quick Example
157
159
 
158
160
  ```bash
159
- arashi init # repository-local ignore rules (default)
160
- arashi init --ignore-scope tracked # opt in to a shared .gitignore block
161
- arashi add git@github.com:your-org/frontend.git
162
- arashi add git@github.com:your-org/backend.git
163
- arashi create feature-auth-refresh
164
- arashi create feature-auth-refresh --base feature/auth
165
- arashi create feature-auth-refresh --launch
166
- arashi create feature-auth-refresh --tmux
167
- arashi create feature-auth-refresh --herdr
168
- arashi create feature-auth-refresh --tab
169
- arashi create feature-auth-refresh --no-launch
170
- arashi shell install
171
- arashi status
172
- arashi switch feature-auth-refresh # parent repo worktrees
173
- arashi switch --repos feature-auth-refresh # child repo worktrees in current workspace
174
- arashi switch --all feature-auth-refresh # all repos
175
- arashi switch --repos docs # repo-name matching in child repos
176
- arashi switch --cd feature-auth-refresh # parent-shell cd when shell integration is active
177
- arashi switch --launch feature-auth-refresh # force launch while preserving a configured launcher
178
- arashi switch --tmux feature-auth-refresh # force a new plain tmux window
179
- arashi switch --herdr feature-auth-refresh # open or focus a persistent Herdr workspace
180
- arashi switch --tab feature-auth-refresh # request a true tab or managed equivalent
181
- arashi switch --ignore-configured-launcher # bypass configured sesh/Herdr mode once
182
- arashi switch --launch --ignore-configured-launcher # force generic automatic launch
161
+ aw init # repository-local ignore rules (default)
162
+ aw init --ignore-scope tracked # opt in to a shared .gitignore block
163
+ aw add git@github.com:your-org/frontend.git
164
+ aw add git@github.com:your-org/backend.git
165
+ aw create feature-auth-refresh
166
+ aw create feature-auth-refresh --base feature/auth
167
+ aw create feature-auth-refresh --repo-base @meta=develop --repo-base frontend=release/2.x
168
+ aw clone --all --base main --repo-base frontend=release/2.x
169
+ aw create feature-auth-refresh --launch
170
+ aw create feature-auth-refresh --tmux
171
+ aw create feature-auth-refresh --herdr
172
+ aw create feature-auth-refresh --tab
173
+ aw create feature-auth-refresh --no-launch
174
+ aw shell install
175
+ aw status
176
+ aw switch feature-auth-refresh # parent repo worktrees
177
+ aw switch --repos feature-auth-refresh # child repo worktrees in current workspace
178
+ aw switch --all feature-auth-refresh # all repos
179
+ aw switch --repos docs # repo-name matching in child repos
180
+ aw switch --cd feature-auth-refresh # parent-shell cd when shell integration is active
181
+ aw switch --launch feature-auth-refresh # force launch while preserving a configured launcher
182
+ aw switch --tmux feature-auth-refresh # force a new plain tmux window
183
+ aw switch --herdr feature-auth-refresh # open or focus a persistent Herdr workspace
184
+ aw switch --tab feature-auth-refresh # request a true tab or managed equivalent
185
+ aw switch --ignore-configured-launcher # bypass configured sesh/Herdr mode once
186
+ aw switch --launch --ignore-configured-launcher # force generic automatic launch
183
187
  ```
184
188
 
185
189
  ### Add from a linked parent worktree
186
190
 
187
- When `arashi add` runs from an active linked parent worktree, Arashi creates one canonical clone in the parent main checkout and leaves it on the child default branch. It then creates the active child as a linked worktree on the coordinated branch and updates only the active parent configuration. Direct-main and configured-bare adds keep their existing single-placement behavior. See the [add command guide](https://arashi.haphazard.dev/commands/add/) for branch, managed-ignore, JSON, and rollback details.
191
+ When `aw add` runs from an active linked parent worktree, Arashi creates one canonical clone in the parent main checkout and leaves it on the child default branch. It then creates the active child as a linked worktree on the coordinated branch and updates only the active parent configuration. Direct-main and configured-bare adds keep their existing single-placement behavior. See the [add command guide](https://arashi.haphazard.dev/commands/add/) for branch, managed-ignore, JSON, and rollback details.
188
192
 
189
193
  Explicit `--tmux` is a per-invocation launcher override for `create` and `switch`; it is not a persisted configuration mode. It requires an active tmux context whose `TMUX` value is non-empty after trimming, uses the selected worktree path as one argv-safe `tmux new-window -c` argument, and does not fall back to another launcher when the prerequisite or launch fails. On `create`, it implies both launch and switch, while validation failures occur before worktree mutation.
190
194
 
@@ -198,10 +202,10 @@ global excludes rule is honored without duplication. Missing safe repository-rel
198
202
  the common repository's local exclude file by default, including when a command runs in a linked
199
203
  worktree.
200
204
 
201
- Use `arashi init --ignore-scope tracked` when the team wants Arashi-owned rules committed in the
202
- workspace `.gitignore`. Use `arashi init --ignore-scope none` for a fully manual workflow; Arashi
205
+ Use `aw init --ignore-scope tracked` when the team wants Arashi-owned rules committed in the
206
+ workspace `.gitignore`. Use `aw init --ignore-scope none` for a fully manual workflow; Arashi
203
207
  will warn about unignored managed paths but will not edit ignore files. Running
204
- `arashi init --ignore-scope local` resets that clone-local preference without recreating an
208
+ `aw init --ignore-scope local` resets that clone-local preference without recreating an
205
209
  existing workspace. The explicit `tracked` or `none` preference is stored only in local Git config
206
210
  as `arashi.ignoreScope`; Arashi never creates or modifies global Git ignore configuration.
207
211
 
@@ -226,41 +230,41 @@ Use shell integration for parent-shell directory switching and native tab comple
226
230
  The official curl installer can offer this automatically. If you skip it or use npm, install it for the active shell with:
227
231
 
228
232
  ```bash
229
- arashi shell install
233
+ aw shell install
230
234
  ```
231
235
 
232
- `arashi shell install` adds a managed pair to the active shell startup file: the parent-shell wrapper first and completion activation second. Repeating the command is idempotent and upgrades older wrapper-only blocks.
236
+ `aw shell install` adds a managed pair to the active shell startup file: the parent-shell wrapper first and completion activation second. Repeating the command is idempotent and upgrades older wrapper-only blocks.
233
237
 
234
238
  For manual setup, activate the wrapper and completion independently:
235
239
 
236
240
  ```bash
237
241
  # Bash
238
- eval "$(command arashi shell init bash)"
239
- source <(command arashi completion bash)
242
+ eval "$(command aw shell init bash)"
243
+ source <(command aw completion bash)
240
244
 
241
245
  # Zsh
242
- eval "$(command arashi shell init zsh)"
243
- source <(command arashi completion zsh)
246
+ eval "$(command aw shell init zsh)"
247
+ source <(command aw completion zsh)
244
248
 
245
249
  # Fish
246
- command arashi shell init fish | source
247
- command arashi completion fish | source
250
+ command aw shell init fish | source
251
+ command aw completion fish | source
248
252
  ```
249
253
 
250
- `arashi shell init <shell>` remains wrapper-only and defines both parent-shell functions, unless an unrelated `aw` alias or function already owns that shell name. `arashi completion <shell>` registers the same completion model for both executable names and emits only deterministic sourceable shell code, including on npm first use when the platform binary must be installed.
254
+ `aw shell init <shell>` remains wrapper-only and defines both parent-shell functions, unless an unrelated `aw` alias or function already owns that shell name. `aw completion <shell>` registers the same completion model for both executable names and emits only deterministic sourceable shell code, including on npm first use when the platform binary must be installed.
251
255
 
252
256
  Completion covers commands, aliases, options, finite choices, conflicts, and positional boundaries. In an Arashi workspace it also resolves configured repository and group selector segments, switch/remove worktrees and paths, and move source/target references. Dynamic lookup is local and read-only, silent on unavailable or broken metadata, and limited to a 200 ms whole-query budget; it performs no network requests, hooks, prompts, workspace mutations, or child operations. Static completion remains available outside a workspace.
253
257
 
254
- Once installed, you can use `arashi switch --cd <filter>` for one-off parent-shell switching or set `.arashi/config.json` `defaults.switch.mode` to `"cd"` or contextual `"auto"`. The canonical modes are `auto` | `cd` | `launch` | `sesh` | `herdr`.
258
+ Once installed, you can use `aw switch --cd <filter>` for one-off parent-shell switching or set `.arashi/config.json` `defaults.switch.mode` to `"cd"` or contextual `"auto"`. The canonical modes are `auto` | `cd` | `launch` | `sesh` | `herdr`.
255
259
 
256
- If shell integration is inactive, `arashi switch --cd` warns and skips launch fallback for that invocation.
260
+ If shell integration is inactive, `aw switch --cd` warns and skips launch fallback for that invocation.
257
261
 
258
262
  For automated installs, set `ARASHI_SHELL_INTEGRATION=yes` to enable it without prompting or `ARASHI_SHELL_INTEGRATION=no` to skip it.
259
263
 
260
264
  ## Hooks
261
265
 
262
- Arashi can run file-backed or configured inline lifecycle hooks during `arashi create` and
263
- `arashi remove`. Inline workspace values live only at root `hooks.scripts.<lifecycle>`; repository
266
+ Arashi can run file-backed or configured inline lifecycle hooks during `aw create` and
267
+ `aw remove`. Inline workspace values live only at root `hooks.scripts.<lifecycle>`; repository
264
268
  values live only at `repos.<name>.hooks.<lifecycle>`. Use inline config for short reviewable commands
265
269
  and native files for substantial scripts. One inline/file source may own a logical location; a
266
270
  same-location collision fails preflight instead of running both.
@@ -279,65 +283,71 @@ See [`docs/configuration.md`](./docs/configuration.md#inline-lifecycle-hook-conf
279
283
 
280
284
  ## Workflow Shortcuts
281
285
 
282
- Use `arashi list` with `fzf` and optional keybinds to speed up daily navigation.
286
+ Use `aw list` with `fzf` and optional keybinds to speed up daily navigation.
283
287
 
284
288
  ### Jump to a worktree (`cd`)
285
289
 
286
290
  ```bash
287
291
  # One-off jump
288
- cd "$(arashi list | fzf)"
292
+ cd "$(aw list | fzf)"
289
293
  ```
290
294
 
291
295
  ```bash
292
296
  # Bash keybind (Ctrl+G)
293
- bind '"\C-g":"cd \$(arashi list | fzf)\n"'
297
+ bind '"\C-g":"cd \$(aw list | fzf)\n"'
294
298
  ```
295
299
 
296
300
  ```zsh
297
301
  # Zsh keybind (Ctrl+G)
298
- bindkey -s '^g' 'cd $(arashi list | fzf)\n'
302
+ bindkey -s '^g' 'cd $(aw list | fzf)\n'
299
303
  ```
300
304
 
301
305
  ### Open or switch tmux sessions with `sesh`
302
306
 
303
307
  ```bash
304
308
  # One-off session connect
305
- sesh connect "$(arashi list | fzf)"
309
+ sesh connect "$(aw list | fzf)"
306
310
  ```
307
311
 
308
312
  ```bash
309
313
  # Bash keybind (Ctrl+S)
310
- bind '"\C-s":"sesh connect \$(arashi list | fzf)\n"'
314
+ bind '"\C-s":"sesh connect \$(aw list | fzf)\n"'
311
315
  ```
312
316
 
313
317
  ```zsh
314
318
  # Zsh keybind (Ctrl+S)
315
- bindkey -s '^s' 'sesh connect $(arashi list | fzf)\n'
319
+ bindkey -s '^s' 'sesh connect $(aw list | fzf)\n'
316
320
  ```
317
321
 
318
- You can also use `arashi switch --sesh` directly inside tmux to open the selected worktree in a new tmux window.
322
+ You can also use `aw switch --sesh` directly inside tmux to open the selected worktree in a new tmux window.
319
323
 
320
- `arashi switch` checks managed contexts in this order: tmux → Herdr → cmux → integrated IDE → Kitty. Managed Kitty selection applies when any one of `KITTY_PID`, `KITTY_WINDOW_ID`, or `TERM=xterm-kitty` is present after normalization.
324
+ `aw switch` checks managed contexts in this order: tmux → Herdr → cmux → integrated IDE → Kitty. Managed Kitty selection applies when any one of `KITTY_PID`, `KITTY_WINDOW_ID`, or `TERM=xterm-kitty` is present after normalization.
321
325
 
322
326
  Managed Kitty requires Kitty 0.43 or newer plus working `kitten @` remote control. Arashi reuses only its exact worktree marker and focuses that tab before launching a new session-backed tab. Once managed Kitty is selected, missing or unsupported tooling, denied remote control, duplicate markers, and validation failures are reported directly instead of falling back to another launcher.
323
327
 
324
- `arashi create --launch` and `defaults.create.launch: "auto"` use the same managed Kitty behavior. If that post-create launch fails, Arashi exits nonzero but preserves the successfully created worktree and reports the launch as partial success. Fix the launcher problem and use `arashi switch`; do not retry creation for the same branch.
328
+ `aw create --launch` and `defaults.create.launch: "auto"` use the same managed Kitty behavior. If that post-create launch fails, Arashi exits nonzero but preserves the successfully created worktree and reports the launch as partial success. Fix the launcher problem and use `aw switch`; do not retry creation for the same branch.
325
329
 
326
330
  ### Fast remove selection
327
331
 
328
332
  ```bash
329
333
  # Select and remove a worktree quickly
330
- arashi remove -f "$(arashi list | fzf)"
334
+ aw remove -f "$(aw list | fzf)"
331
335
  ```
332
336
 
333
337
  If you prefer the term `delete`, create a shell alias:
334
338
 
335
339
  ```bash
336
- alias arashi-delete='arashi remove -f'
340
+ alias arashi-delete='aw remove -f'
337
341
  ```
338
342
 
339
343
  ## Configuration Schema
340
344
 
345
+ ### Configured worktree files
346
+
347
+ Configured repositories can copy isolated files or create native symlinks for intentionally shared state when coordinated worktrees are created. See [Worktree file materialization](docs/configuration.md#worktree-file-materialization) for direct `copy`/`symlink` arrays, Git-primary sourcing, lifecycle order, safety rules, dry-run previews, and doctor diagnostics.
348
+
349
+ ## Configuration Schema
350
+
341
351
  Arashi publishes a JSON Schema for `.arashi/config.json` so editors can validate and autocomplete your config.
342
352
 
343
353
  - Stable URL: `https://unpkg.com/arashi/schema/config.schema.json`
@@ -376,7 +386,7 @@ Explicit launcher flags take precedence over `--cd` / `--launch`, which take pre
376
386
 
377
387
  Legacy switch-only `launchMode` and `launch_mode` fields remain readable for a bounded compatibility window. Arashi warns with the exact replacement `defaults.switch.mode` on stderr; migrate promptly. Ambiguous `cd` plus an explicit legacy launcher and conflicting legacy aliases are rejected.
378
388
 
379
- Use `defaults.create` for terminal `arashi create` behavior. Use `defaults.editors.<host>.create` for editor-specific overrides such as VS Code extension create flows. Supported hosts are `vscode`, `cursor`, and `kiro`. Each scope has one canonical `launch` choice: `none` | `auto` | `sesh` | `herdr`. `switch` stays independent, while any enabled launch implies switch handling for the newly created primary worktree.
389
+ Use `defaults.create` for terminal `aw create` behavior. Use `defaults.editors.<host>.create` for editor-specific overrides such as VS Code extension create flows. Supported hosts are `vscode`, `cursor`, and `kiro`. Each scope has one canonical `launch` choice: `none` | `auto` | `sesh` | `herdr`. `switch` stays independent, while any enabled launch implies switch handling for the newly created primary worktree.
380
390
 
381
391
  Create precedence is: reject `--sesh` plus `--herdr`; then explicit `--sesh` / `--herdr`; `--tab` or `--launch`; `--no-launch`; the matching configured scope; and built-in `none`. `--tab` bypasses the matching configured scope unless an explicit launcher selector is present. An editor-hosted invocation does not fall back to terminal or another editor scope.
382
392
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arashi",
3
- "version": "1.31.0",
3
+ "version": "1.32.1",
4
4
  "description": "Git worktree manager for meta-repositories - The eye of the storm for your development workflow",
5
5
  "keywords": [
6
6
  "cli",
@@ -19,12 +19,18 @@
19
19
  },
20
20
  "Config": {
21
21
  "additionalProperties": false,
22
- "description": "Root configuration object for Arashi",
22
+ "description": "Root configuration object for Arashi.",
23
23
  "properties": {
24
24
  "$schema": {
25
25
  "description": "JSON Schema URL for editor validation/autocomplete",
26
26
  "type": "string"
27
27
  },
28
+ "baseBranch": {
29
+ "description": "Workspace base branch shared by configured create and clone",
30
+ "minLength": 1,
31
+ "pattern": "^(?!HEAD$)(?!origin/(?:HEAD$|-))(?![-/.])(?!.*(?:/\\.|//|\\.\\.|@\\{))(?!.*\\.lock(?:/|$))(?!.*[/.]$)[^\\u0000-\\u0020\\u007F~^:?*\\[\\\\]+$",
32
+ "type": "string"
33
+ },
28
34
  "defaults": {
29
35
  "$ref": "#/definitions/CommandDefaultsConfig",
30
36
  "description": "Optional command-scoped defaults for create and switch"
@@ -47,6 +53,10 @@
47
53
  },
48
54
  "type": "object"
49
55
  },
56
+ "meta": {
57
+ "$ref": "#/definitions/MetaRepositoryConfig",
58
+ "description": "Optional meta-repository-specific policy"
59
+ },
50
60
  "repos": {
51
61
  "additionalProperties": {
52
62
  "$ref": "#/definitions/RepoConfig"
@@ -208,10 +218,36 @@
208
218
  ],
209
219
  "description": "Bash shorthand or interpreter-specific alternatives for one inline hook."
210
220
  },
221
+ "MetaRepositoryConfig": {
222
+ "additionalProperties": false,
223
+ "description": "Meta-repository-specific configuration.",
224
+ "properties": {
225
+ "baseBranch": {
226
+ "description": "Meta-repository-specific base branch for configured create",
227
+ "minLength": 1,
228
+ "pattern": "^(?!HEAD$)(?!origin/(?:HEAD$|-))(?![-/.])(?!.*(?:/\\.|//|\\.\\.|@\\{))(?!.*\\.lock(?:/|$))(?!.*[/.]$)[^\\u0000-\\u0020\\u007F~^:?*\\[\\\\]+$",
229
+ "type": "string"
230
+ }
231
+ },
232
+ "type": "object"
233
+ },
211
234
  "RepoConfig": {
212
235
  "additionalProperties": false,
213
236
  "description": "Configuration for a single repository",
214
237
  "properties": {
238
+ "baseBranch": {
239
+ "description": "Repository-specific base branch for configured create and clone",
240
+ "minLength": 1,
241
+ "pattern": "^(?!HEAD$)(?!origin/(?:HEAD$|-))(?![-/.])(?!.*(?:/\\.|//|\\.\\.|@\\{))(?!.*\\.lock(?:/|$))(?!.*[/.]$)[^\\u0000-\\u0020\\u007F~^:?*\\[\\\\]+$",
242
+ "type": "string"
243
+ },
244
+ "copy": {
245
+ "description": "Repository-relative paths copied into new worktrees in declaration order",
246
+ "items": {
247
+ "type": "string"
248
+ },
249
+ "type": "array"
250
+ },
215
251
  "gitUrl": {
216
252
  "description": "Canonical git URL for cloning the repository",
217
253
  "type": "string"
@@ -230,6 +266,13 @@
230
266
  "path": {
231
267
  "description": "Path to the repository (relative or absolute)",
232
268
  "type": "string"
269
+ },
270
+ "symlink": {
271
+ "description": "Repository-relative paths symlinked into new worktrees in declaration order",
272
+ "items": {
273
+ "type": "string"
274
+ },
275
+ "type": "array"
233
276
  }
234
277
  },
235
278
  "required": ["path"],