Update understand-anything graph metadata

This commit is contained in:
2026-06-23 09:46:16 +03:00
parent 042c4d6550
commit 2acf5dd50b
4 changed files with 3242 additions and 0 deletions

View File

@@ -0,0 +1,733 @@
{
"version": "1.0.0",
"gitCommitHash": "042c4d655090e0ee334208511ec63b6d909d4354",
"generatedAt": "2026-06-23T06:34:02.856Z",
"files": {
".agents/skills/lemana-vpn-operations/SKILL.md": {
"filePath": ".agents/skills/lemana-vpn-operations/SKILL.md",
"contentHash": "27cec75695c23c1dc759d61b5b6250306f3b494688aabc794014711b59aa89ab",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 71,
"hasStructuralAnalysis": true
},
".agents/skills/lemana-vpn-sso-autofill/SKILL.md": {
"filePath": ".agents/skills/lemana-vpn-sso-autofill/SKILL.md",
"contentHash": "e597d0e67861787f5c444c74376bdd514614765dbe27dd62b62f7e61925a643c",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 81,
"hasStructuralAnalysis": true
},
".agents/skills/lemana-vpn-testing/SKILL.md": {
"filePath": ".agents/skills/lemana-vpn-testing/SKILL.md",
"contentHash": "6f4698688ef498f4f1427024a735d7d36cb96a96f36bf8597977fdc28e3ffa13",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 102,
"hasStructuralAnalysis": true
},
"AGENTS.md": {
"filePath": "AGENTS.md",
"contentHash": "3ccea1ed9dacb6f1173a03d8053c5466fc03aebcadb6dbf4db52814c82bc6a92",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 89,
"hasStructuralAnalysis": true
},
"app/Package.swift": {
"filePath": "app/Package.swift",
"contentHash": "338b2954b4fde437b35e7b419d7aff8451d91df790429a168d80d19bf5b99f75",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 15,
"hasStructuralAnalysis": false
},
"app/Sources/LemanaVPN/LemanaVPNApp.swift": {
"filePath": "app/Sources/LemanaVPN/LemanaVPNApp.swift",
"contentHash": "0caddaae55a376d20d023c3e82b525fa2a54002a2730978e22826aad56574474",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 191,
"hasStructuralAnalysis": false
},
"app/Sources/LemanaVPN/VPNManager.swift": {
"filePath": "app/Sources/LemanaVPN/VPNManager.swift",
"contentHash": "16b7da9acd2bad9ff71f3c067ae2bd420c3ef11cab4dc6d9c509be2d0a011d67",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 698,
"hasStructuralAnalysis": false
},
"bin/vpn-lemanapro.sh": {
"filePath": "bin/vpn-lemanapro.sh",
"contentHash": "e1946792a405d2178b197ea11285029ef172a65dd9f9c6b4a8f308e0ac58bbc2",
"functions": [
{
"name": "_emit",
"params": [],
"exported": false,
"lineCount": 8
},
{
"name": "_write_status",
"params": [],
"exported": false,
"lineCount": 4
},
{
"name": "_clear_status",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "_prepare_connection_log",
"params": [],
"exported": false,
"lineCount": 8
},
{
"name": "_log_connection_line",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "_show_connection_log_tail",
"params": [],
"exported": false,
"lineCount": 5
},
{
"name": "_start_connect_progress",
"params": [],
"exported": false,
"lineCount": 9
},
{
"name": "_stop_connect_progress",
"params": [],
"exported": false,
"lineCount": 7
},
{
"name": "_json_get",
"params": [],
"exported": false,
"lineCount": 4
},
{
"name": "_find_webengine_process",
"params": [],
"exported": false,
"lineCount": 7
},
{
"name": "_find_authenticator",
"params": [],
"exported": false,
"lineCount": 7
},
{
"name": "_module_bool",
"params": [],
"exported": false,
"lineCount": 7
},
{
"name": "_patches_active",
"params": [],
"exported": false,
"lineCount": 15
},
{
"name": "_keychain_has",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "_module_status_json",
"params": [],
"exported": false,
"lineCount": 40
},
{
"name": "_module_human_part",
"params": [],
"exported": false,
"lineCount": 10
},
{
"name": "_module_status_human",
"params": [],
"exported": false,
"lineCount": 35
},
{
"name": "_check_status",
"params": [],
"exported": false,
"lineCount": 63
},
{
"name": "_patch_oc",
"params": [],
"exported": false,
"lineCount": 228
},
{
"name": "autoFill",
"params": [],
"exported": false,
"lineCount": 4
},
{
"name": "autoFill",
"params": [],
"exported": false,
"lineCount": 10
},
{
"name": "_store_keychain",
"params": [],
"exported": false,
"lineCount": 16
},
{
"name": "_normalize_totp_secret",
"params": [],
"exported": false,
"lineCount": 27
},
{
"name": "_can_prompt",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "_prompt_read",
"params": [],
"exported": false,
"lineCount": 19
},
{
"name": "_persist_username",
"params": [],
"exported": false,
"lineCount": 44
},
{
"name": "_ensure_username",
"params": [],
"exported": false,
"lineCount": 26
},
{
"name": "_configure_keychain",
"params": [],
"exported": false,
"lineCount": 39
},
{
"name": "_ensure_keychain_credentials",
"params": [],
"exported": false,
"lineCount": 28
},
{
"name": "_bw_cache_session",
"params": [],
"exported": false,
"lineCount": 6
},
{
"name": "_bw_unlock",
"params": [],
"exported": false,
"lineCount": 67
},
{
"name": "_sync_bitwarden",
"params": [],
"exported": false,
"lineCount": 35
},
{
"name": "_sync_credentials",
"params": [],
"exported": false,
"lineCount": 10
},
{
"name": "_dns_cleanup",
"params": [],
"exported": false,
"lineCount": 17
},
{
"name": "_filter_output",
"params": [],
"exported": false,
"lineCount": 51
}
],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 1091,
"hasStructuralAnalysis": true
},
"docs/goals/manual-first-auth-flow/GOAL.md": {
"filePath": "docs/goals/manual-first-auth-flow/GOAL.md",
"contentHash": "27fc0e7feddd4c77f78f1966ab1e58c3727b4796f8600003e31e81b907b6ebe7",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 14,
"hasStructuralAnalysis": true
},
"docs/goals/manual-first-auth-flow/PLAN.md": {
"filePath": "docs/goals/manual-first-auth-flow/PLAN.md",
"contentHash": "459cb4b63f0ea0eee13ed6c8dd91d4bae1be7adaf443b2824a93d2217cbe1c58",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 441,
"hasStructuralAnalysis": true
},
"docs/superpowers/plans/2026-05-24-keychain-totp-provider.md": {
"filePath": "docs/superpowers/plans/2026-05-24-keychain-totp-provider.md",
"contentHash": "1a5d622b3bb8c6277d5d97effbdd07713975b4595bec236ff8710abde772c5dc",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 936,
"hasStructuralAnalysis": true
},
"install.sh": {
"filePath": "install.sh",
"contentHash": "d33186be9dc6457ca80886f629995edf21143d091b6902814853424400a1ec6f",
"functions": [
{
"name": "usage",
"params": [],
"exported": false,
"lineCount": 35
},
{
"name": "log",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "color_line",
"params": [],
"exported": false,
"lineCount": 5
},
{
"name": "log_step",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "log_info",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "log_detail",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "log_ok",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "log_warn",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "log_skip",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "die",
"params": [],
"exported": false,
"lineCount": 4
},
{
"name": "run",
"params": [],
"exported": false,
"lineCount": 11
},
{
"name": "need_cmd",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "has_tty",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "interactive_enabled",
"params": [],
"exported": false,
"lineCount": 8
},
{
"name": "prompt_printf",
"params": [],
"exported": false,
"lineCount": 7
},
{
"name": "prompt_read_answer",
"params": [],
"exported": false,
"lineCount": 7
},
{
"name": "yes_no",
"params": [],
"exported": false,
"lineCount": 27
},
{
"name": "choose_credential_source_interactive",
"params": [],
"exported": false,
"lineCount": 51
},
{
"name": "bool_word",
"params": [],
"exported": false,
"lineCount": 7
},
{
"name": "keychain_has",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "zsh_aliases_installed",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "print_detected_state",
"params": [],
"exported": false,
"lineCount": 18
},
{
"name": "choose_modules",
"params": [],
"exported": false,
"lineCount": 96
},
{
"name": "script_dir",
"params": [],
"exported": false,
"lineCount": 6
},
{
"name": "download_file",
"params": [],
"exported": false,
"lineCount": 18
},
{
"name": "write_file",
"params": [],
"exported": false,
"lineCount": 9
},
{
"name": "install_homebrew_packages",
"params": [],
"exported": false,
"lineCount": 27
},
{
"name": "install_openconnect_lite",
"params": [],
"exported": false,
"lineCount": 18
},
{
"name": "install_cli",
"params": [],
"exported": false,
"lineCount": 15
},
{
"name": "install_config",
"params": [],
"exported": false,
"lineCount": 25
},
{
"name": "install_dns_cleanup",
"params": [],
"exported": false,
"lineCount": 14
},
{
"name": "install_sudoers",
"params": [],
"exported": false,
"lineCount": 28
},
{
"name": "install_touchid_helper",
"params": [],
"exported": false,
"lineCount": 24
},
{
"name": "install_menu_bar_app",
"params": [],
"exported": false,
"lineCount": 60
},
{
"name": "install_launch_agent",
"params": [],
"exported": false,
"lineCount": 41
},
{
"name": "restart_running_menu_bar_app",
"params": [],
"exported": false,
"lineCount": 19
},
{
"name": "install_shell_aliases",
"params": [],
"exported": false,
"lineCount": 45
},
{
"name": "vpn",
"params": [],
"exported": false,
"lineCount": 1
},
{
"name": "maybe_login_bitwarden",
"params": [],
"exported": false,
"lineCount": 22
},
{
"name": "main",
"params": [],
"exported": false,
"lineCount": 40
}
],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 944,
"hasStructuralAnalysis": true
},
"libexec/lemana-vpn-dns-cleanup": {
"filePath": "libexec/lemana-vpn-dns-cleanup",
"contentHash": "9338f2615ba4ef133b42b07dcdbc9e54ddf59b301fd1434e81ea3f36bba16dfb",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 24,
"hasStructuralAnalysis": false
},
"README.md": {
"filePath": "README.md",
"contentHash": "fa2024f70a4eb7556b501ec01f5c74d7981939d20a805bdbb4a534853618560d",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 580,
"hasStructuralAnalysis": true
},
"templates/openconnect-lite-config.toml": {
"filePath": "templates/openconnect-lite-config.toml",
"contentHash": "e3378bc1f313fd8087886e582f9ec402268649125db4b0320365b5c3f65611b6",
"functions": [],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 33,
"hasStructuralAnalysis": true
},
"tests/smoke.sh": {
"filePath": "tests/smoke.sh",
"contentHash": "1cf9648a22e831c0693d328edcbc0e5e6561084244a20dfb37d95dd6f7f8f23e",
"functions": [
{
"name": "autoFill",
"params": [],
"exported": false,
"lineCount": 4
}
],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 439,
"hasStructuralAnalysis": true
},
"uninstall.sh": {
"filePath": "uninstall.sh",
"contentHash": "6ad75a4fbbe52575eb3672a1eac06734e13f4a82d77cba17dfe2aee75b6ecfba",
"functions": [
{
"name": "usage",
"params": [],
"exported": false,
"lineCount": 18
},
{
"name": "log",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "color_line",
"params": [],
"exported": false,
"lineCount": 5
},
{
"name": "log_step",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "log_info",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "log_detail",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "log_ok",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "log_warn",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "log_skip",
"params": [],
"exported": false,
"lineCount": 3
},
{
"name": "die",
"params": [],
"exported": false,
"lineCount": 4
},
{
"name": "run",
"params": [],
"exported": false,
"lineCount": 11
},
{
"name": "find_webengine_process",
"params": [],
"exported": false,
"lineCount": 7
},
{
"name": "restore_openconnect_lite_patch",
"params": [],
"exported": false,
"lineCount": 21
},
{
"name": "remove_zshrc_block",
"params": [],
"exported": false,
"lineCount": 22
},
{
"name": "remove_keychain_entries",
"params": [],
"exported": false,
"lineCount": 29
},
{
"name": "main",
"params": [],
"exported": false,
"lineCount": 83
}
],
"classes": [],
"imports": [],
"exports": [],
"totalLines": 321,
"hasStructuralAnalysis": true
}
}
}

