c53f699714
- go plugin backends ship as release tarballs (per-platform binaries, checksums) that kandev installs from url/upload or filesystem sideload+sync, then spawns and supervises via hashicorp/go-plugin (unix socket / loopback tcp+automtls) - strict typed grpc contract (kandev.plugin.v1): DeliverEvent/InvokeTool/HandleWebhook plus a capability-gated host service (state, secrets, emit); author sdk in pkg/pluginsdk; packaging cli in cmd/plugin-pack - native frontend bundles: window.registerKandevPlugin + registry/host loader with dynamic routes, nav items, slots and ws handlers; plugins settings page with install dialog, sync button and enable/disable/uninstall - gated behind the plugins feature flag (prod off, dev/e2e on); covered by unit and integration tests plus playwright e2e against a real packaged fixture plugin Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2.7 KiB
2.7 KiB
id, title, status, wave, depends_on, plan
| id | title | status | wave | depends_on | plan |
|---|---|---|---|---|---|
| task-10 | plugins feature flag (backend + frontend plumbing) | done | A | docs/plans/plugins/plan.md |
plugins feature flag
Title
Add a plugins feature flag across profiles.yaml, backend config, the runtime
flag registry, and the frontend feature-flag types — default prod OFF, dev/e2e ON.
Inputs
- Pattern reference (
officeflag):docs/decisions/0007-runtime-feature-flags.md. Concrete touch points found in repo:profiles.yamlfeatures:block (KANDEV_FEATURES_OFFICEwith prod/dev/e2e).apps/backend/internal/common/config/config.go:174FeaturesConfig(addPlugins bool mapstructure:"plugins" json:"plugins") + defaults (~line 333).apps/backend/internal/runtimeflags/config.go:31("features.plugins": cfg.Features.Pluginsmap entry + the apply switch ~line 40).apps/backend/internal/runtimeflags/registry.go(add a registry entry mirroring thefeatures.officeentry: Keyfeatures.plugins, Label, Description, Risk).- Frontend:
apps/web/lib/state/slices/features/types.ts(FeatureFlagsaddplugins: boolean),features-slice.ts(defaultplugins: false),apps/web/app/actions/features.ts/lib/api/domains/features-api.ts/ boot payload mapping if features are hydrated there (grepofficeto find every site and addpluginsalongside). - Backend boot payload that ships features to the SPA (grep
Features.Officeininternal/webapp/).
Acceptance
KANDEV_FEATURES_PLUGINSin profiles.yaml: prod"false", dev"true", e2e"true".FeaturesConfig.Pluginsparsed; default false.- Runtime flag registry entry present (togglable in Settings > System).
- Frontend
FeatureFlags.pluginstyped + defaulted false + hydrated from backend whereverofficeis. - Existing feature tests updated; add a slice test asserting default
plugins: false.
Files
profiles.yamlapps/backend/internal/common/config/config.goapps/backend/internal/runtimeflags/config.go,registry.goapps/backend/internal/webapp/payload.go(+ wherever office feature is mapped)apps/web/lib/state/slices/features/types.ts,features-slice.ts,features-slice.test.tsapps/web/app/actions/features.ts,apps/web/lib/api/domains/features-api.ts(as grep reveals)
Verification
go test ./internal/runtimeflags/... ./internal/common/config/... ./internal/webapp/...(apps/backend)cd apps/web && pnpm run typecheck && pnpm test -- features
Output contract
Report: every file touched, and confirm office-parallel sites all got a plugins
sibling (list them). Do not implement the settings page (task-12).
Dependencies
None. (task-09 may add the Plugins config field first; if present, don't duplicate.)