178 lines
6.8 KiB
Go
178 lines
6.8 KiB
Go
package helpers
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/corecmd/contract"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func newSheetVersionCmd() *cobra.Command {
|
|
versionCmd := &cobra.Command{
|
|
Use: "version",
|
|
Short: "表格历史版本管理",
|
|
Long: `管理钉钉在线电子表格的历史版本:手动保存、查看版本列表、回滚到指定版本。`,
|
|
RunE: groupRunE,
|
|
}
|
|
|
|
versionSaveCmd := &cobra.Command{
|
|
Use: "save",
|
|
Short: "手动保存表格版本快照",
|
|
Example: ` dws sheet version save --node SHEET_ID`,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
nodeID, err := mustFlagOrFallback(cmd, "node", "url", "id", "node-id", "doc-id", "file-id")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return callMCPToolOnServer("doc", "save_doc_version", map[string]any{
|
|
"nodeId": nodeID,
|
|
})
|
|
},
|
|
}
|
|
DeclareLeafMetadata(versionSaveCmd, LeafSpec{
|
|
Safety: contract.SafetySpec{
|
|
Effect: "write", Risk: "low",
|
|
Confirmation: "not_required", Idempotency: "non_idempotent",
|
|
},
|
|
Contract: LeafContract{
|
|
Identity: contract.ToolIdentitySpec{
|
|
ProductID: "sheet",
|
|
Name: "version_save",
|
|
CanonicalPath: "sheet.version_save",
|
|
CLIPath: "sheet version save",
|
|
PrimaryCLIPath: "sheet version save",
|
|
},
|
|
Description: "手动保存表格版本快照",
|
|
Interface: &contract.InterfaceSpec{
|
|
Mode: "composite",
|
|
Availability: "available",
|
|
Reason: "Reviewed unpinned remote adapter: this executable CLI wrapper calls a remote helper that is absent from the pinned MCP metadata snapshot; no single pinned semantically equivalent interface_ref can represent the command.",
|
|
},
|
|
Selection: contract.SelectionSpec{
|
|
AgentSummary: "手动保存表格版本快照",
|
|
UseWhen: []string{"用户说 保存版本/存个快照,目标是在线表格"},
|
|
AvoidWhen: []string{"回滚用 version revert;查看历史用 version list"},
|
|
Examples: []string{"dws sheet version save --node <SHEET_ID> --format json"},
|
|
},
|
|
},
|
|
})
|
|
versionSaveCmd.Flags().String("node", "", "表格文档 ID 或 URL (必填)")
|
|
|
|
versionListCmd := &cobra.Command{
|
|
Use: "list",
|
|
Aliases: []string{"ls"},
|
|
Short: "查看表格历史版本列表",
|
|
Example: ` dws sheet version list --node SHEET_ID
|
|
dws sheet version list --node SHEET_ID --limit 10`,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
nodeID, err := mustFlagOrFallback(cmd, "node", "url", "id", "node-id", "doc-id", "file-id")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
toolArgs := map[string]any{"nodeId": nodeID}
|
|
if v, _ := cmd.Flags().GetInt("limit"); v > 0 {
|
|
toolArgs["maxResults"] = v
|
|
}
|
|
if v := flagOrFallback(cmd, "cursor", "page-token", "next-token"); v != "" {
|
|
toolArgs["nextCursor"] = v
|
|
}
|
|
return callMCPToolOnServer("doc", "list_doc_versions", toolArgs)
|
|
},
|
|
}
|
|
DeclareLeafMetadata(versionListCmd, LeafSpec{
|
|
Safety: contract.SafetySpec{
|
|
Effect: "read", Risk: "low",
|
|
Confirmation: "not_required", Idempotency: "idempotent",
|
|
},
|
|
Contract: LeafContract{
|
|
Identity: contract.ToolIdentitySpec{
|
|
ProductID: "sheet",
|
|
Name: "version_list",
|
|
CanonicalPath: "sheet.version_list",
|
|
CLIPath: "sheet version list",
|
|
PrimaryCLIPath: "sheet version list",
|
|
},
|
|
Description: "查看表格历史版本列表",
|
|
Interface: &contract.InterfaceSpec{
|
|
Mode: "composite",
|
|
Availability: "available",
|
|
Reason: "Reviewed unpinned remote adapter: this executable CLI wrapper calls a remote helper that is absent from the pinned MCP metadata snapshot; no single pinned semantically equivalent interface_ref can represent the command.",
|
|
},
|
|
Selection: contract.SelectionSpec{
|
|
AgentSummary: "查看表格历史版本列表",
|
|
UseWhen: []string{"用户说 看历史版本/版本列表,目标是在线表格"},
|
|
AvoidWhen: []string{"回滚用 version revert"},
|
|
Examples: []string{"dws sheet version list --node <SHEET_ID> --limit 10 --format json"},
|
|
},
|
|
},
|
|
})
|
|
versionListCmd.Flags().String("node", "", "表格文档 ID 或 URL (必填)")
|
|
versionListCmd.Flags().Int("limit", 0, "返回版本数量上限")
|
|
versionListCmd.Flags().String("cursor", "", "分页游标")
|
|
|
|
versionRevertCmd := &cobra.Command{
|
|
Use: "revert",
|
|
Short: "[危险] 回滚表格到指定版本",
|
|
Example: ` dws sheet version revert --node SHEET_ID --version 3 --yes`,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
nodeID, err := mustFlagOrFallback(cmd, "node", "url", "id", "node-id", "doc-id", "file-id")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !cmd.Flags().Changed("version") {
|
|
return fmt.Errorf("flag --version is required")
|
|
}
|
|
version, _ := cmd.Flags().GetInt("version")
|
|
return callMCPToolOnServer("doc", "revert_doc_version", map[string]any{
|
|
"nodeId": nodeID,
|
|
"version": version,
|
|
})
|
|
},
|
|
}
|
|
DeclareLeafMetadata(versionRevertCmd, LeafSpec{
|
|
Safety: contract.SafetySpec{
|
|
Effect: "write", Risk: "medium",
|
|
Confirmation: "user_required", Idempotency: "non_idempotent",
|
|
},
|
|
Contract: LeafContract{
|
|
Identity: contract.ToolIdentitySpec{
|
|
ProductID: "sheet",
|
|
Name: "version_revert",
|
|
CanonicalPath: "sheet.version_revert",
|
|
CLIPath: "sheet version revert",
|
|
PrimaryCLIPath: "sheet version revert",
|
|
},
|
|
Description: "回滚表格到指定历史版本",
|
|
Interface: &contract.InterfaceSpec{
|
|
Mode: "composite",
|
|
Availability: "available",
|
|
Reason: "Reviewed unpinned remote adapter: this executable CLI wrapper calls a remote helper that is absent from the pinned MCP metadata snapshot; no single pinned semantically equivalent interface_ref can represent the command.",
|
|
},
|
|
Selection: contract.SelectionSpec{
|
|
AgentSummary: "回滚表格到指定历史版本",
|
|
UseWhen: []string{"用户说 回滚到某个版本/恢复到之前的表格"},
|
|
AvoidWhen: []string{"普通文件回滚用 drive revert;在线文档用 doc version revert"},
|
|
Examples: []string{"dws sheet version revert --node <SHEET_ID> --version 3 --format json"},
|
|
},
|
|
},
|
|
})
|
|
versionRevertCmd.Flags().String("node", "", "表格文档 ID 或 URL (必填)")
|
|
versionRevertCmd.Flags().Int("version", 0, "目标版本号 (必填,从 list 获取)")
|
|
|
|
for _, c := range []*cobra.Command{versionSaveCmd, versionListCmd, versionRevertCmd} {
|
|
c.Flags().String("url", "", "")
|
|
c.Flags().String("id", "", "")
|
|
c.Flags().String("node-id", "", "")
|
|
c.Flags().String("doc-id", "", "")
|
|
c.Flags().String("file-id", "", "")
|
|
_ = c.Flags().MarkHidden("url")
|
|
_ = c.Flags().MarkHidden("id")
|
|
_ = c.Flags().MarkHidden("node-id")
|
|
_ = c.Flags().MarkHidden("doc-id")
|
|
_ = c.Flags().MarkHidden("file-id")
|
|
}
|
|
|
|
versionCmd.AddCommand(versionSaveCmd, versionListCmd, versionRevertCmd)
|
|
return versionCmd
|
|
}
|