You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Merge current main and escape user-controlled catalog values before Rich rendering. Add regressions for markup-bearing no-op and conflict output across integration, workflow, and step catalogs.
Assisted-by: GitHub Copilot (model: GPT-5.6 Sol, autonomous)
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Registers a project-scoped catalog source and persists it.
177
177
178
+
Adding a source is idempotent (identity is the source **id or url**): re-running `catalog add` with the same id/url and identical `--policy`/`--priority` is a successful no-op (exit code 0), so it is safe to include in a re-runnable workflow. Re-adding a matching id/url with *different* settings is rejected as a conflict rather than silently overwriting the existing source — remove it first to change it.
179
+
180
+
Surrounding whitespace in source ids and URLs is ignored when matching identities and comparing settings. No-ops and conflicts leave the existing configuration unchanged; they do not rewrite stored values to normalize them.
Adds a catalog to the project's `.specify/extension-catalogs.yml`.
158
158
159
+
Adding a catalog is idempotent (identity is the catalog **name**): re-running `catalog add` with the same name and identical settings is a successful no-op (exit code 0), so it is safe to include in a re-runnable workflow. Re-adding the same name with *different* settings is rejected as a conflict rather than silently overwriting the existing entry — remove it first to change it.
160
+
161
+
Surrounding whitespace in catalog names and URLs is ignored when comparing entries and stripped from newly added entries. A no-op leaves the existing configuration unchanged.
162
+
163
+
Stored priorities may use numeric strings, but YAML booleans (`true`/`false`) are invalid and are never equivalent to integer priorities (`1`/`0`). Re-adding a matching catalog with an invalid stored priority reports a conflict.
Adds a custom catalog URL to the project's `.specify/integration-catalogs.yml`. The URL must use HTTPS (except `http://localhost`, `http://127.0.0.1`, or `http://[::1]` for local testing).
235
235
236
+
Adding a catalog is idempotent (identity is the catalog **URL**): re-running `catalog add` with the same URL and the same (or no) `--name` is a successful no-op (exit code 0), so it is safe to include in a re-runnable workflow. Re-adding the same URL with a *different*`--name` is rejected as a conflict rather than silently overwriting the existing entry — remove it first to change it.
Adds a catalog to the project's `.specify/preset-catalogs.yml`.
125
125
126
+
Adding a catalog is idempotent (identity is the catalog **name**): re-running `catalog add` with the same name and identical settings is a successful no-op (exit code 0), so it is safe to include in a re-runnable workflow. Re-adding the same name with *different* settings is rejected as a conflict rather than silently overwriting the existing entry — remove it first to change it.
127
+
128
+
Surrounding whitespace in catalog URLs is ignored when comparing entries and stripped from newly added entries. A no-op leaves the existing configuration unchanged.
129
+
130
+
Stored priorities may use numeric strings, but YAML booleans (`true`/`false`) are invalid and are never equivalent to integer priorities (`1`/`0`). Re-adding a matching catalog with an invalid stored priority reports a conflict.
Adds a custom catalog URL to the project's `.specify/workflow-catalogs.yml`.
407
407
408
+
Adding a catalog is idempotent (identity is the catalog **URL**): re-running `catalog add` with the same URL and the same (or no) `--name` is a successful no-op (exit code 0), so it is safe to include in a re-runnable workflow. Re-adding the same URL with a *different* `--name` is rejected as a conflict rather than silently overwriting the existing entry — remove it first to change it.
409
+
410
+
Surrounding whitespace in catalog URLs is ignored when comparing entries and stripped from newly added entries. A no-op leaves the existing configuration unchanged.
411
+
408
412
### Remove a Catalog
409
413
410
414
```bash
@@ -422,6 +426,20 @@ Catalogs are resolved in this order (first match wins):
`step catalog add`writes to `.specify/step-catalogs.yml`. Like workflow catalogs, step catalogs use the **URL** as their identity, ignoring surrounding whitespace. Adding the same URL with the same (or no) `--name` is a successful no-op (exit code 0) that leaves the configuration unchanged. A different `--name` for that URL is a conflict (exit code 1); remove the existing entry first to change it. New entries store the URL without surrounding whitespace.
440
+
441
+
`step catalog list`shows the active sources, and `step catalog remove` removes a project entry by its index. Step catalog resolution uses `SPECKIT_STEP_CATALOG_URL`, then the project config, then `~/.specify/step-catalogs.yml`, then built-in defaults.
442
+
425
443
## Workflow Definition
426
444
427
445
Workflows are defined in YAML files. Here is the built-in **Full SDD Cycle** workflow that ships with Spec Kit:
0 commit comments