diff --git a/.gitignore b/.gitignore index 2db4c76..1aa067d 100644 --- a/.gitignore +++ b/.gitignore @@ -421,3 +421,5 @@ FodyWeavers.xsd /merge-solution.txt /opencode-prompt.txt /test-home +/reset-counter.ps1 +/update-counter.ps1 diff --git a/src/CloudNimble.DotNetDocs.Core/DocumentationManager.cs b/src/CloudNimble.DotNetDocs.Core/DocumentationManager.cs index 34bd939..6514514 100644 --- a/src/CloudNimble.DotNetDocs.Core/DocumentationManager.cs +++ b/src/CloudNimble.DotNetDocs.Core/DocumentationManager.cs @@ -115,15 +115,20 @@ public async Task ProcessAsync(IEnumerable<(string assemblyPath, string xmlPath) var assemblyList = assemblies.ToList(); var hasReferences = projectContext.DocumentationReferences.Any(); - // Documentation-only mode: only process references, no assemblies + // Documentation-only mode: process references and/or template without local assemblies if (assemblyList.Count == 0) { - if (hasReferences) + // Run pipeline if we have references OR a MintlifyTemplate + if (hasReferences || projectContext.HasMintlifyTemplate) { - // Process referenced documentation with format-specific handlers - await ProcessDocumentationReferencesAsync(); + if (hasReferences) + { + // Process referenced documentation with format-specific handlers + await ProcessDocumentationReferencesAsync(); + } - // Renderers still need to run for navigation file processing (pass null model) + // Renderers run for navigation file processing (pass null model) + // For Mintlify: generates docs.json from template + discovers content files foreach (var renderer in renderers) { await renderer.RenderAsync(null); diff --git a/src/CloudNimble.DotNetDocs.Core/ProjectContext.cs b/src/CloudNimble.DotNetDocs.Core/ProjectContext.cs index f6077a9..8ddc0d0 100644 --- a/src/CloudNimble.DotNetDocs.Core/ProjectContext.cs +++ b/src/CloudNimble.DotNetDocs.Core/ProjectContext.cs @@ -155,6 +155,15 @@ public class ProjectContext /// public bool ConceptualDocsEnabled { get; set; } = true; + /// + /// Gets or sets whether a MintlifyTemplate is defined. + /// + /// + /// When true, docs.json will be generated even without assemblies to document. + /// The presence of a template is an explicit signal that the user wants documentation output. + /// + public bool HasMintlifyTemplate { get; set; } = false; + /// /// Gets or sets the collection of external documentation references to combine into this documentation collection. /// diff --git a/src/CloudNimble.DotNetDocs.Docs/CloudNimble.DotNetDocs.Docs.docsproj b/src/CloudNimble.DotNetDocs.Docs/CloudNimble.DotNetDocs.Docs.docsproj index 4103879..00912f0 100644 --- a/src/CloudNimble.DotNetDocs.Docs/CloudNimble.DotNetDocs.Docs.docsproj +++ b/src/CloudNimble.DotNetDocs.Docs/CloudNimble.DotNetDocs.Docs.docsproj @@ -6,7 +6,7 @@ Folder true - Tests.Shared;*.Sdk + Tests.Shared;*.Sdk;test true false diff --git a/src/CloudNimble.DotNetDocs.Docs/api-reference/CloudNimble/DotNetDocs/Core/ProjectContext.mdx b/src/CloudNimble.DotNetDocs.Docs/api-reference/CloudNimble/DotNetDocs/Core/ProjectContext.mdx index ca0e009..98b4a94 100644 --- a/src/CloudNimble.DotNetDocs.Docs/api-reference/CloudNimble/DotNetDocs/Core/ProjectContext.mdx +++ b/src/CloudNimble.DotNetDocs.Docs/api-reference/CloudNimble/DotNetDocs/Core/ProjectContext.mdx @@ -252,6 +252,22 @@ public CloudNimble.DotNetDocs.Core.Configuration.FileNamingOptions FileNamingOpt Type: `CloudNimble.DotNetDocs.Core.Configuration.FileNamingOptions` Configuration for how documentation files are named and organized. +### HasMintlifyTemplate + +Gets or sets whether a MintlifyTemplate is defined. + +#### Syntax + +```csharp +public bool HasMintlifyTemplate { get; set; } +``` + +#### Property Value + +Type: `bool` +When true, docs.json will be generated even without assemblies to document. + The presence of a template is an explicit signal that the user wants documentation output. + ### IncludedMembers Gets or sets the list of member accessibilities to include in documentation. diff --git a/src/CloudNimble.DotNetDocs.Sdk.Tasks/GenerateDocumentationTask.cs b/src/CloudNimble.DotNetDocs.Sdk.Tasks/GenerateDocumentationTask.cs index 7516bc3..ca2e9c0 100644 --- a/src/CloudNimble.DotNetDocs.Sdk.Tasks/GenerateDocumentationTask.cs +++ b/src/CloudNimble.DotNetDocs.Sdk.Tasks/GenerateDocumentationTask.cs @@ -115,6 +115,15 @@ public class GenerateDocumentationTask : Task /// public ITaskItem[]? ResolvedDocumentationReferences { get; set; } + /// + /// Gets or sets whether a MintlifyTemplate is defined (inline or file-based). + /// + /// + /// When true, always generate docs.json regardless of assemblies. + /// The presence of a template is an explicit signal that the user wants documentation output. + /// + public bool HasMintlifyTemplate { get; set; } = false; + #endregion #region Public Methods @@ -186,6 +195,7 @@ public override bool Execute() context.FileNamingOptions.NamespaceMode = Enum.TryParse(NamespaceMode, true, out var mode) ? mode : Core.Configuration.NamespaceMode.Folder; context.ConceptualDocsEnabled = ConceptualDocsEnabled; context.ShowPlaceholders = ShowPlaceholders; + context.HasMintlifyTemplate = HasMintlifyTemplate; // Add the validated documentation references foreach (var reference in documentationReferences) @@ -333,15 +343,21 @@ public override bool Execute() } // Handle different scenarios based on what we have - if (assemblyPairs.Count == 0 && !hasReferences) - { - Log.LogMessage(MessageImportance.High, "No assemblies or documentation references found. Nothing to process."); - return true; - } - - if (assemblyPairs.Count == 0 && hasReferences) + if (assemblyPairs.Count == 0) { - Log.LogMessage(MessageImportance.High, "📚 Documentation-only mode: Processing DocumentationReferences without local assemblies"); + if (hasReferences) + { + Log.LogMessage(MessageImportance.High, "📚 Documentation-only mode: Processing DocumentationReferences without local assemblies"); + } + else if (HasMintlifyTemplate) + { + Log.LogMessage(MessageImportance.High, "📄 Template mode: Generating docs.json from MintlifyTemplate without assemblies"); + } + else + { + Log.LogMessage(MessageImportance.High, "No assemblies, documentation references, or template found. Nothing to process."); + return true; + } } // Process all assemblies together to properly merge navigation diff --git a/src/CloudNimble.DotNetDocs.Sdk/Sdk/Sdk.targets b/src/CloudNimble.DotNetDocs.Sdk/Sdk/Sdk.targets index b4f6a69..12cc0de 100644 --- a/src/CloudNimble.DotNetDocs.Sdk/Sdk/Sdk.targets +++ b/src/CloudNimble.DotNetDocs.Sdk/Sdk/Sdk.targets @@ -78,7 +78,7 @@ - + <_ProjectNames Include="@(DocumentedProjects->'%(Filename)')" /> @@ -86,10 +86,24 @@ + + + + + + true + false + + + + + + DependsOnTargets="DiscoverDocumentedProjects;DetectMintlifyTemplateMode"> @@ -134,6 +148,7 @@ SolutionName="$(_SolutionName)" ConceptualDocsEnabled="$(ConceptualDocsEnabled)" ShowPlaceholders="$(ShowPlaceholders)" + HasMintlifyTemplate="$(HasMintlifyTemplate)" ResolvedDocumentationReferences="@(ResolvedDocumentationReference)"> diff --git a/src/CloudNimble.DotNetDocs.slnx b/src/CloudNimble.DotNetDocs.slnx index 8c1932f..49109a0 100644 --- a/src/CloudNimble.DotNetDocs.slnx +++ b/src/CloudNimble.DotNetDocs.slnx @@ -31,12 +31,6 @@ - - - - - - diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 986a751..fc8e299 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -32,7 +32,7 @@ $(MSBuildProjectName.Replace('CloudNimble.', '')) DotNetDocs 1.1.0.0 - 1.2.0-preview.5 + 1.3.0-preview.1 CloudNimble CloudNimble, Inc. CloudNimble