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
|`layer`|`project`, `preset`, `extension`, or `core`|
100
-
|`presetId`| Preset pack directory id; `null` on `core`, `project`, and `extension` rows |
101
+
|`layer`|`project`, `preset`, or `extension`; `null` for built-in layers |
102
+
|`sourceId`| Source component of `lookupId`, or `null` when the layer has no provenance |
103
+
|`presetId`| Preset pack directory id; `null` on built-in, `project`, and `extension` rows |
101
104
|`presetName`| Preset display name when its manifest declares one, else the pack id; `null` when `presetId` is `null`|
102
105
|`strategy`|`replace`, `wrap`, `prepend`, or `append`|
103
106
|`active`|`true` only for index `0` — the layer whose content is served |
104
107
|`hidden`|`true` when a lower-index `replace` layer cuts this layer out of the composition |
105
108
|`manifestPath`| Project-relative path to the declaring manifest, or `null` when none applies |
106
-
|`lookupId`| Deterministic `{layer}:{sourceId}:{kind}:{name}` identifier for the layer |
109
+
|`lookupId`| Deterministic `{layer}:{sourceId}:{kind}:{name}` identifier, or `null` for built-in layers|
107
110
108
-
`active` and `hidden` are independent labels, not opposites. Composing strategies (`wrap`, `prepend`, `append`) keep lower layers in the composed output, so an inactive layer is not necessarily hidden: only layers below the first `replace` layer are marked `hidden`. Core rows appear as the base of the stack with `presetId`/`presetName`/`manifestPath` set to `null` and a `core:_:{kind}:{name}` lookup ID.
111
+
`active` and `hidden` are independent labels, not opposites. Composing strategies (`wrap`, `prepend`, `append`) keep lower layers in the composed output, so an inactive layer is not necessarily hidden: only layers below the first `replace` layer are marked `hidden`. Built-in rows have no provenance: `layer`, `sourceId`, and `lookupId` are `null`.
109
112
110
113
Lookup IDs use the same grammar as [preset contribution identifiers](presets.md#contribution-identifiers), so a `lookupId` from this command joins directly to `PresetManifest.iter_contributions()` / `ExtensionManifest.iter_contributions()` for manifest-declared layers. Project-local overrides carry a synthetic `project:_:{kind}:{name}` ID that intentionally matches no manifest contribution.
Every command, template, script, and hook contributed by an extension (or a preset, or the core layer) is addressable at read time by a deterministic opaque identifier. Resolved artifact-stack layers carry a matching `lookupId` field that shares this grammar and identifies the layer's stack position. Manifest-declared preset and extension layers use the manifest's validated `id:` for `lookupId`'s `sourceId` component, so their `lookupId` joins directly to the matching `iter_contributions()` entry even after the installed directory is renamed; convention-only contributions have no manifest `id:` to consult and fall back to the on-disk directory / registry key instead (see [Determinism guarantees](#determinism-guarantees) below). Identifiers are **computed on demand from author-declared manifest content** and are **never persisted** to `.specify/` or to any cache file.
866
+
Every command, template, script, and hook contributed by an extension or presetis addressable at read time by a deterministic opaque identifier. Resolved artifact-stack layers carry a matching `lookupId` field when they have provenance. Manifest-declared preset and extension layers use the manifest's validated `id:` for `lookupId`'s `sourceId` component, so their `lookupId` joins directly to the matching `iter_contributions()` entry even after the installed directory is renamed; convention-only contributions have no manifest `id:` to consult and fall back to the on-disk directory / registry key instead (see [Determinism guarantees](#determinism-guarantees) below). Identifiers are **computed on demand from author-declared manifest content** and are **never persisted** to `.specify/` or to any cache file.
867
867
868
868
### Grammar
869
869
@@ -873,9 +873,9 @@ Named contributions (commands, templates, scripts) follow:
873
873
{layer}:{sourceId}:{kind}:{name}
874
874
```
875
875
876
-
- `layer`is one of `core`, `preset`, or `extension`.
877
-
- `sourceId`is `_` for `core`, the preset pack id for `preset`, or the extension id for `extension`.
878
-
- `kind`is one of `command`, `template`, `script`, or `hook`.
876
+
- `layer`is one of `preset` or `extension`.
877
+
- `sourceId`is the preset pack id for `preset`, or the extension id for `extension`.
878
+
- `kind`is one of `command`, `template`, or `script`.
879
879
- `name`is the contribution's declared `name` field.
880
880
881
881
Hook contributions use a compound name-component built from the event and command:
0 commit comments