View File

@@ -1566,6 +1566,472 @@
"type": "contains",
"direction": "forward",
"weight": 1
},
{
"source": "document:README.md",
"target": "file:install.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:README.md",
"target": "file:bin/vpn-lemanapro.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:README.md",
"target": "file:app/Sources/LemanaVPN/LemanaVPNApp.swift",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:README.md",
"target": "file:app/Sources/LemanaVPN/VPNManager.swift",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:README.md",
"target": "file:uninstall.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:README.md",
"target": "config:templates/openconnect-lite-config.toml",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:README.md",
"target": "file:libexec/lemana-vpn-dns-cleanup",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:AGENTS.md",
"target": "document:.agents/skills/lemana-vpn-operations/SKILL.md",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:AGENTS.md",
"target": "document:.agents/skills/lemana-vpn-sso-autofill/SKILL.md",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:AGENTS.md",
"target": "document:.agents/skills/lemana-vpn-testing/SKILL.md",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:.agents/skills/lemana-vpn-operations/SKILL.md",
"target": "file:install.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:.agents/skills/lemana-vpn-operations/SKILL.md",
"target": "file:bin/vpn-lemanapro.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:.agents/skills/lemana-vpn-operations/SKILL.md",
"target": "file:uninstall.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:.agents/skills/lemana-vpn-sso-autofill/SKILL.md",
"target": "file:bin/vpn-lemanapro.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:.agents/skills/lemana-vpn-sso-autofill/SKILL.md",
"target": "config:templates/openconnect-lite-config.toml",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:.agents/skills/lemana-vpn-testing/SKILL.md",
"target": "file:tests/smoke.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:docs/goals/manual-first-auth-flow/GOAL.md",
"target": "document:docs/goals/manual-first-auth-flow/PLAN.md",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:docs/goals/manual-first-auth-flow/PLAN.md",
"target": "file:install.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:docs/goals/manual-first-auth-flow/PLAN.md",
"target": "file:bin/vpn-lemanapro.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:docs/goals/manual-first-auth-flow/PLAN.md",
"target": "file:app/Sources/LemanaVPN/VPNManager.swift",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:docs/goals/manual-first-auth-flow/PLAN.md",
"target": "file:tests/smoke.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:docs/superpowers/plans/2026-05-24-keychain-totp-provider.md",
"target": "file:install.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:docs/superpowers/plans/2026-05-24-keychain-totp-provider.md",
"target": "file:bin/vpn-lemanapro.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:docs/superpowers/plans/2026-05-24-keychain-totp-provider.md",
"target": "file:app/Sources/LemanaVPN/VPNManager.swift",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "document:docs/superpowers/plans/2026-05-24-keychain-totp-provider.md",
"target": "file:tests/smoke.sh",
"type": "documents",
"direction": "forward",
"weight": 0.5
},
{
"source": "file:install.sh",
"target": "file:bin/vpn-lemanapro.sh",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:install.sh",
"target": "file:uninstall.sh",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:install.sh",
"target": "config:templates/openconnect-lite-config.toml",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:install.sh",
"target": "file:libexec/lemana-vpn-dns-cleanup",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:install.sh",
"target": "file:app/Package.swift",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:install.sh",
"target": "file:app/Sources/LemanaVPN/LemanaVPNApp.swift",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:install.sh",
"target": "file:app/Sources/LemanaVPN/VPNManager.swift",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:uninstall.sh",
"target": "file:bin/vpn-lemanapro.sh",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:uninstall.sh",
"target": "file:libexec/lemana-vpn-dns-cleanup",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:app/Sources/LemanaVPN/LemanaVPNApp.swift",
"target": "file:app/Sources/LemanaVPN/VPNManager.swift",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:app/Sources/LemanaVPN/VPNManager.swift",
"target": "file:bin/vpn-lemanapro.sh",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:bin/vpn-lemanapro.sh",
"target": "config:templates/openconnect-lite-config.toml",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:bin/vpn-lemanapro.sh",
"target": "file:libexec/lemana-vpn-dns-cleanup",
"type": "depends_on",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:app/Package.swift",
"target": "file:app/Sources/LemanaVPN/LemanaVPNApp.swift",
"type": "configures",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:app/Package.swift",
"target": "file:app/Sources/LemanaVPN/VPNManager.swift",
"type": "configures",
"direction": "forward",
"weight": 0.6
},
{
"source": "config:templates/openconnect-lite-config.toml",
"target": "file:bin/vpn-lemanapro.sh",
"type": "configures",
"direction": "forward",
"weight": 0.6
},
{
"source": "file:install.sh",
"target": "file:tests/smoke.sh",
"type": "tested_by",
"direction": "forward",
"weight": 0.5
},
{
"source": "file:uninstall.sh",
"target": "file:tests/smoke.sh",
"type": "tested_by",
"direction": "forward",
"weight": 0.5
},
{
"source": "file:bin/vpn-lemanapro.sh",
"target": "file:tests/smoke.sh",
"type": "tested_by",
"direction": "forward",
"weight": 0.5
},
{
"source": "file:app/Sources/LemanaVPN/LemanaVPNApp.swift",
"target": "file:tests/smoke.sh",
"type": "tested_by",
"direction": "forward",
"weight": 0.5
},
{
"source": "file:app/Sources/LemanaVPN/VPNManager.swift",
"target": "file:tests/smoke.sh",
"type": "tested_by",
"direction": "forward",
"weight": 0.5
},
{
"source": "config:templates/openconnect-lite-config.toml",
"target": "file:tests/smoke.sh",
"type": "tested_by",
"direction": "forward",
"weight": 0.5
}
],
"version": "1.0.0",
"project": {
"name": "Lemana VPN",
"languages": [
"markdown",
"swift",
"shell",
"unknown",
"toml"
],
"frameworks": [
"SwiftUI",
"AppKit",
"openconnect-lite",
"Bitwarden CLI",
"macOS Keychain"
],
"description": "macOS-пакет для корпоративного VPN Lemana: installer, CLI runtime, SSO/autofill через openconnect-lite, DNS cleanup wrapper и Swift menu bar app.",
"analyzedAt": "2026-06-23T06:33:02.614Z",
"gitCommitHash": "042c4d655090e0ee334208511ec63b6d909d4354"
},
"layers": [
{
"id": "layer:documentation-and-agent-guidance",
"name": "Документация и agent guidance",
"description": "Пользовательская документация, локальные agent skills и планы, которые описывают ожидаемые операции, safety rules и будущие изменения.",
"nodeIds": [
"document:README.md",
"document:AGENTS.md",
"document:.agents/skills/lemana-vpn-operations/SKILL.md",
"document:.agents/skills/lemana-vpn-sso-autofill/SKILL.md",
"document:.agents/skills/lemana-vpn-testing/SKILL.md",
"document:docs/goals/manual-first-auth-flow/GOAL.md",
"document:docs/goals/manual-first-auth-flow/PLAN.md",
"document:docs/superpowers/plans/2026-05-24-keychain-totp-provider.md"
]
},
{
"id": "layer:installer-and-uninstaller",
"name": "Installer и uninstall слой",
"description": "Shell scripts, которые устанавливают, обновляют и удаляют локальный VPN пакет, включая dependencies, app bundle, aliases, sudoers и cleanup.",
"nodeIds": [
"file:install.sh",
"file:uninstall.sh"
]
},
{
"id": "layer:runtime-cli-and-system-integration",
"name": "Runtime CLI и системная интеграция",
"description": "Основной CLI, openconnect-lite config и DNS cleanup wrapper, которые управляют SSO, credentials, VPN session status и системной очисткой DNS.",
"nodeIds": [
"file:bin/vpn-lemanapro.sh",
"config:templates/openconnect-lite-config.toml",
"file:libexec/lemana-vpn-dns-cleanup"
]
},
{
"id": "layer:swift-menu-bar-app",
"name": "Swift menu bar app",
"description": "Swift Package и SwiftUI/AppKit код menu bar приложения, которое запускает CLI, показывает статус и предоставляет user-facing actions.",
"nodeIds": [
"file:app/Package.swift",
"file:app/Sources/LemanaVPN/LemanaVPNApp.swift",
"file:app/Sources/LemanaVPN/VPNManager.swift"
]
},
{
"id": "layer:verification",
"name": "Verification слой",
"description": "Non-live smoke suite, который закрепляет синтаксис, installer/runtime/app wiring и SSO patch/config expectations.",
"nodeIds": [
"file:tests/smoke.sh"
]
}
],
"tour": [
{
"order": 1,
"title": "Назначение проекта",
"description": "Начните с README и AGENTS, чтобы понять пользовательский контракт, состав пакета и правила безопасной работы с live VPN.",
"nodeIds": [
"document:README.md",
"document:AGENTS.md"
],
"languageLesson": "Markdown здесь используется как операционный runbook: таблицы путей, shell blocks и safety sections важнее обычного prose."
},
{
"order": 2,
"title": "Установка и удаление",
"description": "Разберите installer и uninstaller: они определяют, какие артефакты попадают в систему и как их безопасно откатить.",
"nodeIds": [
"file:install.sh",
"file:uninstall.sh"
],
"languageLesson": "Shell strict-mode и idempotent функции помогают повторять установку без ручной чистки состояния."
},
{
"order": 3,
"title": "Runtime CLI",
"description": "Основной runtime находится в `vpn-lemanapro.sh`: он синхронизирует credentials, применяет patches, запускает SSO и публикует JSON events.",
"nodeIds": [
"file:bin/vpn-lemanapro.sh",
"config:templates/openconnect-lite-config.toml",
"file:libexec/lemana-vpn-dns-cleanup"
]
},
{
"order": 4,
"title": "SSO, credentials и autofill",
"description": "SSO skill и historical plans объясняют, почему runtime разделяет Bitwarden sync, Keychain-only flow, TOTP normalization и manual/full-manual режимы.",
"nodeIds": [
"document:.agents/skills/lemana-vpn-sso-autofill/SKILL.md",
"document:docs/superpowers/plans/2026-05-24-keychain-totp-provider.md",
"file:bin/vpn-lemanapro.sh"
]
},
{
"order": 5,
"title": "Menu bar app",
"description": "Swift layer показывает user-facing поверхность: `LemanaVPNApp` строит меню, а `VPNManager` мостит app с CLI JSON events и health checks.",
"nodeIds": [
"file:app/Package.swift",
"file:app/Sources/LemanaVPN/LemanaVPNApp.swift",
"file:app/Sources/LemanaVPN/VPNManager.swift"
],
"languageLesson": "SwiftUI state flow здесь строится вокруг `ObservableObject` и `@Published`: изменения CLI events автоматически обновляют меню."
},
{
"order": 6,
"title": "Проверка без live VPN",
"description": "Закончите smoke suite и testing skill: они показывают, какие проверки можно делать до любого реального подключения.",
"nodeIds": [
"file:tests/smoke.sh",
"document:.agents/skills/lemana-vpn-testing/SKILL.md"
]
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,6 @@
{
"lastAnalyzedAt": "2026-06-23T06:34:14.317Z",
"gitCommitHash": "042c4d655090e0ee334208511ec63b6d909d4354",
"version": "1.0.0",
"analyzedFiles": 17
}