瀏覽代碼

feat: add permission editor

Yeuoly 8 月之前
父節點
當前提交
5349e3ebda

+ 11 - 0
cmd/commandline/plugin.go

@@ -18,6 +18,16 @@ var (
 		},
 		},
 	}
 	}
 
 
+	pluginEditPermissionCommand = &cobra.Command{
+		Use:   "permission [plugin_path]",
+		Short: "Edit permission",
+		Long:  "Edit permission",
+		Args:  cobra.ExactArgs(1),
+		Run: func(cmd *cobra.Command, args []string) {
+			plugin.EditPermission(args[0])
+		},
+	}
+
 	pluginPackageCommand = &cobra.Command{
 	pluginPackageCommand = &cobra.Command{
 		Use:   "package [plugin_path]",
 		Use:   "package [plugin_path]",
 		Short: "Package",
 		Short: "Package",
@@ -150,6 +160,7 @@ func init() {
 	pluginCommand.AddCommand(pluginInitCommand)
 	pluginCommand.AddCommand(pluginInitCommand)
 	pluginCommand.AddCommand(pluginPackageCommand)
 	pluginCommand.AddCommand(pluginPackageCommand)
 	pluginCommand.AddCommand(pluginChecksumCommand)
 	pluginCommand.AddCommand(pluginChecksumCommand)
+	pluginCommand.AddCommand(pluginEditPermissionCommand)
 	pluginCommand.AddCommand(pluginModuleCommand)
 	pluginCommand.AddCommand(pluginModuleCommand)
 	pluginModuleCommand.AddCommand(pluginModuleListCommand)
 	pluginModuleCommand.AddCommand(pluginModuleListCommand)
 	pluginModuleCommand.AddCommand(pluginModuleAppendCommand)
 	pluginModuleCommand.AddCommand(pluginModuleAppendCommand)

+ 66 - 0
cmd/commandline/plugin/permission.go

@@ -2,12 +2,16 @@ package plugin
 
 
 import (
 import (
 	"fmt"
 	"fmt"
+	"os"
+	"path/filepath"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
 
 
 	ti "github.com/charmbracelet/bubbles/textinput"
 	ti "github.com/charmbracelet/bubbles/textinput"
 	tea "github.com/charmbracelet/bubbletea"
 	tea "github.com/charmbracelet/bubbletea"
+	"github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/decoder"
 	"github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
 	"github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
+	"github.com/langgenius/dify-plugin-daemon/internal/utils/log"
 )
 )
 
 
 var permissionKeySeq = []string{
 var permissionKeySeq = []string{
@@ -287,3 +291,65 @@ func (p permission) Update(msg tea.Msg) (subMenu, subMenuEvent, tea.Cmd) {
 func (p permission) Init() tea.Cmd {
 func (p permission) Init() tea.Cmd {
 	return nil
 	return nil
 }
 }
+
+// TODO: optimize implementation
+type permissionModel struct {
+	permission
+}
+
+func (p permissionModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
+	m, subMenuEvent, cmd := p.permission.Update(msg)
+	p.permission = m.(permission)
+	if subMenuEvent == SUB_MENU_EVENT_NEXT {
+		return p, tea.Quit
+	}
+	return p, cmd
+}
+
+func (p permissionModel) View() string {
+	return p.permission.View()
+}
+
+func EditPermission(pluginPath string) {
+	plugin, err := decoder.NewFSPluginDecoder(pluginPath)
+	if err != nil {
+		log.Error("decode plugin failed, error: %v", err)
+		os.Exit(1)
+		return
+	}
+
+	manifest, err := plugin.Manifest()
+	if err != nil {
+		log.Error("get manifest failed, error: %v", err)
+		os.Exit(1)
+		return
+	}
+
+	// create a new permission
+	m := permissionModel{
+		permission: newPermission(),
+	}
+	m.permission.permission = *manifest.Resource.Permission
+
+	p := tea.NewProgram(m)
+	if result, err := p.Run(); err != nil {
+		fmt.Println("Error running program:", err)
+	} else {
+		if m, ok := result.(permissionModel); ok {
+			// save the manifest
+			manifestPath := filepath.Join(pluginPath, "manifest.yaml")
+			manifest.Resource.Permission = &m.permission.permission
+			if err := writeFile(
+				manifestPath,
+				string(marshalYamlBytes(manifest.PluginDeclarationWithoutAdvancedFields)),
+			); err != nil {
+				log.Error("write manifest failed, error: %v", err)
+				os.Exit(1)
+				return
+			}
+		} else {
+			log.Error("Error running program:", err)
+			return
+		}
+	}
+}

+ 3 - 3
internal/types/entities/plugin_entities/plugin_declaration.go

@@ -139,16 +139,16 @@ type PluginExtensions struct {
 type PluginDeclarationWithoutAdvancedFields struct {
 type PluginDeclarationWithoutAdvancedFields struct {
 	Version     manifest_entities.Version          `json:"version" yaml:"version,omitempty" validate:"required,version"`
 	Version     manifest_entities.Version          `json:"version" yaml:"version,omitempty" validate:"required,version"`
 	Type        manifest_entities.DifyManifestType `json:"type" yaml:"type,omitempty" validate:"required,eq=plugin"`
 	Type        manifest_entities.DifyManifestType `json:"type" yaml:"type,omitempty" validate:"required,eq=plugin"`
-	Description I18nObject                         `json:"description" yaml:"description" validate:"required"`
-	Label       I18nObject                         `json:"label" yaml:"label" validate:"required"`
 	Author      string                             `json:"author" yaml:"author,omitempty" validate:"omitempty,max=64"`
 	Author      string                             `json:"author" yaml:"author,omitempty" validate:"omitempty,max=64"`
 	Name        string                             `json:"name" yaml:"name,omitempty" validate:"required,max=128"`
 	Name        string                             `json:"name" yaml:"name,omitempty" validate:"required,max=128"`
+	Label       I18nObject                         `json:"label" yaml:"label" validate:"required"`
+	Description I18nObject                         `json:"description" yaml:"description" validate:"required"`
 	Icon        string                             `json:"icon" yaml:"icon,omitempty" validate:"required,max=128"`
 	Icon        string                             `json:"icon" yaml:"icon,omitempty" validate:"required,max=128"`
-	CreatedAt   time.Time                          `json:"created_at" yaml:"created_at,omitempty" validate:"required"`
 	Resource    PluginResourceRequirement          `json:"resource" yaml:"resource,omitempty" validate:"required"`
 	Resource    PluginResourceRequirement          `json:"resource" yaml:"resource,omitempty" validate:"required"`
 	Plugins     PluginExtensions                   `json:"plugins" yaml:"plugins,omitempty" validate:"required"`
 	Plugins     PluginExtensions                   `json:"plugins" yaml:"plugins,omitempty" validate:"required"`
 	Meta        PluginMeta                         `json:"meta" yaml:"meta,omitempty" validate:"required"`
 	Meta        PluginMeta                         `json:"meta" yaml:"meta,omitempty" validate:"required"`
 	Tags        []manifest_entities.PluginTag      `json:"tags" yaml:"tags,omitempty" validate:"omitempty,dive,plugin_tag,max=128"`
 	Tags        []manifest_entities.PluginTag      `json:"tags" yaml:"tags,omitempty" validate:"omitempty,dive,plugin_tag,max=128"`
+	CreatedAt   time.Time                          `json:"created_at" yaml:"created_at,omitempty" validate:"required"`
 }
 }
 
 
 func (p *PluginDeclarationWithoutAdvancedFields) UnmarshalJSON(data []byte) error {
 func (p *PluginDeclarationWithoutAdvancedFields) UnmarshalJSON(data []byte) error {