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