provisioning/tools/distribution/generate-docs.nu

164 lines
5.9 KiB
Plaintext
Raw Normal View History

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
use ./docs_discovery.nu
use ./guide_generators.nu
use ./docs_templates.nu
use ./docs_postprocessing.nu
2025-10-07 11:12:02 +01: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 = []
let result = (do {
2025-10-07 11:12:02 +01:00
# Phase 1: Discover documentation sources
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"
$summary
} | complete)
2025-10-07 11:12:02 +01:00
if $result.exit_code != 0 {
log error $"Documentation generation failed: ($result.stderr)"
2025-10-07 11:12:02 +01:00
exit 1
}
$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
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
}