* feat: add plugin system with grpc runtime and native ui plugins - 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> * fix(plugins): hydrate base app context on plugin routes Plugin-owned SPA routes classify as RouteUnknown, so the boot payload shipped only feature flags — no workspaces, workflows, or kanban context. Native plugin UI (e.g. host.ui.TaskCreateDialog) then had an empty store. Hydrate the same base context as the Home route for unknown SPA routes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(plugins): expose TaskCreateDialog on host.ui Lets a native plugin open kandev's real create-task modal (prefilled via initialValues) instead of POSTing directly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(plugins): harden filesystem/URL sinks against CodeQL findings Add sink-level guards on the plugin trust boundary: securejoin containment on archive extraction (zip-slip), plugin-id validation before every fs_store path, http/https scheme validation on install-from-URL, and non-interpolated ws-handler error logging. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(plugins): address review findings (races, resource caps, lifecycle) - serialize per-plugin startup to close a TOCTOU double-spawn race, and let a plugin restart after exhausting attempts - bound plugin startup with an explicit 30s timeout - reject backslash paths and cap decompressed bytes by actual size in pkgtar; only mark a package Signed when a verifier actually ran and passed - delete plugin_state on uninstall; validate webhook keys against the manifest and cap webhook body size; restart an active plugin when a new version installs Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(plugins): sanitize plugin-id path sinks for CodeQL Pin the plugin id to a single path segment with filepath.Base at recordPath/ configPath and pkgtar.Remove — a barrier the taint analysis recognizes. Behaviour-identical for valid ids (already validated by safePluginID); clears the go/path-injection alerts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(plugins): inline plugin-id validation at path sinks for CodeQL filepath.Base does not strip '..', so it is not a path-injection barrier. Call the recognized safePluginID / id-pattern guard inline in Delete/GetConfig/ SetConfig and pkgtar.Remove — the same barrier that already cleared the Get sink. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(plugins): address code-review findings (backend) - add capability-gating tests for the Host RPC service (was untested) - close a stop-during-start orphan race so Disable/Uninstall can't leave a supervised subprocess behind - on failed upgrade, remove only the new version dir (not all versions + data); restart the prior version - validate manifest version and reject ids ending in .config (record-file alias) - make Deliverer.Refresh non-blocking and cancel in-flight delivery on worker stop - clamp out-of-range webhook status, skip-and-warn corrupt records in List, write records atomically, semver-aware sideload version pick Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(plugins): address code-review findings (frontend) - wrap plugin routes + settings routes in a shared PluginErrorBoundary so a throwing plugin page shows a fallback instead of white-screening the SPA - fix disable/re-enable in one session: keep the cached registration and re-run initialize instead of relying on a cached ES-module re-import - prefix root-relative bundle/style URLs with apiBaseUrl (split-origin/Tauri) - surface partial-install warnings via toast.warning instead of a bare success - dedupe/remove injected style links on unload; gate PluginNavItems on the flag Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(plugins): serialize per-plugin lifecycle + guard config writes - add a per-plugin keyed lock in Service so concurrent Enable/Disable/Install/ Uninstall/UpdateConfig for one id are serialized (no status-machine race) - take s.mu in SetConfig/GetConfig and write config atomically - bound each plugin initialize() with a timeout so one hung bundle can't stall the rest of the boot load Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test(plugins): split service_test.go to satisfy file-length lint Move the install/URL test group into service_install_test.go; no logic change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci: build and ship the e2e fixture plugin package to E2E shards The plugin E2E specs' global-setup requires apps/backend/.build/kandev-plugin-e2e-1.0.0.tar.gz. Build it in the E2E build job, upload it as an artifact, and download it in both the regular and container shard jobs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Kandev Agent <agent@kandev.dev> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
6.4 KiB
Feature Specs
Specs for kandev product features, grouped by umbrella. Each spec describes a user-invocable capability and is the source of truth for "is this feature done?"
The bar: an agent given only a spec (no source code) should be able to either reimplement the feature or test the existing system for conformance. See .agents/skills/spec/SKILL.md for the workflow and template.
Status: draft (being written) · building (in active development) · shipped (implemented, spec matches code) · archived (deprecated).
needs-upgrade in a spec's frontmatter flags template sections that the original sources did not cover and should be filled in from code (Data model, API surface, State machine, Permissions, Failure modes, Persistence guarantees). All office specs have been brought to the implementability bar; this flag is only used for newly-drafted specs that need a code-driven fill-in pass.
office/ — autonomous agent management
The office umbrella covers kandev's autonomous-agent product surface: workspaces of long-running agents that pick up tasks, coordinate via handoffs, and report through a dashboard.
| Spec | Status |
|---|---|
| overview | draft |
| agents | draft |
| tasks | draft |
| scheduler | draft |
| runtime | draft |
| routing | draft |
| costs | in-progress |
| dashboard | draft |
| live-updates | draft |
| inbox | draft |
| assistant | draft |
| automations-settings | draft |
| testing | shipped |
platform/ — cross-cutting capabilities
Product-wide capabilities that are not tied to a single feature area.
| Spec | Status |
|---|---|
| plugins | draft |
tasks/ — task & workflow model
Kandev's task model: documents, execution stages, labels, blocker escalation, subtask checklists, subtree controls, and the unification with the workflow engine.
| Spec | Status |
|---|---|
| documents | shipped |
| execution-stages | shipped |
| labels | shipped |
| model-unification | draft |
| without-repositories | draft |
| subtask-checklist | shipped |
| subtask-completion-trigger | draft |
| subtree-controls | shipped |
| blocked-task-escalation | draft |
| runtime-cleanup | draft |
| archive-confirmation | shipped |
| link-existing-task-github-issue | building |
| wip-limit-pull-system | building |
| multi-branch | shipped |
| quick-chat-expiration | draft |
| quick-chat-repository-context | shipped |
| parent-child-message-interrupt | shipped |
agents/ — agent governance
Roles, governance gates, and granular permissions that apply across human users and office agents.
| Spec | Status |
|---|---|
| roles | shipped |
| governance | shipped |
| granular-permissions | draft |
integrations/ — external service integrations
Per-workspace credentials and triage triggers for external services.
| Spec | Status |
|---|---|
| slack | shipped |
| external-mcp | draft |
| gitlab-integration | shipped |
| jira-status-filter | shipped |
workspaces/ — workspace lifecycle
| Spec | Status |
|---|---|
| deletion | shipped |
costs/ — cost tracking & budgets
Subscription quota tracking and per-agent cheap-model profile routing.
| Spec | Status |
|---|---|
| subscription-usage | draft |
| cheap-model-profiles | shipped |
ui/ — cross-cutting UI features
| Spec | Status |
|---|---|
| ci-pr-automation | draft |
| comment-markdown | shipped |
| empty-turn-notice | shipped |
| acp-shell-command-output | shipped |
| review-file-status | building |
| slash-command-composer | shipped |
system-page/ — operational diagnostics & maintenance UI
System pages (Radarr/Sonarr-style) for status, disk usage, database maintenance, backups, logs, updates, OSS licenses, and about.
| Spec | Status |
|---|---|
| system-page | draft |
| feature-toggles | draft |
Standalone
| Spec | Status |
|---|---|
| improve-kandev | draft |
| homebrew-core | draft |
| native-kandev-cli | draft |
| desktop-tauri-app | shipped |
| public-share-links | draft |
| ssh-executor | draft |
| cli-mode-parity | draft |
Conventions
- Spec layout. Umbrella specs live as flat
.mdfiles under the umbrella directory (docs/specs/office/agents.md). Standalone specs use a folder (docs/specs/improve-kandev/spec.md). - Plans are not specs. Implementation plans are committed under
docs/plans/<feature>/with individual sibling task files namedtask-<NN>-<short-slug>.md. Specs are the durable requirements; plans and task files are implementation records for the current buildout. - Bug fixes are not specs. Bugs produce a regression test plus an ADR if they encoded a new convention. See
/fixskill. - Architecture decisions are not specs. ADRs live under
docs/decisions/. See/record decision.
Cross-references
- ADRs:
../decisions/INDEX.md - Spec workflow:
.agents/skills/spec/SKILL.md - Bug-fix workflow:
.agents/skills/fix/SKILL.md