dogsbay 0.2.0-beta.2 → 0.2.0-beta.21
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/dist/commands/agent.js +305 -0
- package/dist/commands/site-build.js +66 -15
- package/dist/commands/site-dev.js +181 -23
- package/dist/commands/site-init.js +193 -32
- package/dist/config/defaults.js +8 -1
- package/dist/config/load.js +6 -32
- package/dist/config/to-astro-options.js +1 -0
- package/dist/import-content.js +13 -12
- package/dist/index.js +19 -4
- package/dist/passthrough-astro.js +152 -0
- package/dist/registry.js +8 -0
- package/package.json +11 -9
- package/skills/platform/agent-readiness/SKILL.md +262 -0
- package/skills/platform/cli-commands/SKILL.md +205 -0
- package/skills/platform/config-yml/SKILL.md +219 -0
- package/skills/platform/frontmatter-fields/SKILL.md +310 -0
- package/skills/platform/markdown-directives/SKILL.md +329 -0
- package/skills/platform/multi-source/SKILL.md +294 -0
- package/skills/platform/nav-file/SKILL.md +107 -0
- package/skills/platform/openapi-source/SKILL.md +237 -0
- package/skills/platform/plugin-api/SKILL.md +280 -0
- package/skills/platform/project-anatomy/SKILL.md +156 -0
- package/skills/platform/taxonomy-config/SKILL.md +392 -0
- package/skills/platform/theme-tokens/SKILL.md +276 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dogsbay:cli-commands
|
|
3
|
+
description: Reference for every dogsbay CLI command and flag — site init/build/dev/preview/check, astro init/add/list, convert, pattern install, agent install. Use when running CLI operations or recommending the right subcommand.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Dogsbay CLI command reference
|
|
7
|
+
|
|
8
|
+
Three command namespaces, each with a clear scope:
|
|
9
|
+
|
|
10
|
+
- `dogsbay site …` — full SSG; Dogsbay owns the project (`dogsbay.config.yml` at root)
|
|
11
|
+
- `dogsbay astro …` — drop Dogsbay components into someone else's existing Astro project
|
|
12
|
+
- `dogsbay convert …` — pure content-format primitive; no SSG, no install
|
|
13
|
+
|
|
14
|
+
## site init
|
|
15
|
+
|
|
16
|
+
Scaffold a new Dogsbay-owned project.
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
dogsbay site init [target] [flags]
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
| Flag | Purpose |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `--yes` | Non-interactive; combine with `--site-name` and `--content` |
|
|
25
|
+
| `--site-name <string>` | Site name (required in non-interactive mode) |
|
|
26
|
+
| `--content <path>` | Content directory path (required in non-interactive mode) |
|
|
27
|
+
| `--from <format>` | Source format: `auto`, `dogsbay-md`, `mkdocs`, `obsidian`, `starlight`, `mdx`, `openapi` |
|
|
28
|
+
| `--theme <name>` | `default` or `material` |
|
|
29
|
+
| `--deploy <target>` | `cloudflare-workers` adds wrangler config + worker emission |
|
|
30
|
+
| `--scaffold-only` | Skip writing dogsbay.config.yml; just scaffold astro/. Used when content + config already exist. |
|
|
31
|
+
| `--force` | Overwrite an existing scaffold |
|
|
32
|
+
| `--local` | Use `link:` deps to a local monorepo checkout (development only) |
|
|
33
|
+
| `--config-format <yaml\|json>` | Default `yaml` |
|
|
34
|
+
|
|
35
|
+
Writes (default): `dogsbay.config.yml` + `content/index.md` + `content/getting-started.md` + `content/nav.yml` + `astro/` scaffold. Never overwrites an existing `content/` dir (the seed-content step is skipped if it exists).
|
|
36
|
+
|
|
37
|
+
## site build
|
|
38
|
+
|
|
39
|
+
Build Astro source from the configured sources. Generates pages, nav.json, and agent-readiness files.
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
dogsbay site build [flags]
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
| Flag | Purpose |
|
|
46
|
+
|---|---|
|
|
47
|
+
| `--config <path>` | Explicit config path |
|
|
48
|
+
| `--include-drafts` | Include pages with `draft: true` in frontmatter (default false; site dev defaults true) |
|
|
49
|
+
| `--primary-only` | Build only sources marked `primary: true` — fast iteration. Default builds the full matrix (every locale / version / namespace declared in config). |
|
|
50
|
+
| `--publish` | Deprecated no-op (publish IS the default now). Kept for compat with older scripts. |
|
|
51
|
+
| `--refresh` | Invalidate the git-source cache and re-clone |
|
|
52
|
+
|
|
53
|
+
Writes into the configured `output:` (default `./astro/`). Doesn't run Astro itself — that's `site dev` / `site preview`.
|
|
54
|
+
|
|
55
|
+
## site dev
|
|
56
|
+
|
|
57
|
+
Build + serve with hot reload at localhost:4321.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
dogsbay site dev [flags]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| Flag | Purpose |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `--no-build` | Skip the implicit `site build`; only run Astro dev server |
|
|
66
|
+
| `--full` | Build the full publish matrix (every source) |
|
|
67
|
+
| `--config <path>` | Explicit config path |
|
|
68
|
+
|
|
69
|
+
Auto-installs scaffolded site deps on first run if `astro/node_modules` is missing. Picks pnpm if on PATH, falls back to npm.
|
|
70
|
+
|
|
71
|
+
## site preview
|
|
72
|
+
|
|
73
|
+
Production build + static serve.
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
dogsbay site preview [flags]
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Runs `dogsbay site build` then `astro build` then `astro preview`. Same flags as `site dev`. Used for verifying the deployable artefact locally.
|
|
80
|
+
|
|
81
|
+
## site check
|
|
82
|
+
|
|
83
|
+
Run audit rules against built content.
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
dogsbay site check [flags]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
| Flag | Purpose |
|
|
90
|
+
|---|---|
|
|
91
|
+
| `--quiet` | Suppress stdout (still writes JSON output if requested) |
|
|
92
|
+
| `--output <path>` | Write findings to a JSON file |
|
|
93
|
+
| `--rule <name>` | Run only the named rule (or comma-separated list) |
|
|
94
|
+
| `--severity <level>` | Filter to error / warning / info |
|
|
95
|
+
|
|
96
|
+
Audit categories (some shipped, some pending): coherence (broken links, orphan pages), seo (titles, descriptions, brand keywords), prose (Vale wrapper), corpus (duplicate paragraphs), performance (page weight), freshness (stale pages, dead screenshots), aeo (agent readability, llms.txt coverage).
|
|
97
|
+
|
|
98
|
+
## astro init
|
|
99
|
+
|
|
100
|
+
Scaffold theme + path aliases into an existing Astro project (where Dogsbay is a guest, not the owner).
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
dogsbay astro init
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Writes `src/styles/theme.css`, `src/styles/global.css`, sets `@/*` and `@ui/*` path aliases in `tsconfig.json`. Doesn't write a dogsbay.config.yml.
|
|
107
|
+
|
|
108
|
+
## astro add
|
|
109
|
+
|
|
110
|
+
Copy components into an Astro project. The component must exist in the registry (see `astro list`).
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
dogsbay astro add card badge button
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Resolves `registryDependencies` (e.g. `form` auto-adds `field`). Installs npm deps for components that need them (e.g. `maplibre-gl` for `map-view`).
|
|
117
|
+
|
|
118
|
+
## astro list
|
|
119
|
+
|
|
120
|
+
Show every registered component grouped by category.
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
dogsbay astro list
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
72 components across base UI / docs / API / map / layout categories.
|
|
127
|
+
|
|
128
|
+
## convert
|
|
129
|
+
|
|
130
|
+
Pure content-format primitive. Reads source markdown, writes target format. No project scaffolding.
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
dogsbay convert <src> --to <format> [-o <output>]
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
| `--to` value | Target |
|
|
137
|
+
|---|---|
|
|
138
|
+
| `astro` | `.astro` pages + `nav.json` (no full Astro project — just the content tier) |
|
|
139
|
+
| `dogsbay-md` | Normalise to canonical Dogsbay markdown |
|
|
140
|
+
|
|
141
|
+
Used for one-shot migrations and CI-style content transformations.
|
|
142
|
+
|
|
143
|
+
## pattern install
|
|
144
|
+
|
|
145
|
+
Install a pattern package into the project (Diátaxis content types, Google-style guide, etc.).
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
dogsbay pattern install diataxis
|
|
149
|
+
dogsbay pattern install @your-org/pattern-internal
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Copies templates into `.dogsbay/patterns/<name>/`. Adds the pattern's audit rules to `dogsbay.config.yml`'s registered list (with user confirmation). See `dogsbay:taxonomy-config` for what patterns can register.
|
|
153
|
+
|
|
154
|
+
## agent install
|
|
155
|
+
|
|
156
|
+
Wire skill discovery for an agent harness.
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
dogsbay agent install --agent claude
|
|
160
|
+
dogsbay agent install --agent cursor
|
|
161
|
+
dogsbay agent install --all
|
|
162
|
+
dogsbay agent install --workflow pr-review
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
| Flag | Purpose |
|
|
166
|
+
|---|---|
|
|
167
|
+
| `--agent <name>` | Set up discovery for a specific agent (claude, cursor, copilot) |
|
|
168
|
+
| `--all` | Set up every supported agent |
|
|
169
|
+
| `--workflow <name>` | Install a workflow package (writes to `.github/workflows/`, etc.) |
|
|
170
|
+
|
|
171
|
+
Without `--agent` or `--workflow`, prints a list of detected agents in the project + suggests next-step commands.
|
|
172
|
+
|
|
173
|
+
## Common patterns
|
|
174
|
+
|
|
175
|
+
### First-run after clone
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
git clone …
|
|
179
|
+
cd …
|
|
180
|
+
dogsbay site dev # auto-installs deps + builds + serves
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Migrating from MkDocs
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
dogsbay convert ./mkdocs-site --to astro -o ./astro-pages
|
|
187
|
+
# OR for a fresh Dogsbay site:
|
|
188
|
+
dogsbay site init my-docs --content ./mkdocs-site/docs --from mkdocs
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Production publish to Cloudflare
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
dogsbay site build # builds full matrix by default
|
|
195
|
+
cd astro && pnpm run build && wrangler deploy
|
|
196
|
+
# OR via the deploy script:
|
|
197
|
+
cd astro && pnpm run deploy
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Adding components mid-project
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
dogsbay astro add tabs accordion popover
|
|
204
|
+
# components copied to src/components/ui/
|
|
205
|
+
```
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dogsbay:config-yml
|
|
3
|
+
description: Read or write fields in dogsbay.config.yml. Use when configuring site identity, base path, multi-source content, theme, deploy target, agent readiness, plugins, taxonomies, or any other site-wide setting.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Writing dogsbay.config.yml
|
|
7
|
+
|
|
8
|
+
The config file lives at the project root. It anchors path resolution
|
|
9
|
+
for `output:`, content sources, and the scaffolded astro/ subdir.
|
|
10
|
+
|
|
11
|
+
YAML is the canonical format (`.yml`). JSON is also accepted
|
|
12
|
+
(`dogsbay.config.json`); the loader picks whichever exists.
|
|
13
|
+
|
|
14
|
+
## Top-level shape
|
|
15
|
+
|
|
16
|
+
```yaml
|
|
17
|
+
schemaVersion: 1
|
|
18
|
+
|
|
19
|
+
site: # site identity
|
|
20
|
+
name: …
|
|
21
|
+
url: …
|
|
22
|
+
basePath: /docs
|
|
23
|
+
description: …
|
|
24
|
+
|
|
25
|
+
content: # one or more content sources
|
|
26
|
+
sources:
|
|
27
|
+
- …
|
|
28
|
+
|
|
29
|
+
theme: default # or "material"
|
|
30
|
+
|
|
31
|
+
agent: # agent-readiness toggles
|
|
32
|
+
llmsTxt: true
|
|
33
|
+
mdMirror: true
|
|
34
|
+
|
|
35
|
+
deploy: # optional deploy target
|
|
36
|
+
target: cloudflare-workers
|
|
37
|
+
|
|
38
|
+
plugins: # plugin configurations
|
|
39
|
+
- …
|
|
40
|
+
|
|
41
|
+
taxonomies: # tagging schemes (user-defined)
|
|
42
|
+
…
|
|
43
|
+
|
|
44
|
+
analytics: # optional
|
|
45
|
+
plausible:
|
|
46
|
+
domain: …
|
|
47
|
+
|
|
48
|
+
output: ./astro # where the scaffold lives
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## site
|
|
52
|
+
|
|
53
|
+
| Field | Type | Required | Notes |
|
|
54
|
+
|---|---|---|---|
|
|
55
|
+
| `name` | string | yes | Shown in header, page-title suffixes, copyright. |
|
|
56
|
+
| `url` | string | recommended | Canonical site URL. **Must be host-only when `basePath` is set** — `https://example.com`, NOT `https://example.com/docs`. The validator throws otherwise. Used for sitemap, canonical tags, OG meta. |
|
|
57
|
+
| `basePath` | string | no | URL prefix for all pages. Defaults to `/docs`. Set to `""` for root-mounted sites. |
|
|
58
|
+
| `description` | string | no | Site-wide description; default `og:description` and `<meta name="description">`. |
|
|
59
|
+
| `repoUrl` | string | no | Source repo URL — used for edit-on-GitHub links. |
|
|
60
|
+
| `editUri` | string | no | Path inside repo for edit links, e.g. `blob/main/content/`. |
|
|
61
|
+
| `copyright` | string | no | Footer copyright text. |
|
|
62
|
+
| `redirects` | object | no | Map of old-path → new-path. Emitted as redirects in the build output. |
|
|
63
|
+
| `brandKeywords` | string[] | no | Used by the `seo/h1-brand-keyword` audit rule. |
|
|
64
|
+
|
|
65
|
+
## content.sources
|
|
66
|
+
|
|
67
|
+
Each entry is a `SourceConfig`. The aggregator concatenates them in declaration order. See `dogsbay:multi-source` for the full axis model.
|
|
68
|
+
|
|
69
|
+
| Field | Type | Required | Notes |
|
|
70
|
+
|---|---|---|---|
|
|
71
|
+
| `path` | string | one of path/git | Local directory containing the source. |
|
|
72
|
+
| `git` | string | one of path/git | Git URL — checked out at build time. Requires `ref:`. |
|
|
73
|
+
| `ref` | string | required when git is set | Branch / tag / sha. |
|
|
74
|
+
| `subdir` | string | no | Subdirectory within the resolved source. |
|
|
75
|
+
| `from` | enum | no | One of `auto`, `dogsbay-md`, `mkdocs`, `obsidian`, `starlight`, `mdx`, `openapi`. Default `auto` (detection by content). |
|
|
76
|
+
| `name` | string | no | Namespace key — when ≥2 sources have distinct names, the namespace axis activates. |
|
|
77
|
+
| `version` | string | no | Version label — when ≥2 sources have distinct versions, the version axis activates. |
|
|
78
|
+
| `locale` | string | no | BCP-47 locale tag. |
|
|
79
|
+
| `nav` | string | no | Path to an explicit nav file. Defaults to auto-detect (see `dogsbay:nav-file`). |
|
|
80
|
+
| `primary` | boolean | no | Marks this source for the primary build mode (default mode for `site dev` / `site build`). |
|
|
81
|
+
|
|
82
|
+
## theme
|
|
83
|
+
|
|
84
|
+
`default` or `material`. Default is `default` (shadcn-style zinc). Both ship with 60 design tokens — see `dogsbay:theme-tokens` for what's overridable.
|
|
85
|
+
|
|
86
|
+
## agent
|
|
87
|
+
|
|
88
|
+
| Field | Type | Default | Notes |
|
|
89
|
+
|---|---|---|---|
|
|
90
|
+
| `llmsTxt` | boolean | `true` | Emit `public/llms.txt` and `public/llms-full.txt`. |
|
|
91
|
+
| `mdMirror` | boolean | `true` | Emit a `.md` mirror endpoint for every page (e.g. `/docs/page.md`). |
|
|
92
|
+
| `contentSignal` | object | none | Sets `Content-Signal: aiTrain=…, aiInput=…, search=…` headers. Each key is `"yes"` / `"no"`. |
|
|
93
|
+
|
|
94
|
+
See `dogsbay:agent-readiness` for the full agent surface.
|
|
95
|
+
|
|
96
|
+
## deploy
|
|
97
|
+
|
|
98
|
+
```yaml
|
|
99
|
+
deploy:
|
|
100
|
+
target: cloudflare-workers
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Currently supports `cloudflare-workers`. Adds wrangler.jsonc + worker emission to the scaffold.
|
|
104
|
+
|
|
105
|
+
## plugins
|
|
106
|
+
|
|
107
|
+
Each entry is either a string (the package name) or an object with options. The CLI auto-prefixes `@dogsbay/plugin-` and `dogsbay-plugin-` for short names:
|
|
108
|
+
|
|
109
|
+
```yaml
|
|
110
|
+
plugins:
|
|
111
|
+
- image-zoom # resolves to @dogsbay/plugin-image-zoom
|
|
112
|
+
- "@your-org/plugin-foo" # explicit
|
|
113
|
+
- name: typedoc # with options
|
|
114
|
+
options:
|
|
115
|
+
sourceRoot: ./src
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
See `dogsbay:plugin-api` for what plugins can do.
|
|
119
|
+
|
|
120
|
+
## taxonomies
|
|
121
|
+
|
|
122
|
+
User-defined tagging schemes. Dogsbay doesn't prescribe categories; this is the slot for the user's opinions. See `dogsbay:taxonomy-config`.
|
|
123
|
+
|
|
124
|
+
## analytics
|
|
125
|
+
|
|
126
|
+
```yaml
|
|
127
|
+
analytics:
|
|
128
|
+
plausible:
|
|
129
|
+
domain: docs.example.com
|
|
130
|
+
scriptUrl: https://plausible.io/js/script.js # optional
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Plausible is the only built-in. Self-hosting via `scriptUrl` is supported.
|
|
134
|
+
|
|
135
|
+
## output
|
|
136
|
+
|
|
137
|
+
Where the scaffolded astro/ project lives. Default `./astro`. The user almost never changes this.
|
|
138
|
+
|
|
139
|
+
## Common patterns
|
|
140
|
+
|
|
141
|
+
### Single-source site
|
|
142
|
+
|
|
143
|
+
```yaml
|
|
144
|
+
schemaVersion: 1
|
|
145
|
+
site:
|
|
146
|
+
name: My Docs
|
|
147
|
+
url: https://docs.example.com
|
|
148
|
+
content:
|
|
149
|
+
sources:
|
|
150
|
+
- path: ./content
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Multi-source — markdown + OpenAPI
|
|
154
|
+
|
|
155
|
+
```yaml
|
|
156
|
+
schemaVersion: 1
|
|
157
|
+
site:
|
|
158
|
+
name: Acme API
|
|
159
|
+
url: https://docs.acme.com
|
|
160
|
+
basePath: /docs
|
|
161
|
+
content:
|
|
162
|
+
sources:
|
|
163
|
+
- path: ./content
|
|
164
|
+
from: dogsbay-md
|
|
165
|
+
- name: api
|
|
166
|
+
path: ./openapi/spec.yaml
|
|
167
|
+
from: openapi
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
URLs: `/docs/` (markdown), `/docs/api/...` (operations).
|
|
171
|
+
|
|
172
|
+
### Multi-version OpenAPI
|
|
173
|
+
|
|
174
|
+
```yaml
|
|
175
|
+
content:
|
|
176
|
+
sources:
|
|
177
|
+
- path: ./content # evergreen prose
|
|
178
|
+
from: dogsbay-md
|
|
179
|
+
- name: api
|
|
180
|
+
path: ./openapi/2024-04-10.yaml
|
|
181
|
+
from: openapi
|
|
182
|
+
version: "2024-04-10"
|
|
183
|
+
- name: api
|
|
184
|
+
path: ./openapi/2023-12-01.yaml
|
|
185
|
+
from: openapi
|
|
186
|
+
version: "2023-12-01"
|
|
187
|
+
|
|
188
|
+
versions:
|
|
189
|
+
- id: "2024-04-10"
|
|
190
|
+
label: "2024-04-10 (latest)"
|
|
191
|
+
default: true
|
|
192
|
+
- id: "2023-12-01"
|
|
193
|
+
label: "2023-12-01"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Cloudflare Workers deploy + agent readiness
|
|
197
|
+
|
|
198
|
+
```yaml
|
|
199
|
+
deploy:
|
|
200
|
+
target: cloudflare-workers
|
|
201
|
+
|
|
202
|
+
agent:
|
|
203
|
+
llmsTxt: true
|
|
204
|
+
mdMirror: true
|
|
205
|
+
contentSignal:
|
|
206
|
+
aiTrain: "no"
|
|
207
|
+
aiInput: "yes"
|
|
208
|
+
search: "yes"
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Validation that fails the build
|
|
212
|
+
|
|
213
|
+
- `site.url` includes a path AND `basePath` is set → throws "site.url must be host-only when basePath is set"
|
|
214
|
+
- `site.basePath` contains `?`, `#`, whitespace, or `//` → throws
|
|
215
|
+
- `content.sources` is empty → throws
|
|
216
|
+
- `content.sources[].from` is unknown → throws (valid values: `auto`, `dogsbay-md`, `mkdocs`, `obsidian`, `starlight`, `mdx`, `openapi`)
|
|
217
|
+
- `content.sources[]` has neither `path` nor `git` → throws
|
|
218
|
+
- `git:` source has no `ref:` → throws
|
|
219
|
+
- An entry has both `path:` and `git:` → throws (exactly-one-of)
|