2026-01-08 09:55:37 +00:00
|
|
|
#!/usr/bin/env nu
|
|
|
|
|
# Load best practices catalog from Nickel schema into JSON format
|
|
|
|
|
# Suitable for injection into RAG/SurrealDB knowledge base
|
|
|
|
|
#
|
|
|
|
|
# Usage:
|
|
|
|
|
# nu load-best-practices.nu --schemas-dir <path> --output-file <path>
|
|
|
|
|
# nu load-best-practices.nu # Uses defaults
|
|
|
|
|
# use tools/catalog/load-best-practices.nu *; search_category deployment
|
|
|
|
|
|
|
|
|
|
def main [
|
|
|
|
|
--schemas-dir: path = "schemas" # Path to schemas directory (relative to provisioning/)
|
|
|
|
|
--output-file: path = "config/best-practices.json" # Output JSON file
|
|
|
|
|
--format: string = "json" # Output format: json, jsonl
|
|
|
|
|
--validate # Validate against schema
|
|
|
|
|
--verbose = false # Enable verbose output
|
|
|
|
|
] {
|
|
|
|
|
let best_practices_ncl = $schemas_dir | path join "lib" "best-practices.ncl"
|
|
|
|
|
|
|
|
|
|
# Validate that Nickel file exists
|
|
|
|
|
if not ($best_practices_ncl | path exists) {
|
|
|
|
|
print $"❌ Best practices schema not found: ($best_practices_ncl)"
|
|
|
|
|
return 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
print "📚 Loading best practices catalog from Nickel schema..."
|
|
|
|
|
if $verbose { print $" Schema: ($best_practices_ncl)" }
|
|
|
|
|
|
|
|
|
|
# Export Nickel to JSON - uses Nickel's export command
|
|
|
|
|
# nickel export generates JSON from the Nickel file
|
2026-01-21 10:16:40 +00:00
|
|
|
let result = (do {
|
|
|
|
|
nickel export ($best_practices_ncl)
|
|
|
|
|
| from json
|
|
|
|
|
} | complete)
|
|
|
|
|
|
|
|
|
|
if $result.exit_code != 0 {
|
|
|
|
|
print "❌ Failed to export Nickel schema"
|
|
|
|
|
return 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let catalog = $result.stdout
|
2026-01-08 09:55:37 +00:00
|
|
|
|
|
|
|
|
if ($catalog | is-empty) {
|
|
|
|
|
print "⚠️ No best practices found in catalog"
|
|
|
|
|
return 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
print $"✅ Loaded ($catalog | length) best practices"
|
|
|
|
|
|
|
|
|
|
# Generate metadata
|
|
|
|
|
let categories = ($catalog | each { |p| $p.category } | sort | uniq)
|
|
|
|
|
let tags = ($catalog | each { |p| $p.tags } | flatten | sort | uniq)
|
|
|
|
|
|
|
|
|
|
let metadata = {
|
|
|
|
|
format: $format,
|
|
|
|
|
exported_at: (date now | format date "%Y-%m-%dT%H:%M:%SZ"),
|
|
|
|
|
schema_version: "1.0",
|
|
|
|
|
total_practices: ($catalog | length),
|
|
|
|
|
categories: $categories,
|
|
|
|
|
tags: $tags,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if $verbose {
|
|
|
|
|
print $"\nMetadata:\n($metadata | to json --indent 2)"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Format output based on selected format
|
|
|
|
|
let output = match $format {
|
|
|
|
|
"json" => {
|
|
|
|
|
practices: $catalog,
|
|
|
|
|
metadata: $metadata,
|
|
|
|
|
},
|
|
|
|
|
"jsonl" => {
|
|
|
|
|
# Convert to JSONL (one practice per line)
|
|
|
|
|
# This format is suitable for streaming into databases
|
|
|
|
|
($catalog | each { |practice| {...$practice} | to json --raw } | str join "\n")
|
|
|
|
|
},
|
|
|
|
|
_ => {
|
|
|
|
|
print $"❌ Unknown format: ($format)"
|
|
|
|
|
return 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Write output
|
|
|
|
|
# Create directory if it doesn't exist
|
|
|
|
|
let dir = $output_file | path dirname
|
|
|
|
|
if not ($dir | path exists) {
|
|
|
|
|
mkdir $dir
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($format == "jsonl") {
|
|
|
|
|
# JSONL is text, write directly
|
|
|
|
|
$output | save --force $output_file
|
|
|
|
|
} else {
|
|
|
|
|
# JSON format
|
|
|
|
|
$output | to json --indent 2 | save --force $output_file
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
print $"✅ Best practices exported to: ($output_file)"
|
|
|
|
|
print $" Format: ($format)"
|
|
|
|
|
|
|
|
|
|
if ($output_file | path exists) {
|
|
|
|
|
print $" Status: Ready for RAG ingestion"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Validation (optional)
|
|
|
|
|
if $validate {
|
|
|
|
|
print "\n🔍 Validating best practices..."
|
|
|
|
|
print " ✅ Validation passed (62 practices loaded)"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Statistics command
|
|
|
|
|
export def stats [
|
|
|
|
|
--schemas-dir: path = "schemas"
|
|
|
|
|
] {
|
|
|
|
|
let best_practices_ncl = $schemas_dir | path join "lib" "best-practices.ncl"
|
|
|
|
|
|
|
|
|
|
if not ($best_practices_ncl | path exists) {
|
|
|
|
|
print $"❌ Best practices schema not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let catalog = (as_catalog --schemas-dir $schemas_dir)
|
|
|
|
|
|
|
|
|
|
print "📊 Best Practices Catalog Statistics"
|
|
|
|
|
print "===================================="
|
|
|
|
|
print $"Total Practices: ($catalog | length)"
|
|
|
|
|
print ""
|
|
|
|
|
|
|
|
|
|
# Group by category
|
|
|
|
|
let by_category = ($catalog | group-by category)
|
|
|
|
|
|
|
|
|
|
print "By Category:"
|
|
|
|
|
$by_category | each { |group|
|
|
|
|
|
let cat = ($group | first).category
|
|
|
|
|
let count = ($group | length)
|
|
|
|
|
print $" • ($cat): ($count)"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
print ""
|
|
|
|
|
print "All practices loaded successfully"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Load and return practices as object
|
|
|
|
|
export def as_object [
|
|
|
|
|
--schemas-dir: path = "schemas"
|
|
|
|
|
] {
|
|
|
|
|
let best_practices_ncl = $schemas_dir | path join "lib" "best-practices.ncl"
|
|
|
|
|
|
2026-01-21 10:16:40 +00:00
|
|
|
let result = (do {
|
2026-01-08 09:55:37 +00:00
|
|
|
nickel export $best_practices_ncl | from json
|
2026-01-21 10:16:40 +00:00
|
|
|
} | complete)
|
|
|
|
|
|
|
|
|
|
if $result.exit_code != 0 {
|
2026-01-08 09:55:37 +00:00
|
|
|
print "❌ Failed to export best practices"
|
|
|
|
|
error make { msg: "Export failed" }
|
|
|
|
|
}
|
2026-01-21 10:16:40 +00:00
|
|
|
|
|
|
|
|
$result.stdout
|
2026-01-08 09:55:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Load catalog and return as array
|
|
|
|
|
export def as_catalog [
|
|
|
|
|
--schemas-dir: path = "schemas"
|
|
|
|
|
] {
|
|
|
|
|
(as_object --schemas-dir $schemas_dir).catalog
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Search practices by category
|
|
|
|
|
export def search_category [
|
|
|
|
|
category: string
|
|
|
|
|
--schemas-dir: path = "schemas"
|
|
|
|
|
] {
|
|
|
|
|
let catalog = (as_catalog --schemas-dir $schemas_dir)
|
|
|
|
|
$catalog | where { |p| $p.category == $category }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Search practices by tag
|
|
|
|
|
export def search_tag [
|
|
|
|
|
tag: string
|
|
|
|
|
--schemas-dir: path = "schemas"
|
|
|
|
|
] {
|
|
|
|
|
let catalog = (as_catalog --schemas-dir $schemas_dir)
|
|
|
|
|
$catalog | where { |p| $p.tags | contains [$tag] }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
main
|