feat(wfctl): add status + private fields to RegistryManifest#715
Merged
Conversation
- Adds optional Status (verified|experimental|deprecated) to RegistryManifest aligning with workflow-registry schema extension. - Adds Private bool to RegistryManifest mirroring existing manifest.json field (was silently discarded). - Propagates Status through PluginSummary + SearchPlugins callsites so wfctl plugin list and wfctl marketplace search surface the verification status. - Adds enum validation in ValidateManifest. - Updates staticIndexEntry to carry status from index.json. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Adds registry manifest metadata support in wfctl so registry status is validated, propagated through search results, and displayed to users, while preserving the existing private manifest flag during JSON unmarshal.
Changes:
- Added
statusandprivatefields toRegistryManifest, plus status enum validation. - Propagated
statusthrough GitHub/static/mock registry search paths and CLI search output. - Added unit coverage for status validation, private-field unmarshalling, and summary propagation.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
cmd/wfctl/registry_validate.go |
Adds allowed status values and validation errors for invalid status. |
cmd/wfctl/registry_source.go |
Carries status through GitHub and static registry search results. |
cmd/wfctl/plugin_registry.go |
Extends manifest and summary structs with status/private metadata. |
cmd/wfctl/plugin_install.go |
Displays status as a new column in plugin search output. |
cmd/wfctl/multi_registry_test.go |
Adds tests for status validation, private unmarshalling, and status propagation. |
runPluginList was missed in the initial implementation. Status is not persisted to disk on install so renders as "-" for installed plugins, keeping table alignment consistent with marketplace search output. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
⏱ Benchmark Results✅ No significant performance regressions detected. benchstat comparison (baseline → PR)
|
Comment on lines
+473
to
+474
| // Status is not persisted to disk on install; render "-" for installed plugins. | ||
| fmt.Printf("%-20s %-10s %-10s %-14s %s\n", p.name, p.version, p.pluginType, "-", desc) |
TestStaticRegistrySource_SearchPlugins_StatusPropagation uses httptest.NewServer + buildStaticRegistryServer to exercise the `Status: e.Status` line in StaticRegistrySource.SearchPlugins directly, so removal of that line would cause the test to fail. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace mockRegistrySource with a real StaticRegistrySource backed by httptest.NewServer so the test exercises the actual Status: e.Status propagation line in StaticRegistrySource.SearchPlugins. Removing that line now directly fails this test. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
| Type string `json:"type"` | ||
| Tier string `json:"tier"` | ||
| Status string `json:"status,omitempty"` // verified | experimental | deprecated | ||
| Private bool `json:"private,omitempty"` // mirrors manifest.json `private` field |
Comment on lines
+473
to
+474
| // Status is not persisted to disk on install; render "-" for installed plugins. | ||
| fmt.Printf("%-20s %-10s %-10s %-14s %s\n", p.name, p.version, p.pluginType, "-", desc) |
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
intel352
added a commit
to GoCodeAlone/workflow-registry
that referenced
this pull request
May 19, 2026
Preceding commit body listed `agent` in the verified set, but plugins/agent/manifest.json has type=builtin — the population script correctly skipped it per the `type != "external"` guard. The 6-count was always correct; only the parenthetical name list was wrong. Correct verified set (6): audit-chain, digitalocean, eventbus, payments, twilio, workflow-plugin-auth. No manifest files changed; schema validation still passes. Part of 2026-05-19 OSS-readiness QoL sweep. See: GoCodeAlone/workflow#714 See: #53 See: GoCodeAlone/workflow#715 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
intel352
added a commit
to GoCodeAlone/workflow-registry
that referenced
this pull request
May 19, 2026
#54) * feat(registry): populate status field across external plugin manifests Sets status=verified on 6 established plugins (agent, audit-chain, digitalocean, eventbus, payments, twilio, workflow-plugin-auth) and status=experimental on 33 remaining external plugins. Private plugins (waf, security, sandbox, supply-chain, data-protection, authz-ui, cloud-ui, workflow-plugin-supply-chain) left unchanged. Built-in plugin manifests (type != "external") unchanged. Validated against schema/registry-schema.json (draft2020) — all 59 manifests pass. Negative assertion confirms no private-plugin manifests touched. Part of 2026-05-19 OSS-readiness QoL sweep. See: GoCodeAlone/workflow#714 See: #53 See: GoCodeAlone/workflow#715 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(registry): correct verified plugin list in preceding commit body Preceding commit body listed `agent` in the verified set, but plugins/agent/manifest.json has type=builtin — the population script correctly skipped it per the `type != "external"` guard. The 6-count was always correct; only the parenthetical name list was wrong. Correct verified set (6): audit-chain, digitalocean, eventbus, payments, twilio, workflow-plugin-auth. No manifest files changed; schema validation still passes. Part of 2026-05-19 OSS-readiness QoL sweep. See: GoCodeAlone/workflow#714 See: #53 See: GoCodeAlone/workflow#715 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Statusfield (verified|experimental|deprecated) toRegistryManifestGo struct, aligning with the workflow-registry schema extension (Task 2).Private boolfield toRegistryManifestmirroring the existingmanifest.jsonprivatefield that was previously silently discarded on unmarshal.StatusthroughPluginSummaryand allSearchPluginscallsites (GitHubRegistrySource,StaticRegistrySource,mockRegistrySource), making the verification status user-visible inwfctl marketplace searchoutput.ValidateManifest— acceptsverified,experimental,deprecated, rejects anything else.staticIndexEntryto carry astatusfield fromindex.json.TestValidateManifest_StatusEnum,TestRegistryManifest_PrivateField,TestPluginSummary_StatusPropagation.References
docs/plans/2026-05-19-multi-repo-qol-sweep.mdTask 1 (Step B)docs/plans/2026-05-19-multi-repo-qol-sweep-design.mdStep B sectionRollback Note
Revert this PR; existing manifests with
statusfields continue parsing correctly because Go'sencoding/jsonignores unknown fields, butValidateManifestwill accept invalid status values until the validation block returns. If Task 16 (registry manifest population) has already merged, revert Task 16's PR FIRST, then revert this PR.Test plan
go test ./cmd/wfctl/...— all tests pass including 3 new onesgo vet ./cmd/wfctl/...— no outputgo build ./cmd/wfctl— exits 0🤖 Generated with Claude Code