spark: validate Hermes profile structure and generate status report
This commit is contained in:
1 parent
e456bf5c4c
commit
e93cd11af9
2 files changed
+266
-19
No files matched your search
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Validate Hermes profile structure and output status report."""
|
||||
|
||||
import os
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
PROFILE_DIR = Path("/root/.hermes/profiles/spark")
|
||||
WIZARD_OUTPUT = Path("/root/.hermes/wizard-outputs/spark")
|
||||
VALID_CATEGORIES = {
|
||||
"notes", "projects", "research", "skills", "tools",
|
||||
"skills", "templates", "scripts", "config", "cache",
|
||||
"memories", "plugins", "cron", "scratch"
|
||||
}
|
||||
|
||||
def validate_profile():
|
||||
"""Validate profile directory structure."""
|
||||
results = {
|
||||
"profile_exists": PROFILE_DIR.exists(),
|
||||
"profile_is_dir": PROFILE_DIR.is_dir() if PROFILE_DIR.exists() else False,
|
||||
"stats": {},
|
||||
"valid_structure": True,
|
||||
"issues": []
|
||||
}
|
||||
|
||||
if not results["profile_exists"]:
|
||||
results["issues"].append("Profile directory does not exist")
|
||||
results["valid_structure"] = False
|
||||
return results
|
||||
|
||||
# List contents
|
||||
contents = []
|
||||
for item in PROFILE_DIR.iterdir():
|
||||
item_type = "dir" if item.is_dir() else "file"
|
||||
contents.append({"name": item.name, "type": item_type})
|
||||
|
||||
results["stats"]["item_count"] = len(contents)
|
||||
results["stats"]["contents"] = sorted(contents, key=lambda x: x["name"])
|
||||
|
||||
# Check for expected subdirectories
|
||||
expected_dirs = {"skills", "memories", "cache"}
|
||||
found_dirs = {c["name"] for c in contents if c["type"] == "dir"}
|
||||
|
||||
missing = expected_dirs - found_dirs
|
||||
if missing:
|
||||
results["issues"].append(f"Missing expected dirs: {missing}")
|
||||
results["valid_structure"] = False
|
||||
|
||||
results["stats"]["found_dirs"] = list(found_dirs)
|
||||
results["valid_structure"] = results["valid_structure"] and len(results["issues"]) == 0
|
||||
|
||||
return results
|
||||
|
||||
def main():
|
||||
results = validate_profile()
|
||||
|
||||
# Output as JSON to stdout
|
||||
print(json.dumps(results, indent=2))
|
||||
|
||||
# Also write to wizard output
|
||||
output_file = WIZARD_OUTPUT / "validation_report.json"
|
||||
with open(output_file, "w") as f:
|
||||
json.dump(results, f, indent=2)
|
||||
|
||||
# Return exit code based on validation
|
||||
return 0 if results["valid_structure"] else 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
exit(main())
|
||||
@@ -1,27 +1,205 @@
|
||||
{
|
||||
"timestamp": "2024-01-01T00:00:00Z",
|
||||
"task": "JSON file validation",
|
||||
"directory": "/root/.hermes/wizard-outputs/spark",
|
||||
"files_validated": [
|
||||
"profile_exists": true,
|
||||
"profile_is_dir": true,
|
||||
"stats": {
|
||||
"item_count": 42,
|
||||
"contents": [
|
||||
{
|
||||
"filename": "valid.json",
|
||||
"status": "valid",
|
||||
"type": "dict",
|
||||
"keys": 3,
|
||||
"size_bytes": 77,
|
||||
"line_count": 8
|
||||
"name": ".env",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"filename": "invalid.json",
|
||||
"status": "invalid",
|
||||
"error": "Line 1, Column 13: Expecting value"
|
||||
"name": ".env.bak-20261014T165714Z",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": ".env.lock",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": ".skills_prompt_snapshot.json",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "SOUL.md",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "audio_cache",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "auth.json",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "auth.lock",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "backups",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "bin",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "cache",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "config.yaml",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "config.yaml.bak-20261014T165714Z",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "context_length_cache.yaml",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "cron",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "home",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "hooks",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "image_cache",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "keys",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "logs",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "lsp",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "memories",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "models_dev_cache.etag",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "models_dev_cache.json",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "pairing",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "plans",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "platforms",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "plugin-update-checks",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "plugins",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "runtime",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "sandboxes",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "sessions",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "skills",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "skins",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "source-checks",
|
||||
"type": "dir"
|
||||
},
|
||||
{
|
||||
"name": "state.db",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "state.db-shm",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "state.db-wal",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "state.db.auto-maintenance.lock",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "state.db.fts_rebuild.lock",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "state.db.quarantine.lock",
|
||||
"type": "file"
|
||||
},
|
||||
{
|
||||
"name": "workspace",
|
||||
"type": "dir"
|
||||
}
|
||||
],
|
||||
"summary": {
|
||||
"total": 2,
|
||||
"valid_count": 1,
|
||||
"invalid_count": 1
|
||||
"found_dirs": [
|
||||
"runtime",
|
||||
"sessions",
|
||||
"cron",
|
||||
"plugins",
|
||||
"keys",
|
||||
"workspace",
|
||||
"hooks",
|
||||
"sandboxes",
|
||||
"audio_cache",
|
||||
"cache",
|
||||
"source-checks",
|
||||
"platforms",
|
||||
"plans",
|
||||
"bin",
|
||||
"skills",
|
||||
"memories",
|
||||
"lsp",
|
||||
"plugin-update-checks",
|
||||
"skins",
|
||||
"backups",
|
||||
"home",
|
||||
"logs",
|
||||
"pairing",
|
||||
"image_cache"
|
||||
]
|
||||
},
|
||||
"validator_exit_code": 1,
|
||||
"test_passed": true
|
||||
"valid_structure": true,
|
||||
"issues": []
|
||||
}
|
||||
Reference in new issue
Block a user