mirror of
https://github.com/go-vikunja/vikunja.git
synced 2026-07-16 23:11:04 -05:00
Closed
opened 2026-04-23 09:13:55 -05:00 by GiteaMirror
·
0 comments
No Branch/Tag Specified
main
renovate/tar-7.x
renovate/postcss-8.x
renovate/pnpm
renovate/major-dev-dependencies
fix-subtask-root-null-safety
renovate/crowdin-github-action-2.x
renovate/postgres-18
renovate/actions-setup-node-6.x
renovate/github.com-labstack-echo-v5-5.x
claude/task-event-field-changes-ws73g2
renovate/github.com-labstack-echo-jwt-v5-5.x
renovate/marked-18.x
pr-swarm-assets
feat-mcp
feat-audit-sinks
claude/per-user-feature-toggles-vqlg8x
docs-v2-query-param
feat-project-templates
claude/veans-question-xBFkq
spike-huma-openapi3
claude/investigate-swagger3-support-nyyUa
feat-list-view-buckets
ci-mysql-8-test
codex/analyze-codebase-for-email-task-feature
csv-import-feature
claude/email-reply-comments-wpdcQ
fix-oidc-pkce-support
fix/overview-subtasks-expand
feat/bucket-select-task-detail
feat-soft-delete-projects
claude/review-bot-design-plan-cf5C3
claude/project-scoped-api-tokens-KTqR3
claude/explore-openclaw-integration-KQEzg
claude/project-scoped-api-tokens-yv5KS
fix-duplicate-close-button
feat-list-view-sorting
feat/official-vite-sentry-plugin
feat/highlight-overdue-tasks
feat/add-enter-key-form-submission-handling
feat/TipTap-nits
feat/update-caldavtimetotimestamp-parsing
feat-phosphor-icons
wip-plans
claude/investigate-issue-2173-llKme
fix-description-text-drag
feat-custom-keyboard-shortcuts
pr-1845-ci
codex/fix-drag-and-drop-behavior-inconsistency
copilot/add-clickable-labels-for-filtering
copilot/fix-issue-1786
playwright-migration
fix-kanban-repeating-wip
copilot/fix-1498
feature/replace-axios
codex/upgrade-to-tailwind-4.1.8-using-pnpm
codex/add-cypress-test-for-avatar-types
feature/biome
feature/oxc
codex/update-flexsearch-to-0.8.205
4r6ni9-codex/fix-deprecated-sass-@import-usage
codex/fix-deprecated-sass-@import-usage
codex/add-cypress-test-for-task-list-refresh-fix
codex/fix-quick-add-magic-not-adding-tasks
codex/fix-all-type-errors
codex/fix-mimetype-for-docs.json
feature/caldav-from-scratch
feature/gh-actions-hetzner
fix-ci
feat/new-logger
jyte-better-dev-config
feat/add-team-member-with-enter
fix/button-and-icon-types
fix/notifications-component-name-collision
feature/null-time
renovate/tailwindcss-4.x
feature/unplugin-vue-router
fix/deprecated-import
feature/zod-schema
renovate/golangci-golangci-lint-1.x
fix/tiptap-editor-reactive-destructuring
release/0.24
feat/improve-add-task
fix/saved-filter-search
feat/webp-and-avif-attachment-previews
feature/migrate-back-to-bulma
fix/sass-add-missing-list-import
feature/sticky-demo-bar
fix/gantt-view-switch
feature/typesense-position-join
feature/focus-visible
dependencies/golangci-lint
feature/better-filter-syntax
fix/tiptap-task-list
renovate/github.com-golang-jwt-jwt-v4-5.x
feature/hide-forbidden-related-tasks
renovate/golang-1.x
release/0.20
release/0.17
release/0.16
release/0.15
release/0.14
v2.3.0
v2.2.2
v2.2.1
v2.2.0
v2.1.0
v2.0.0
v1.1.0
v1.0.0
v1.0.0-rc4
v1.0.0-rc3
v1.0.0-rc2
v1.0.0-rc1
v1.0.0-rc0
v0.24.6
v0.24.5
v0.24.4
v0.24.3
v0.24.2
v0.24.1
v0.24.0
v0.23.0
v0.22.1
v0.22.0
0.21.0
v0.21.0
v0.20.4
v0.20.5
v0.20.3
v0.20.2
v0.20.1
v0.20.0
v0.19.2
v0.19.1
v0.19.0
vue3
v0.18.1
v0.18.0
v0.17.1
v0.17.0
v0.16.1
v0.16.0
v0.15.1
v0.15.0
v0.14.1
v0.14.0
v0.13.1
v0.13
v0.12
v0.11
v0.10
v0.9
v0.8
v0.7
v0.6
v0.5
v0.4
v0.3
v0.2
v0.1
Labels
Clear labels
area/api
area/attachments
area/auth
area/avatars
area/backup-restore
area/caldav
area/calendar-view
area/comments
area/config
area/database
area/desktop
area/docker
area/email
area/favorites
area/filters
area/frontend
area/gantt
area/i18n
area/import-export
area/internal-code
area/kanban
area/labels
area/list-view
area/mobile
area/notifications
area/permissions
area/projects
area/pwa
area/recurring-tasks
area/reminders
area/search
area/shortcuts
area/subtasks
area/sync
area/table-view
area/task-editor
area/task-metadata
area/task-relations
area/teams
area/theming
area/time-tracking
area/typesense
area/views
area/webhooks
bug
changes requested
concern/accessibility
concern/performance
concern/regression
concern/ux
confirmed
db/mysql
dependencies
enhancement
good first issue
help wanted
integration/inbound
integration/outbound
kind/bug
kind/feature
needs reproduction
pull-request
question
security
support
upstream issue
waiting for reply
wontfix
Mirrored from GitHub Pull Request
No Label
pull-request
Milestone
No items
No Milestone
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: github-starred/vikunja#9819
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/go-vikunja/vikunja/pull/2178
Author: @kolaente
Created: 1/29/2026
Status: ✅ Merged
Merged: 3/30/2026
Merged by: @kolaente
Base:
main← Head:poc-yaegi-plugins📝 Commits (7)
a64da15feat(plugins): add plugin system interfaces and manager2330a2dfeat(plugins): add plugin config optionsa347192feat(plugins): extract vikunja package symbols for yaegi92102c8feat(plugins): extract third-party symbols for yaegif0a03b4feat(plugins): add yaegi interpreter-based plugin loadercf633fafeat(plugins): add example plugin4e28a1etest(plugins): add yaegi plugin integration tests📊 Changes
22 files changed (+1738 additions, -9 deletions)
View changed files
📝
.golangci.yml(+2 -0)📝
config-raw.json(+5 -0)📝
examples/plugins/example/main.go(+13 -1)📝
go.mod(+1 -0)📝
go.sum(+2 -0)📝
pkg/config/config.go(+6 -0)📝
pkg/initialize/init.go(+1 -0)📝
pkg/plugins/manager.go(+64 -8)➕
pkg/plugins/yaegi/events_test.go(+48 -0)➕
pkg/plugins/yaegi/loader.go(+118 -0)➕
pkg/plugins/yaegi/loader_test.go(+70 -0)➕
pkg/plugins/yaegi/routes_test.go(+63 -0)➕
pkg/yaegi_symbols/echo.go(+285 -0)➕
pkg/yaegi_symbols/stdlib_check_test.go(+26 -0)➕
pkg/yaegi_symbols/symbols.go(+8 -0)➕
pkg/yaegi_symbols/vikunja_db.go(+37 -0)➕
pkg/yaegi_symbols/vikunja_events.go(+49 -0)➕
pkg/yaegi_symbols/vikunja_log.go(+40 -0)➕
pkg/yaegi_symbols/vikunja_models.go(+516 -0)➕
pkg/yaegi_symbols/vikunja_plugins.go(+118 -0)...and 2 more files
📄 Description
Summary
Proof-of-concept for a Yaegi-based plugin system as an alternative to Go's native
pluginpackage (.soshared libraries).Why Yaegi instead of Go's native plugins?
Go's native plugin system (
-buildmode=plugin) has significant limitations:Yaegi is a Go interpreter that loads
.gosource files at runtime, avoiding all of the above. The trade-off is slower execution (interpreted, not compiled), but for plugin hooks this is generally acceptable.Key difference: typed factory functions
With native Go plugins, you export a single
NewPlugin() plugins.Pluginfactory and then type-assert the result to discover additional capabilities:Yaegi wraps interpreted values per their declared return type, which breaks sub-interface type assertions. So with Yaegi, plugins must export separate typed factory functions for each capability:
Only
NewPlugin()is required. The others are optional and discovered by the loader.Plugin capabilities
PluginInit()/Shutdown()hooksAuthenticatedRouterPlugin/api/v1/plugins/*(behind auth)UnauthenticatedRouterPlugin/plugins/*(no auth, rate-limited)MigrationPluginevents.RegisterListener()inInit()TaskCreatedEvent)Plugins also have access to Vikunja internals:
db.NewSession(),user.GetCurrentUserFromDB(),log.Infof(), all model types, etc.Writing a plugin
See
examples/plugins/example/main.gofor a complete example. The key points:mainplugins.Plugin(required) plus any optional interfacesInit(), register event listeners viaevents.RegisterListener()Configuration
The
plugins.loadervalue is validated at startup — invalid values cause a fatal error.native(default): scansplugins.dirfor.soshared library files. Plugins must be compiled with the exact same Go version and dependencies as the Vikunja binary.yaegi: scansplugins.dirfor subdirectories containing.gosource files. Plugins are interpreted at runtime — no compilation step needed.Known limitations
.gofiles individually viaEval()rather than using yaegi'sEvalPath(). This means multi-file plugins may hit order-dependency issues if cross-file declarations depend on filename ordering.EvalPath()would solve this, but it doesn't supportmain.NewPluginsymbol lookup forpackage main— yaegi resolves the package name from the import path rather than thepackagedeclaration. A future fix could either use a non-main package convention or find a workaround forEvalPathsymbol resolution.Files
pkg/plugins/interfaces.go— plugin interface definitionspkg/plugins/manager.go— plugin manager, loads plugins via configured loaderpkg/plugins/yaegi/loader.go— Yaegi-based interpreter loaderpkg/yaegi_symbols/— generated symbol tables exposing Vikunja internals to interpreted codeexamples/plugins/example/main.go— example plugin🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.