From b72117997449f09c6ac5e2ddefd4c57e6e18dc19 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 26 May 2026 02:13:46 +0000 Subject: [PATCH] Allow initial document minor publishing Signed-off-by: Cursor Agent Co-authored-by: Bryan FRIMIN --- e2e/console/document_version_test.go | 103 ++++++++++++++++++ .../actions/document/publish.operation.ts | 2 +- pkg/cmd/document/publish/publish.go | 2 +- pkg/probo/document_service.go | 10 +- pkg/server/api/mcp/v1/specification.yaml | 2 +- 5 files changed, 108 insertions(+), 11 deletions(-) diff --git a/e2e/console/document_version_test.go b/e2e/console/document_version_test.go index 8f59e12bb..7227ad2fd 100644 --- a/e2e/console/document_version_test.go +++ b/e2e/console/document_version_test.go @@ -222,6 +222,109 @@ func TestDocumentVersion_PublishVersion(t *testing.T) { assert.Equal(t, 0, result.Node.Versions.Edges[0].Node.Minor) } +func TestDocumentVersion_PublishInitialMinorVersion(t *testing.T) { + t.Parallel() + owner := testutil.NewClient(t, testutil.RoleOwner) + + docID, _ := createTestDocument(t, owner) + + publishMutation := ` + mutation($input: PublishDocumentInput!) { + publishDocument(input: $input) { + document { + currentPublishedMajor + currentPublishedMinor + } + documentVersion { + status + major + minor + } + } + } + ` + + var publishResult struct { + PublishDocument struct { + Document struct { + CurrentPublishedMajor *int `json:"currentPublishedMajor"` + CurrentPublishedMinor *int `json:"currentPublishedMinor"` + } `json:"document"` + DocumentVersion struct { + Status string `json:"status"` + Major int `json:"major"` + Minor int `json:"minor"` + } `json:"documentVersion"` + } `json:"publishDocument"` + } + + err := owner.Execute(publishMutation, map[string]any{ + "input": map[string]any{ + "minor": true, + "documentId": docID, + "changelog": "Initial minor release", + }, + }, &publishResult) + require.NoError(t, err) + + require.NotNil(t, publishResult.PublishDocument.Document.CurrentPublishedMajor) + require.NotNil(t, publishResult.PublishDocument.Document.CurrentPublishedMinor) + assert.Equal(t, 0, *publishResult.PublishDocument.Document.CurrentPublishedMajor) + assert.Equal(t, 1, *publishResult.PublishDocument.Document.CurrentPublishedMinor) + assert.Equal(t, "PUBLISHED", publishResult.PublishDocument.DocumentVersion.Status) + assert.Equal(t, 0, publishResult.PublishDocument.DocumentVersion.Major) + assert.Equal(t, 1, publishResult.PublishDocument.DocumentVersion.Minor) + + var updateResult struct { + UpdateDocument struct { + DocumentVersion *struct { + Status string `json:"status"` + Major int `json:"major"` + Minor int `json:"minor"` + } `json:"documentVersion"` + } `json:"updateDocument"` + } + + err = owner.Execute(` + mutation($input: UpdateDocumentInput!) { + updateDocument(input: $input) { + documentVersion { + status + major + minor + } + } + } + `, map[string]any{ + "input": map[string]any{ + "id": docID, + "content": testutil.ProseMirrorTextDoc("Updated content for 0.2"), + }, + }, &updateResult) + require.NoError(t, err) + require.NotNil(t, updateResult.UpdateDocument.DocumentVersion) + assert.Equal(t, "DRAFT", updateResult.UpdateDocument.DocumentVersion.Status) + assert.Equal(t, 0, updateResult.UpdateDocument.DocumentVersion.Major) + assert.Equal(t, 2, updateResult.UpdateDocument.DocumentVersion.Minor) + + err = owner.Execute(publishMutation, map[string]any{ + "input": map[string]any{ + "minor": true, + "documentId": docID, + "changelog": "Second minor release", + }, + }, &publishResult) + require.NoError(t, err) + + require.NotNil(t, publishResult.PublishDocument.Document.CurrentPublishedMajor) + require.NotNil(t, publishResult.PublishDocument.Document.CurrentPublishedMinor) + assert.Equal(t, 0, *publishResult.PublishDocument.Document.CurrentPublishedMajor) + assert.Equal(t, 2, *publishResult.PublishDocument.Document.CurrentPublishedMinor) + assert.Equal(t, "PUBLISHED", publishResult.PublishDocument.DocumentVersion.Status) + assert.Equal(t, 0, publishResult.PublishDocument.DocumentVersion.Major) + assert.Equal(t, 2, publishResult.PublishDocument.DocumentVersion.Minor) +} + func TestDocumentVersion_AutoCreateDraft(t *testing.T) { t.Parallel() owner := testutil.NewClient(t, testutil.RoleOwner) diff --git a/packages/n8n-node/nodes/Probo/actions/document/publish.operation.ts b/packages/n8n-node/nodes/Probo/actions/document/publish.operation.ts index 0037ded39..a14d026ed 100644 --- a/packages/n8n-node/nodes/Probo/actions/document/publish.operation.ts +++ b/packages/n8n-node/nodes/Probo/actions/document/publish.operation.ts @@ -41,7 +41,7 @@ export const description: INodeProperties[] = [ }, }, default: false, - description: 'Whether to publish as a minor version. Approvers are ignored when set. The document must already have a published major version.', + description: 'Whether to publish as a minor version. Approvers are ignored when set.', }, { displayName: 'Approver IDs', diff --git a/pkg/cmd/document/publish/publish.go b/pkg/cmd/document/publish/publish.go index e667b2cad..ab251d18b 100644 --- a/pkg/cmd/document/publish/publish.go +++ b/pkg/cmd/document/publish/publish.go @@ -70,7 +70,7 @@ func NewCmdPublish(f *cmdutil.Factory) *cobra.Command { Long: `Publish the latest draft of a document. By default, the draft is published as a new major version. Pass --minor to -publish as a minor version (the document must already have a major version). +publish as a minor version. When --approver is set (one or more profile IDs), an approval is requested instead of publishing immediately. Approvers are ignored with --minor.`, Args: cobra.ExactArgs(1), diff --git a/pkg/probo/document_service.go b/pkg/probo/document_service.go index 7a3b0aaf9..ba827970c 100644 --- a/pkg/probo/document_service.go +++ b/pkg/probo/document_service.go @@ -541,10 +541,8 @@ func (s DocumentService) generateChangelog( // PublishVersion is the single entry point for publishing a document // version. The behaviour depends on req.Minor and req.ApproverIDs: -// - Minor=true: publish the existing draft as a minor bump (currentMajor. -// currentMinor+1). ApproverIDs are ignored. Errors with -// ErrCannotPublishMinorWithoutMajor when the document has never been -// published. +// - Minor=true: publish the existing draft as a minor version. ApproverIDs +// are ignored. // - Minor=false with ApproverIDs: open an approval quorum on the draft as // a pending major bump (currentMajor+1.0). Result.Quorum is set. // - Minor=false without ApproverIDs: publish the draft immediately as a @@ -2826,10 +2824,6 @@ func (s *DocumentService) publishMinorVersionInTx( return document, documentVersion, nil } - if document.CurrentPublishedMajor == nil || document.CurrentPublishedMinor == nil { - return nil, nil, &ErrCannotPublishMinorWithoutMajor{} - } - document.CurrentPublishedMajor = &documentVersion.Major document.CurrentPublishedMinor = &documentVersion.Minor diff --git a/pkg/server/api/mcp/v1/specification.yaml b/pkg/server/api/mcp/v1/specification.yaml index 0c1abb3f9..6cda911d7 100644 --- a/pkg/server/api/mcp/v1/specification.yaml +++ b/pkg/server/api/mcp/v1/specification.yaml @@ -6321,7 +6321,7 @@ components: description: Document ID minor: type: boolean - description: When true, publish the draft as a minor version (currentMajor.currentMinor+1) and ignore approver_ids; the document must already have a published major version. When false, publish as a new major version; if approver_ids are provided, an approval is requested instead. + description: When true, publish the draft as a minor version and ignore approver_ids. When false, publish as a new major version; if approver_ids are provided, an approval is requested instead. approver_ids: type: array items: