2025-10-07 11:12:02 +01:00
|
|
|
#!/usr/bin/env nu
|
|
|
|
|
|
|
|
|
|
# Documentation generation tool - generates distribution documentation
|
|
|
|
|
#
|
|
|
|
|
# Generates:
|
|
|
|
|
# - Installation guides and system requirements
|
|
|
|
|
# - User manuals and API documentation
|
|
|
|
|
# - Configuration references and examples
|
|
|
|
|
# - Troubleshooting guides and FAQ
|
|
|
|
|
# - Developer documentation and contributing guides
|
|
|
|
|
|
|
|
|
|
use std log
|
2026-01-21 10:16:40 +00:00
|
|
|
use ./docs_discovery.nu
|
|
|
|
|
use ./guide_generators.nu
|
|
|
|
|
use ./docs_templates.nu
|
|
|
|
|
use ./docs_postprocessing.nu
|
2025-10-07 11:12:02 +01:00
|
|
|
|
2026-01-21 10:16:40 +00:00
|
|
|
def main [--source-root: string = "", --output-dir: string = "dist/docs", --doc-types: string = "all", --format: string = "markdown", --include-examples = true, --generate-api = true, --create-index = true, --minify-output = false, --verbose] {
|
2025-10-07 11:12:02 +01:00
|
|
|
|
|
|
|
|
let repo_root = if $source_root == "" {
|
|
|
|
|
($env.PWD | path dirname | path dirname | path dirname)
|
|
|
|
|
} else {
|
|
|
|
|
($source_root | path expand)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let doc_types_list = if $doc_types == "all" {
|
|
|
|
|
["user", "admin", "dev", "api"]
|
|
|
|
|
} else {
|
|
|
|
|
($doc_types | split row "," | each { str trim })
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let format_list = if $format == "all" {
|
|
|
|
|
["markdown", "html"]
|
|
|
|
|
} else {
|
|
|
|
|
[$format]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let docs_config = {
|
|
|
|
|
source_root: $repo_root
|
|
|
|
|
output_dir: ($output_dir | path expand)
|
|
|
|
|
doc_types: $doc_types_list
|
|
|
|
|
formats: $format_list
|
|
|
|
|
include_examples: $include_examples
|
|
|
|
|
generate_api: $generate_api
|
|
|
|
|
create_index: $create_index
|
|
|
|
|
minify_output: $minify_output
|
|
|
|
|
verbose: $verbose
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log info $"Starting documentation generation with config: ($docs_config)"
|
|
|
|
|
|
|
|
|
|
# Ensure output directory exists
|
|
|
|
|
mkdir ($docs_config.output_dir)
|
|
|
|
|
|
|
|
|
|
let generation_results = []
|
|
|
|
|
|
2026-01-21 10:16:40 +00:00
|
|
|
let result = (do {
|
2025-10-07 11:12:02 +01:00
|
|
|
# Phase 1: Discover documentation sources
|
2026-01-21 10:16:40 +00:00
|
|
|
let discovery_result = discover-all-docs $docs_config
|
2025-10-07 11:12:02 +01:00
|
|
|
|
|
|
|
|
let generation_results = ($generation_results | append { phase: "discovery", result: $discovery_result })
|
|
|
|
|
|
|
|
|
|
# Phase 2: Generate user documentation
|
|
|
|
|
let user_docs_result = if "user" in $docs_config.doc_types {
|
|
|
|
|
generate_user_documentation $docs_config $discovery_result
|
|
|
|
|
} else {
|
|
|
|
|
{ status: "skipped", reason: "user documentation not requested" }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let generation_results = ($generation_results | append { phase: "user", result: $user_docs_result })
|
|
|
|
|
|
|
|
|
|
# Phase 3: Generate admin documentation
|
|
|
|
|
let admin_docs_result = if "admin" in $docs_config.doc_types {
|
|
|
|
|
generate_admin_documentation $docs_config $discovery_result
|
|
|
|
|
} else {
|
|
|
|
|
{ status: "skipped", reason: "admin documentation not requested" }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let generation_results = ($generation_results | append { phase: "admin", result: $admin_docs_result })
|
|
|
|
|
|
|
|
|
|
# Phase 4: Generate developer documentation
|
|
|
|
|
let dev_docs_result = if "dev" in $docs_config.doc_types {
|
|
|
|
|
generate_developer_documentation $docs_config $discovery_result
|
|
|
|
|
} else {
|
|
|
|
|
{ status: "skipped", reason: "developer documentation not requested" }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let generation_results = ($generation_results | append { phase: "dev", result: $dev_docs_result })
|
|
|
|
|
|
|
|
|
|
# Phase 5: Generate API documentation
|
|
|
|
|
let api_docs_result = if "api" in $docs_config.doc_types and $docs_config.generate_api {
|
|
|
|
|
generate_api_documentation $docs_config $discovery_result
|
|
|
|
|
} else {
|
|
|
|
|
{ status: "skipped", reason: "API documentation not requested or disabled" }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let generation_results = ($generation_results | append { phase: "api", result: $api_docs_result })
|
|
|
|
|
|
|
|
|
|
# Phase 6: Create documentation index
|
|
|
|
|
let index_result = if $docs_config.create_index {
|
|
|
|
|
create_documentation_index $docs_config $generation_results
|
|
|
|
|
} else {
|
|
|
|
|
{ status: "skipped", reason: "index creation disabled" }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let generation_results = ($generation_results | append { phase: "index", result: $index_result })
|
|
|
|
|
|
|
|
|
|
# Phase 7: Convert to additional formats
|
|
|
|
|
let conversion_result = convert_documentation_formats $docs_config $generation_results
|
|
|
|
|
|
|
|
|
|
let generation_results = ($generation_results | append { phase: "conversion", result: $conversion_result })
|
|
|
|
|
|
|
|
|
|
let summary = {
|
|
|
|
|
source_root: $docs_config.source_root
|
|
|
|
|
output_directory: $docs_config.output_dir
|
|
|
|
|
doc_types: ($docs_config.doc_types | length)
|
|
|
|
|
formats: ($docs_config.formats | length)
|
|
|
|
|
successful_phases: ($generation_results | where {|r| $r.result.status == "success"} | length)
|
|
|
|
|
total_phases: ($generation_results | length)
|
|
|
|
|
documents_generated: (count_generated_documents $generation_results)
|
|
|
|
|
total_size: (get_directory_size $docs_config.output_dir)
|
|
|
|
|
docs_config: $docs_config
|
|
|
|
|
phases: $generation_results
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log info $"Documentation generation completed - ($summary.documents_generated) documents generated"
|
|
|
|
|
|
2026-01-21 10:16:40 +00:00
|
|
|
$summary
|
|
|
|
|
} | complete)
|
2025-10-07 11:12:02 +01:00
|
|
|
|
2026-01-21 10:16:40 +00:00
|
|
|
if $result.exit_code != 0 {
|
|
|
|
|
log error $"Documentation generation failed: ($result.stderr)"
|
2025-10-07 11:12:02 +01:00
|
|
|
exit 1
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-21 10:16:40 +00:00
|
|
|
$result.stdout
|
2025-10-07 11:12:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Show documentation generation status
|
|
|
|
|
def "main status" [] {
|
|
|
|
|
let repo_root = ($env.PWD | path dirname | path dirname | path dirname)
|
|
|
|
|
|
|
|
|
|
# Check for documentation sources
|
2026-01-21 10:16:40 +00:00
|
|
|
let existing_docs = find-existing-docs $repo_root
|
2025-10-07 11:12:02 +01:00
|
|
|
let has_readme = (($repo_root | path join "README.md") | path exists)
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
repository: $repo_root
|
|
|
|
|
existing_docs: $existing_docs.total_docs
|
|
|
|
|
has_readme: $has_readme
|
|
|
|
|
supported_formats: ["markdown", "html"]
|
|
|
|
|
doc_types: ["user", "admin", "dev", "api"]
|
|
|
|
|
ready_for_generation: true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Quick documentation generation with minimal options
|
|
|
|
|
def "main quick" [
|
|
|
|
|
--output-dir: string = "dist/docs" # Output directory
|
|
|
|
|
--doc-types: string = "user" # Documentation types
|
|
|
|
|
] {
|
|
|
|
|
main --output-dir $output_dir --doc-types $doc_types --format markdown
|
2026-01-08 09:55:37 +00:00
|
|
|
}
|