[Feature]: Add deterministic contribution IDs and stack lookup IDs for resolved artifacts
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
- #4261 de @nicolehaugen — fechado sem integrar
Avaliação
- Dificuldade
- 5/5
- Tempo estimado
- Mais de uma semana
- Facilidade para iniciantes
- 38/100
- Tipo de issue
- Funcionalidade
- Clareza
- Razoavelmente clara
- Status de atividade
- Ativa
- Stack de tecnologia
- python
- Domínio
- cli, documentation, testing, tooling
Direção de pesquisa
Comece pelo schema e pela validação do manifesto da extensão e, em seguida, acompanhe o tratamento de composição em PresetResolver para camadas respaldadas por provenance. Leia extensions/EXTENSION-API-REFERENCE.md e a referência da API/manifesto de presets, e execute os testes existentes de schema e resolver. Considera-se concluído quando IDs determinísticos e relacionamentos lookupId estiverem cobertos para todos os tipos de artefato listados, hooks, built-ins, overrides e casos de compatibilidade.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Problem Statement
Spec Kit identifies contributed commands, templates, scripts, and hooks primarily by name. Names can collide across artifact kinds and source layers, and a name alone cannot reliably link a resolved artifact-stack layer to the exact manifest contribution that supplied it. Consumers such as preset info --json, extension info --json, and specify artifact need stable contribution identifiers and a join key that works across reinstalls and machines.
Proposed Solution
Introduce computed, opaque id fields for every command, template, script, and hook returned by public preset/extension manifest and info APIs, plus a lookupId field on every provenance-backed non-built-in resolved artifact-stack layer.
For named preset, extension, and project-override contributions, derive IDs using:
{layer}:{sourceId}:{kind}:{name}
Use project, preset, or extension for layer; _ only for the project-override source ID; and the preset or extension manifest ID for manifest-declared sources. Use command, template, or script for kind. Examples include preset:speckit.core:command:speckit.plan, extension:speckit.git:template:pr-body, and project:_:template:spec-template.
For hooks, use {eventName}:{command} as the name component. Hooks are valid only for preset and extension layers. If duplicate event/command hook entries are valid, add an appropriate stable discriminator or reject duplicates; do not use array position.
Built-in artifacts do not have an originating manifest contribution and therefore do not receive a contribution lookupId. Every artifact, including built-ins, instead has a source-agnostic public ID of the form {kind}:{name}. Built-in stack rows are recognized by absent provenance fields (layer, sourceId, and lookupId are null), and round-trip through the public artifact ID.
Compute IDs at read, serialization, or resolution time rather than persisting them in authored or installed manifests. For manifest-declared preset and extension layers, lookupId must exactly match the originating contribution's id. Preserve existing name-based behavior and document IDs as opaque strings.
Alternatives Considered
Install-time UUIDs are unsuitable because they differ across machines and reinstalls. Existing names are insufficient because they collide across sources and kinds. Content hashes are unsuitable because IDs would change whenever artifact content is edited. Array indexes are unsuitable for hooks because reordering entries would change their IDs.
A synthetic core:_:... contribution ID was considered for built-in assets. It was rejected because built-ins have no originating preset or extension manifest contribution to join to; the source-agnostic {kind}:{name} artifact ID provides their stable round-trip key without overloading lookupId.
Do not use the existing integration manifest as the ID source; it tracks installed file hashes and paths rather than manifest contribution identity.
Component
Specify CLI (initialization, commands)
AI Agent (if applicable)
No response
Use Cases
- A wizard can read an artifact stack and follow each provenance-backed layer's
lookupIdto the full contribution detail without re-parsing manifests. - Developers on different machines can use identical IDs when reporting or diagnosing a contribution.
- Tooling can hash or cache resolved compositions using public artifact IDs plus the available layer
lookupIdvalues. - Future JSON output for
preset info,extension info, andspecify artifactcan expose consistent cross-references.
Acceptance Criteria
- Document the
layer:sourceId:kind:namecontribution grammar, the source-agnostickind:nameartifact ID, and thelookupIdrelationship inextensions/EXTENSION-API-REFERENCE.mdand the preset API/manifest reference. - Public preset/extension manifest and info representations expose computed
idvalues for commands, templates, scripts, and hooks. - Hook IDs are deterministic and collision-free without install paths or list indexes.
- Manifest-declared preset and extension artifact-stack layers expose
lookupIdequal to the corresponding contribution'sid. - Project-local override layers use the synthetic
project:_:{kind}:{name}lookup form and intentionally have no manifest contribution match. - Built-in artifact-stack layers expose no contribution provenance (
layer,sourceId, andlookupIdare null) and round-trip through the public{kind}:{name}artifact ID. - Identical manifest coordinates produce identical IDs across processes, machines, project locations, and reinstalls.
- Manifest-backed IDs do not depend on artifact contents, timestamps, manifest hashes, archive paths, or installation directories.
- Existing
namefields and name-based resolution remain unchanged. - Tests cover each provenance-backed layer and artifact kind, hook uniqueness, resolver repeatability, manifest lookup round-trips, built-in public-ID round-trips, and backward compatibility.
Additional Context
This request defines the ID contract only. Adding the JSON output surfaces themselves for preset info --json, extension info --json, or specify artifact is out of scope and will be handled separately. Changing precedence, resolution, installation, or uninstall behavior is also out of scope. Relevant implementation areas include the extension manifest schema and validation and PresetResolver composition handling. IDs must not expose install paths, secrets, or connection strings.
- Linguagem predominante
- Python
- Estrelas
- 140k
- Forks
- 12.6k
- Merge médio
- 2d 13h
- PRs com merge (30d)
- 197
Preparar o ambiente
Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de github/spec-kit
-
feature-assess feature-go triage-can-wait
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
github/spec-kit#4804 · 6 comentários ·
Mantenedores costumam responder em até 1 dia
-
needs-triage triage-nice-to-have
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
github/spec-kit#4527 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
[Bug]: specify init writes speckit.manifest.json without the speckit-converge skill it just installedTalvez livre de novo Um pull request para esta issue foi fechado sem ser mesclado. Abertabug-assess severity-medium
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
github/spec-kit#4273 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
-
[Bug]: /speckit-implement counts checkbox markers inside fenced code blocks — example checkboxes can falsely block implementationTalvez já em andamento @ntdatt812 assumiu há 30 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
Mantenedores costumam responder em até 1 dia
-
[Extension]: Jira Integration (Sync Engine) v0.5.0 (version update of jira-sync)Talvez já em andamento @github-actions assumiu há 54 dias. Abertaextension-submission validation-passed
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
github/spec-kit#4099 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
Todas as issues de github/spec-kit
Issues semelhantes
-
enhancement good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
-
python-version
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 88/100
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
Mantenedores costumam responder em até 1 dia
-
bug javascript P2-medium python release:v3.1
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
adrirubio/claude-deck#546 ·
Mantenedores costumam responder em até 1 dia
-
area: desktop area: website priority: P2 type: feature
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
appandflow/stim#3411 · 1 comentário ·
Mantenedores costumam responder em até 1 dia