From f53308253719c87e68f85ff66c92d21a23290a83 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 15 Jul 2026 18:33:33 +0900 Subject: [PATCH] 260715_0 --- .agent/0_backup_위키구현전 md파일.zip | Bin 0 -> 189893 bytes .agent/agent.md | 10 + .claude/scheduled_tasks.lock | 1 + .claude/settings.json | 24 +- .claude/settings.local.json | 4 +- AGENTS.md | 210 +- B01_Dashboard/B01_Dashboard_UI_Page.ts | 24 +- B04_wf1_Surface/B04_wf1_Surface_Api_Fetch.ts | 31 + B04_wf1_Surface/B04_wf1_Surface_Engine.py | 46 + .../B04_wf1_Surface_Engine_GisVector.py | 155 + .../B04_wf1_Surface_Engine_MvtHelper.py | 113 + .../B04_wf1_Surface_Engine_VWorld.py | 199 + B04_wf1_Surface/B04_wf1_Surface_Router.py | 201 +- B04_wf1_Surface/B04_wf1_Surface_UI_Page.ts | 39 +- .../B04_wf1_Surface_UI_TerrainViewer.ts | 72 +- B04_wf1_Surface/B04_wf1_Surface_UI_Viewer.ts | 257 +- B05_wf2_Route/B05_wf2_Route_UI_Page.ts | 19 +- .../B06_wf3_ProfileCross_UI_Page.ts | 19 +- CLAUDE.md | 245 +- check_db.py | 82 - docs/.agents/rules/graphify.md | 14 + docs/.agents/workflows/graphify.md | 10 + docs/.claude/settings.json | 24 + docs/.codex/hooks.json | 15 + docs/.obsidian/app.json | 3 + .../.obsidian/appearance.json | 0 docs/.obsidian/community-plugins.json | 1 + .../.obsidian/core-plugins.json | 0 .../설계자동화 => docs}/.obsidian/graph.json | 14 +- .../.obsidian/workspace.json | 114 +- docs/AGENTS.md | 111 + docs/CLAUDE.md | 111 + docs/output/AGENTS.md | 7 + docs/output/CLAUDE.md | 7 + docs/raw/AGENTS.md | 15 + docs/raw/CLAUDE.md | 15 + docs/raw/PLAN.md | 45 + docs/raw/guidelines/agent.md | 200 + docs/raw/guidelines/backend.md | 300 + docs/raw/guidelines/db_schema.md | 851 ++ docs/raw/guidelines/design.md | 445 + docs/raw/guidelines/frontend.md | 120 + docs/raw/guidelines/migration_plan.md | 278 + docs/raw/guidelines/structure.md | 189 + .../plans/plan_workflow_state_management.md | 207 + .../2026-07-12_verify_add_phase4_role.md | 8 + docs/wiki 관리 이유.md | 8 + docs/wiki/AGENTS.md | 20 + docs/wiki/CLAUDE.md | 20 + docs/wiki/concepts/a00_app_shell_framework.md | 86 + .../a00_app_shell_framework_scaffold.md | 37 + docs/wiki/concepts/api_common.md | 27 + docs/wiki/concepts/auth_rbac.md | 69 + docs/wiki/concepts/common_util.md | 35 + docs/wiki/concepts/db_schema/files_surface.md | 95 + .../concepts/db_schema/logs_monitoring.md | 102 + docs/wiki/concepts/db_schema/overview.md | 64 + docs/wiki/concepts/db_schema/projects.md | 56 + docs/wiki/concepts/db_schema/route_profile.md | 69 + .../concepts/db_schema/structure_output.md | 70 + .../concepts/db_schema/unconfirmed/README.md | 7 + docs/wiki/concepts/db_schema/users_auth.md | 92 + docs/wiki/concepts/dependencies.md | 36 + docs/wiki/concepts/schema_common.md | 19 + docs/wiki/concepts/storage_paths.md | 36 + docs/wiki/concepts/ui_templates.md | 85 + docs/wiki/concepts/workflow_state.md | 74 + docs/wiki/graphify-out/.graphify_labels.json | 48 + docs/wiki/graphify-out/.graphify_root | 1 + docs/wiki/graphify-out/GRAPH_REPORT.md | 275 + ...9630e320fd97ac8bfcec25673ffef09e4d059.json | 1 + ...d084ff2d4d330ad6ed1e67b99ee2b144d4d7d.json | 1 + ...4436bfa31f27f00ed2057e251ff2f7a31623a.json | 1 + ...de504af4b359fb90f4b29ba9688d1d6e17d2e.json | 1 + ...03d5dbd50d4d0b51975d3a17b60f7780055ca.json | 1 + ...5411d8b86d513511ea6df46b3348775ca49a4.json | 1 + ...1e324a92f283cd57fa229bc6d47bb5224d32b.json | 1 + ...6143b93b6e1c0a7e1073d8c15e0cdddbeb171.json | 1 + ...e6c96776d60ed81e47cd559330fd26a8da829.json | 1 + ...843557fcfffe8364feccc7ebc92f3ddc04155.json | 1 + ...085bf5df4a98ba74866cbe2f8697b00379869.json | 1 + ...05b84faf8b3e44cc65a78ac00683ff4cc92ea.json | 1 + ...d3fb89dbd706320402a4eccb759b58281fa0a.json | 1 + ...e801796b07a63f6a114bd2a2109e0b5806e12.json | 1 + ...1c1b0ff6b6f91aa809ee33b6be89c57ccd9fa.json | 1 + ...e58347f2b10bcc8843f04fffa74fbdca4d2a7.json | 1 + ...d57ad41156fa1bf6f636be896aa2d44899709.json | 1 + ...94b28850890191432179205576bde15298bf5.json | 1 + ...c2ac0767eeec0172efa0542cb863877908fcb.json | 1 + ...b552f3c4918332701b292c8140bd177fae0f3.json | 1 + ...3de2a3fd70d54fdde9b2002e15145901824c1.json | 1 + ...ac795f30c714099326f504dcf44364ffdfd63.json | 1 + ...03400b6239ad5460dfad3ccdeb03da87f41fb.json | 1 + ...a52131bedb7f8a770ad07dc99148df7e87c5b.json | 1 + ...fd9af63de315e299c5bfaa734f3dc729d25a1.json | 1 + ...11f92d55600a624ab7905ccbc6e3ad42a3352.json | 1 + ...536726d973ee824de69be0d36d0a60322cdaa.json | 1 + ...88633a2c58d466bff1f2e195d8ad42e74d686.json | 1 + ...d4b90fe7405d00db5ca205080ab8b2fcba450.json | 1 + ...ee06ec3918a47e2e33f1bba85cc3d586c424c.json | 1 + ...203c800db677004bc8ae75c253e28b0464ee1.json | 1 + ...6e3aefea664dc1af074865d994a02ceea83e7.json | 1 + ...a5354565d898bbb2169efed8ae55d8aba79cc.json | 1 + ...0488bcb975554ef4227b5d294117aa14d35bc.json | 1 + ...cff4eba1d7a96287360cb7c92afbf09ce3094.json | 1 + ...c865bd82059e3dd905065e164202716f19204.json | 1 + ...5cf4a4f34c2c07d0b440fe86da472081038b8.json | 1 + ...21d7179a7ae138805534d5a8f104afc477a40.json | 1 + ...ed9c5c4381d26906e595e1bf74b413f559880.json | 1 + ...245df62a5739b3547ecf4cabbdad69ea26f7d.json | 1 + ...ec59bea00a7f2d0eee6bacc57ecbf7b4f7e04.json | 1 + ...a4dfcd67d6a13bcfed08f9280892d055b7aec.json | 1 + ...ff3d9f78d8a6b70c16341450a63a15eea1e79.json | 1 + ...3e7a3d3a4a7c9d3c18d6994a3d65420b74bd8.json | 1 + ...b422cac5171f209ac35465cb3cf6afd457c55.json | 1 + ...99ffb11804957097d503d81077bbf581c6403.json | 1 + ...d4b9e8ef66c3d8458b9ea16a3f73dd370fe52.json | 1 + ...83c70b5229be9c7f932926aeb285b77807561.json | 1 + ...74905fe22139f5b049c3f7dc0ad6534c378cf.json | 1 + ...b219a2b94edecb3285f81207390133befebed.json | 1 + ...ecdc4407e949a7aa702a13130c8e1b70920ec.json | 1 + ...7d9d1e1c542bc8b65333fd5579891c9857361.json | 1 + ...506e5c74fa12760a92b9d72930d4a96d07742.json | 1 + ...4dfff812e4362029bf2900537a635cea03345.json | 1 + ...067fd18e7d17a741c99321bd6c782e82c7c82.json | 1 + ...ba29d570264ad0322202e9f907db6a7cd5717.json | 1 + ...d2a7813c06e0dc3f073f5680c831ecf7292f0.json | 1 + ...24e1459355dd7538f1577120a4b7ec9f8a0b6.json | 1 + ...6824b1050d0df0b0ee7719b7da9115e3e9d5b.json | 1 + ...9f371698a1070a1adbdffb079bbdb1ce3eb2c.json | 1 + ...9361b91e27034b72846bf1083ee3a0b9aaf35.json | 1 + ...8efd22932d394b41f00de2f065920df19c7b7.json | 1 + ...4df0f5db7fc40240c9b2dea195710e80aa456.json | 1 + ...28ca167883c8abfb32eff54161c461fcde509.json | 1 + ...82b3cf72360db91b22dd9337ef082385050cb.json | 1 + ...4dc21dc761794e098626c17dfffe673b47711.json | 1 + ...b5c4381fb4e5151386baa77d1ca9e6ce185a9.json | 1 + ...0a4b864c03ee044607301107af0e64c3d9bd9.json | 1 + ...6a67a90cebd48ce726060f43d64c696689583.json | 1 + docs/wiki/graphify-out/cache/stat-index.json | 1 + docs/wiki/graphify-out/graph.html | 307 + docs/wiki/graphify-out/graph.json | 10421 ++++++++++++++++ docs/wiki/graphify-out/manifest.json | 347 + docs/wiki/index.md | 119 + docs/wiki/log.md | 330 + docs/wiki/pages/A01_Home/A01_components.md | 37 + docs/wiki/pages/A01_Home/A01_frontend.md | 60 + .../pages/A02_ProgDetail/A02_components.md | 38 + .../wiki/pages/A02_ProgDetail/A02_frontend.md | 33 + .../wiki/pages/A03_CompDetail/A03_frontend.md | 67 + .../pages/A04_NewsHistory/A04_frontend.md | 86 + docs/wiki/pages/A05_EduDetail/A05_frontend.md | 69 + docs/wiki/pages/A06_Login/A06_backend.md | 70 + docs/wiki/pages/A06_Login/A06_frontend.md | 85 + docs/wiki/pages/A07_Register/A07_backend.md | 57 + docs/wiki/pages/A07_Register/A07_frontend.md | 91 + docs/wiki/pages/A08_Support/A08_backend.md | 67 + docs/wiki/pages/A08_Support/A08_frontend.md | 76 + docs/wiki/pages/A09_Security/A09_backend.md | 77 + docs/wiki/pages/A09_Security/A09_frontend.md | 78 + docs/wiki/pages/B01_Dashboard/B01_api.md | 59 + docs/wiki/pages/B01_Dashboard/B01_backend.md | 58 + docs/wiki/pages/B01_Dashboard/B01_db.md | 32 + .../pages/B01_Dashboard/B01_dependencies.md | 29 + docs/wiki/pages/B01_Dashboard/B01_frontend.md | 55 + .../pages/B02_ProjRegister/B02_backend.md | 72 + docs/wiki/pages/B02_ProjRegister/B02_db.md | 30 + .../pages/B02_ProjRegister/B02_frontend.md | 83 + docs/wiki/pages/B03_FileInput/B03_api.md | 32 + docs/wiki/pages/B03_FileInput/B03_backend.md | 49 + docs/wiki/pages/B03_FileInput/B03_db.md | 29 + .../pages/B03_FileInput/B03_dependencies.md | 30 + docs/wiki/pages/B03_FileInput/B03_frontend.md | 46 + docs/wiki/pages/B04_wf1_Surface/B04_api.md | 43 + .../wiki/pages/B04_wf1_Surface/B04_backend.md | 71 + docs/wiki/pages/B04_wf1_Surface/B04_db.md | 34 + .../pages/B04_wf1_Surface/B04_dependencies.md | 34 + .../pages/B04_wf1_Surface/B04_frontend.md | 66 + docs/wiki/pages/B05_wf2_Route/B05_api.md | 28 + docs/wiki/pages/B05_wf2_Route/B05_backend.md | 50 + docs/wiki/pages/B05_wf2_Route/B05_db.md | 36 + .../pages/B05_wf2_Route/B05_dependencies.md | 29 + docs/wiki/pages/B05_wf2_Route/B05_frontend.md | 44 + .../pages/B06_wf3_ProfileCross/B06_api.md | 28 + .../pages/B06_wf3_ProfileCross/B06_backend.md | 43 + .../wiki/pages/B06_wf3_ProfileCross/B06_db.md | 35 + .../B06_wf3_ProfileCross/B06_dependencies.md | 27 + .../B06_wf3_ProfileCross/B06_frontend.md | 40 + .../B07_wf4_DesignDetail/B07_frontend.md | 45 + docs/wiki/pages/B08_wf5_Quantity/B08_db.md | 29 + .../pages/B08_wf5_Quantity/B08_frontend.md | 42 + .../pages/B09_wf6_Estimation/B09_frontend.md | 45 + init_db.py | 51 - main.py | 3 + requirements.txt | 1 + scratch_inspect.py | 9 - ui_template/ui_template_locale.ts | 2 +- ui_template/ui_template_workflow_layout.ts | 22 +- vite-dev.out.log | 1 + wiki/설계자동화/.obsidian/app.json | 1 - wiki/설계자동화/환영합니다!.md | 5 - 201 files changed, 19776 insertions(+), 563 deletions(-) create mode 100644 .agent/0_backup_위키구현전 md파일.zip create mode 100644 .claude/scheduled_tasks.lock create mode 100644 B04_wf1_Surface/B04_wf1_Surface_Engine_GisVector.py create mode 100644 B04_wf1_Surface/B04_wf1_Surface_Engine_MvtHelper.py create mode 100644 B04_wf1_Surface/B04_wf1_Surface_Engine_VWorld.py delete mode 100644 check_db.py create mode 100644 docs/.agents/rules/graphify.md create mode 100644 docs/.agents/workflows/graphify.md create mode 100644 docs/.claude/settings.json create mode 100644 docs/.codex/hooks.json create mode 100644 docs/.obsidian/app.json rename {wiki/설계자동화 => docs}/.obsidian/appearance.json (100%) create mode 100644 docs/.obsidian/community-plugins.json rename {wiki/설계자동화 => docs}/.obsidian/core-plugins.json (100%) rename {wiki/설계자동화 => docs}/.obsidian/graph.json (61%) rename {wiki/설계자동화 => docs}/.obsidian/workspace.json (59%) create mode 100644 docs/AGENTS.md create mode 100644 docs/CLAUDE.md create mode 100644 docs/output/AGENTS.md create mode 100644 docs/output/CLAUDE.md create mode 100644 docs/raw/AGENTS.md create mode 100644 docs/raw/CLAUDE.md create mode 100644 docs/raw/PLAN.md create mode 100644 docs/raw/guidelines/agent.md create mode 100644 docs/raw/guidelines/backend.md create mode 100644 docs/raw/guidelines/db_schema.md create mode 100644 docs/raw/guidelines/design.md create mode 100644 docs/raw/guidelines/frontend.md create mode 100644 docs/raw/guidelines/migration_plan.md create mode 100644 docs/raw/guidelines/structure.md create mode 100644 docs/raw/plans/plan_workflow_state_management.md create mode 100644 docs/raw/verification/2026-07-12_verify_add_phase4_role.md create mode 100644 docs/wiki 관리 이유.md create mode 100644 docs/wiki/AGENTS.md create mode 100644 docs/wiki/CLAUDE.md create mode 100644 docs/wiki/concepts/a00_app_shell_framework.md create mode 100644 docs/wiki/concepts/a00_app_shell_framework_scaffold.md create mode 100644 docs/wiki/concepts/api_common.md create mode 100644 docs/wiki/concepts/auth_rbac.md create mode 100644 docs/wiki/concepts/common_util.md create mode 100644 docs/wiki/concepts/db_schema/files_surface.md create mode 100644 docs/wiki/concepts/db_schema/logs_monitoring.md create mode 100644 docs/wiki/concepts/db_schema/overview.md create mode 100644 docs/wiki/concepts/db_schema/projects.md create mode 100644 docs/wiki/concepts/db_schema/route_profile.md create mode 100644 docs/wiki/concepts/db_schema/structure_output.md create mode 100644 docs/wiki/concepts/db_schema/unconfirmed/README.md create mode 100644 docs/wiki/concepts/db_schema/users_auth.md create mode 100644 docs/wiki/concepts/dependencies.md create mode 100644 docs/wiki/concepts/schema_common.md create mode 100644 docs/wiki/concepts/storage_paths.md create mode 100644 docs/wiki/concepts/ui_templates.md create mode 100644 docs/wiki/concepts/workflow_state.md create mode 100644 docs/wiki/graphify-out/.graphify_labels.json create mode 100644 docs/wiki/graphify-out/.graphify_root create mode 100644 docs/wiki/graphify-out/GRAPH_REPORT.md create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/0624d255f06a43b161abeb6fdee9630e320fd97ac8bfcec25673ffef09e4d059.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/0b2cdc6e3ca674d334281585329d084ff2d4d330ad6ed1e67b99ee2b144d4d7d.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/0dddf33216964b4bf97f34f8bce4436bfa31f27f00ed2057e251ff2f7a31623a.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/0f5b6dbb9bebbfa33f4d635f070de504af4b359fb90f4b29ba9688d1d6e17d2e.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/118279706a1eb23a45441e1ff8903d5dbd50d4d0b51975d3a17b60f7780055ca.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/145e767fcb59085a1ee13d461285411d8b86d513511ea6df46b3348775ca49a4.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/186d47f554f2e797fb63a3167221e324a92f283cd57fa229bc6d47bb5224d32b.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/1b226e5d018fc38a72090165fa26143b93b6e1c0a7e1073d8c15e0cdddbeb171.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/1d05c804dd886b8148e1a246412e6c96776d60ed81e47cd559330fd26a8da829.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/1dad047374ae3b973fcdcaa189f843557fcfffe8364feccc7ebc92f3ddc04155.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/1e373af97a118ae3015a3afa398085bf5df4a98ba74866cbe2f8697b00379869.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/1e9e4be64167f23705811ee00b005b84faf8b3e44cc65a78ac00683ff4cc92ea.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/2511b51e4eb20cf62e268122c88d3fb89dbd706320402a4eccb759b58281fa0a.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/2808d040f080236ab87ff5d059ee801796b07a63f6a114bd2a2109e0b5806e12.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/29bd2bdc39958157c52fe4e872b1c1b0ff6b6f91aa809ee33b6be89c57ccd9fa.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/2be5bc2fd35d20f0f1eb7c1c707e58347f2b10bcc8843f04fffa74fbdca4d2a7.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/2db81e60642ebe8f3ec8f7c3673d57ad41156fa1bf6f636be896aa2d44899709.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/32b6d000932825989e419a4136794b28850890191432179205576bde15298bf5.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/36e9c3aa280793956998877458fc2ac0767eeec0172efa0542cb863877908fcb.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/37aa0d07aa6c480aa555897c7a3b552f3c4918332701b292c8140bd177fae0f3.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/3db683a2cde7e94a133978113563de2a3fd70d54fdde9b2002e15145901824c1.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/430bcc25e31726266357a8339dcac795f30c714099326f504dcf44364ffdfd63.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/464194e04c304a155a3445c411403400b6239ad5460dfad3ccdeb03da87f41fb.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/474c775ef5ef23ed26e38b39828a52131bedb7f8a770ad07dc99148df7e87c5b.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/479a8e4089e3bb7a2cc81032c56fd9af63de315e299c5bfaa734f3dc729d25a1.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/49fd7d94d4b60db667d3b09b49911f92d55600a624ab7905ccbc6e3ad42a3352.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/4a5f18486fb810daf3f1c5b1551536726d973ee824de69be0d36d0a60322cdaa.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/4b09b67e025ab679214a595ed4288633a2c58d466bff1f2e195d8ad42e74d686.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/4df26e4d9121bc917f5542182c4d4b90fe7405d00db5ca205080ab8b2fcba450.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/50e6b6bf0066bb5b891dbcf8988ee06ec3918a47e2e33f1bba85cc3d586c424c.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/52811408853b074f152e72eca98203c800db677004bc8ae75c253e28b0464ee1.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/54d5ac3300a973b62932c4e49e96e3aefea664dc1af074865d994a02ceea83e7.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/5fec6364bd060aef3f2afe819bea5354565d898bbb2169efed8ae55d8aba79cc.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/645ae1caf18f1055571c195d5af0488bcb975554ef4227b5d294117aa14d35bc.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/646d6ab79be622a7ff0a6e70be8cff4eba1d7a96287360cb7c92afbf09ce3094.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/671505750d39bdfee5448654c63c865bd82059e3dd905065e164202716f19204.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/777dc18c8da82ae19d1ef4696015cf4a4f34c2c07d0b440fe86da472081038b8.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/7a20bcee60ba41e229ef85f767421d7179a7ae138805534d5a8f104afc477a40.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/7b7b025371ec01828e5296e1181ed9c5c4381d26906e595e1bf74b413f559880.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/7fb3857a81e71036c1ce149c4b7245df62a5739b3547ecf4cabbdad69ea26f7d.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/864c1304191de6468d4edc50434ec59bea00a7f2d0eee6bacc57ecbf7b4f7e04.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/87a19225130d879a47fa512b619a4dfcd67d6a13bcfed08f9280892d055b7aec.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/890159057c1b315dc2f987cc22cff3d9f78d8a6b70c16341450a63a15eea1e79.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/8d85ff410419578b818f52078b23e7a3d3a4a7c9d3c18d6994a3d65420b74bd8.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/90d7356198e73e4cc9f6377549bb422cac5171f209ac35465cb3cf6afd457c55.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/913554bc65be372e31038c5b6db99ffb11804957097d503d81077bbf581c6403.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/9216484c57c256629ee59314bc7d4b9e8ef66c3d8458b9ea16a3f73dd370fe52.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/944204e569fb7c208be3dd6b08b83c70b5229be9c7f932926aeb285b77807561.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/9691ebb53407e479750a796e82774905fe22139f5b049c3f7dc0ad6534c378cf.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/97478cabbb537844beae71898c5b219a2b94edecb3285f81207390133befebed.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/981095fcec47154f4626fb3eab7ecdc4407e949a7aa702a13130c8e1b70920ec.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/a38a8ca962fdacc272da8439e0d7d9d1e1c542bc8b65333fd5579891c9857361.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/a6d3afe6fc8285143b839973bd8506e5c74fa12760a92b9d72930d4a96d07742.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/aacc52798876b1c9f1528049e014dfff812e4362029bf2900537a635cea03345.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/ab34ed804dca07323ea78583add067fd18e7d17a741c99321bd6c782e82c7c82.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/b274d5ee1fd61e7bc3013ac1dfaba29d570264ad0322202e9f907db6a7cd5717.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/bc8f362e6683fa0ae51daf283b5d2a7813c06e0dc3f073f5680c831ecf7292f0.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/c0a1926f8af61577dc912e4ca9824e1459355dd7538f1577120a4b7ec9f8a0b6.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/c3a3a40df2648ee75578c94723b6824b1050d0df0b0ee7719b7da9115e3e9d5b.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/c6652706034c525ffeec3bbaf4f9f371698a1070a1adbdffb079bbdb1ce3eb2c.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/c7645ac1d9ed01c49738b733aa69361b91e27034b72846bf1083ee3a0b9aaf35.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/c82e36238d3bc7e9f58d7a65a208efd22932d394b41f00de2f065920df19c7b7.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/dbc60034a717404e311f43e3f724df0f5db7fc40240c9b2dea195710e80aa456.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/dc48367a69497d4965a076e5baa28ca167883c8abfb32eff54161c461fcde509.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/dc90c884f2f276e80a57bfc0e2b82b3cf72360db91b22dd9337ef082385050cb.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/e5a0d7854dc5f172c997de38f2c4dc21dc761794e098626c17dfffe673b47711.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/ec26c30de18a4df2b859538b4a3b5c4381fb4e5151386baa77d1ca9e6ce185a9.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/f43d7fb7c134b25445c9b5d16d30a4b864c03ee044607301107af0e64c3d9bd9.json create mode 100644 docs/wiki/graphify-out/cache/ast/v0.9.12/f849b661543b4f07113704a24786a67a90cebd48ce726060f43d64c696689583.json create mode 100644 docs/wiki/graphify-out/cache/stat-index.json create mode 100644 docs/wiki/graphify-out/graph.html create mode 100644 docs/wiki/graphify-out/graph.json create mode 100644 docs/wiki/graphify-out/manifest.json create mode 100644 docs/wiki/index.md create mode 100644 docs/wiki/log.md create mode 100644 docs/wiki/pages/A01_Home/A01_components.md create mode 100644 docs/wiki/pages/A01_Home/A01_frontend.md create mode 100644 docs/wiki/pages/A02_ProgDetail/A02_components.md create mode 100644 docs/wiki/pages/A02_ProgDetail/A02_frontend.md create mode 100644 docs/wiki/pages/A03_CompDetail/A03_frontend.md create mode 100644 docs/wiki/pages/A04_NewsHistory/A04_frontend.md create mode 100644 docs/wiki/pages/A05_EduDetail/A05_frontend.md create mode 100644 docs/wiki/pages/A06_Login/A06_backend.md create mode 100644 docs/wiki/pages/A06_Login/A06_frontend.md create mode 100644 docs/wiki/pages/A07_Register/A07_backend.md create mode 100644 docs/wiki/pages/A07_Register/A07_frontend.md create mode 100644 docs/wiki/pages/A08_Support/A08_backend.md create mode 100644 docs/wiki/pages/A08_Support/A08_frontend.md create mode 100644 docs/wiki/pages/A09_Security/A09_backend.md create mode 100644 docs/wiki/pages/A09_Security/A09_frontend.md create mode 100644 docs/wiki/pages/B01_Dashboard/B01_api.md create mode 100644 docs/wiki/pages/B01_Dashboard/B01_backend.md create mode 100644 docs/wiki/pages/B01_Dashboard/B01_db.md create mode 100644 docs/wiki/pages/B01_Dashboard/B01_dependencies.md create mode 100644 docs/wiki/pages/B01_Dashboard/B01_frontend.md create mode 100644 docs/wiki/pages/B02_ProjRegister/B02_backend.md create mode 100644 docs/wiki/pages/B02_ProjRegister/B02_db.md create mode 100644 docs/wiki/pages/B02_ProjRegister/B02_frontend.md create mode 100644 docs/wiki/pages/B03_FileInput/B03_api.md create mode 100644 docs/wiki/pages/B03_FileInput/B03_backend.md create mode 100644 docs/wiki/pages/B03_FileInput/B03_db.md create mode 100644 docs/wiki/pages/B03_FileInput/B03_dependencies.md create mode 100644 docs/wiki/pages/B03_FileInput/B03_frontend.md create mode 100644 docs/wiki/pages/B04_wf1_Surface/B04_api.md create mode 100644 docs/wiki/pages/B04_wf1_Surface/B04_backend.md create mode 100644 docs/wiki/pages/B04_wf1_Surface/B04_db.md create mode 100644 docs/wiki/pages/B04_wf1_Surface/B04_dependencies.md create mode 100644 docs/wiki/pages/B04_wf1_Surface/B04_frontend.md create mode 100644 docs/wiki/pages/B05_wf2_Route/B05_api.md create mode 100644 docs/wiki/pages/B05_wf2_Route/B05_backend.md create mode 100644 docs/wiki/pages/B05_wf2_Route/B05_db.md create mode 100644 docs/wiki/pages/B05_wf2_Route/B05_dependencies.md create mode 100644 docs/wiki/pages/B05_wf2_Route/B05_frontend.md create mode 100644 docs/wiki/pages/B06_wf3_ProfileCross/B06_api.md create mode 100644 docs/wiki/pages/B06_wf3_ProfileCross/B06_backend.md create mode 100644 docs/wiki/pages/B06_wf3_ProfileCross/B06_db.md create mode 100644 docs/wiki/pages/B06_wf3_ProfileCross/B06_dependencies.md create mode 100644 docs/wiki/pages/B06_wf3_ProfileCross/B06_frontend.md create mode 100644 docs/wiki/pages/B07_wf4_DesignDetail/B07_frontend.md create mode 100644 docs/wiki/pages/B08_wf5_Quantity/B08_db.md create mode 100644 docs/wiki/pages/B08_wf5_Quantity/B08_frontend.md create mode 100644 docs/wiki/pages/B09_wf6_Estimation/B09_frontend.md delete mode 100644 init_db.py delete mode 100644 scratch_inspect.py delete mode 100644 wiki/설계자동화/.obsidian/app.json delete mode 100644 wiki/설계자동화/환영합니다!.md diff --git a/.agent/0_backup_위키구현전 md파일.zip b/.agent/0_backup_위키구현전 md파일.zip new file mode 100644 index 0000000000000000000000000000000000000000..204bfb19602f642df4fd40b923ff239d915578af GIT binary patch literal 189893 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

0_5;heIHyhBqFRj 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 literal 0 HcmV?d00001 diff --git a/.agent/agent.md b/.agent/agent.md index 56f275f..e904b2c 100644 --- a/.agent/agent.md +++ b/.agent/agent.md @@ -198,3 +198,13 @@ WF6: B09_wf6_Estimation (견적·문서) | **인증 방식** | HttpOnly Secure 세션 쿠키 | | **사용자 역할** | SYSTEM_ADMIN, ADMIN, USER (3가지) | | **대시보드** | B01_Dashboard (역할별 동적 렌더링) | + +## graphify + +This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships. + +Rules: +- For codebase questions, first run `graphify query ""` when graphify-out/graph.json exists. Use `graphify path "" ""` for relationships and `graphify explain ""` for focused concepts. These return a scoped subgraph, usually much smaller than GRAPH_REPORT.md or raw grep output. +- If graphify-out/wiki/index.md exists, use it for broad navigation instead of raw source browsing. +- Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context. +- After modifying code, run `graphify update .` to keep the graph current (AST-only, no API cost). diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock new file mode 100644 index 0000000..447b4d4 --- /dev/null +++ b/.claude/scheduled_tasks.lock @@ -0,0 +1 @@ +{"sessionId":"9ae379c1-e893-4e1a-90dd-8805e30be635","pid":23164,"acquiredAt":1783854829533} \ No newline at end of file diff --git a/.claude/settings.json b/.claude/settings.json index 0bebe95..5a66e56 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -16,5 +16,27 @@ "Bash(./venv/Scripts/python.exe -c \"import ast; ast.parse\\(open\\('B04_wf1_Surface/B04_wf1_Surface_Repository.py',encoding='utf-8'\\).read\\(\\)\\); print\\('OK'\\)\")", "Bash(python)" ] + }, + "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "C:\\Users\\umsan\\AppData\\Local\\Programs\\Python\\Python312\\Scripts\\graphify.EXE hook-guard search" + } + ] + }, + { + "matcher": "Read|Glob", + "hooks": [ + { + "type": "command", + "command": "C:\\Users\\umsan\\AppData\\Local\\Programs\\Python\\Python312\\Scripts\\graphify.EXE hook-guard read" + } + ] + } + ] } -} +} \ No newline at end of file diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 8333274..6991b36 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -15,7 +15,9 @@ "Bash(git checkout *)", "Bash(dir /B)", "Read(//c/Program_coding/**)", - "Read(//c/Program_coding/�ӵ����� �� �����ڵ�ȭ ���α׷� ����/**)" + "Read(//c/Program_coding/�ӵ����� �� �����ڵ�ȭ ���α׷� ����/**)", + "Bash(graphify path *)", + "Bash(graphify query *)" ] } } diff --git a/AGENTS.md b/AGENTS.md index b237134..5a4c09a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,147 +1,95 @@ -# 프로젝트 행동지침 및 기술 스택 명세 (agent.md) +# Aislo 프로젝트 AI 행동 지침서 (AGENTS.md) -## 프로젝트 & DB 정보 -### 📌 프로그램명 -**Aislo (아이슬로)** -- **의미**: AI (인공지능) + Slotti (핀란드어: 임도/산림 도로) -- **콘셉트**: 산림의 미래를 열어가는 인공지능 경로 설계 솔루션 +이 문서는 **Antigravity** 및 **Codex** 코드 어시스턴트가 프로젝트 수행 시 반드시 준수해야 하는 행동 지침 및 아키텍처 명세입니다. 본 가이드라인은 불필요한 토큰 소모를 방지하고 설계 정합성을 유지하기 위해 강제 적용됩니다. --- -## 1. 기술 환경 및 기본 스택 (Technical Stack Baseline) -프로젝트의 코드를 작성, 테스트 또는 검증할 환경 명확화 및 호환 기준 제시. +## 1. 3중 역할 분담 협업 체계 (3-Role System) -### A. 백엔드 프레임워크 (Python) -* **Runtime:** Python v3.12 or v3.13.7 -* **Framework:** FastAPI / Pydantic -* **Geometry/GIS Engine:** Trimesh, Whitebox, Geopandas, Shapely, Rasterio, Laspy +AI는 작업 단계에 따라 다음 3가지 역할 중 하나로만 명확하게 작동해야 하며, 각 단계의 작업물은 엄격하게 분리됩니다. -### B. 데이터베이스 (MariaDB) -* **DBMS:** MariaDB v10.6+ -* **Character Set:** utf8mb4 (한글 완벽 지원) -* **Collation:** utf8mb4_unicode_ci -* **DB Driver (비동기):** `aiomysql` (순수 Python, Windows 호환. asyncmy는 Cython 빌드 필요로 미채택) -* **쿼리 방식:** Raw SQL (ORM 사용 금지) -* **공간 데이터:** JSON 기반 저장 (MariaDB는 PostGIS 미지원) - -### C. 프론트엔드 & WebCAD (TypeScript & WebGL) -* **Language/Runtime:** TypeScript / Node.js -* **Rendering:** HTML5 Canvas 및 WebGL 기반 WebCAD 시스템 구현 - -### D. 인코딩 및 다국어 표준 -* **인코딩:** 텍스트 파일은 UTF-8 표준으로 통일 - ---- - -## 2. 문맥 라우팅 및 문서 구조 (Context Routing) -코드 작성 및 기술 검증 시 문서 우선순위에 따른 계층적 레퍼런스 필수 읽기. - -* **1단계 (필수):** `.agent/structure.md` 읽기 후 신규 폴더 생성 기준 분석. -* **2단계 (선택 읽기):** 프로젝트 구현에 필요한 세부 기술 명세 읽기. - * **그룹 A (UI, 스타일, 컴포넌트, WebCAD):** `.agent/frontend.md` 필수 추가 읽기. - * **그룹 B (알고리즘, 저장, DB, MariaDB 값 제어):** `.agent/backend.md` 필수 추가 읽기. - * **그룹 C (DB 구조 변경):** DB 구조 변경 시 `.agent/db_schema.md` 선택적 읽기. - ---- - -## 3. 코드 작성 기본 제약 (Constraints) -* **구조 준수:** `.agent/structure.md` 트리 구조 엄격 준수. -* **700줄 제한:** 단일 파일 코드 작성/수정 시 700줄 이상이 될 경우 사전 공지. 기능별 파일 분할 후 `structure.md` 갱신 필수. -* **안전 보관:** 백엔드 작업 시 보안 저장소 경로 명시 및 임의 삭제 방지 필수. -* **경로 활용:** 단계별 페이지 기반 폴더 구조(B03~B09)와 DB 경로 열의 기준은 `.agent/db_schema_simple.md`의 「파일시스템 경로와 DB 링크」를 따른다. -* **일관성 검증:** 설계 단계에서부터 DB 설계, 파일 경로, API 라우팅이 모두 동일한 워크플로우 기준으로 통일되어야 한다. (불일치 발생 시 설계 단계에서 재논의 필수) -* **코드 포맷팅 (자동화 도구):** 프로젝트의 코드 작성이 완료되는 시, 반드시 프로젝트 루트에서 각 언어별 포맷터를 재실행하여 스타일을 통일해야 한다. - * *Python 포맷팅 명령어:* `ruff format [파일명]` 및 `ruff check --fix [파일명]` 실행 - * *TypeScript/CSS 포맷팅 명령어:* `npx prettier --write [파일명]` 실행 -* **외부 라이브러리 활용:** 외부 라이브러리 활용 시 프로젝트에 맞춰 호환 라이브러리 선정하고, 불필요한 함수는 작성하지 않도록 최소화. - ---- - -## 4. 데이터베이스 상세 명세 (Database Specification) - -### 4.1 스키마 기본 정보 -- **DB 명:** `aislo_db` -- **DBMS:** MariaDB v10.6+ -- **인코딩:** utf8mb4_unicode_ci -- **테이블 수:** 18개 -- **드라이버:** aiomysql (비동기) - -### 4.2 파일 경로 추적 (Path Tracking) -**모든 중간 산출물의 파일 경로를 DB에 기록:** -- `input_files.raw_file_path` — 원본 입력 파일 -- `processed_point_cloud.converted_file_path` — 변환된 포인트클라우드 -- `surface_models.model_file_path` — 지표면 모델 -- `routes.route_data_path` — 경로 데이터 -- `longitudinal_sections.longitudinal_file_path` — 종단면 -- `cross_sections.cross_section_file_path` — 횡단면 -- `structures.structure_data_path` — 구조물 배치 -- `quantity_items.quantity_data_path` — 수량 항목 -- `outputs.outputs_directory_path` — 산출물 폴더 -- `output_files.output_file_path` — 개별 산출 파일 - -### 4.3 저장소 구조 (Workflow-based Folder Structure) -``` -storage/{company_slug}/{user_slug}/{project_id}/ -├── B03_FileInput/input/ (WF0: 원본 입력) -├── B04_wf1_Surface/processed/ (WF1: 변환된 포인트클라우드 & 모델) -├── B05_wf2_Route/route/ (WF2: 경로 설계) -├── B06_wf3_ProfileCross/ (WF3: 종단면 & 횡단면) -├── B07_wf4_DesignDetail/structures/ (WF4: 구조물 배치) -├── B08_wf5_Quantity/quantities/ (WF5: 수량 산출) -└── B09_wf6_Estimation/v1,v2,.../ (WF6: 최종 산출물) -``` - -### 4.4 공간 데이터 처리 (MariaDB 특성) -- **지하형 기하 데이터:** GEOMETRY 타입 미지원 → JSON으로 저장 -- **좌표 저장 예:** `{"type": "Point", "coordinates": [127.5, 37.5]}` -- **경로 저장 예:** `{"type": "LineString", "coordinates": [[127.5, 37.5], [127.6, 37.6]]}` -- **애플리케이션 처리:** Python의 Shapely, Geopandas에서 JSON 파싱 후 기하 연산 - ---- - -## 5. 워크플로우 6단계 (6-Stage Workflow) +### 🎭 단계별 역할 정의 ``` -WF0: B03_FileInput (파일 입력) - ↓ (LAS, TIF, TFW, PRJ, DXF 업로드) -WF1: B04_wf1_Surface (지표면 분석) - ↓ (DEM, TIN, 포인트클라우드 변환) -WF2: B05_wf2_Route (경로 설계) - ↓ (최적 경로 계산) -WF3: B06_wf3_ProfileCross (종횡단 생성) - ↓ (종단면, 횡단면 생성) -WF4: B07_wf4_DesignDetail (상세 설계) - ↓ (구조물 배치) -WF5: B08_wf5_Quantity (수량 산출) - ↓ (수량 항목 계산) -WF6: B09_wf6_Estimation (견적·문서) - ↓ (Excel, PDF, DXF 생성) +사용자 요청 ➡️ [1. 기획자] ➡️ 계획 수립 및 PLAN.md 합의 + ⬇️ + [2. 프로그래머] ➡️ 오직 코드 작성 및 수정 (Surgical) + ⬇️ + [3. 코드 검증] ➡️ 검증 및 보고서 작성, 완료 건 아카이빙 + ⬇️ + [4. 위키 관리] ➡️ 인제스트, 린트 및 지식 그래프 갱신 ``` ---- +#### 역할 1: 기획자 (Planner / Architect) +* **목표**: 최소한의 정보 탐색으로 문제의 핵심을 짚고, 작업 계획을 구체화하여 사용자 합의를 얻는 것. +* **동작**: + 1. 사용자 요구사항을 받으면 전체 코드를 뒤지지 않고, `docs/wiki/` 내의 `graphify` 결과물 및 위키 지식을 우선 조회하여 작업 대상 파일과 이력을 신속하게 식별합니다. + 2. 영향을 받는 파일 범위와 수정 방향을 분석하여 `docs/raw/PLAN.md`에 계획서와 구체적인 구현 체크리스트를 작성합니다. + 3. `PLAN.md`에 작성된 계획서 내용에 대해 사용자의 Proceed 승인을 받습니다. -## 6. 주요 문서 참고 순서 +#### 역할 2: 코딩 전문 (Coder) +* **목표**: 오직 코드 작성 및 수정에만 집중하여 고품질의 구현물을 만드는 것. +* **동작**: + 1. 기획 단계에서 합의된 `docs/raw/PLAN.md`에 명시된 스펙과 대상 파일만 접근하여 수정합니다. (Spec 외의 오버엔지니어링 절대 금지) + 2. 전체 코드를 뒤지지 않고, `docs/wiki/` 내의 `graphify` 결과물 및 위키 지식을 우선 조회하여 작업 대상 파일과 이력을 신속하게 식별합니다. + 3. 수정 시 **Surgical Changes(정밀 수정) 원칙**을 지켜 주변 코드나 서식을 손대지 않습니다. + 4. 수정이 끝나면 프로그래머는 계획서의 구현 체크리스트에 스스로 완료 표시를 합니다. + 5. *주의*: 코더는 작업 중 어떠한 경우에도 `graphify` 명령어를 실행하지 않습니다. -1. **구조 설계:** `.agent/structure.md` 읽기 -2. **프론트 구현:** `.agent/frontend.md` 읽기 -3. **백엔드 구현:** `.agent/backend.md` 읽기 -4. **마이그레이션:** `.agent/migration_plan.md` 읽기 -5. **DB 스키마:** `.agent/db_schema_simple.md` 읽기 -6. **프로젝트 정보:** `.agent/project_info.md` 읽기 +#### 역할 3: 코드 검증 (Verifier / QA) +* **목표**: 구현된 코드가 실무 기준에 맞는지 정밀 검증하고 설계 지식을 현행화하는 것. +* **동작**: + 1. 코드가 작성되면 오직 수정한 코드만을 대조하여 실무 적합성 및 기술 검증을 수행합니다. + 2. 전체 코드를 뒤지지 않고, `docs/wiki/` 내의 `graphify` 결과물 및 위키 지식을 우선 조회하여 작업 대상 파일과 이력을 신속하게 식별합니다. + 3. 검증 결과를 바탕으로 `docs/raw/verification/{YYYY-MM-DD}_verify_{기능명}.md` 보고서를 작성합니다. + 4. `docs/raw/PLAN.md`에서 완료된 항목을 잘라내어(Cut) `docs/raw/plans/{YYYY-MM-DD}_plan_{기능명}.md` 파일로 이관하고, `PLAN.md`에서는 제거합니다. + 5. 관련 `docs/wiki/` 문서를 현행화(`status: stable` 전환)하고, 아래 규칙에 따라 **지식 그래프(`graphify`)를 업데이트**합니다. + +#### 역할 4: 기타 작업자 (위키 관리 / 작업 보조) +* **목표**: 사용자의 위키 및 프로젝트 지식 관리와 도구 실행(인제스트, 린트, 위키 업데이트 등)을 효과적으로 지원하는 것. +* **동작**: + 1. **인제스트(Ingest) 또는 린트(Lint) 요청 시**: 루트 폴더의 `./docs/AGENTS.md` 파일을 참조하여 해당 파일에 명시된 인제스트 및 린트 지침과 명령어를 성실히 따릅니다. + 2. **위키 업데이트 요청 시**: Skill을 통해 `graphify update`를 실행하여 `docs/wiki/` 기준으로 지식 그래프를 갱신합니다. --- -## 7. 요약 +## 2. 작업 관리 표준 (Live-PLAN 및 아카이빙) -| 항목 | 값 | -|------|-----| -| **프로그램명** | Aislo (아이슬로) | -| **DB 명** | aislo_db | -| **DBMS** | MariaDB v10.6+ | -| **인코딩** | utf8mb4_unicode_ci | -| **Backend** | Python 3.12+ / FastAPI | -| **Frontend** | TypeScript / Node.js | -| **드라이버** | aiomysql | -| **워크플로우** | 6단계 (WF0~WF6) | -| **테이블 수** | 18개 | -| **폴더 구조** | 워크플로우 기반 (B03~B09) | +* **현재 작업판 (`docs/raw/PLAN.md`)**: + * 현재 개발해야 할 신규 작업, 활성 작업 체크리스트, 미결 사항(Backlog)만 남겨놓는 살아있는 유일한 계획서입니다. + * 이 파일에 적힌 백로그가 완전히 비워지면 프로젝트가 최종 완료된 것으로 판단합니다. +* **완료 이력 백업 (`docs/raw/plans/`)**: + * 검증이 완료된 작업은 `PLAN.md`에서 즉시 삭제되고, `{YYYY-MM-DD}_plan_{기능명}.md` 문서로 이관 보관됩니다. +* **세션 종료 전 2중 검증**: + * 대화 세션을 종료하기 전에 `raw/`에 쌓인 신규 아카이브와 보고서를 Ingest(위키 반영) 및 Lint(위키 건강 점검)하여 데이터 누락 및 모순이 없는지 교차 점검합니다. + +--- + +## 3. 기술 환경 및 제약 조건 (Baseline Constraints) + +### 📌 기본 기술 스택 +* **Backend**: Python v3.12.7 / FastAPI / Pydantic (aiomysql 비동기 드라이버 사용, ORM 금지, Raw SQL 쿼리) +* **Frontend**: TypeScript / Node.js / HTML5 Canvas 및 WebGL (WebGL WebCAD) +* **Database**: MariaDB v10.6+ (공간 데이터는 GEOMETRY 미지원으로 인해 JSON 포맷 저장) +* **GIS Engine**: Trimesh, Whitebox, Geopandas, Shapely, Rasterio, Laspy + +### 📌 코딩 규칙 +* **700줄 제한**: 단일 소스코드 파일은 700줄을 초과할 수 없습니다. 초과할 경우 기능별로 파일을 분리해야 합니다. +* **Surgical Edit**: 변경해야 할 최소한의 라인만 정확하게 수정합니다. +* **포맷팅 적용**: 작업 완료 시 해당 언어의 포맷터(Python: `ruff format`, TS/CSS: `prettier`)를 반드시 실행합니다. + +### 📌 지식 그래프(graphify) 운영 규칙 + +* **분석 대상 범위**: `docs/wiki/` 폴더만을 대상으로 합니다. + * 검색 범위: `docs/wiki/` 하위 모든 마크다운 파일 + * 업데이트 범위: `docs/wiki/` 폴더만 + +* **Skill 기반 호출**: + * 기획자/검증자: Skill을 통해 graphify를 호출하여 정보 수집 + * 조회 옵션: `graphify query "질문"`, `graphify path "개념A" "개념B"`, `graphify explain "개념명"` + * 업데이트: `graphify update` (Skill 기반) + +* **실행 권한**: + * 기획자: graphify query/explain/path 사용 가능 (계획 수립 시) + * 프로그래머: graphify 실행 금지 + * 검증자: graphify update만 문서 갱신 후 최종 1회 실행 diff --git a/B01_Dashboard/B01_Dashboard_UI_Page.ts b/B01_Dashboard/B01_Dashboard_UI_Page.ts index b338b36..844bb69 100644 --- a/B01_Dashboard/B01_Dashboard_UI_Page.ts +++ b/B01_Dashboard/B01_Dashboard_UI_Page.ts @@ -369,7 +369,6 @@ function projectTable(projects: ProjectItem[], currentUser: DashboardUser): HTML } function workflow(project: ProjectItem): HTMLElement { - const activeStage = project.workflow_stage; const routes: RoutePath[] = [ ROUTES.B03_FILE_INPUT, ROUTES.B04_WF1_SURFACE, @@ -391,21 +390,14 @@ function workflow(project: ProjectItem): HTMLElement { button.className = "b01-dashboard__step"; button.textContent = stepLabels[index] ?? `B${String(index + 3).padStart(2, "0")}`; - let enabled = false; - if (stages && stages.length > 0) { - enabled = index === 0 || stages[index - 1]?.state === "COMPLETE"; - } else { - enabled = index + 1 <= Math.max(activeStage, 1); - } - - button.disabled = !enabled; - if (enabled) { - button.classList.add("is-enabled"); - button.addEventListener("click", () => { - localStorage.setItem(CURRENT_PROJECT_ID_KEY, project.id); - navigateTo(route); - }); - } + // 스텝바는 항상 자유롭게 이동 가능(게이팅하지 않음). + // 단계 완료/무효화 판정은 각 페이지의 액션(업로드·분석 실행 등) 시 백엔드가 + // 계산·DB 갱신하며, 여기서는 그 결과를 색상/툴팁으로 표시만 한다. + button.classList.add("is-enabled"); + button.addEventListener("click", () => { + localStorage.setItem(CURRENT_PROJECT_ID_KEY, project.id); + navigateTo(route); + }); if (stages && stages[index]) { const state = stages[index].state; diff --git a/B04_wf1_Surface/B04_wf1_Surface_Api_Fetch.ts b/B04_wf1_Surface/B04_wf1_Surface_Api_Fetch.ts index 19c12c3..3fcf25a 100644 --- a/B04_wf1_Surface/B04_wf1_Surface_Api_Fetch.ts +++ b/B04_wf1_Surface/B04_wf1_Surface_Api_Fetch.ts @@ -163,3 +163,34 @@ export async function fetchSurfaceStatus(projectId: string): Promise { + return requestJson(`/projects/${projectId}/vworld-meta?layer_name=${layerName}`, { + method: "GET", + }); +} + +export async function fetchGisGeoJson(projectId: string, layer: string): Promise { + return requestJson(`/projects/${projectId}/geojson?layer=${encodeURIComponent(layer)}`, { + method: "GET", + }); +} diff --git a/B04_wf1_Surface/B04_wf1_Surface_Engine.py b/B04_wf1_Surface/B04_wf1_Surface_Engine.py index 42024e1..f1061b9 100644 --- a/B04_wf1_Surface/B04_wf1_Surface_Engine.py +++ b/B04_wf1_Surface/B04_wf1_Surface_Engine.py @@ -84,6 +84,52 @@ def run_surface_analysis( config["precompute"] = list(methods) manifest = build_all_terrain_models(data, masks, models_dir, config, force=force) + # 3-2. VWorld 지도 및 국가 GIS 벡터 다운로드 + _report(90, "download_maps", "VWorld 지도 및 GIS 벡터 데이터 다운로드 중") + try: + # project_root 내의 .prj 파일 탐색 (B03_FileInput/input 또는 root 내 존재할 수 있음) + prj_files = ( + list(project_root.glob("**/B03_FileInput/input/*.prj")) + + list(project_root.glob("*.prj")) + + list(project_root.glob("**/*.prj")) + ) + prj_path = prj_files[0] if prj_files else project_root / "result.prj" + + bounds_dict_for_download = { + "x": [float(bounds[0, 0]), float(bounds[0, 1])], + "y": [float(bounds[1, 0]), float(bounds[1, 1])], + "z": [float(bounds[2, 0]), float(bounds[2, 1])], + } + + from B04_wf1_Surface.B04_wf1_Surface_Engine_GisVector import download_all_gis_vectors + from B04_wf1_Surface.B04_wf1_Surface_Engine_VWorld import download_vworld_satellite_map + + # VWorld 지도 및 GIS 데이터 저장 위치는 B04_wf1_Surface/processed에 보관. + layers = [ + {"layer": "Satellite", "ext": "jpeg"}, + {"layer": "Hybrid", "ext": "png"}, + {"layer": "white", "ext": "png"}, + ] + for item in layers: + try: + download_vworld_satellite_map( + prj_path, + bounds_dict_for_download, + processed_dir, + layer_name=item["layer"], + ext=item["ext"], + ) + except Exception: + pass + + try: + download_all_gis_vectors(prj_path, bounds_dict_for_download, processed_dir) + + except Exception: + pass + except Exception: + pass + _report(95, "saving", "결과 저장 중") processed = { diff --git a/B04_wf1_Surface/B04_wf1_Surface_Engine_GisVector.py b/B04_wf1_Surface/B04_wf1_Surface_Engine_GisVector.py new file mode 100644 index 0000000..d7e09cf --- /dev/null +++ b/B04_wf1_Surface/B04_wf1_Surface_Engine_GisVector.py @@ -0,0 +1,155 @@ +"""국가 GIS 벡터 데이터 다운로드 엔진.""" + +from __future__ import annotations + +import json +import urllib.parse +import urllib.request +from pathlib import Path + +from pyproj import Transformer + +# 설정 불러오기 +try: + from config import config_system + + VWORLD_API_KEY = getattr( + config_system, "VWORLD_API_KEY", "3DBD7306-7DBD-38BB-B292-267C5ED7AC6B" + ) + PROJECT_ROOT = getattr(config_system, "PROJECT_ROOT", Path(__file__).resolve().parent.parent) +except ImportError: + VWORLD_API_KEY = "3DBD7306-7DBD-38BB-B292-267C5ED7AC6B" + PROJECT_ROOT = Path(__file__).resolve().parent.parent + +from B04_wf1_Surface.B04_wf1_Surface_Engine_VWorld import get_epsg_from_prj + + +def request_vworld_wfs(typename: str, filename: str, bounds_wgs84: dict, output_dir: Path) -> None: + """브이월드 WFS API를 사용하여 지정된 Bounds 영역 내의 + 공간 벡터 데이터를 GeoJSON으로 다운로드합니다. + """ + # 4326(위경도) bbox 파라미터 구성 (BBOX=minx,miny,maxx,maxy) + bbox_str = ( + f"{bounds_wgs84['min_lon']},{bounds_wgs84['min_lat']}," + f"{bounds_wgs84['max_lon']},{bounds_wgs84['max_lat']}" + ) + + # WFS 파라미터 조립 + params = { + "key": VWORLD_API_KEY, + "domain": "localhost", + "service": "WFS", + "version": "1.1.0", + "request": "GetFeature", + "typename": typename, + "bbox": bbox_str, + "output": "application/json", # GeoJSON 포맷 요청 + "srsName": "EPSG:4326", + } + + url = "http://api.vworld.kr/req/wfs?" + urllib.parse.urlencode(params) + headers = {"User-Agent": "Mozilla/5.0"} + + req = urllib.request.Request(url, headers=headers) + try: + with urllib.request.urlopen(req, timeout=15) as res: + content = res.read() + + data = json.loads(content.decode("utf-8")) + + output_path = output_dir / filename + output_path.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8") + except Exception: + pass + + +def download_all_gis_vectors(prj_path: Path, bounds_meter: dict, output_dir: Path) -> None: + """지형의 로컬 미터단위 bounds 정보를 위경도로 변환 후 5대 국가 GIS 데이터를 다운로드합니다.""" + output_dir.mkdir(parents=True, exist_ok=True) + + # 1. vworld_white_meta.json이 생성되어 있다면 직접 위경도 경계 획득하여 pyproj 축왜곡 방지 + meta_path = prj_path.parent / "vworld_white_meta.json" + if not meta_path.exists(): + meta_path = prj_path.parent / "vworld_satellite_meta.json" + + if meta_path.exists(): + try: + with open(meta_path, "r", encoding="utf-8") as f: + meta_data = json.load(f) + bounds_wgs84 = { + "min_lon": meta_data["lon_min"] - 0.010, + "max_lon": meta_data["lon_max"] + 0.010, + "min_lat": meta_data["lat_min"] - 0.010, + "max_lat": meta_data["lat_max"] + 0.010, + } + except Exception: + # 폴백용 pyproj 변환 + src_epsg = "EPSG:5186" + if prj_path.exists(): + src_epsg = get_epsg_from_prj(prj_path.read_text(encoding="utf-8", errors="ignore")) + transformer = Transformer.from_crs(src_epsg, "EPSG:4326", always_xy=True) + x_min, x_max = bounds_meter["x"][0], bounds_meter["x"][1] + y_min, y_max = bounds_meter["y"][0], bounds_meter["y"][1] + lon_min, lat_min = transformer.transform(x_min, y_min) + lon_max, lat_max = transformer.transform(x_max, y_max) + bounds_wgs84 = { + "min_lon": min(lon_min, lon_max) - 0.002, + "max_lon": max(lon_min, lon_max) + 0.002, + "min_lat": min(lat_min, lat_max) - 0.002, + "max_lat": max(lat_min, lat_max) + 0.002, + } + else: + # 폴백용 pyproj 변환 + src_epsg = "EPSG:5186" + if prj_path.exists(): + src_epsg = get_epsg_from_prj(prj_path.read_text(encoding="utf-8", errors="ignore")) + transformer = Transformer.from_crs(src_epsg, "EPSG:4326", always_xy=True) + x_min, x_max = bounds_meter["x"][0], bounds_meter["x"][1] + y_min, y_max = bounds_meter["y"][0], bounds_meter["y"][1] + lon_min, lat_min = transformer.transform(x_min, y_min) + lon_max, lat_max = transformer.transform(x_max, y_max) + bounds_wgs84 = { + "min_lon": min(lon_min, lon_max) - 0.010, + "max_lon": max(lon_min, lon_max) + 0.010, + "min_lat": min(lat_min, lat_max) - 0.010, + "max_lat": max(lat_min, lat_max) + 0.010, + } + + # 5대 레이어 다운로드 + request_vworld_wfs( + "lt_c_landinfobasemap", "연속지적도_bounds.geojson", bounds_wgs84, output_dir + ) + request_vworld_wfs("lt_c_uq111", "용도지역도_bounds.geojson", bounds_wgs84, output_dir) + request_vworld_wfs("lt_c_adsigg", "행정구역_시군구_bounds.geojson", bounds_wgs84, output_dir) + request_vworld_wfs("lt_c_adri", "행정구역_읍면동_bounds.geojson", bounds_wgs84, output_dir) + request_vworld_wfs("lt_c_gimshydro", "수계망_물줄기_bounds.geojson", bounds_wgs84, output_dir) + request_vworld_wfs( + "lt_c_kfdrssigugrade", "산사태위험등급_bounds.geojson", bounds_wgs84, output_dir + ) + + # 6. gpkg 등고선(national_contours.gpkg) 데이터에서 + # 기준 영역 크롭하여 등고선_bounds.geojson 생성 + + gpkg_path = PROJECT_ROOT / "source" / "grobal_contours" / "national_contours.gpkg" + if gpkg_path.exists(): + try: + import geopandas as gpd + from shapely.geometry import box + + t_to_5179 = Transformer.from_crs("EPSG:4326", "EPSG:5179", always_xy=True) + min_x_5179, min_y_5179 = t_to_5179.transform( + bounds_wgs84["min_lon"], bounds_wgs84["min_lat"] + ) + max_x_5179, max_y_5179 = t_to_5179.transform( + bounds_wgs84["max_lon"], bounds_wgs84["max_lat"] + ) + + bbox = box(min_x_5179, min_y_5179, max_x_5179, max_y_5179) + + gdf = gpd.read_file(gpkg_path, bbox=bbox) + if not gdf.empty: + gdf_wgs84 = gdf.to_crs("EPSG:4326") + geojson_out = output_dir / "등고선_bounds.geojson" + gdf_wgs84.to_file(geojson_out, driver="GeoJSON") + except Exception: + pass diff --git a/B04_wf1_Surface/B04_wf1_Surface_Engine_MvtHelper.py b/B04_wf1_Surface/B04_wf1_Surface_Engine_MvtHelper.py new file mode 100644 index 0000000..c945e8f --- /dev/null +++ b/B04_wf1_Surface/B04_wf1_Surface_Engine_MvtHelper.py @@ -0,0 +1,113 @@ +"""MVT 벡터 타일 생성 유틸리티.""" + +from __future__ import annotations + +import math +from pathlib import Path +from typing import Any + +try: + import geopandas as gpd + from shapely.geometry import box +except ImportError: + gpd = None + box = None + +try: + import mapbox_vector_tile +except ImportError: + mapbox_vector_tile = None + +# 메모리 캐시: {project_id}_{layer_name}: GeoDataFrame +_gdf_cache: dict[str, Any] = {} + + +def num2deg(xtile: int, ytile: int, zoom: int) -> tuple[float, float]: + """Z/X/Y 타일 인덱스를 경도/위도(WGS84) 좌표로 변환합니다.""" + n = 1.0 << zoom + lon_deg = xtile / n * 360.0 - 180.0 + lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n))) + lat_deg = math.degrees(lat_rad) + return lon_deg, lat_deg + + +def get_tile_bbox(xtile: int, ytile: int, zoom: int) -> tuple[float, float, float, float]: + """Z/X/Y 타일의 경위도 Bounding Box (min_lon, min_lat, max_lon, max_lat)를 구합니다.""" + left, top = num2deg(xtile, ytile, zoom) + right, bottom = num2deg(xtile + 1, ytile + 1, zoom) + return min(left, right), min(top, bottom), max(left, right), max(top, bottom) + + +def load_geojson_cached(filepath: Path, cache_key: str) -> Any: + """GeoJSON 파일을 한 번 읽으면 메모리에 GeoDataFrame으로 캐싱합니다.""" + global _gdf_cache + if cache_key not in _gdf_cache: + if not filepath.exists(): + raise FileNotFoundError(f"File not found: {filepath}") + if gpd is None: + raise ImportError("geopandas가 설치되어 있지 않습니다.") + gdf = gpd.read_file(filepath) + if gdf.crs is None: + gdf.set_crs(epsg=4326, inplace=True) + if gdf.crs.to_epsg() != 4326: + gdf = gdf.to_crs(epsg=4326) + _gdf_cache[cache_key] = gdf + return _gdf_cache[cache_key] + + +def generate_mvt_tile( + filepath: Path, cache_key: str, z: int, x: int, y: int, layer_name: str = "contour" +) -> bytes: + """주어진 GeoJSON 파일에서 Z/X/Y 영역에 해당하는 데이터를 + 필터링하고 MVT 타일 바이너리로 인코딩합니다. + """ + if mapbox_vector_tile is None: + # mapbox_vector_tile 패키지가 없을 경우 빈 바이트 리턴하여 다운 방지 + return b"" + + gdf = load_geojson_cached(filepath, cache_key) + + # 1. 타일 경계 구하기 + min_lon, min_lat, max_lon, max_lat = get_tile_bbox(x, y, z) + tile_geom = box(min_lon, min_lat, max_lon, max_lat) + + # 2. 해당 영역 내에 공간적으로 접하는(Intersects) 데이터 신속 조회 + possible_matches_index = list(gdf.sindex.intersection((min_lon, min_lat, max_lon, max_lat))) + possible_matches = gdf.iloc[possible_matches_index] + + # 정확하게 겹치는 피처만 정밀 필터링 및 타일 경계로 클리핑(자르기) + clipped_gdf = possible_matches.clip(tile_geom) + + if clipped_gdf.empty: + return mapbox_vector_tile.encode([]) + + # 3. GeoJSON 스타일 피처 목록 생성 + features = [] + extent = 4096 + + for idx, row in clipped_gdf.iterrows(): + geom = row.geometry + if geom.is_empty: + continue + + properties = {} + for col in clipped_gdf.columns: + if col != "geometry": + val = row[col] + if isinstance(val, (int, float, str, bool)): + properties[col] = val + else: + properties[col] = str(val) if val is not None else "" + + features.append({"geometry": geom, "properties": properties}) + + tile_data = [{"name": layer_name, "features": features}] + + mvt_bytes = mapbox_vector_tile.encode( + tile_data, + quantize_bounds=(min_lon, min_lat, max_lon, max_lat), + y_coord_down=True, + extents=extent, + ) + + return mvt_bytes diff --git a/B04_wf1_Surface/B04_wf1_Surface_Engine_VWorld.py b/B04_wf1_Surface/B04_wf1_Surface_Engine_VWorld.py new file mode 100644 index 0000000..bfba30f --- /dev/null +++ b/B04_wf1_Surface/B04_wf1_Surface_Engine_VWorld.py @@ -0,0 +1,199 @@ +"""VWorld 위성 맵 및 타일 다운로드 엔진.""" + +from __future__ import annotations + +import json +import math +import urllib.parse +import urllib.request +from io import BytesIO +from pathlib import Path + +from PIL import Image +from pyproj import Transformer + +# 설정 불러오기 +try: + from config import config_system + + VWORLD_API_KEY = getattr( + config_system, "VWORLD_API_KEY", "3DBD7306-7DBD-38BB-B292-267C5ED7AC6B" + ) +except ImportError: + VWORLD_API_KEY = "3DBD7306-7DBD-38BB-B292-267C5ED7AC6B" + + +def get_epsg_from_prj(prj_content: str) -> str: + """PRJ 파일 텍스트 내용을 해석하여 적합한 EPSG 좌표계 코드를 추정합니다. + + 기본 한반도 주요 좌표계 매핑: + - Korea Central Belt (중부원점 20만, 60만) -> EPSG:5186 (Korea 2000 Central) + - Korea East Belt (동부원점) -> EPSG:5187 + - Korea West Belt (서부원점) -> EPSG:5185 + - WGS84 UTM 52N -> EPSG:32652 + """ + prj_upper = prj_content.upper() + if "EAST" in prj_upper: + return "EPSG:5187" + elif "WEST" in prj_upper: + return "EPSG:5185" + elif "CENTRAL" in prj_upper: + return "EPSG:5186" + elif "UTM" in prj_upper and "52N" in prj_upper: + return "EPSG:32652" + + # 디폴트는 한국 중부 2000 좌표계 적용 + return "EPSG:5186" + + +def latlon_to_tile(lat: float, lon: float, zoom: int) -> tuple[int, int]: + """위도, 경도를 OSM/VWorld 표준 지도 타일 좌표 (X, Y)로 변환합니다.""" + lat_rad = math.radians(lat) + n = 2.0**zoom + xtile = int((lon + 180.0) / 360.0 * n) + ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n) + return xtile, ytile + + +def tile_to_latlon(xtile: int, ytile: int, zoom: int) -> tuple[float, float]: + """OSM/VWorld 표준 타일 좌표 (X, Y)를 위도, 경도 좌표로 역변환합니다.""" + n = 2.0**zoom + lon_deg = xtile / n * 360.0 - 180.0 + lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n))) + lat_deg = math.degrees(lat_rad) + return lat_deg, lon_deg + + +def download_vworld_satellite_map( + prj_path: Path, bounds: dict, output_dir: Path, layer_name: str = "Satellite", ext: str = "jpeg" +) -> Path | None: + """PRJ 좌표 정보와 지형 범위(bounds)를 바탕으로, + 해당 임도 산림 지역을 감싸는 VWorld 지도 타일을 다운로드하여 하나의 PNG 텍스처로 병합합니다. + """ + output_dir.mkdir(parents=True, exist_ok=True) + file_name = f"vworld_{layer_name.lower()}.png" + map_png_path = output_dir / file_name + meta_json_path = output_dir / f"vworld_{layer_name.lower()}_meta.json" + + # 1. PRJ 내용 분석 + if not prj_path.exists(): + return None + prj_content = prj_path.read_text(encoding="utf-8", errors="ignore") + src_epsg = get_epsg_from_prj(prj_content) + + # 2. 중심점 및 경계 좌표 위경도 변환 + # bounds: {'x': [x_min, x_max], 'y': [y_min, y_max], 'z': [z_min, z_max]} + x_min, x_max = bounds["x"][0], bounds["x"][1] + y_min, y_max = bounds["y"][0], bounds["y"][1] + + # 좌표 변환기 생성 (지정 좌표계 -> 경위도 EPSG:4326) + try: + transformer = Transformer.from_crs(src_epsg, "EPSG:4326", always_xy=True) + except Exception: + # 실패 시 강제로 Korea Central -> WGS84 생성 + transformer = Transformer.from_crs("EPSG:5186", "EPSG:4326", always_xy=True) + + lon_min, lat_min = transformer.transform(x_min, y_min) + lon_max, lat_max = transformer.transform(x_max, y_max) + + # 3. 지도 타일 크기 결정 (ZOOM 18 초고해상도 적용) + zoom = 18 + + # 영역을 포괄하는 좌상단 타일, 우하단 타일 인덱스 산출 + x1, y1 = latlon_to_tile(lat_max, lon_min, zoom) + x2, y2 = latlon_to_tile(lat_min, lon_max, zoom) + + # 타일 경계 마진 패딩 + x_start = min(x1, x2) - 1 + x_end = max(x1, x2) + 1 + y_start = min(y1, y2) - 1 + y_end = max(y1, y2) + 1 + + tile_w = x_end - x_start + 1 + tile_h = y_end - y_start + 1 + + # 너무 많은 타일을 다운로드하여 IP 차단되는 것을 방지 + if tile_w > 15: + tile_w = 15 + x_end = x_start + 14 + if tile_h > 15: + tile_h = 15 + y_end = y_start + 14 + + # 4. 개별 타일 다운로드 및 이미지 병합 + map_img = Image.new("RGBA", (tile_w * 256, tile_h * 256)) + headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"} + + for ty in range(y_start, y_end + 1): + for tx in range(x_start, x_end + 1): + try: + normalized_layer = layer_name.lower() + if normalized_layer == "satellite": + sat_url = f"http://api.vworld.kr/req/wmts/1.0.0/{VWORLD_API_KEY}/Satellite/{zoom}/{ty}/{tx}.jpeg" + sat_req = urllib.request.Request(sat_url, headers=headers) + with urllib.request.urlopen(sat_req, timeout=5) as sat_res: + sat_data = sat_res.read() + base_img = Image.open(BytesIO(sat_data)).convert("RGBA") + elif normalized_layer == "hybrid": + hy_url = f"http://api.vworld.kr/req/wmts/1.0.0/{VWORLD_API_KEY}/Hybrid/{zoom}/{ty}/{tx}.png" + hy_req = urllib.request.Request(hy_url, headers=headers) + with urllib.request.urlopen(hy_req, timeout=5) as hy_res: + hy_data = hy_res.read() + base_img = Image.open(BytesIO(hy_data)).convert("RGBA") + elif normalized_layer == "white": + white_url = f"http://api.vworld.kr/req/wmts/1.0.0/{VWORLD_API_KEY}/white/{zoom}/{ty}/{tx}.png" + white_req = urllib.request.Request(white_url, headers=headers) + with urllib.request.urlopen(white_req, timeout=5) as white_res: + white_data = white_res.read() + base_img = Image.open(BytesIO(white_data)).convert("RGBA") + else: + layer_url = f"http://api.vworld.kr/req/wmts/1.0.0/{VWORLD_API_KEY}/{layer_name}/{zoom}/{ty}/{tx}.{ext}" + layer_req = urllib.request.Request(layer_url, headers=headers) + with urllib.request.urlopen(layer_req, timeout=5) as layer_res: + layer_data = layer_res.read() + base_img = Image.open(BytesIO(layer_data)).convert("RGBA") + + # 병합 좌표 계산 + px = (tx - x_start) * 256 + py = (ty - y_start) * 256 + map_img.paste(base_img, (px, py)) + except Exception: + # 다운로드 실패 시 회색 격자 텍스처로 대체 + fallback_tile = Image.new("RGBA", (256, 256), (200, 200, 200, 255)) + px = (tx - x_start) * 256 + py = (ty - y_start) * 256 + map_img.paste(fallback_tile, (px, py)) + + # 5. 병합된 이미지의 실제 위경도 바운더리 계산 + lat_top, lon_left = tile_to_latlon(x_start, y_start, zoom) + lat_bottom, lon_right = tile_to_latlon(x_end + 1, y_end + 1, zoom) + + # 위경도를 다시 원본 Local 3D 미터 좌표계로 변환 + try: + rev_transformer = Transformer.from_crs("EPSG:4326", src_epsg, always_xy=True) + except Exception: + rev_transformer = Transformer.from_crs("EPSG:4326", "EPSG:5186", always_xy=True) + + img_x_min, img_y_max = rev_transformer.transform(lon_left, lat_top) + img_x_max, img_y_min = rev_transformer.transform(lon_right, lat_bottom) + + # 6. 이미지 저장 및 메타데이터 작성 + map_img.save(map_png_path, "PNG") + + meta = { + "x_min": img_x_min, + "x_max": img_x_max, + "y_min": img_y_min, + "y_max": img_y_max, + "width_meters": img_x_max - img_x_min, + "height_meters": img_y_max - img_y_min, + "center_x": (img_x_min + img_x_max) / 2.0, + "center_y": (img_y_min + img_y_max) / 2.0, + "lon_min": lon_left, + "lon_max": lon_right, + "lat_min": lat_bottom, + "lat_max": lat_top, + } + meta_json_path.write_text(json.dumps(meta, indent=2), encoding="utf-8") + + return map_png_path diff --git a/B04_wf1_Surface/B04_wf1_Surface_Router.py b/B04_wf1_Surface/B04_wf1_Surface_Router.py index 3df369b..55acf7c 100644 --- a/B04_wf1_Surface/B04_wf1_Surface_Router.py +++ b/B04_wf1_Surface/B04_wf1_Surface_Router.py @@ -9,7 +9,7 @@ from uuid import UUID import aiomysql import numpy as np -from fastapi import APIRouter +from fastapi import APIRouter, HTTPException, Response from fastapi.responses import FileResponse, JSONResponse from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_path @@ -637,3 +637,202 @@ async def get_surface_model_contour( status_code=500, content={"status": "error", "message": "등고선 파일 조회 중 오류가 발생했습니다."}, ) + + +# VWorld 메타 API +@router.get("/{project_id}/vworld-meta", response_model=None) +async def get_vworld_meta( + project_id: UUID, layer_name: str = "satellite" +) -> dict[str, Any] | JSONResponse: + """VWorld 위성 맵 이미지 매핑 좌표 메타데이터를 반환합니다.""" + pool = get_db_pool() + try: + async with pool.acquire() as connection: + stored_path = await get_project_storage_relative_path(connection, project_id) + project_root = Path(resolve_stored_project_path(stored_path)) + target_dir = project_root / "B04_wf1_Surface" / "processed" + + target_layer = "white" if layer_name.lower() in ["gray", "white"] else layer_name.lower() + meta_name = f"vworld_{target_layer}_meta.json" + meta_path = target_dir / meta_name + + if not meta_path.exists() and target_layer == "satellite": + meta_path = target_dir / "vworld_meta.json" + + if not meta_path.exists(): + return JSONResponse( + status_code=404, + content={ + "status": "error", + "message": f"VWorld {layer_name} 메타데이터를 찾을 수 없습니다.", + }, + ) + return json.loads(meta_path.read_text(encoding="utf-8")) + except Exception as exc: + return JSONResponse(status_code=500, content={"status": "error", "message": str(exc)}) + + +# VWorld 맵 API +@router.get("/{project_id}/vworld-map", response_model=None) +async def get_vworld_map( + project_id: UUID, layer_name: str = "satellite" +) -> FileResponse | JSONResponse: + """배경 지도 레이어 PNG 이미지를 반환합니다.""" + pool = get_db_pool() + try: + async with pool.acquire() as connection: + stored_path = await get_project_storage_relative_path(connection, project_id) + project_root = Path(resolve_stored_project_path(stored_path)) + target_dir = project_root / "B04_wf1_Surface" / "processed" + + target_layer = layer_name.lower() + if target_layer in ["gray", "white"]: + target_layer = "white" + + map_name = f"vworld_{target_layer}.png" + map_path = target_dir / map_name + + if not map_path.exists() and target_layer == "satellite": + map_path = target_dir / "vworld_map.png" + + if not map_path.exists(): + return JSONResponse( + status_code=404, + content={ + "status": "error", + "message": f"VWorld {layer_name} 지도가 존재하지 않습니다.", + }, + ) + return FileResponse(map_path, media_type="image/png") + except Exception as exc: + return JSONResponse(status_code=500, content={"status": "error", "message": str(exc)}) + + +# GeoJSON 조회 API +@router.get("/{project_id}/geojson", response_model=None) +async def get_project_geojson(project_id: UUID, layer: str) -> dict[str, Any] | JSONResponse: + """저장된 프로젝트의 특정 GeoJSON 레이어 데이터를 반환합니다.""" + pool = get_db_pool() + try: + async with pool.acquire() as connection: + stored_path = await get_project_storage_relative_path(connection, project_id) + project_root = Path(resolve_stored_project_path(stored_path)) + target_dir = project_root / "B04_wf1_Surface" / "processed" + + layer_mapping = { + "지적도": "연속지적도_bounds.geojson", + "용도지역": "용도지역도_bounds.geojson", + "행정구역_시군구": "행정구역_시군구_bounds.geojson", + "행정구역_읍면동": "행정구역_읍면동_bounds.geojson", + "수계망": "수계망_물줄기_bounds.geojson", + "등고선": "등고선_bounds.geojson", + "산사태": "산사태위험등급_bounds.geojson", + } + + filename = layer_mapping.get(layer) + if not filename: + return JSONResponse( + status_code=400, + content={"status": "error", "message": "유효하지 않은 레이어명입니다."}, + ) + + filepath = target_dir / filename + if not filepath.exists(): + return JSONResponse( + status_code=404, + content={ + "status": "error", + "message": f"요청한 레이어({layer}) 파일이 존재하지 않습니다.", + }, + ) + + if layer == "등고선": + simplified_filepath = target_dir / "등고선_bounds_simplified.geojson" + if simplified_filepath.exists(): + try: + return json.loads(simplified_filepath.read_text(encoding="utf-8")) + except Exception: + pass + + try: + import geopandas as gpd + + gdf = gpd.read_file(filepath) + gdf["geometry"] = gdf["geometry"].simplify( + tolerance=0.00003, preserve_topology=True + ) + simplified_filepath.write_text(gdf.to_json(), encoding="utf-8") + return json.loads(simplified_filepath.read_text(encoding="utf-8")) + except Exception as e: + logger.warning("등고선 단순화 처리 실패 (원본 전송): %s", e) + + return json.loads(filepath.read_text(encoding="utf-8")) + except Exception as exc: + return JSONResponse(status_code=500, content={"status": "error", "message": str(exc)}) + + +# 별도 tiles_router 정의 (prefix 없음) +tiles_router = APIRouter(tags=["B04 MVT Tiles"]) + + +@tiles_router.get("/tiles/{project_id}/{layer}/{z}/{x}/{y}.pbf", response_model=None) +async def get_vector_tile(project_id: UUID, layer: str, z: int, x: int, y: int) -> Response: + """프로젝트의 특정 레이어에 대한 정밀 벡터 타일(MVT) 조각을 동적으로 렌더링하여 반환합니다.""" + pool = get_db_pool() + try: + async with pool.acquire() as connection: + stored_path = await get_project_storage_relative_path(connection, project_id) + project_root = Path(resolve_stored_project_path(stored_path)) + target_dir = project_root / "B04_wf1_Surface" / "processed" + + layer_mapping = { + "지적도": "연속지적도_bounds.geojson", + "용도지역": "용도지역도_bounds.geojson", + "행정구역_시군구": "행정구역_시군구_bounds.geojson", + "행정구역_읍면동": "행정구역_읍면동_bounds.geojson", + "수계망": "수계망_물줄기_bounds.geojson", + "등고선": "등고선_bounds.geojson", + "산사태": "산사태위험등급_bounds.geojson", + "임도노선": "임도노선.geojson", + } + + filename = layer_mapping.get(layer) + if not filename: + raise HTTPException(status_code=400, detail="유효하지 않은 레이어명입니다.") + + filepath = target_dir / filename + + if layer == "임도노선" and not filepath.exists(): + from config.config_system import PROJECT_ROOT + + road_shp_candidates = list(PROJECT_ROOT.glob("samples/**/*_Polyline.shp")) + if road_shp_candidates: + try: + import geopandas as gpd + + gdf = gpd.read_file(road_shp_candidates[0]) + gdf = gdf.to_crs(epsg=4326) + filepath.write_text(gdf.to_json(), encoding="utf-8") + except Exception: + pass + + if not filepath.exists(): + import mapbox_vector_tile + + empty_tile = mapbox_vector_tile.encode([]) if mapbox_vector_tile else b"" + return Response(content=empty_tile, media_type="application/x-protobuf") + + cache_key = f"{project_id}_{layer}" + from B04_wf1_Surface.B04_wf1_Surface_Engine_MvtHelper import generate_mvt_tile + + mvt_bytes = generate_mvt_tile(filepath, cache_key, z, x, y, layer_name=layer) + return Response( + content=mvt_bytes, + media_type="application/x-protobuf", + headers={"Content-Encoding": "identity"}, + ) + except Exception: + import mapbox_vector_tile + + empty_tile = mapbox_vector_tile.encode([]) if mapbox_vector_tile else b"" + return Response(content=empty_tile, media_type="application/x-protobuf") diff --git a/B04_wf1_Surface/B04_wf1_Surface_UI_Page.ts b/B04_wf1_Surface/B04_wf1_Surface_UI_Page.ts index 7678109..9959e75 100644 --- a/B04_wf1_Surface/B04_wf1_Surface_UI_Page.ts +++ b/B04_wf1_Surface/B04_wf1_Surface_UI_Page.ts @@ -11,8 +11,9 @@ * 텍스트는 ui_template_locale에 선(先) 등록 후 참조 (frontend.md §3). * ========================================================================== */ -import { CURRENT_PROJECT_ID_KEY } from "@config/config_frontend"; +import { CURRENT_PROJECT_ID_KEY, ROUTES, type RoutePath } from "@config/config_frontend"; import { currentLanguageIndex, ui_locales } from "@ui/ui_template_locale"; +import { navigateTo } from "../A00_Common/router"; import { createButton, createTag, @@ -32,7 +33,7 @@ import { type SurfaceModelSummary, type SurfaceStatusResponse, } from "./B04_wf1_Surface_Api_Fetch"; -import { createWorkflowLayout } from "@ui/ui_template_workflow_layout"; +import { createWorkflowLayout, type WorkflowStage } from "@ui/ui_template_workflow_layout"; import { createSurfacePointCloudViewer } from "./B04_wf1_Surface_UI_Viewer"; import { createSurfaceTerrainViewer } from "./B04_wf1_Surface_UI_TerrainViewer"; import "./B04_wf1_Surface_UI_Style.css"; @@ -91,7 +92,7 @@ function buildInfoLine(label: string, value: unknown): HTMLElement { return row; } -export function renderB04Surface(root: HTMLElement): void { +export async function renderB04Surface(root: HTMLElement): Promise { let selectedInputFile: SurfaceInputFileSummary | null = null; let inputFiles: SurfaceInputFileSummary[] = []; @@ -190,12 +191,44 @@ export function renderB04Surface(root: HTMLElement): void { bottom.append(statsSection, modelsSection); workspace.append(topbar, viewer.root, terrainViewer.root, bottom); + const workflowRoutes = [ + ROUTES.B03_FILE_INPUT, + ROUTES.B04_WF1_SURFACE, + ROUTES.B05_WF2_ROUTE, + ROUTES.B06_WF3_PROFILE_CROSS, + ROUTES.B07_WF4_DESIGN_DETAIL, + ROUTES.B08_WF5_QUANTITY, + ROUTES.B09_WF6_ESTIMATION, + ]; + + let workflowStages: WorkflowStage[] = []; + const layoutProjectId = localStorage.getItem(CURRENT_PROJECT_ID_KEY); + if (layoutProjectId) { + try { + const res = await fetch(`/api/projects/${layoutProjectId}/workflow-state`); + if (res.ok) { + const data = await res.json(); + workflowStages = data.workflow_state?.stages ?? data.stages ?? []; + } + } catch { + /* 실패 시 빈 배열 → activeStep 기준 폴백으로 이동 허용 */ + } + } + const layout = createWorkflowLayout({ title: L("B04_Surface_Title"), steps: workflowSteps(), activeStep: 1, leftPanel: panel, mainContent: workspace, + stages: workflowStages, + routes: workflowRoutes, + onStepClick: (_stepIndex, route) => { + if (layoutProjectId) { + localStorage.setItem(CURRENT_PROJECT_ID_KEY, layoutProjectId); + navigateTo(route as RoutePath); + } + }, }); function getProjectId(): string | null { diff --git a/B04_wf1_Surface/B04_wf1_Surface_UI_TerrainViewer.ts b/B04_wf1_Surface/B04_wf1_Surface_UI_TerrainViewer.ts index 62d4b47..ef4595d 100644 --- a/B04_wf1_Surface/B04_wf1_Surface_UI_TerrainViewer.ts +++ b/B04_wf1_Surface/B04_wf1_Surface_UI_TerrainViewer.ts @@ -3,11 +3,13 @@ import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"; import { PLYLoader } from "three/examples/jsm/loaders/PLYLoader.js"; import type { SurfaceModelSummary } from "./B04_wf1_Surface_Api_Fetch"; -import { API_BASE_URL } from "@config/config_frontend"; +import { fetchVWorldMeta, getVWorldMapUrl, fetchGisGeoJson } from "./B04_wf1_Surface_Api_Fetch"; export interface SurfaceTerrainViewer { root: HTMLElement; render: (projectId: string, models: readonly SurfaceModelSummary[]) => void; + updateBgMap: (projectId: string, bgLayer: string) => void; + updateGisLayer: (projectId: string, gisLayer: string) => void; dispose: () => void; } @@ -263,6 +265,46 @@ export function createSurfaceTerrainViewer(): SurfaceTerrainViewer { scaleBar.append(scaleLabel); viewerArea.append(scaleBar); + // Elevation bounds legend bar overlay (I-403) + const legendBar = document.createElement("div"); + legendBar.style.position = "absolute"; + legendBar.style.top = "16px"; + legendBar.style.right = "16px"; + legendBar.style.background = "rgba(255, 255, 255, 0.9)"; + legendBar.style.border = "1px solid #cbd5e1"; + legendBar.style.borderRadius = "6px"; + legendBar.style.padding = "8px"; + legendBar.style.width = "50px"; + legendBar.style.display = "none"; // hidden until contours are loaded + legendBar.style.flexDirection = "column"; + legendBar.style.alignItems = "center"; + legendBar.style.zIndex = "10"; + legendBar.style.boxShadow = "0 2px 6px rgba(0,0,0,0.08)"; + legendBar.style.pointerEvents = "none"; + + const maxValSpan = document.createElement("span"); + maxValSpan.style.fontSize = "10px"; + maxValSpan.style.fontWeight = "bold"; + maxValSpan.style.color = "#b91c1c"; + maxValSpan.style.marginBottom = "4px"; + + const gradientDiv = document.createElement("div"); + gradientDiv.style.width = "12px"; + gradientDiv.style.height = "120px"; + gradientDiv.style.background = + "linear-gradient(to bottom, #d60000 0%, #ff5100 25%, #e6a100 50%, #228b22 75%, #3a85ff 100%)"; + gradientDiv.style.borderRadius = "2px"; + gradientDiv.style.border = "1px solid #94a3b8"; + + const minValSpan = document.createElement("span"); + minValSpan.style.fontSize = "10px"; + minValSpan.style.fontWeight = "bold"; + minValSpan.style.color = "#1d4ed8"; + minValSpan.style.marginTop = "4px"; + + legendBar.append(maxValSpan, gradientDiv, minValSpan); + viewerArea.append(legendBar); + // Three.js context variables let currentProjectId = ""; let currentModelsList: readonly SurfaceModelSummary[] = []; @@ -324,6 +366,7 @@ export function createSurfaceTerrainViewer(): SurfaceTerrainViewer { } labelElements.forEach((el) => el.remove()); labelElements.length = 0; + legendBar.style.display = "none"; } const getFitParams = (object: THREE.Object3D) => { @@ -376,8 +419,7 @@ export function createSurfaceTerrainViewer(): SurfaceTerrainViewer { const match = currentModelsList.find((m) => { const typeMatches = m.model_type.toLowerCase() === activeMethod.toLowerCase(); const pathContainsFilter = - m.model_file_path && - m.model_file_path.toLowerCase().includes(activeFilter.toLowerCase()); + m.model_file_path && m.model_file_path.toLowerCase().includes(activeFilter.toLowerCase()); return typeMatches && pathContainsFilter; }); @@ -471,7 +513,13 @@ export function createSurfaceTerrainViewer(): SurfaceTerrainViewer { }); }; + let minH = Infinity; + let maxH = -Infinity; + data.contours.forEach((c: any) => { + if (c.level < minH) minH = c.level; + if (c.level > maxH) maxH = c.level; + const points = transform(c.coordinates); if (points.length < 2) return; @@ -531,8 +579,18 @@ export function createSurfaceTerrainViewer(): SurfaceTerrainViewer { labelElements.push(labelDiv); } }); + + if (minH !== Infinity && maxH !== -Infinity) { + const nearestMin10 = Math.round(minH / 10) * 10; + const nearestMax10 = Math.round(maxH / 10) * 10; + maxValSpan.textContent = `${nearestMax10}m`; + minValSpan.textContent = `${nearestMin10}m`; + legendBar.style.display = "flex"; + } else { + legendBar.style.display = "none"; + } } catch (e) { - // Contour loading failed or silent fail + legendBar.style.display = "none"; } } @@ -652,6 +710,12 @@ export function createSurfaceTerrainViewer(): SurfaceTerrainViewer { currentModelsList = models; updateSelectedModel(); }, + updateBgMap(projectId, bgLayer) { + // 포인트클라우드 뷰어와 인터페이스 조화를 위해 빈 껍데기 함수 정의 + }, + updateGisLayer(projectId, gisLayer) { + // 포인트클라우드 뷰어와 인터페이스 조화를 위해 빈 껍데기 함수 정의 + }, dispose() { cancelAnimationFrame(animationFrameId); resizeObserver.disconnect(); diff --git a/B04_wf1_Surface/B04_wf1_Surface_UI_Viewer.ts b/B04_wf1_Surface/B04_wf1_Surface_UI_Viewer.ts index 2ac9fb0..f42d381 100644 --- a/B04_wf1_Surface/B04_wf1_Surface_UI_Viewer.ts +++ b/B04_wf1_Surface/B04_wf1_Surface_UI_Viewer.ts @@ -1,7 +1,12 @@ import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; import { RENDER_OPTIONS } from "@config/config_frontend"; -import type { SurfacePointCloudSampleResponse } from "./B04_wf1_Surface_Api_Fetch"; +import { + fetchVWorldMeta, + getVWorldMapUrl, + fetchGisGeoJson, + type SurfacePointCloudSampleResponse, +} from "./B04_wf1_Surface_Api_Fetch"; export interface SurfacePointCloudViewer { root: HTMLElement; @@ -9,6 +14,8 @@ export interface SurfacePointCloudViewer { optionsGroup: HTMLElement; statusSpan: HTMLElement; render: (data: SurfacePointCloudSampleResponse | null) => void; + updateBgMap: (projectId: string, bgLayer: string) => void; + updateGisLayer: (projectId: string, gisLayer: string) => void; dispose: () => void; } @@ -85,7 +92,53 @@ export function createSurfacePointCloudViewer(): SurfacePointCloudViewer { densityInput.value = "10"; densityLabel.append(densityInput); - optionsDiv.append(sizeLabel, densityLabel); + const bgLabel = document.createElement("label"); + bgLabel.textContent = "배경 지도 "; + bgLabel.style.display = "flex"; + bgLabel.style.flexDirection = "column"; + bgLabel.style.gap = "var(--spacing-4)"; + bgLabel.style.marginTop = "var(--spacing-8)"; + const bgSelect = document.createElement("select"); + bgSelect.className = "b04-surface__select"; + const bgOptions = [ + { value: "none", label: "없음" }, + { value: "satellite", label: "위성사진" }, + { value: "hybrid", label: "하이브리드 지도" }, + { value: "white", label: "백지도" }, + ]; + bgOptions.forEach((opt) => { + const o = document.createElement("option"); + o.value = opt.value; + o.textContent = opt.label; + bgSelect.append(o); + }); + bgLabel.append(bgSelect); + + const gisLabel = document.createElement("label"); + gisLabel.textContent = "국가 GIS 레이어 "; + gisLabel.style.display = "flex"; + gisLabel.style.flexDirection = "column"; + gisLabel.style.gap = "var(--spacing-4)"; + gisLabel.style.marginTop = "var(--spacing-8)"; + const gisSelect = document.createElement("select"); + gisSelect.className = "b04-surface__select"; + const gisOptions = [ + { value: "none", label: "없음" }, + { value: "지적도", label: "연속지적도" }, + { value: "수계망", label: "수계망" }, + { value: "산사태", label: "산사태위험등급" }, + { value: "행정구역_시군구", label: "시군구 경계" }, + { value: "행정구역_읍면동", label: "읍면동 경계" }, + ]; + gisOptions.forEach((opt) => { + const o = document.createElement("option"); + o.value = opt.value; + o.textContent = opt.label; + gisSelect.append(o); + }); + gisLabel.append(gisSelect); + + optionsDiv.append(sizeLabel, densityLabel, bgLabel, gisLabel); const optionsGroup = document.createElement("section"); optionsGroup.className = "b04-surface__group"; @@ -151,6 +204,8 @@ export function createSurfacePointCloudViewer(): SurfacePointCloudViewer { scene.add(axes); let pointsObject: THREE.Points | null = null; + let bgPlane: THREE.Mesh | null = null; + let gisObjects: THREE.Object3D[] = []; let animationFrame = 0; let currentData: SurfacePointCloudSampleResponse | null = null; @@ -343,15 +398,204 @@ export function createSurfacePointCloudViewer(): SurfacePointCloudViewer { statusSpan.textContent = ` ${renderPoints.length.toLocaleString()}개 점 표시 중 [높이범위: ~${nearestMin10}m ... ${nearestMax10}m~]`; } + function clearBgMap(): void { + if (bgPlane) { + bgPlane.geometry.dispose(); + if (Array.isArray(bgPlane.material)) { + bgPlane.material.forEach((mat) => mat.dispose()); + } else { + bgPlane.material.dispose(); + } + scene.remove(bgPlane); + bgPlane = null; + } + } + + function clearGisLayers(): void { + gisObjects.forEach((obj) => { + if (obj instanceof THREE.Line) { + obj.geometry.dispose(); + if (Array.isArray(obj.material)) { + obj.material.forEach((mat) => mat.dispose()); + } else { + obj.material.dispose(); + } + } + scene.remove(obj); + }); + gisObjects = []; + } + + function updateBgMap(projectId: string, bgLayer: string): void { + clearBgMap(); + if (bgLayer === "none" || !currentData) return; + + const bounds = currentData.bounds; + const xMin = bounds.x_min ?? 0; + const xMax = bounds.x_max ?? 0; + const yMin = bounds.y_min ?? 0; + const yMax = bounds.y_max ?? 0; + const zMin = bounds.z_min ?? 0; + const zMax = bounds.z_max ?? 0; + + const xMid = (xMin + xMax) / 2; + const yMid = (yMin + yMax) / 2; + const zMid = (zMin + zMax) / 2; + + const xSpan = Math.max(xMax - xMin, 1e-9); + const ySpan = Math.max(yMax - yMin, 1e-9); + const zSpan = Math.max(zMax - zMin, 1e-9); + const scale = 180 / Math.max(xSpan, ySpan, zSpan); + + const targetLayer = bgLayer === "gray" ? "white" : bgLayer; + + fetchVWorldMeta(projectId, targetLayer) + .then((meta) => { + const planeW = meta.width_meters * scale; + const planeH = meta.height_meters * scale; + const planeGeo = new THREE.PlaneGeometry(planeW, planeH); + + const textureLoader = new THREE.TextureLoader(); + textureLoader.load(getVWorldMapUrl(projectId, targetLayer), (texture) => { + const planeMat = new THREE.MeshBasicMaterial({ + map: texture, + side: THREE.DoubleSide, + transparent: true, + opacity: 0.85, + }); + bgPlane = new THREE.Mesh(planeGeo, planeMat); + bgPlane.rotation.x = -Math.PI / 2; + + const planeCenterX = (meta.center_x - xMid) * scale; + const planeCenterY = -(meta.center_y - yMid) * scale; + const planeCenterZ = (zMin - zMid) * scale - 0.5; + + bgPlane.position.set(planeCenterX, planeCenterZ, planeCenterY); + scene.add(bgPlane); + }); + }) + .catch((e) => console.log("VWorld 배경 로드 실패:", e.message)); + } + + function updateGisLayer(projectId: string, gisLayer: string): void { + clearGisLayers(); + if (gisLayer === "none" || !currentData) return; + + const bounds = currentData.bounds; + const xMin = bounds.x_min ?? 0; + const xMax = bounds.x_max ?? 0; + const yMin = bounds.y_min ?? 0; + const yMax = bounds.y_max ?? 0; + const zMin = bounds.z_min ?? 0; + const zMax = bounds.z_max ?? 0; + + const xMid = (xMin + xMax) / 2; + const yMid = (yMin + yMax) / 2; + const zMid = (zMin + zMax) / 2; + + const xSpan = Math.max(xMax - xMin, 1e-9); + const ySpan = Math.max(yMax - yMin, 1e-9); + const zSpan = Math.max(zMax - zMin, 1e-9); + const scale = 180 / Math.max(xSpan, ySpan, zSpan); + + Promise.all([fetchGisGeoJson(projectId, gisLayer), fetchVWorldMeta(projectId, "white")]) + .then(([geoData, meta]) => { + const lonRange = meta.lon_max - meta.lon_min; + const latRange = meta.lat_max - meta.lat_min; + const xRange = meta.x_max - meta.x_min; + const yRange = meta.y_max - meta.y_min; + + const toLocal = (lon: number, lat: number): [number, number] => { + const localX_m = meta.x_min + ((lon - meta.lon_min) / lonRange) * xRange; + const localY_m = meta.y_min + ((lat - meta.lat_min) / latRange) * yRange; + return [(localX_m - xMid) * scale, -(localY_m - yMid) * scale]; + }; + + const features = geoData.features || []; + const colors: Record = { + 지적도: 0xff5500, + 수계망: 0x00aaff, + 산사태: 0xff0055, + 행정구역_시군구: 0x333333, + 행정구역_읍면동: 0x666666, + }; + const layerColor = colors[gisLayer] || 0x00aa00; + const groundZ = (zMin - zMid) * scale + 0.1; + + features.forEach((feat: any) => { + const geom = feat.geometry; + if (!geom) return; + + const drawRing = (ring: number[][]) => { + const pts: THREE.Vector3[] = ring.map((pt) => { + const [lx, ly] = toLocal(pt[0], pt[1]); + return new THREE.Vector3(lx, groundZ, ly); + }); + if (pts.length === 0) return; + const lineGeo = new THREE.BufferGeometry().setFromPoints(pts); + const lineMat = new THREE.LineBasicMaterial({ color: layerColor }); + const line = new THREE.Line(lineGeo, lineMat); + scene.add(line); + gisObjects.push(line); + }; + + const drawCoordinates = (coords: any[], type: string) => { + if (type === "Polygon") { + coords.forEach((ring: number[][]) => drawRing(ring)); + } else if (type === "MultiPolygon") { + coords.forEach((poly: any[]) => drawCoordinates(poly, "Polygon")); + } else if (type === "LineString") { + drawRing(coords as number[][]); + } else if (type === "MultiLineString") { + (coords as number[][][]).forEach((line) => drawRing(line)); + } + }; + + drawCoordinates(geom.coordinates, geom.type); + }); + }) + .catch((err) => console.error("GIS 벡터 로드 실패:", err)); + } + + const getProjectIdLocal = () => { + return localStorage.getItem("current_project_id"); + }; + + bgSelect.addEventListener("change", () => { + const projId = getProjectIdLocal(); + if (projId) { + updateBgMap(projId, bgSelect.value); + } + }); + + gisSelect.addEventListener("change", () => { + const projId = getProjectIdLocal(); + if (projId) { + updateGisLayer(projId, gisSelect.value); + } + }); + function render(data: SurfacePointCloudSampleResponse | null): void { currentData = data; clearPoints(); + clearBgMap(); + clearGisLayers(); if (!data) { statusSpan.textContent = "데이터가 존재하지 않습니다."; return; } renderPointCloudInternal(data); setCameraView("top"); + + const projId = getProjectIdLocal(); + if (projId) { + if (bgSelect.value !== "none") { + updateBgMap(projId, bgSelect.value); + } + if (gisSelect.value !== "none") { + updateGisLayer(projId, gisSelect.value); + } + } } // Event Listeners @@ -377,6 +621,11 @@ export function createSurfacePointCloudViewer(): SurfacePointCloudViewer { if (valSpan) valSpan.textContent = `${val * 10}%`; if (currentData) { renderPointCloudInternal(currentData); + const projId = getProjectIdLocal(); + if (projId) { + if (bgSelect.value !== "none") updateBgMap(projId, bgSelect.value); + if (gisSelect.value !== "none") updateGisLayer(projId, gisSelect.value); + } } }); @@ -388,9 +637,13 @@ export function createSurfacePointCloudViewer(): SurfacePointCloudViewer { optionsGroup, statusSpan, render, + updateBgMap, + updateGisLayer, dispose: () => { cancelAnimationFrame(animationFrame); clearPoints(); + clearBgMap(); + clearGisLayers(); controls.dispose(); renderer.dispose(); }, diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Page.ts b/B05_wf2_Route/B05_wf2_Route_UI_Page.ts index d63257f..e791845 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Page.ts +++ b/B05_wf2_Route/B05_wf2_Route_UI_Page.ts @@ -71,7 +71,7 @@ function parseNumber(value: string): number | null { return Number.isFinite(parsed) ? parsed : null; } -export function renderB05Route(root: HTMLElement): void { +export async function renderB05Route(root: HTMLElement): Promise { /* ---- 좌측: 경로 제어점 ---- */ const pointsGroup = document.createElement("fieldset"); pointsGroup.className = "b05-route__group"; @@ -333,14 +333,15 @@ export function renderB05Route(root: HTMLElement): void { let workflowStages: WorkflowStage[] = []; const projectId = localStorage.getItem(CURRENT_PROJECT_ID_KEY); if (projectId) { - fetch(`/api/projects/${projectId}/workflow-state`) - .then((res) => res.json()) - .then((data) => { - workflowStages = data.stages || []; - }) - .catch(() => { - /* silently fail */ - }); + try { + const res = await fetch(`/api/projects/${projectId}/workflow-state`); + if (res.ok) { + const data = await res.json(); + workflowStages = data.workflow_state?.stages ?? data.stages ?? []; + } + } catch { + /* 실패 시 빈 배열 → activeStep 기준 폴백으로 이동 허용 */ + } } const layout = createWorkflowLayout({ diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page.ts b/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page.ts index 190b759..e6c81db 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page.ts +++ b/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page.ts @@ -54,7 +54,7 @@ function parseNumber(value: string): number | null { return Number.isFinite(parsed) ? parsed : null; } -export function renderB06ProfileCross(root: HTMLElement): void { +export async function renderB06ProfileCross(root: HTMLElement): Promise { let currentRouteId: number | null = null; /* ---- 좌측: 대상 경로 ---- */ @@ -255,14 +255,15 @@ export function renderB06ProfileCross(root: HTMLElement): void { let workflowStages: WorkflowStage[] = []; const projectId = localStorage.getItem(CURRENT_PROJECT_ID_KEY); if (projectId) { - fetch(`/api/projects/${projectId}/workflow-state`) - .then((res) => res.json()) - .then((data) => { - workflowStages = data.stages || []; - }) - .catch(() => { - /* silently fail */ - }); + try { + const res = await fetch(`/api/projects/${projectId}/workflow-state`); + if (res.ok) { + const data = await res.json(); + workflowStages = data.workflow_state?.stages ?? data.stages ?? []; + } + } catch { + /* 실패 시 빈 배열 → activeStep 기준 폴백으로 이동 허용 */ + } } const layout = createWorkflowLayout({ diff --git a/CLAUDE.md b/CLAUDE.md index b2dd1e8..f31cf54 120000 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,181 +1,94 @@ -# 프로젝트 행동지침 및 기술 스택 명세 (CLAUDE.md) +# Aislo 프로젝트 AI 행동 지침서 (CLAUDE.md) + +이 문서는 **Claude Code** 및 관련 클로드 어시스턴트가 프로젝트 수행 시 반드시 준수해야 하는 행동 지침 및 아키텍처 명세입니다. 본 가이드라인은 불필요한 토큰 소모를 방지하고 설계 정합성을 유지하기 위해 강제 적용됩니다. --- -## 🚀 빠른 시작 (Quick Start - 항상 읽기!) +## 1. 3중 역할 분담 협업 체계 (3-Role System) -### 웹앱 실행 (전체 스택) -```bash -# 1. 프로젝트 루트에서만 작업 -cd d:\02_Software_Prog\임도설계\ 및\ 견적자동화\ 프로그램\ 개발 +AI는 작업 단계에 따라 다음 3가지 역할 중 하나로만 명확하게 작동해야 하며, 각 단계의 작업물은 엄격하게 분리됩니다. -# 2. Python 가상환경 활성화 -.\venv\Scripts\activate - -# 3. 웹서버 실행 (백엔드 + 프론트엔드 동시 시작) -python main.py - -# 브라우저: http://localhost:8000 -``` - -### 중요 구조 -- **빌드 설정**: 루트(`package.json`, `tsconfig.json`, `vite.config.ts`) — 유일한 빌드 설정 -- **프론트엔드 소스**: `A00_Common/` (진입점), `A0*/`, `B0*/` (페이지들) -- **프론트엔드 공유 자산**: `ui_template/`, `config/` (TypeScript 설정용) -- **백엔드**: `main.py`, `common_util/`, `config/` (Python 설정) -- **DB**: `db_management/` (마이그레이션 SQL) - -### 주의사항 -- ❌ `config/` 폴더에 빌드 설정 파일 두지 말 것 (루트만 사용) -- ❌ `npm run build`는 프로젝트 루트에서만 실행 -- ✅ `python main.py`로 전체 스택 자동 시작 (프론트엔드 빌드 포함) -- ✅ 코더 AI는 `.agent/CODER_HANDOFF.md` 참고 - ---- - -## 프로젝트 & DB 정보 - -### 📌 프로그램명 -**Aislo (아이슬로)** -- **의미**: AI (인공지능) + Slotti (핀란드어: 임도/산림 도로) -- **콘셉트**: 산림의 미래를 열어가는 인공지능 경로 설계 솔루션 - ---- - -## 1. 기술 환경 및 기본 스택 (Technical Stack Baseline) -프로젝트의 코드를 작성, 테스트 또는 검증할 환경 명확화 및 호환 기준 제시. - -### A. 백엔드 프레임워크 (Python) -* **Runtime:** Python v3.12 or v3.13.7 -* **Framework:** FastAPI / Pydantic -* **Geometry/GIS Engine:** Trimesh, Whitebox, Geopandas, Shapely, Rasterio, Laspy - -### B. 데이터베이스 (MariaDB) -* **DBMS:** MariaDB v10.6+ -* **Character Set:** utf8mb4 (한글 완벽 지원) -* **Collation:** utf8mb4_unicode_ci -* **DB Driver (비동기):** `aiomysql` (순수 Python, Windows 호환. asyncmy는 Cython 빌드 필요로 미채택) -* **쿼리 방식:** Raw SQL (ORM 사용 금지) -* **공간 데이터:** JSON 기반 저장 (MariaDB는 PostGIS 미지원) - -### C. 프론트엔드 & WebCAD (TypeScript & WebGL) -* **Language/Runtime:** TypeScript / Node.js -* **Rendering:** HTML5 Canvas 및 WebGL 기반 WebCAD 시스템 구현 - -### D. 인코딩 및 다국어 표준 -* **인코딩:** 텍스트 파일은 UTF-8 표준으로 통일 - ---- - -## 2. 문맥 라우팅 및 문서 구조 (Context Routing) -코드 작성 및 기술 검증 시 문서 우선순위에 따른 계층적 레퍼런스 필수 읽기. - -* **1단계 (필수):** `.agent/structure.md` 읽기 후 신규 폴더 생성 기준 분석. -* **2단계 (선택 읽기):** 프로젝트 구현에 필요한 세부 기술 명세 읽기. - * **그룹 A (UI, 스타일, 컴포넌트, WebCAD):** `.agent/frontend.md` 필수 추가 읽기. - * **그룹 B (알고리즘, 저장, DB, MariaDB 값 제어):** `.agent/backend.md` 필수 추가 읽기. - * **그룹 C (DB 구조 변경):** DB 구조 변경 시 `.agent/db_schema.md` 선택적 읽기. - ---- - -## 3. 코드 작성 기본 제약 (Constraints) -* **구조 준수:** `.agent/structure.md` 트리 구조 엄격 준수. -* **700줄 제한:** 단일 파일 코드 작성/수정 시 700줄 이상이 될 경우 사전 공지. 기능별 파일 분할 후 `structure.md` 갱신 필수. -* **안전 보관:** 백엔드 작업 시 보안 저장소 경로 명시 및 임의 삭제 방지 필수. -* **경로 활용:** 단계별 페이지 기반 폴더 구조(B03~B09)와 DB 경로 열의 기준은 `.agent/db_schema_simple.md`의 「파일시스템 경로와 DB 링크」를 따른다. -* **일관성 검증:** 설계 단계에서부터 DB 설계, 파일 경로, API 라우팅이 모두 동일한 워크플로우 기준으로 통일되어야 한다. (불일치 발생 시 설계 단계에서 재논의 필수) -* **코드 포맷팅 (자동화 도구):** 프로젝트의 코드 작성이 완료되는 시, 반드시 프로젝트 루트에서 각 언어별 포맷터를 재실행하여 스타일을 통일해야 한다. - * *Python 포맷팅 명령어:* `ruff format [파일명]` 및 `ruff check --fix [파일명]` 실행 - * *TypeScript/CSS 포맷팅 명령어:* `npx prettier --write [파일명]` 실행 -* **외부 라이브러리 활용:** 외부 라이브러리 활용 시 프로젝트에 맞춰 호환 라이브러리 선정하고, 불필요한 함수는 작성하지 않도록 최소화. - ---- - -## 4. 데이터베이스 상세 명세 (Database Specification) - -### 4.1 스키마 기본 정보 -- **DB 명:** `aislo_db` -- **DBMS:** MariaDB v10.6+ -- **인코딩:** utf8mb4_unicode_ci -- **테이블 수:** 18개 -- **드라이버:** aiomysql (비동기) - -### 4.2 파일 경로 추적 (Path Tracking) -**모든 중간 산출물의 파일 경로를 DB에 기록:** -- `input_files.raw_file_path` — 원본 입력 파일 -- `processed_point_cloud.converted_file_path` — 변환된 포인트클라우드 -- `surface_models.model_file_path` — 지표면 모델 -- `routes.route_data_path` — 경로 데이터 -- `longitudinal_sections.longitudinal_file_path` — 종단면 -- `cross_sections.cross_section_file_path` — 횡단면 -- `structures.structure_data_path` — 구조물 배치 -- `quantity_items.quantity_data_path` — 수량 항목 -- `outputs.outputs_directory_path` — 산출물 폴더 -- `output_files.output_file_path` — 개별 산출 파일 - -### 4.3 저장소 구조 (Workflow-based Folder Structure) -``` -storage/{company_slug}/{user_slug}/{project_id}/ -├── B03_FileInput/input/ (WF0: 원본 입력) -├── B04_wf1_Surface/processed/ (WF1: 변환된 포인트클라우드 & 모델) -├── B05_wf2_Route/route/ (WF2: 경로 설계) -├── B06_wf3_ProfileCross/ (WF3: 종단면 & 횡단면) -├── B07_wf4_DesignDetail/structures/ (WF4: 구조물 배치) -├── B08_wf5_Quantity/quantities/ (WF5: 수량 산출) -└── B09_wf6_Estimation/v1,v2,.../ (WF6: 최종 산출물) -``` - -### 4.4 공간 데이터 처리 (MariaDB 특성) -- **지하형 기하 데이터:** GEOMETRY 타입 미지원 → JSON으로 저장 -- **좌표 저장 예:** `{"type": "Point", "coordinates": [127.5, 37.5]}` -- **경로 저장 예:** `{"type": "LineString", "coordinates": [[127.5, 37.5], [127.6, 37.6]]}` -- **애플리케이션 처리:** Python의 Shapely, Geopandas에서 JSON 파싱 후 기하 연산 - ---- - -## 5. 워크플로우 6단계 (6-Stage Workflow) +### 🎭 단계별 역할 정의 ``` -WF0: B03_FileInput (파일 입력) - ↓ (LAS, TIF, TFW, PRJ, DXF 업로드) -WF1: B04_wf1_Surface (지표면 분석) - ↓ (DEM, TIN, 포인트클라우드 변환) -WF2: B05_wf2_Route (경로 설계) - ↓ (최적 경로 계산) -WF3: B06_wf3_ProfileCross (종횡단 생성) - ↓ (종단면, 횡단면 생성) -WF4: B07_wf4_DesignDetail (상세 설계) - ↓ (구조물 배치) -WF5: B08_wf5_Quantity (수량 산출) - ↓ (수량 항목 계산) -WF6: B09_wf6_Estimation (견적·문서) - ↓ (Excel, PDF, DXF 생성) +사용자 요청 ➡️ [1. 기획자] ➡️ 계획 수립 및 PLAN.md 합의 + ⬇️ + [2. 프로그래머] ➡️ 오직 코드 작성 및 수정 (Surgical) + ⬇️ + [3. 코드 검증] ➡️ 검증 및 보고서 작성, 완료 건 아카이빙 ``` ---- +#### 1단계: 기획자 (Planner / Architect) +* **목표**: 최소한의 정보 탐색으로 문제의 핵심을 짚고, 작업 계획을 구체화하여 사용자 합의를 얻는 것. +* **동작**: + 1. 사용자 요구사항을 받으면 전체 코드를 뒤지지 않고, **Skill을 통해 graphify를 능동적으로 사용**하여 `docs/wiki/` 폴더의 설계 지식을 조회합니다. (graphify query/explain으로 작업 대상 파일과 이력 신속 식별) + 2. 영향을 받는 파일 범위와 수정 방향을 분석하여 `docs/raw/PLAN.md`에 계획서와 구체적인 구현 체크리스트를 작성합니다. + 3. `PLAN.md`에 작성된 계획서 내용에 대해 사용자의 Proceed 승인을 받습니다. -## 6. 주요 문서 참고 순서 +#### 2단계: 코딩 프로그래머 (Coder) +* **목표**: 오직 코드 작성 및 수정에만 집중하여 고품질의 구현물을 만드는 것. +* **동작**: + 1. 기획 단계에서 합의된 `docs/raw/PLAN.md`에 명시된 스펙과 대상 파일만 접근하여 수정합니다. (Spec 외의 오버엔지니어링 절대 금지) + 2. PLAN.md의 정보가 충분하지 않으면, 실제 코드를 읽어보고 설계 의도를 파악합니다. + 3. 그래도 모호하면 기획자(사용자)에게 피드백을 요청합니다. + 4. 수정 시 **Surgical Changes(정밀 수정) 원칙**을 지켜 주변 코드나 서식을 손대지 않습니다. + 5. 수정이 끝나면 프로그래머는 계획서의 구현 체크리스트에 스스로 완료 표시를 합니다. + 6. *주의*: graphify는 실행하지 않습니다. (기획자가 `docs/wiki/` 기반 정보를 이미 수집했으므로 PLAN.md로 충분) -1. **구조 설계:** `.agent/structure.md` 읽기 -2. **프론트 구현:** `.agent/frontend.md` 읽기 (대시보드 관리 UI: `.agent/plan_dashboard_management.md` 병행) -3. **백엔드 구현:** `.agent/backend.md` 읽기 (대시보드 관리 API: `.agent/plan_dashboard_management.md` 병행) -4. **마이그레이션:** `.agent/migration_plan.md` 읽기 -5. **DB 스키마:** `.agent/db_schema_simple.md` 읽기 -6. **프로젝트 정보:** `.agent/project_info.md` 읽기 +#### 3단계: 코드 검증 (Verifier / QA) +* **목표**: 구현된 코드가 실무 기준에 맞는지 정밀 검증하고 설계 지식을 현행화하는 것. +* **동작**: + 1. 코드가 작성되면 오직 수정한 코드만을 대조하여 실무 적합성 및 기술 검증을 수행합니다. + 2. 검증 결과를 바탕으로 `docs/raw/verification/{YYYY-MM-DD}_verify_{기능명}.md` 보고서를 작성합니다. + 3. `docs/raw/PLAN.md`에서 완료된 항목을 잘라내어(Cut) `docs/raw/plans/{YYYY-MM-DD}_plan_{기능명}.md` 파일로 이관하고, `PLAN.md`에서는 제거합니다. + 4. 관련 `docs/wiki/` 문서를 현행화(`status: stable` 전환)합니다. + 5. **Lint를 실행**하여 `docs/wiki/` 폴더 전체를 검사합니다. (graphify 호출 없음) + 6. 발견된 모든 문제점을 해결한 후, **Skill을 통해 graphify update를 최종 1회만 실행**합니다. --- -## 7. 요약 +## 2. 작업 관리 표준 (Live-PLAN 및 아카이빙) -| 항목 | 값 | -|------|-----| -| **프로그램명** | Aislo (아이슬로) | -| **DB 명** | aislo_db | -| **DBMS** | MariaDB v10.6+ | -| **인코딩** | utf8mb4_unicode_ci | -| **Backend** | Python 3.12+ / FastAPI | -| **Frontend** | TypeScript / Node.js | -| **드라이버** | aiomysql | -| **워크플로우** | 6단계 (WF0~WF6) | -| **테이블 수** | 18개 | -| **폴더 구조** | 워크플로우 기반 (B03~B09) | +* **현재 작업판 (`docs/raw/PLAN.md`)**: + * 현재 개발해야 할 신규 작업, 활성 작업 체크리스트, 미결 사항(Backlog)만 남겨놓는 살아있는 유일한 계획서입니다. + * 이 파일에 적힌 백로그가 완전히 비워지면 프로젝트가 최종 완료된 것으로 판단합니다. +* **완료 이력 백업 (`docs/raw/plans/`)**: + * 검증이 완료된 작업은 `PLAN.md`에서 즉시 삭제되고, `{YYYY-MM-DD}_plan_{기능명}.md` 문서로 이관 보관됩니다. +* **세션 종료 전 2중 검증**: + * **Ingest**: `docs/raw/guidelines/`, `docs/raw/plans/`, `docs/raw/verification/` 폴더의 신규 파일을 `docs/wiki/`에 반영합니다. + * **Lint**: `docs/wiki/` 폴더를 탐색하여 데이터 모순, 누락, 포맷 오류 등을 점검합니다. + +--- + +## 3. 기술 환경 및 제약 조건 (Baseline Constraints) + +### 📌 기본 기술 스택 +* **Backend**: Python v3.12.7 / FastAPI / Pydantic (aiomysql 비동기 드라이버 사용, ORM 금지, Raw SQL 쿼리) +* **Frontend**: TypeScript / Node.js / HTML5 Canvas 및 WebGL (WebGL WebCAD) +* **Database**: MariaDB v10.6+ (공간 데이터는 GEOMETRY 미지원으로 인해 JSON 포맷 저장) +* **GIS Engine**: Trimesh, Whitebox, Geopandas, Shapely, Rasterio, Laspy + +### 📌 코딩 규칙 +* **700줄 제한**: 단일 소스코드 파일은 700줄을 초과할 수 없습니다. 초과할 경우 기능별로 파일을 분리해야 합니다. +* **Surgical Edit**: 변경해야 할 최소한의 라인만 정확하게 수정합니다. +* **포맷팅 적용**: 작업 완료 시 해당 언어의 포맷터(Python: `ruff format`, TS/CSS: `prettier`)를 반드시 실행합니다. + +### 📌 지식 그래프(graphify) 운영 규칙 + +* **분석 대상 범위**: `docs/wiki/` 폴더만을 대상으로 합니다. + * 검색 범위: `docs/wiki/` 하위 모든 마크다운 파일 + * 업데이트 범위: `docs/wiki/` 폴더만 + * 따라서 프로그래머는 PLAN.md의 정보(wiki 기반)를 신뢰하고 코드 작성에만 집중 가능 + +* **Skill 기반 호출** (외부 cmd 명령 제거): + * 기획자: `Skill` 도구로 graphify를 능동적으로 호출하여 정보 수집 + * 검증자: `Skill` 도구로 graphify update 실행 + * 조회 옵션: + * `graphify query "질문 내용"` - 구조 기반 질문 + * `graphify path "개념A" "개념B"` - 노드 관계 추적 + * `graphify explain "개념명"` - 개별 개념 상세 설명 + +* **실행 권한 및 타이밍**: + * **기획자(1단계)**: graphify query/explain/path 언제든 실행 가능 (계획 수립 시) + * **프로그래머(2단계)**: graphify 실행 금지 (PLAN.md로 충분) + * **검증자(3단계)**: graphify update는 문서 갱신 후 최종 1회만 실행 diff --git a/check_db.py b/check_db.py deleted file mode 100644 index f47725c..0000000 --- a/check_db.py +++ /dev/null @@ -1,82 +0,0 @@ -"""DB 상태 확인 스크립트.""" - -import asyncio -import aiomysql - - -async def check_db(): - """DB 테이블 목록 및 구조 확인.""" - conn = await aiomysql.connect( - host="dsm.chemifactory.com", - port=53306, - user="ctnt_root", - password="Umsang6595!!", - db="aislo_db", - charset="utf8mb4", - ) - - try: - async with conn.cursor() as cur: - # 1. 테이블 목록 - print("=" * 60) - print("【존재하는 테이블】") - print("=" * 60) - await cur.execute("SHOW TABLES") - tables = await cur.fetchall() - for (table_name,) in tables: - print(f" - {table_name}") - - # 2. upload_sessions 테이블 확인 - print("\n" + "=" * 60) - print("【upload_sessions 테이블 구조】") - print("=" * 60) - try: - await cur.execute("DESCRIBE upload_sessions") - columns = await cur.fetchall() - for row in columns: - print(f" {row}") - except Exception as e: - print(f" ❌ 테이블 없음: {e}") - - # 3. upload_chunks 테이블 확인 - print("\n" + "=" * 60) - print("【upload_chunks 테이블 구조】") - print("=" * 60) - try: - await cur.execute("DESCRIBE upload_chunks") - columns = await cur.fetchall() - for row in columns: - print(f" {row}") - except Exception as e: - print(f" ❌ 테이블 없음: {e}") - - # 4. input_files 테이블 확인 - print("\n" + "=" * 60) - print("【input_files 테이블 구조】") - print("=" * 60) - try: - await cur.execute("DESCRIBE input_files") - columns = await cur.fetchall() - for row in columns: - print(f" {row}") - except Exception as e: - print(f" ❌ 테이블 없음: {e}") - - # 5. projects 테이블 확인 - print("\n" + "=" * 60) - print("【projects 테이블 구조】") - print("=" * 60) - try: - await cur.execute("DESCRIBE projects") - columns = await cur.fetchall() - for row in columns: - print(f" {row}") - except Exception as e: - print(f" ❌ 테이블 없음: {e}") - - finally: - conn.close() - - -if __name__ == "__main__": - asyncio.run(check_db()) diff --git a/docs/.agents/rules/graphify.md b/docs/.agents/rules/graphify.md new file mode 100644 index 0000000..0fc7864 --- /dev/null +++ b/docs/.agents/rules/graphify.md @@ -0,0 +1,14 @@ +--- +trigger: always_on +description: Consult the graphify knowledge graph at graphify-out/ for codebase and architecture questions. +--- + +## graphify + +This project has a graphify knowledge graph at graphify-out/. + +Rules: +- For codebase or architecture questions, when `graphify-out/graph.json` exists, first run `graphify query ""` (CLI) or `query_graph` (MCP). Use `graphify path "" ""` / `shortest_path` for relationships and `graphify explain ""` / `get_node` for focused concepts. These return a scoped subgraph, usually much smaller than `GRAPH_REPORT.md` or raw grep output. +- If graphify-out/wiki/index.md exists, navigate it instead of reading raw files +- Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context +- After modifying code files in this session, run `graphify update .` to keep the graph current (AST-only, no API cost) diff --git a/docs/.agents/workflows/graphify.md b/docs/.agents/workflows/graphify.md new file mode 100644 index 0000000..c57bdf1 --- /dev/null +++ b/docs/.agents/workflows/graphify.md @@ -0,0 +1,10 @@ +--- +name: graphify +description: Turn any folder of files into a navigable knowledge graph +--- + +# Workflow: graphify + +Follow the graphify skill installed at ~/.gemini/config/skills/graphify/SKILL.md to run the full pipeline. + +If no path argument is given, use `.` (current directory). diff --git a/docs/.claude/settings.json b/docs/.claude/settings.json new file mode 100644 index 0000000..167d865 --- /dev/null +++ b/docs/.claude/settings.json @@ -0,0 +1,24 @@ +{ + "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "C:\\Users\\umsan\\AppData\\Local\\Programs\\Python\\Python312\\Scripts\\graphify.EXE hook-guard search" + } + ] + }, + { + "matcher": "Read|Glob", + "hooks": [ + { + "type": "command", + "command": "C:\\Users\\umsan\\AppData\\Local\\Programs\\Python\\Python312\\Scripts\\graphify.EXE hook-guard read" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/docs/.codex/hooks.json b/docs/.codex/hooks.json new file mode 100644 index 0000000..d87c474 --- /dev/null +++ b/docs/.codex/hooks.json @@ -0,0 +1,15 @@ +{ + "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "C:\\Users\\umsan\\AppData\\Local\\Programs\\Python\\Python312\\Scripts\\graphify.EXE hook-check" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/docs/.obsidian/app.json b/docs/.obsidian/app.json new file mode 100644 index 0000000..e609a07 --- /dev/null +++ b/docs/.obsidian/app.json @@ -0,0 +1,3 @@ +{ + "promptDelete": false +} \ No newline at end of file diff --git a/wiki/설계자동화/.obsidian/appearance.json b/docs/.obsidian/appearance.json similarity index 100% rename from wiki/설계자동화/.obsidian/appearance.json rename to docs/.obsidian/appearance.json diff --git a/docs/.obsidian/community-plugins.json b/docs/.obsidian/community-plugins.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/docs/.obsidian/community-plugins.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/wiki/설계자동화/.obsidian/core-plugins.json b/docs/.obsidian/core-plugins.json similarity index 100% rename from wiki/설계자동화/.obsidian/core-plugins.json rename to docs/.obsidian/core-plugins.json diff --git a/wiki/설계자동화/.obsidian/graph.json b/docs/.obsidian/graph.json similarity index 61% rename from wiki/설계자동화/.obsidian/graph.json rename to docs/.obsidian/graph.json index 42a46ec..aee24be 100644 --- a/wiki/설계자동화/.obsidian/graph.json +++ b/docs/.obsidian/graph.json @@ -1,22 +1,22 @@ { - "collapse-filter": true, + "collapse-filter": false, "search": "", "showTags": false, "showAttachments": false, "hideUnresolved": false, "showOrphans": true, - "collapse-color-groups": true, + "collapse-color-groups": false, "colorGroups": [], - "collapse-display": true, + "collapse-display": false, "showArrow": false, "textFadeMultiplier": 0, "nodeSizeMultiplier": 1, "lineSizeMultiplier": 1, - "collapse-forces": true, - "centerStrength": 0.518713248970312, + "collapse-forces": false, + "centerStrength": 0.390625, "repelStrength": 10, "linkStrength": 1, "linkDistance": 250, - "scale": 1, - "close": true + "scale": 0.5359795996225794, + "close": false } \ No newline at end of file diff --git a/wiki/설계자동화/.obsidian/workspace.json b/docs/.obsidian/workspace.json similarity index 59% rename from wiki/설계자동화/.obsidian/workspace.json rename to docs/.obsidian/workspace.json index d81755a..030322c 100644 --- a/wiki/설계자동화/.obsidian/workspace.json +++ b/docs/.obsidian/workspace.json @@ -1,34 +1,14 @@ { "main": { - "id": "5482fab4a11d4532", + "id": "99c9496f9af0d35f", "type": "split", "children": [ { - "id": "01bcd28ddd3397b5", + "id": "030658548bffdd02", "type": "tabs", "children": [ { - "id": "c255da74576ceb2c", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "환영합니다!.md", - "mode": "source", - "source": false - }, - "icon": "lucide-file", - "title": "환영합니다!" - } - } - ] - }, - { - "id": "e295692769be8451", - "type": "tabs", - "children": [ - { - "id": "a238438c95e4e2cb", + "id": "c66e6631a498571e", "type": "leaf", "state": { "type": "graph", @@ -43,15 +23,15 @@ "direction": "vertical" }, "left": { - "id": "d0795a7b37943326", + "id": "1fdf49368d0b8d12", "type": "split", "children": [ { - "id": "bb2e823296bd288b", + "id": "286216e41ef17318", "type": "tabs", "children": [ { - "id": "7c387a260a093866", + "id": "bf4a66eeb6ba12b7", "type": "leaf", "state": { "type": "file-explorer", @@ -64,7 +44,7 @@ } }, { - "id": "787034934986e2ac", + "id": "d69b070685f35c13", "type": "leaf", "state": { "type": "search", @@ -81,7 +61,7 @@ } }, { - "id": "39a684c30291c459", + "id": "f48a2962a3eee224", "type": "leaf", "state": { "type": "bookmarks", @@ -94,23 +74,22 @@ } ], "direction": "horizontal", - "width": 300 + "width": 439.5 }, "right": { - "id": "3876a6eb1b7177fb", + "id": "47e841f62a2c8446", "type": "split", "children": [ { - "id": "26ead9768de2588b", + "id": "ed0c1ac6b73a8ced", "type": "tabs", "children": [ { - "id": "5a31669d02d19deb", + "id": "9eee98dc05d3fde2", "type": "leaf", "state": { "type": "backlink", "state": { - "file": "환영합니다!.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -120,25 +99,24 @@ "unlinkedCollapsed": true }, "icon": "links-coming-in", - "title": "환영합니다! 의 백링크" + "title": "백링크" } }, { - "id": "e68e588bf0592627", + "id": "1e0ba87b26453941", "type": "leaf", "state": { "type": "outgoing-link", "state": { - "file": "환영합니다!.md", "linksCollapsed": false, "unlinkedCollapsed": true }, "icon": "links-going-out", - "title": "환영합니다! 의 나가는 링크" + "title": "나가는 링크" } }, { - "id": "a0d807bfcc441861", + "id": "aea498d48aaa60a0", "type": "leaf", "state": { "type": "tag", @@ -153,7 +131,7 @@ } }, { - "id": "8e88569af2439683", + "id": "dde952791b603350", "type": "leaf", "state": { "type": "all-properties", @@ -167,40 +145,78 @@ } }, { - "id": "bae3874c44778d37", + "id": "2daeda4e90730082", "type": "leaf", "state": { "type": "outline", "state": { - "file": "환영합니다!.md", "followCursor": false, "showSearch": false, "searchQuery": "" }, "icon": "lucide-list", - "title": "환영합니다! 의 개요" + "title": "개요" } } ] } ], "direction": "horizontal", - "width": 300, - "collapsed": true + "width": 300 }, "left-ribbon": { "hiddenItems": { - "switcher:빠른 전환기 열기": false, - "graph:그래프 뷰 열기": false, "canvas:새 캔버스 만들기": false, + "graph:그래프 뷰 열기": false, + "switcher:빠른 전환기 열기": false, "daily-notes:오늘의 일일 노트 열기": false, "templates:템플릿 삽입": false, "command-palette:명령어 팔레트 열기": false, - "bases:새 베이스 생성하기": false + "bases:새 베이스 생성하기": false, + "terminal:Open terminal": false } }, - "active": "c255da74576ceb2c", + "active": "c66e6631a498571e", "lastOpenFiles": [ - "환영합니다!.md" + "raw/guidelines/backend.md", + "raw/AGENTS.md", + "wiki/pages/B02_ProjRegister/B02_backend.md", + "무제.canvas", + "raw/plans/plan_workflow_state_management.md", + "raw/PLAN.md.tmp.23164.6d84a6365004", + "wiki/graphify-out/graph.html", + "wiki/graphify-out/manifest.json", + "wiki/graphify-out/GRAPH_REPORT.md", + "wiki/graphify-out/graph.json", + "wiki/graphify-out/cache/stat-index.json", + "wiki/graphify-out/cache/ast/v0.9.12/9691ebb53407e479750a796e82774905fe22139f5b049c3f7dc0ad6534c378cf.json", + "wiki/graphify-out/cache/ast/v0.9.12/2808d040f080236ab87ff5d059ee801796b07a63f6a114bd2a2109e0b5806e12.json", + "wiki/graphify-out/cache/ast/v0.9.12/1b226e5d018fc38a72090165fa26143b93b6e1c0a7e1073d8c15e0cdddbeb171.json", + "wiki/graphify-out/cache/ast/v0.9.12/e5a0d7854dc5f172c997de38f2c4dc21dc761794e098626c17dfffe673b47711.json", + "wiki/graphify-out/cache/ast/v0.9.12/2be5bc2fd35d20f0f1eb7c1c707e58347f2b10bcc8843f04fffa74fbdca4d2a7.json", + "wiki/pages/B08_wf5_Quantity/B08_db.md", + "wiki/concepts/db_schema/unconfirmed/README.md", + "wiki/concepts/ui_templates.md", + "wiki/concepts/workflow_state.md", + "wiki/concepts/storage_paths.md", + "wiki/concepts/common_util.md", + "wiki/concepts/auth_rbac.md", + "wiki/concepts/dependencies.md", + "wiki/concepts/api_common.md", + "raw/PLAN.md", + "raw/plans/2026-07-12_plan_add_phase4_role.md", + "raw/verification/2026-07-12_verify_add_phase4_role.md", + "raw/guidelines/frontend.md", + "wiki/index.md", + "wiki/pages/A02_ProgDetail/A02_components.md", + "wiki/pages/A02_ProgDetail/A02_frontend.md", + "wiki/pages/A03_CompDetail/A03_frontend.md", + "wiki/pages/A01_Home/A01_components.md", + "wiki/pages/A01_Home/A01_frontend.md", + "wiki/concepts/db_schema/route_profile.md", + "무제 3.canvas", + "무제 2.canvas", + "무제 1.canvas", + "graphify-out/2026-07-12/GRAPH_REPORT.md" ] } \ No newline at end of file diff --git a/docs/AGENTS.md b/docs/AGENTS.md new file mode 100644 index 0000000..2d6ea29 --- /dev/null +++ b/docs/AGENTS.md @@ -0,0 +1,111 @@ +## 나는 누구인가 +- 이름: +- 하는 일: 임도설계 실무자. Aislo(라이다 데이터 기반 임도 설계·견적 자동화 웹앱) 프로젝트의 기획·설계자. +- 핵심 가치: 코드를 직접 작성하거나 깊이 이해하지는 못하지만, 도메인 전문성을 바탕으로 결과물(화면, 산출물)을 보고 실무적으로 맞는지 검증할 수 있다. 이 검증력을 근거로 AI에게 방향성과 구체적 지시를 내린다. + +## 나의 역할들 + +### 임도설계 실무자 (도메인 전문가) +- 하는 일: 임도 설계 실무 지식을 바탕으로 요구사항을 정의하고, AI가 만든 결과물이 실무 기준에 맞는지 검증한다. +- 주요 관심사: 결과물의 실무적 타당성, 설계 로직의 정확성. + +### 프로젝트 기획·설계자 +- 하는 일: AI 코드 어시스턴트에게 방향성과 지시를 제공하고, 계획서 작성과 검토를 주도한다. +- 주요 관심사: AI와의 소통 효율, 문서·컨텍스트 구조화, 반복되는 방향성 이탈 방지. + +## 나의 비전과 목표 +- 이루고자 하는 것: 라이다 데이터를 활용해 임도 설계를 자동화하는 웹앱(Aislo)을 완성한다. 동시에, 개발 과정에서 문서(백엔드/프론트엔드/DB/구조/계획서/검증보고서)가 비대해져 컨텍스트·토큰을 낭비하지 않도록, 페이지 단위로 구조화·연결된 위키 체계를 구축한다. +- 타겟 독자/고객: + - 1차: AI 코드 어시스턴트 자신 — 코드 작성 전후로 필요한 부분만 효율적으로 찾아 읽는 용도. + - 2차: 6개월~1년 후의 AI 세션 및 팀원 — 프로젝트 구조, 설계 이유, 사용된 함수·변수, DB 정보를 스스로 파악해 개선하거나 인수인계받는 용도. (본인이 직접 위키를 다시 찾아볼 일은 거의 없음) + +## AI에게 기대하는 것 +- 코드 작성 전후로 관련된 위키·계획서만 효율적으로 찾아 읽고, 문서 전체를 뒤지지 않기. +- 계획서 작성 → 코드 작업 → 계획서 체크리스트 점검 → 코드 검증 → 검증보고서 작성 → 계획서 업데이트의 흐름을 주기적으로 관리하기. +- 같은 실수나 배경 설명을 반복하지 않기 — 이전 결정사항과 컨텍스트를 유지하기. +- 함수·변수 단위, DB 컬럼 단위까지 추적 가능하도록 문서화하기. + +## 작업 규칙 +- 톤: 간결하고 명확하게. 불필요한 수식어 없이 핵심만 +- 언어: 한국어 기본 +- 결과물 형태: 계획서와 검증보고서는 각각 하나의 파일로 구성하여 지속 업데이트한다. 문서는 비대해지지 않도록 페이지 단위로 구조화하고, 하위에 관련 백엔드·프론트엔드·DB·API·의존성 정보를 연결한다. + +--- + +## Wiki Schema (위키 운영 규칙) + +> 이 규칙은 `docs/` 볼트에만 적용된다. 프로젝트 루트의 docs 폴더 상위의 `.agent/` 폴더(실제 코딩 라우팅용)와는 완전히 독립적이며, 서로 건드리지 않는다. 위키가 충분히 성숙하면 그때 `.agent`를 대체할지 판단한다. + +### 레이어 구조 +- **raw/** — 불변 원본. 계획서·검증보고서·행동지침 등을 유형별로 넣는다. AI는 이 폴더를 절대 수정하지 않는다. +- **wiki/** — AI가 raw를 읽고 편집·유지하는 산출물. 페이지(B01~B09) 기준 폴더 + 개념(concepts) 폴더로 구성. +- **output/** — 최종 결과물(보고서, 슬라이드 등). + +### 위키 관리자(Librarian) 역할 +AI는 이 볼트에서 "위키 관리자"로 행동한다. 단순 챗봇이 아니라, raw를 읽고 wiki를 지속적으로 편집·정리·연결하는 책임을 진다. wiki는 사용자가 아니라 AI가 쓰고 관리한다. + +### 운영 방식 +- **Ingest** (원본 반영): raw/에 새 파일이 들어오면 → 내용을 읽고 핵심을 파악 → 관련된 `wiki/pages/B0x_*/`와 `wiki/concepts/*.md`를 갱신 → `wiki/index.md` 갱신 → `wiki/log.md`에 기록. +- **Query** (질의 응답): 코드 작업 전후로 질문을 받으면 → `wiki/index.md`를 먼저 확인 → 관련 페이지만 열어서 답변 → raw/는 위키에 없는 정보가 필요할 때만 최후 수단으로 참조. 답변 중 새로 정리된 내용(비교, 분석 등)은 대화에 흘려보내지 말고 관련 wiki 페이지에 다시 파일링한다. +- **Lint** (건강 점검): 요청 시 위키 전체를 점검 — 페이지 간 모순, 오래된 내용(최근 raw로 갱신되지 않은 부분), 고아 페이지(연결 없음), 빠진 크로스링크를 찾아 보고한다. + +### 위키 규칙 +1. **raw/는 절대 수정 금지** (불변 원본) +2. wiki 페이지 생성·삭제 시 **index.md 필수 업데이트** +3. 모든 오퍼레이션마다 **log.md에 기록** +4. 내부 참조는 **위키링크(`[[페이지명]]`)** 형식 사용 +5. 모든 wiki 페이지에 **YAML frontmatter** 작성. `status`는 반드시 아래 3개 값 중 하나만 사용: + - `draft` — 계획서만 반영됨, 아직 검증 안 됨 + - `stable` — 검증보고서로 확인된 내용까지 반영됨 + - `stale` — raw에 새 자료가 들어왔는데 아직 이 페이지에 반영 못함 (Lint 시 최우선 처리 대상) + 그 외 `related_pages`, `last_updated`도 함께 기록한다. **`wiki/pages/B0x_이름/`, `wiki/pages/A0x_이름/` 하위 파일은 다음 규칙을 따른다:** + - **파일명 형식:** `{page_id}_{기능명}.md` (예: `A01_frontend.md`, `B05_backend.md`, `B03_db.md`) + - **frontmatter에 `page_id` 필드 필수:** `page_id: A01_Home` 또는 `page_id: B05_wf2_Route` — 폴더 밖에서 파일 하나만 봐도 어느 페이지 소속인지 식별 가능해야 한다. + - concepts 페이지에는 이 규칙을 적용하지 않는다(페이지 단위가 아니므로). +6. 모순 발견 시 **양쪽 소스 모두 인용**하고 어느 쪽이 최신인지 명시. **계획서와 검증보고서가 충돌하면 검증보고서를 채택한다** (검증보고서 = 실제 코드가 검증된 상태, 계획서 = 그 시점의 의도). 계획서 쪽 내용은 지우지 말고 "계획 당시 의도"로 표시해 남긴다. +7. 소스 요약은 사실만 기록, 해석·종합은 concepts 페이지에서 +8. 질의 시 **index.md 먼저**, raw/는 마지막 수단 +9. **새 페이지 생성보다 기존 페이지 업데이트를 우선** +10. index 항목은 한 줄, 120자 이내로 요약 +11. **공유 자원은 1차 정의를 concepts에만 둔다.** 공유 자원이란 두 페이지 이상이 함께 쓰는 것 전부를 말한다 — DB 테이블·컬럼, 공통 함수(`common_util_*`), API 엔드포인트, Pydantic 요청/응답 스키마, 외부 라이브러리(의존성), workflow 상태 등. 페이지의 `db.md`/`backend.md`/`api.md`/`dependencies.md`에는 정의를 복사하지 않고, "이 페이지가 무슨 용도로 쓰는지" + `[[concepts/해당개념#항목명]]` 위키링크만 남긴다. +12. **concepts 페이지에는 사용처(역참조) 목록을 직접 적는다.** 예: `db_schema.md`의 "routes 테이블" 항목 아래에 `사용처: [[B05_wf2_Route]], [[B06_wf3_ProfileCross]]`. 새 페이지가 그 자원을 쓰게 되면 concepts 쪽 사용처 목록도 함께 갱신한다 (Obsidian 자동 백링크에만 의존하지 않음). +13. **함수·API·테이블 등 개별 항목은 표 형식으로만 기록한다** (서술문 금지). 최소 컬럼: `항목 | 위치(파일:줄번호) | 역할`. 코드 AI가 grep 없이 바로 해당 위치로 이동할 수 있어야 한다. + + | 항목 | 위치 | 역할 | + |---|---|---| + | `generate_dem()` | `B04_wf1_Surface/B04_wf1_Surface_Engine.py:142` | 포인트클라우드 → DEM 변환 | + +14. **페이지 하나(파일 하나)는 100줄을 넘지 않는다.** 넘으면 즉시 하위 주제별로 분할한다 (예: `concepts/db_schema.md` → `concepts/db_schema/routes.md`, `concepts/db_schema/input_files.md` ...). 분할 시 상위 페이지는 하위 페이지로 가는 링크 목록만 남기고, `index.md`도 함께 갱신한다. + +### 폴더 구조 +``` +docs/ +├── raw/ (불변 원본) +│ ├── plans/ 계획서 +│ ├── verification/ 검증보고서 +│ └── guidelines/ 행동지침 +├── wiki/ +│ ├── index.md 전체 카탈로그 (카테고리별 한 줄 목록) +│ ├── log.md 연대기 로그 (append-only) +│ ├── pages/ 페이지(B01~B09) 기준 — 프로젝트 구조의 B01~B09 폴더와 1:1 대응 +│ │ └── B0x_이름/ +│ │ ├── frontend.md +│ │ ├── backend.md +│ │ ├── db.md +│ │ ├── api.md +│ │ └── dependencies.md +│ └── concepts/ 페이지를 관통하는 공통 개념 (DB 스키마, 인증/RBAC, 저장 경로 규칙, 공통 유틸, API 공통, 의존성, 공통 스키마, workflow 상태 등) +└── output/ 최종 산출물 +``` +- 페이지 하위 파일은 raw 반영 시 **필요한 것만 생성**한다 (5개를 미리 다 만들지 않음). +- `wiki/pages/`의 카테고리는 프로젝트의 실제 B01~B09 폴더명과 항상 일치시킨다. + +## graphify + +This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships. + +Rules: +- For codebase questions, first run `graphify query ""` when graphify-out/graph.json exists. Use `graphify path "" ""` for relationships and `graphify explain ""` for focused concepts. These return a scoped subgraph, usually much smaller than GRAPH_REPORT.md or raw grep output. +- If graphify-out/wiki/index.md exists, use it for broad navigation instead of raw source browsing. +- Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context. +- After modifying code, run `graphify update .` to keep the graph current (AST-only, no API cost). diff --git a/docs/CLAUDE.md b/docs/CLAUDE.md new file mode 100644 index 0000000..2d6ea29 --- /dev/null +++ b/docs/CLAUDE.md @@ -0,0 +1,111 @@ +## 나는 누구인가 +- 이름: +- 하는 일: 임도설계 실무자. Aislo(라이다 데이터 기반 임도 설계·견적 자동화 웹앱) 프로젝트의 기획·설계자. +- 핵심 가치: 코드를 직접 작성하거나 깊이 이해하지는 못하지만, 도메인 전문성을 바탕으로 결과물(화면, 산출물)을 보고 실무적으로 맞는지 검증할 수 있다. 이 검증력을 근거로 AI에게 방향성과 구체적 지시를 내린다. + +## 나의 역할들 + +### 임도설계 실무자 (도메인 전문가) +- 하는 일: 임도 설계 실무 지식을 바탕으로 요구사항을 정의하고, AI가 만든 결과물이 실무 기준에 맞는지 검증한다. +- 주요 관심사: 결과물의 실무적 타당성, 설계 로직의 정확성. + +### 프로젝트 기획·설계자 +- 하는 일: AI 코드 어시스턴트에게 방향성과 지시를 제공하고, 계획서 작성과 검토를 주도한다. +- 주요 관심사: AI와의 소통 효율, 문서·컨텍스트 구조화, 반복되는 방향성 이탈 방지. + +## 나의 비전과 목표 +- 이루고자 하는 것: 라이다 데이터를 활용해 임도 설계를 자동화하는 웹앱(Aislo)을 완성한다. 동시에, 개발 과정에서 문서(백엔드/프론트엔드/DB/구조/계획서/검증보고서)가 비대해져 컨텍스트·토큰을 낭비하지 않도록, 페이지 단위로 구조화·연결된 위키 체계를 구축한다. +- 타겟 독자/고객: + - 1차: AI 코드 어시스턴트 자신 — 코드 작성 전후로 필요한 부분만 효율적으로 찾아 읽는 용도. + - 2차: 6개월~1년 후의 AI 세션 및 팀원 — 프로젝트 구조, 설계 이유, 사용된 함수·변수, DB 정보를 스스로 파악해 개선하거나 인수인계받는 용도. (본인이 직접 위키를 다시 찾아볼 일은 거의 없음) + +## AI에게 기대하는 것 +- 코드 작성 전후로 관련된 위키·계획서만 효율적으로 찾아 읽고, 문서 전체를 뒤지지 않기. +- 계획서 작성 → 코드 작업 → 계획서 체크리스트 점검 → 코드 검증 → 검증보고서 작성 → 계획서 업데이트의 흐름을 주기적으로 관리하기. +- 같은 실수나 배경 설명을 반복하지 않기 — 이전 결정사항과 컨텍스트를 유지하기. +- 함수·변수 단위, DB 컬럼 단위까지 추적 가능하도록 문서화하기. + +## 작업 규칙 +- 톤: 간결하고 명확하게. 불필요한 수식어 없이 핵심만 +- 언어: 한국어 기본 +- 결과물 형태: 계획서와 검증보고서는 각각 하나의 파일로 구성하여 지속 업데이트한다. 문서는 비대해지지 않도록 페이지 단위로 구조화하고, 하위에 관련 백엔드·프론트엔드·DB·API·의존성 정보를 연결한다. + +--- + +## Wiki Schema (위키 운영 규칙) + +> 이 규칙은 `docs/` 볼트에만 적용된다. 프로젝트 루트의 docs 폴더 상위의 `.agent/` 폴더(실제 코딩 라우팅용)와는 완전히 독립적이며, 서로 건드리지 않는다. 위키가 충분히 성숙하면 그때 `.agent`를 대체할지 판단한다. + +### 레이어 구조 +- **raw/** — 불변 원본. 계획서·검증보고서·행동지침 등을 유형별로 넣는다. AI는 이 폴더를 절대 수정하지 않는다. +- **wiki/** — AI가 raw를 읽고 편집·유지하는 산출물. 페이지(B01~B09) 기준 폴더 + 개념(concepts) 폴더로 구성. +- **output/** — 최종 결과물(보고서, 슬라이드 등). + +### 위키 관리자(Librarian) 역할 +AI는 이 볼트에서 "위키 관리자"로 행동한다. 단순 챗봇이 아니라, raw를 읽고 wiki를 지속적으로 편집·정리·연결하는 책임을 진다. wiki는 사용자가 아니라 AI가 쓰고 관리한다. + +### 운영 방식 +- **Ingest** (원본 반영): raw/에 새 파일이 들어오면 → 내용을 읽고 핵심을 파악 → 관련된 `wiki/pages/B0x_*/`와 `wiki/concepts/*.md`를 갱신 → `wiki/index.md` 갱신 → `wiki/log.md`에 기록. +- **Query** (질의 응답): 코드 작업 전후로 질문을 받으면 → `wiki/index.md`를 먼저 확인 → 관련 페이지만 열어서 답변 → raw/는 위키에 없는 정보가 필요할 때만 최후 수단으로 참조. 답변 중 새로 정리된 내용(비교, 분석 등)은 대화에 흘려보내지 말고 관련 wiki 페이지에 다시 파일링한다. +- **Lint** (건강 점검): 요청 시 위키 전체를 점검 — 페이지 간 모순, 오래된 내용(최근 raw로 갱신되지 않은 부분), 고아 페이지(연결 없음), 빠진 크로스링크를 찾아 보고한다. + +### 위키 규칙 +1. **raw/는 절대 수정 금지** (불변 원본) +2. wiki 페이지 생성·삭제 시 **index.md 필수 업데이트** +3. 모든 오퍼레이션마다 **log.md에 기록** +4. 내부 참조는 **위키링크(`[[페이지명]]`)** 형식 사용 +5. 모든 wiki 페이지에 **YAML frontmatter** 작성. `status`는 반드시 아래 3개 값 중 하나만 사용: + - `draft` — 계획서만 반영됨, 아직 검증 안 됨 + - `stable` — 검증보고서로 확인된 내용까지 반영됨 + - `stale` — raw에 새 자료가 들어왔는데 아직 이 페이지에 반영 못함 (Lint 시 최우선 처리 대상) + 그 외 `related_pages`, `last_updated`도 함께 기록한다. **`wiki/pages/B0x_이름/`, `wiki/pages/A0x_이름/` 하위 파일은 다음 규칙을 따른다:** + - **파일명 형식:** `{page_id}_{기능명}.md` (예: `A01_frontend.md`, `B05_backend.md`, `B03_db.md`) + - **frontmatter에 `page_id` 필드 필수:** `page_id: A01_Home` 또는 `page_id: B05_wf2_Route` — 폴더 밖에서 파일 하나만 봐도 어느 페이지 소속인지 식별 가능해야 한다. + - concepts 페이지에는 이 규칙을 적용하지 않는다(페이지 단위가 아니므로). +6. 모순 발견 시 **양쪽 소스 모두 인용**하고 어느 쪽이 최신인지 명시. **계획서와 검증보고서가 충돌하면 검증보고서를 채택한다** (검증보고서 = 실제 코드가 검증된 상태, 계획서 = 그 시점의 의도). 계획서 쪽 내용은 지우지 말고 "계획 당시 의도"로 표시해 남긴다. +7. 소스 요약은 사실만 기록, 해석·종합은 concepts 페이지에서 +8. 질의 시 **index.md 먼저**, raw/는 마지막 수단 +9. **새 페이지 생성보다 기존 페이지 업데이트를 우선** +10. index 항목은 한 줄, 120자 이내로 요약 +11. **공유 자원은 1차 정의를 concepts에만 둔다.** 공유 자원이란 두 페이지 이상이 함께 쓰는 것 전부를 말한다 — DB 테이블·컬럼, 공통 함수(`common_util_*`), API 엔드포인트, Pydantic 요청/응답 스키마, 외부 라이브러리(의존성), workflow 상태 등. 페이지의 `db.md`/`backend.md`/`api.md`/`dependencies.md`에는 정의를 복사하지 않고, "이 페이지가 무슨 용도로 쓰는지" + `[[concepts/해당개념#항목명]]` 위키링크만 남긴다. +12. **concepts 페이지에는 사용처(역참조) 목록을 직접 적는다.** 예: `db_schema.md`의 "routes 테이블" 항목 아래에 `사용처: [[B05_wf2_Route]], [[B06_wf3_ProfileCross]]`. 새 페이지가 그 자원을 쓰게 되면 concepts 쪽 사용처 목록도 함께 갱신한다 (Obsidian 자동 백링크에만 의존하지 않음). +13. **함수·API·테이블 등 개별 항목은 표 형식으로만 기록한다** (서술문 금지). 최소 컬럼: `항목 | 위치(파일:줄번호) | 역할`. 코드 AI가 grep 없이 바로 해당 위치로 이동할 수 있어야 한다. + + | 항목 | 위치 | 역할 | + |---|---|---| + | `generate_dem()` | `B04_wf1_Surface/B04_wf1_Surface_Engine.py:142` | 포인트클라우드 → DEM 변환 | + +14. **페이지 하나(파일 하나)는 100줄을 넘지 않는다.** 넘으면 즉시 하위 주제별로 분할한다 (예: `concepts/db_schema.md` → `concepts/db_schema/routes.md`, `concepts/db_schema/input_files.md` ...). 분할 시 상위 페이지는 하위 페이지로 가는 링크 목록만 남기고, `index.md`도 함께 갱신한다. + +### 폴더 구조 +``` +docs/ +├── raw/ (불변 원본) +│ ├── plans/ 계획서 +│ ├── verification/ 검증보고서 +│ └── guidelines/ 행동지침 +├── wiki/ +│ ├── index.md 전체 카탈로그 (카테고리별 한 줄 목록) +│ ├── log.md 연대기 로그 (append-only) +│ ├── pages/ 페이지(B01~B09) 기준 — 프로젝트 구조의 B01~B09 폴더와 1:1 대응 +│ │ └── B0x_이름/ +│ │ ├── frontend.md +│ │ ├── backend.md +│ │ ├── db.md +│ │ ├── api.md +│ │ └── dependencies.md +│ └── concepts/ 페이지를 관통하는 공통 개념 (DB 스키마, 인증/RBAC, 저장 경로 규칙, 공통 유틸, API 공통, 의존성, 공통 스키마, workflow 상태 등) +└── output/ 최종 산출물 +``` +- 페이지 하위 파일은 raw 반영 시 **필요한 것만 생성**한다 (5개를 미리 다 만들지 않음). +- `wiki/pages/`의 카테고리는 프로젝트의 실제 B01~B09 폴더명과 항상 일치시킨다. + +## graphify + +This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships. + +Rules: +- For codebase questions, first run `graphify query ""` when graphify-out/graph.json exists. Use `graphify path "" ""` for relationships and `graphify explain ""` for focused concepts. These return a scoped subgraph, usually much smaller than GRAPH_REPORT.md or raw grep output. +- If graphify-out/wiki/index.md exists, use it for broad navigation instead of raw source browsing. +- Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context. +- After modifying code, run `graphify update .` to keep the graph current (AST-only, no API cost). diff --git a/docs/output/AGENTS.md b/docs/output/AGENTS.md new file mode 100644 index 0000000..0f67d15 --- /dev/null +++ b/docs/output/AGENTS.md @@ -0,0 +1,7 @@ +# output/ 폴더 규칙 + +wiki/ 내용을 바탕으로 생성한 최종 산출물(보고서, 슬라이드, 요약 문서 등)을 둔다. + +## 규칙 +- 여기 있는 파일은 wiki/의 특정 시점 스냅샷이다. 원본이 아니므로, 내용 갱신이 필요하면 wiki/를 먼저 갱신한 뒤 다시 생성한다. +- 파일명에 생성 날짜를 포함해 버전을 구분한다. diff --git a/docs/output/CLAUDE.md b/docs/output/CLAUDE.md new file mode 100644 index 0000000..0f67d15 --- /dev/null +++ b/docs/output/CLAUDE.md @@ -0,0 +1,7 @@ +# output/ 폴더 규칙 + +wiki/ 내용을 바탕으로 생성한 최종 산출물(보고서, 슬라이드, 요약 문서 등)을 둔다. + +## 규칙 +- 여기 있는 파일은 wiki/의 특정 시점 스냅샷이다. 원본이 아니므로, 내용 갱신이 필요하면 wiki/를 먼저 갱신한 뒤 다시 생성한다. +- 파일명에 생성 날짜를 포함해 버전을 구분한다. diff --git a/docs/raw/AGENTS.md b/docs/raw/AGENTS.md new file mode 100644 index 0000000..fe25fc8 --- /dev/null +++ b/docs/raw/AGENTS.md @@ -0,0 +1,15 @@ +# raw/ 폴더 규칙 + +이 폴더는 불변 원본 저장소다. 계획서, 검증보고서, 행동지침 등 사용자가 넣거나 세션 중 생성된 원본 자료를 유형별로 보관한다. + +## 제약 +- **절대 수정하지 않는다.** 이 폴더의 파일은 읽기 전용 소스로만 취급한다. 오탈자나 오래된 내용이 있어도 여기서 고치지 않고, wiki/ 쪽에서 반영·정정한다. +- 파일을 삭제하지 않는다. + +## 하위 폴더 +- `plans/` — 계획서 +- `verification/` — 검증보고서. **계획서와 내용이 충돌하면 이쪽을 채택한다** (실제 코드가 검증된 상태이므로). +- `guidelines/` — 행동지침 + +## 이 폴더가 업데이트되면 +`docs/CLAUDE.md`의 Wiki Schema에 따라 Ingest 절차를 수행한다: 새 파일을 읽고 → 관련 `wiki/pages/`, `wiki/concepts/` 갱신 → `wiki/index.md` 갱신 → `wiki/log.md`에 기록. diff --git a/docs/raw/CLAUDE.md b/docs/raw/CLAUDE.md new file mode 100644 index 0000000..fe25fc8 --- /dev/null +++ b/docs/raw/CLAUDE.md @@ -0,0 +1,15 @@ +# raw/ 폴더 규칙 + +이 폴더는 불변 원본 저장소다. 계획서, 검증보고서, 행동지침 등 사용자가 넣거나 세션 중 생성된 원본 자료를 유형별로 보관한다. + +## 제약 +- **절대 수정하지 않는다.** 이 폴더의 파일은 읽기 전용 소스로만 취급한다. 오탈자나 오래된 내용이 있어도 여기서 고치지 않고, wiki/ 쪽에서 반영·정정한다. +- 파일을 삭제하지 않는다. + +## 하위 폴더 +- `plans/` — 계획서 +- `verification/` — 검증보고서. **계획서와 내용이 충돌하면 이쪽을 채택한다** (실제 코드가 검증된 상태이므로). +- `guidelines/` — 행동지침 + +## 이 폴더가 업데이트되면 +`docs/CLAUDE.md`의 Wiki Schema에 따라 Ingest 절차를 수행한다: 새 파일을 읽고 → 관련 `wiki/pages/`, `wiki/concepts/` 갱신 → `wiki/index.md` 갱신 → `wiki/log.md`에 기록. diff --git a/docs/raw/PLAN.md b/docs/raw/PLAN.md new file mode 100644 index 0000000..38ef1aa --- /dev/null +++ b/docs/raw/PLAN.md @@ -0,0 +1,45 @@ +# PLAN: 위키 린트(Lint) 결과 조치 및 건강도 개선 + +본 계획은 위키 린트 결과 발견된 구조적 문제들을 정밀 수정(Surgical Edit)하여 위키 건강도 및 무결성을 회복하는 것을 목표로 합니다. + +## 작업 대상 및 조치 계획 + +### 1. frontmatter status 누락 조치 +* **대상 파일**: `docs/wiki/concepts/db_schema/unconfirmed/README.md` +* **조치 내용**: YAML frontmatter를 추가하고 `status: draft`를 명시하여 상태 관리 정합성을 맞춥니다. + +### 2. 파일 줄 수 제한 초과 조치 (100줄 이내 축소) +* **대상 파일**: `docs/wiki/concepts/db_schema/logs_monitoring.md` +* **조치 내용**: 현재 103줄로 100줄 제한을 약간 초과한 상태입니다. 하단부의 사용처 설명 단락의 개행을 정리하여 파일 크기를 100줄 이하로 최적화합니다. + +### 3. 고아 페이지(Orphaned Pages) 연결 보완 ✅ 완료 +* **대상 파일**: 4개의 의존성(`dependencies.md`) 페이지들 + - `pages/B01_Dashboard/B01_dependencies.md` + - `pages/B03_FileInput/B03_dependencies.md` + - `pages/B05_wf2_Route/B05_dependencies.md` + - `pages/B06_wf3_ProfileCross/B06_dependencies.md` +* **조치 내용**: 각 폴더의 메인 문서(예: `B01_backend.md`, `B03_backend.md` 등) frontmatter의 `related_pages` 리스트에 해당 의존성 문서 링크(예: `"[[B01_Dashboard/B01_dependencies]]"`)를 추가하여, 고아 상태를 해제하고 문서 간 유기적 연결을 형성합니다. + +### 4. 위키 링크 정비 (Broken Links 교정) +* **대상 파일**: `docs/wiki/AGENTS.md` 및 `docs/wiki/CLAUDE.md` +* **조치 내용**: 문서 내 특수문자나 인코딩으로 인해 비정상적으로 생성된 깨진 위키링크(`[[]]` 등)를 확인하여 삭제하거나 정상화합니다. + +### 5. support_requests 컬럼 불일치 확인 및 동기화 +* **대상**: `[[A08_Support/A08_backend]]`, `[[db_schema/logs_monitoring]]`, 실 DB +* **조치 내용**: 계획서 vs 실 코드 vs 실 DB의 컬럼 정의를 맞춘다. + - 계획서: user_id/title/priority/status + - 실 코드: company_id/company_name/user_name/user_email/user_phone/subject/message + +### 6. A07/A09 구버전 코드 정리 +* **대상**: `A07_Register_UI_Page.ts` (구버전 잔재), `A09_Security_Api_Fetch.ts` (미연동) +* **조치 내용**: 불필요한 코드 제거 및 wiki 문서 갱신 + +### 7. B04 레거시 코드 명확화 +* **대상**: `B04_wf1_Surface_Router.py:412-427`, `B04_wf1_Surface_Router.py:76` +* **조치 내용**: `projects.status` 문자열 비교의 의도(폴백 vs 구형) 명확화 및 `update_project_status()` 호출처 추적 + +--- + +## 검증 계획 +1. 수정 완료 후 `wiki_lint.py`를 다시 실행하여 린트 오류가 모두 제거(또는 정상 수준으로 감소)되었는지 확인합니다. +2. 검증이 완료되면 `verify` 보고서를 작성하고 `PLAN.md`를 초기화합니다. diff --git a/docs/raw/guidelines/agent.md b/docs/raw/guidelines/agent.md new file mode 100644 index 0000000..56f275f --- /dev/null +++ b/docs/raw/guidelines/agent.md @@ -0,0 +1,200 @@ +# 프로젝트 행동지침 및 기술 스택 명세 (agent.md) + +## 프로젝트 & DB 정보 + +### 📌 프로그램명 +**Aislo (아이슬로)** +- **의미**: AI (인공지능) + Slotti (핀란드어: 임도/산림 도로) +- **콘셉트**: 산림의 미래를 열어가는 인공지능 경로 설계 솔루션 + +--- + +## 1. 기술 환경 및 기본 스택 (Technical Stack Baseline) +프로젝트의 코드를 작성, 테스트 또는 검증할 환경 명확화 및 호환 기준 제시. + +### A. 백엔드 프레임워크 (Python) +* **Runtime:** Python v3.12.7 +* **Framework:** FastAPI / Pydantic +* **Geometry/GIS Engine:** Trimesh, Whitebox, Geopandas, Shapely, Rasterio, Laspy + +### B. 데이터베이스 (MariaDB) +* **DBMS:** MariaDB v10.6+ +* **Character Set:** utf8mb4 (한글 완벽 지원) +* **Collation:** utf8mb4_unicode_ci +* **DB Driver (비동기):** `aiomysql` (순수 Python, Windows 호환. asyncmy는 Cython 빌드 필요로 미채택) +* **쿼리 방식:** Raw SQL (ORM 사용 금지) +* **공간 데이터:** JSON 기반 저장 (MariaDB는 PostGIS 미지원) + +### C. 프론트엔드 & WebCAD (TypeScript & WebGL) +* **Language/Runtime:** TypeScript / Node.js +* **Rendering:** HTML5 Canvas 및 WebGL 기반 WebCAD 시스템 구현 + +### D. 인코딩 및 다국어 표준 +* **인코딩:** 텍스트 파일은 UTF-8 표준으로 통일 + +--- + +## 2. 문맥 라우팅 및 문서 구조 (Context Routing) +코드 작성 및 기술 검증 시 문서 우선순위에 따른 계층적 레퍼런스 필수 읽기. + +* **1단계 (필수):** `.agent/structure.md` 읽기 후 신규 폴더 생성 기준 분석. +* **2단계 (선택 읽기):** 프로젝트 구현에 필요한 세부 기술 명세 읽기. + * **그룹 A (UI, 스타일, 컴포넌트, WebCAD):** `.agent/frontend.md` 필수 추가 읽기. + * **그룹 B (알고리즘, 저장, DB, MariaDB 값 제어):** `.agent/backend.md` 필수 추가 읽기. + * **그룹 C (DB 구조 변경):** DB 구조 변경 시 `.agent/db_schema.md` 선택적 읽기. + +--- + +## 3. 코드 작성 기본 제약 (Constraints) +* **구조 준수:** `.agent/structure.md` 트리 구조 엄격 준수. +* **700줄 제한:** 단일 파일 코드 작성/수정 시 700줄 이상이 될 경우 사전 공지. 기능별 파일 분할 후 `structure.md` 갱신 필수. +* **안전 보관:** 백엔드 작업 시 보안 저장소 경로 명시 및 임의 삭제 방지 필수. +* **경로 활용:** 단계별 페이지 기반 폴더 구조(B03~B09)와 DB 경로 열의 기준은 `.agent/db_schema_simple.md`의 「파일시스템 경로와 DB 링크」를 따른다. +* **일관성 검증:** 설계 단계에서부터 DB 설계, 파일 경로, API 라우팅이 모두 동일한 워크플로우 기준으로 통일되어야 한다. (불일치 발생 시 설계 단계에서 재논의 필수) +* **코드 포맷팅 (자동화 도구):** 프로젝트의 코드 작성이 완료되는 시, 반드시 프로젝트 루트에서 각 언어별 포맷터를 재실행하여 스타일을 통일해야 한다. + * *Python 포맷팅 명령어:* `ruff format [파일명]` 및 `ruff check --fix [파일명]` 실행 + * *TypeScript/CSS 포맷팅 명령어:* `npx prettier --write [파일명]` 실행 +* **외부 라이브러리 활용:** 외부 라이브러리 활용 시 프로젝트에 맞춰 호환 라이브러리 선정하고, 불필요한 함수는 작성하지 않도록 최소화. +* **서버실행은 사용자가 실행:** 필요한 경우 의존성 설치까지는 OK, 단 서버실행은 사용자가 진행 + +--- + +## 4. 데이터베이스 상세 명세 (Database Specification) + +### 4.1 스키마 기본 정보 +- **DB 명:** `aislo_db` +- **DBMS:** MariaDB v10.6+ +- **인코딩:** utf8mb4_unicode_ci +- **테이블 수:** 18개 +- **드라이버:** aiomysql (비동기) + +### 4.2 파일 경로 추적 (Path Tracking) +**모든 중간 산출물의 파일 경로를 DB에 기록:** +- `input_files.raw_file_path` — 원본 입력 파일 +- `processed_point_cloud.converted_file_path` — 변환된 포인트클라우드 +- `surface_models.model_file_path` — 지표면 모델 +- `routes.route_data_path` — 경로 데이터 +- `longitudinal_sections.longitudinal_file_path` — 종단면 +- `cross_sections.cross_section_file_path` — 횡단면 +- `structures.structure_data_path` — 구조물 배치 +- `quantity_items.quantity_data_path` — 수량 항목 +- `outputs.outputs_directory_path` — 산출물 폴더 +- `output_files.output_file_path` — 개별 산출 파일 + +### 4.3 저장소 구조 (Workflow-based Folder Structure) +``` +storage/{company_slug}/{user_slug}/{project_id}/ +├── B03_FileInput/input/ (WF0: 원본 입력) +├── B04_wf1_Surface/processed/ (WF1: 변환된 포인트클라우드 & 모델) +├── B05_wf2_Route/route/ (WF2: 경로 설계) +├── B06_wf3_ProfileCross/ (WF3: 종단면 & 횡단면) +├── B07_wf4_DesignDetail/structures/ (WF4: 구조물 배치) +├── B08_wf5_Quantity/quantities/ (WF5: 수량 산출) +└── B09_wf6_Estimation/v1,v2,.../ (WF6: 최종 산출물) +``` + +### 4.4 공간 데이터 처리 (MariaDB 특성) +- **지하형 기하 데이터:** GEOMETRY 타입 미지원 → JSON으로 저장 +- **좌표 저장 예:** `{"type": "Point", "coordinates": [127.5, 37.5]}` +- **경로 저장 예:** `{"type": "LineString", "coordinates": [[127.5, 37.5], [127.6, 37.6]]}` +- **애플리케이션 처리:** Python의 Shapely, Geopandas에서 JSON 파싱 후 기하 연산 + +### 4.5 역할 기반 접근 제어 (RBAC - Role-Based Access Control) + +**3가지 사용자 역할:** + +| 역할 | 영문 | 설명 | 접근 권한 | +|------|------|------|---------| +| 시스템 관리자 | SYSTEM_ADMIN | 최고 관리자 | 전체 회사/사용자/프로젝트 조회 및 관리 | +| 회사 관리자 | ADMIN | 회사의 주요 아이디 (초기 로그인) | 회사 내 팀원/프로젝트 관리, 가입 요청 승인 | +| 일반 사용자 | USER | 팀원 | 개인 프로젝트 생성/수정, 워크플로우 진행 | + +**회사 마스터 (is_master) 플래그:** +- TRUE: 회사 생성자 또는 ADMIN 역할 (팀원 승인/거부 권한) +- FALSE: 일반 팀원 + +**사용자 상태 생명주기:** +``` +PENDING_EMAIL (임시) + ↓ (이메일 인증) +NO_COMPANY (로그인 가능, 회사 미연결) + ↓ (회사 생성 또는 참여 신청) +PENDING (승인 대기) 또는 ACTIVE (회사 연결 완료) + ↓ +ACTIVE (모든 기능 접근) + ↓ (퇴사/비활성화) +INACTIVE 또는 REJECTED +``` + +--- + +## 5. 워크플로우 6단계 (6-Stage Workflow) + +``` +WF0: B03_FileInput (파일 입력) + ↓ (LAS, TIF, TFW, PRJ, DXF 업로드) +WF1: B04_wf1_Surface (지표면 분석) + ↓ (DEM, TIN, 포인트클라우드 변환) +WF2: B05_wf2_Route (경로 설계) + ↓ (최적 경로 계산) +WF3: B06_wf3_ProfileCross (종횡단 생성) + ↓ (종단면, 횡단면 생성) +WF4: B07_wf4_DesignDetail (상세 설계) + ↓ (구조물 배치) +WF5: B08_wf5_Quantity (수량 산출) + ↓ (수량 항목 계산) +WF6: B09_wf6_Estimation (견적·문서) + ↓ (Excel, PDF, DXF 생성) +``` + +--- + +## 6. 주요 문서 참고 순서 + +1. **계획서 읽기:** 구현 전 반드시 읽을 문서 + - `.agent/plan_register_split.md` — B01_Dashboard 설계 및 역할별 기능 + - `.agent/plan_register_split_validation.md` — 검증 항목 및 테스트 체크리스트 + +2. **구조 설계:** `.agent/structure.md` 읽기 + - 폴더/파일 명명 규칙 + - 전체 디렉토리 트리 구조 + +3. **DB 스키마:** `.agent/db_schema.md` 읽기 + - 사용자/회사/조직 테이블 (5개) + - 프로젝트 및 워크플로우 테이블 + - 테이블 관계도 + +4. **백엔드 구현:** `.agent/backend.md` 읽기 + - 아키텍처 및 라우팅 + - DB 및 MariaDB 설정 + - 인증 시스템 (로그인/역할/인가) + - 역할 기반 접근 제어 (RBAC) + +5. **프론트 구현:** `.agent/frontend.md` 읽기 + - UI 요소 및 레이아웃 제약 + - 인증 및 라우팅 가드 + - 역할 기반 대시보드 렌더링 + +6. **마이그레이션:** `.agent/migration_plan.md` 읽기 (필요 시) + +7. **프로젝트 정보:** `.agent/project_info.md` 읽기 (필요 시) + +--- + +## 7. 요약 + +| 항목 | 값 | +|------|-----| +| **프로그램명** | Aislo (아이슬로) | +| **DB 명** | aislo_db | +| **DBMS** | MariaDB v10.6+ | +| **인코딩** | utf8mb4_unicode_ci | +| **Backend** | Python 3.12+ / FastAPI | +| **Frontend** | TypeScript / Node.js | +| **드라이버** | aiomysql | +| **워크플로우** | 6단계 (WF0~WF6) | +| **테이블 수** | 23개 (조직/인증 5개 포함) | +| **폴더 구조** | 워크플로우 기반 (B03~B09) | +| **인증 방식** | HttpOnly Secure 세션 쿠키 | +| **사용자 역할** | SYSTEM_ADMIN, ADMIN, USER (3가지) | +| **대시보드** | B01_Dashboard (역할별 동적 렌더링) | diff --git a/docs/raw/guidelines/backend.md b/docs/raw/guidelines/backend.md new file mode 100644 index 0000000..1598afc --- /dev/null +++ b/docs/raw/guidelines/backend.md @@ -0,0 +1,300 @@ +# 백엔드 제어 명세서 (backend.md) + +## 1. 아키텍처 및 라우팅 (Architecture) +* **수직 통합:** 백엔드 로직은 페이지 폴더(`A01_`, `B01_` 등)별로 격리. 거대 단일 모듈 금지. +* **파일 분할:** 파일 수 제한 없음. 코드 집중 방지를 위해 기능별 분할 자율화. +* **파일명 규칙:** `[폴더명]_Router.py`, `[폴더명]_Engine.py`, `[폴더명]_Schema.py` 형태 준수. +* **루트 main.py:** 라우터 등록(`include_router`)만 수행. 비즈니스 로직 작성 금지. + +--- + +## 2. DB 및 MariaDB (Database) +* **비동기 통신:** `async/await` 및 `aiomysql` 드라이버 사용 강제. (asyncmy는 Cython 빌드 필요로 Windows 환경 미채택) +* **쿼리 방식:** ORM 사용 금지. **Raw SQL** 작성 원칙. 파라미터 바인딩은 `%s` 플레이스홀더 사용. +* **커넥션/트랜잭션:** 풀에서 `pool.acquire()`로 커넥션 확보 후 `connection.cursor()`로 커서 생성. 다건 쓰기는 `connection.begin()` → `commit()` / 예외 시 `rollback()`. +* **자동 증가 ID:** `INSERT` 후 `cursor.lastrowid`로 조회 (PostgreSQL의 `RETURNING id` 미지원). +* **공간 데이터:** GEOMETRY 타입 미지원. 좌표, 다각형, 경로 등은 JSON 형식으로 저장 후 애플리케이션에서 처리. + +--- + +## 3. 설정 및 저장소 (Config & Storage) +* **하드코딩 금지:** 제어 변수/파라미터 하드코딩 금지. `config/config_system.py`에서 `import` 필수. +* **물리 파일 격리:** 포인트 클라우드, 분석 중간 파일, 메쉬, 임시 커서는 DB 저장 금지. +* **저장 경로:** `storage/[고객사명]/[사용자명]/[프로젝트ID]/`에 물리 파일 저장 후 DB에는 경로만 기록. +* **단계별 루트 강제:** 프로젝트 저장소 내부는 실제 워크플로우 페이지명과 동일한 `B03_FileInput/` ~ `B09_wf6_Estimation/` 폴더로 분리한다. `raw/`, `processed/`, `computed/`를 프로젝트 루트의 공용 폴더로 만들지 않는다. +* **경로 정의 우선순위:** 단계별 세부 폴더와 DB 경로 열의 기준은 `.agent/db_schema_simple.md`의 「파일시스템 경로와 DB 링크」를 따른다. +* **경로 생성 책임:** 페이지별 백엔드는 자기 단계 폴더만 생성·수정한다. 다른 단계의 산출물을 직접 삭제하거나 덮어쓰지 않고 stale 상태를 통해 재계산 필요성을 전파한다. +* **DB 저장 형식:** DB에는 프로젝트 루트 기준 상대 경로를 기록하고, 실제 파일 접근 시 설정의 저장소 루트와 안전하게 결합한다. 사용자 입력 경로를 직접 결합하거나 절대 경로를 DB에 저장하지 않는다. +* **MariaDB 특성:** + - 공간 기하 데이터(좌표, 폴리곤, 경로 등)는 GEOMETRY 타입 미지원 → JSON 또는 TEXT로 저장 + - 예: `{"type": "Point", "coordinates": [127.5, 37.5]}` (GeoJSON 형식) + - 애플리케이션(Python)에서 JSON 파싱 후 기하 연산 처리 + +--- + +## 4. 검증 및 예외 처리 (Error Handling) +* **데이터 검증:** 모든 JSON 요청은 라우터 진입 전 Pydantic 모델로 타입/범위 필수 검증. +* **예외 포획:** 모든 지형/메쉬 연산은 `try-except` 필수 처리. +* **반환 포맷:** 에러 발생 시 `{"status": "error", "message": "원인"}` 표준 포맷 반환. + +--- + +## 5. 워크플로우 상태 동기화 (Workflow State Sync) + +### 5.1 다중 브라우저 동시 작업 원칙 +* **브라우저 독립성:** 같은 계정/프로젝트를 여러 브라우저에서 동시 접근 가능. 각 브라우저는 서버 데이터 기반 독립 작동. +* **클라이언트 상태 격리:** `localStorage`는 브라우저별 격리(도메인 단위 공유). 공유 데이터는 항상 서버 영구저장소 우선. +* **영구저장소 설계:** 계산 결과는 `.agent/db_schema_simple.md`에 정의된 페이지별 단계 폴더에 저장한다. + * `B03_FileInput/` — 원본 입력 및 파일 메타데이터 + * `B04_wf1_Surface/` — 변환 포인트클라우드, 지표면 모델 및 분석 결과 + * `B05_wf2_Route/` — 경로, 경로점 및 설계 파라미터 + * `B06_wf3_ProfileCross/` — 종단·횡단 결과 및 인덱스 +* **워크플로우 상태:** 여러 단계가 공유하는 `workflow.json`의 실제 위치는 저장소 경로 유틸에서 단일하게 정의하며, 원자적 쓰기를 적용한다. 단계별 결과 파일의 위치를 프로젝트 루트의 `result_*.json` 이름으로 추정하지 않는다. + +### 5.2 Stale 상태 감지 및 전파 +* **workflow.json 구조:** + ```json + { + "current_stage": "route", + "completed": ["scan", "surface"], + "stale_from": "route", + "stage1_confirmed": {...} + } + ``` +* **Stale 발생 조건:** + * 상위 단계(예: surface) 재계산 → 하위 단계(route, section) 자동으로 `stale_from` 설정 + * 다른 브라우저에서 변경 감지 → 기존 결과 무효화 +* **상태 업데이트 함수:** + ```python + def _patch_workflow_stale(project_id: str, stale_from: str | None) -> None: + """workflow.json의 stale_from 필드만 원자적 업데이트""" + wf_path = get_project_workflow_path(project_id) + # 기존 상태 유지하며 stale_from만 변경 + ``` + +### 5.3 클라이언트 폴링 패턴 (Polling) +* **주기:** GET `/api/projects/{project_id}/workflow` — 3초마다 호출 +* **응답:** workflow.json 전체 반환 (현재 단계, 완료 이력, stale 상태 포함) +* **클라이언트 동작:** + 1. stale 감지 → 사용자에게 선택지 제시 + 2. "계속하기" → 기존 결과 유지 (위험 경고) + 3. "재계산하기" → 상위 단계 재실행 (모든 하위 결과 초기화) +* **구현 예시:** + ```typescript + setInterval(async () => { + const workflow = await fetch(`/api/projects/${projectId}/workflow`); + if (workflow.stale_from && workflow.stale_from !== currentStage) { + handleStaleness(workflow.stale_from); // 사용자에게 알림 + } + }, 3000); + ``` + +### 5.4 WebSocket 확장 (미래 선택사항) +* **실시간 알림:** 폴링 대신 WebSocket으로 업그레이드 가능 (응답성 향상) +* **전송 메시지:** + ```json + { + "type": "workflow_changed", + "project_id": "...", + "stale_from": "route", + "changed_by": "other_browser" + } + ``` +* **마이그레이션 시기:** 사용자 수 증가 또는 실시간성 요구 시 적용 + +--- + +## 6. 로그인 및 인증 시스템 (Authentication & Authorization) + +### 6.1 이메일 기반 OTP 인증 (Email OTP) +* **OTP 생성:** 6자리 난수 (000000~999999) +* **저장 방식:** DB에 bcrypt/PBKDF2 해시값 저장 (평문 절대 금지) +* **유효 시간:** 5분 (config에서 설정 가능) +* **발송:** Google SMTP (개발) → AWS SES (상용화) 전환 예정 +* **재시도 로직:** 최대 3회 (지수 백오프: 2초, 4초, 8초) + +### 6.2 비밀번호 정책 (Password Policy) +* **최소 길이:** 8자 이상 +* **권장 구성:** 대문자/소문자/숫자/특수문자 (강제 아님, Google 기준) +* **해시 알고리즘:** bcrypt (라운드 12 이상) 또는 PBKDF2 +* **저장 방식:** 해시값만 DB에 저장 (평문 절대 금지) + +### 6.3 세션 관리 (Session Management) - 확정: Secure HttpOnly 세션 쿠키 + +* **방식:** Secure HttpOnly 세션 쿠키 (JWT 아님) +* **쿠키 이름:** `session_id` +* **유효 시간:** 12시간 +* **Secure 플래그:** true (HTTPS만 전송, 개발 환경 localhost에서는 false) +* **HttpOnly 플래그:** true (JavaScript 접근 불가) +* **SameSite:** Lax (CSRF 방지) +* **저장소:** MariaDB `sessions` 테이블 +* **활동 감지:** 마지막 요청으로부터 4시간 (파일 업로드 등 장시간 작업 고려) +* **세션 만료 판정:** + ```python + if (current_time - last_activity_at > 4시간) or (current_time - created_at > 12시간): + → 세션 자동 만료 + ``` +* **만료 처리:** 프론트엔드는 만료 5분 전 알림, 만료 후 모든 요청 거부 (401 Unauthorized) +* **DB 풀 설정:** `autocommit=True` (pooled 커넥션의 트랜잭션 스냅샷 문제 방지 — 새 세션 INSERT 후 다른 커넥션에서 즉시 조회 가능) + +### 6.4 로그인 이력 기록 (Audit Log) +* **기록 항목:** + - `user_id`, `email`, `login_timestamp`, `user_agent` (브라우저/OS), `status` (SUCCESS/FAILURE) +* **보관 기간:** 1년 (자동 삭제) +* **무차별 대입 방지:** 5회 이상 실패 시 계정 15분 잠금 +* **IP 주소:** 법적 이슈로 수집하지 않음 (권장) + +### 6.4.1 사용자 상태 생명주기 (User Status Lifecycle) +* **PENDING_EMAIL:** 회원가입 후 이메일 인증 전 (임시) +* **NO_COMPANY:** 이메일 인증 완료, 회사 미연결 (로그인 가능, B01_Dashboard 접근 가능, B02~B11 워크플로우 차단) +* **PENDING:** 회사 참여 신청 후 ADMIN 승인 대기 (로그인 가능, B01_Dashboard 접근 가능, B02~B11 워크플로우 차단) +* **ACTIVE:** 회사 연결 완료, 모든 기능 접근 가능 (B01_Dashboard + B02~B11) +* **INACTIVE:** 퇴사/계정 휴활성화 +* **REJECTED:** 회사 참여 신청 거부 + +### 6.5 회사 연결 필수화 (Mandatory Company Linking) +* **접근 제어:** + - B02~B11 워크플로우 라우터에 `Depends(require_company)` 의존성 추가 + - `session["company_id"] is None` 이면 403 Forbidden 반환 (`"회사 연결이 필요합니다."`) +* **라우팅 가드 (프론트):** + - B02~B11 진입 시 `fetchSessionUser()` → `company_id` 확인 + - 없으면 B01_ACCOUNT로 리다이렉트 +* **회사 생성/연결:** + - `POST /api/account/company/create`: 신규 회사 생성 후 사용자를 MASTER로 자동 연결 (status='ACTIVE') + - `POST /api/account/company/join`: 기존 회사 참여 신청 (status='PENDING', 마스터 승인 필요) + +### 6.6 권한 체크 (Authorization) +* **마스터 권한:** + - 팀원 목록 조회, 승인/거부, 내보내기 + - 회사 정보 수정, 구독 관리 + - 마스터 대시보드 접근 +* **팀원 권한:** + - 프로젝트 생성/수정/조회 + - 워크플로우 실행 (B03~B09) + - 개인 프로필 수정 +* **시스템관리자 권한:** + - 모든 회사/사용자 데이터 접근 (슈퍼유저) + - 회사/사용자 생성/수정/삭제 + - 관리자 대시보드 (모니터링, Q&A 관리) +* **검증 방식:** 라우터 진입 전 JWT/토큰 검증, 필요시 데이터베이스에서 권한 확인 + +### 6.7 로그인 기반 인증 갱신 (Login-based Auth Renewal) +* **목적:** 활성 사용자의 인증 유지, 비활성 사용자 자동 차단 +* **방식:** 로그인 시 인증 유효 기간 자동 연장 (3개월) +* **구현:** + - `users.last_login` → 마지막 로그인 시간 업데이트 + - `users.auth_expires_at` → 매 로그인 시 NOW() + 3개월로 설정 +* **인증 확인:** + - auth_expires_at > NOW() → 인증 유효 (바로 대시보드 이동) + - auth_expires_at <= NOW() → 재인증 모달 표시 +* **장점:** + - 활동적인 사용자: 지속적으로 인증 유지 + - 휴면 사용자: 자동으로 재인증 요구 + - 일관된 정책: 고정 3개월이 아닌 활동 기반 연장 + +### 6.8 역할 기반 접근 제어 (Role-Based Access Control) + +**사용자 역할 (users.role)** +- `SYSTEM_ADMIN`: 시스템 관리자 (최고 권한) +- `ADMIN`: 회사 관리자 (회사 내 관리권 한정) +- `USER`: 일반 사용자 + +### 6.9 대시보드 권한 검증 및 감시 로깅 (B01_Dashboard Authorization & Audit) +* **권한 검증 헬퍼 필수:** `.agent/plan_dashboard_management.md` 섹션 9의 Python 헬퍼 함수 구현 + - `can_edit_project(user, project)` - 프로젝트 수정 권한 + - `can_delete_project(user)` - 프로젝트 삭제 권한 (SYSTEM_ADMIN만) + - `can_change_role(user, target_user, new_role)` - 역할 변경 권한 + - ADMIN이 SYSTEM_ADMIN으로 변경 시도 시 즉시 False 반환 + - ADMIN은 USER ↔ ADMIN만 변경 가능 (같은 회사만) + - `can_manage_automation(user, automation)` - 자동화 로직 관리 권한 (USER 차단) + - `is_last_admin(company_id, exclude_user_id)` - 회사의 마지막 ADMIN 확인 + +* **백엔드 권한 재검증 필수:** 모든 수정/삭제/역할변경 API에서 권한 재검증 + - 클라이언트 UI 신뢰 금지 (프론트엔드는 UI만 제어) + - 권한 없는 사용자가 API 직접 호출 시도 → 403 Forbidden + - 권한 오류 메시지: `{"status": "error", "message": "Access denied"}` + +* **감시 로깅 (audit_logs):** 다음 행동들을 기록 + - 프로젝트 삭제: `action="DELETE_PROJECT"`, `resource_type="project"` + - 사용자 역할 변경: `action="CHANGE_ROLE_TO_{NEW_ROLE}"`, `resource_type="user"` + - 사용자 삭제: `action="DELETE_USER"`, `resource_type="user"` + - 자동화 로직 삭제: `action="DELETE_AUTOMATION"`, `resource_type="automation"` + +* **USER 자동화 조회 권한 차단:** `/api/projects/{pid}/automations` GET + - 요청 사용자의 role이 USER인 경우 403 Forbidden 반환 + - 메시지: `"Automation logic viewing is not allowed for users"` + +* **마지막 ADMIN 보호:** 사용자 삭제 API에서 체크 + - `is_last_admin(company_id, exclude_user_id=user_id)` 호출 + - True 반환 시 400 Bad Request: `"Cannot delete the last admin of the company"` + - 역할 변경 API에서도 동일 로직 적용 + +**마스터 플래그 (users.is_master)** +- `TRUE`: 회사 생성자 또는 ADMIN 역할 (팀원 승인/거부 권한) +- `FALSE`: 일반 팀원 + +**접근 제어 규칙:** + +| 기능 | SYSTEM_ADMIN | ADMIN | USER | +|------|-------------|-------|------| +| 전체 회사 조회 | ✅ | ✗ | ✗ | +| 전체 사용자 조회 | ✅ | ✗ | ✗ | +| 사용자 역할 변경 | ✅ | ✗ | ✗ | +| 회사 생성 | ✅ | ✅ | ✅ | +| 회사 팀원 관리 | ✅ | ✅ (자신 회사만) | ✗ | +| 가입 요청 승인 | ✅ | ✅ (자신 회사만) | ✗ | +| 시스템 로그 조회 | ✅ | ✗ | ✗ | +| 프로젝트 생성 | ✅ | ✅ | ✅ | +| 프로젝트 조회 | ✅ (전체) | ✅ (회사별) | ✅ (개인) | + +### 6.9 이메일 발송 (Email Infrastructure) +* **SMTP 설정:** + - **개발:** Google Gmail SMTP (umsangdon@gmail.com) + - **상용화:** Google Workspace 또는 AWS SES로 전환 +* **발송 유형:** + - OTP 인증 코드 + - 가입 확인 메일 + - 팀원 가입 승인 요청 (ADMIN 수신) + - 팀원 승인/거부 결과 (사용자에게) + - 회사 참여 신청 알림 (SYSTEM_ADMIN 수신) + - 로그인 기반 인증 갱신 알림 +* **구현:** `common_util/common_util_email.py` 모듈 + - 비동기 발송 (asyncio.create_task) + - 재시도 로직 (최대 3회) + - 템플릿 렌더링 (common_util_email_templates.py) +* **자세한 내용:** `.agent/email_infrastructure_plan.md` 참고 + +--- + +## 7. 시스템 리소스 모니터링 (System Resource Monitoring) + +### 7.1 계측 백그라운드 태스크 +* **구현:** `common_util/common_util_resource_monitor.py`의 `sample_resources_loop()` +* **등록:** `main.py` lifespan에서 `asyncio.create_task`로 시작, 종료 시 cancel (기존 `cleanup_expired_sessions` 패턴과 동일) +* **계측 주기:** 2분 (`config_system.RESOURCE_SAMPLE_INTERVAL_SEC = 120`) +* **계측 항목:** CPU(`psutil.cpu_percent`), 메모리(`psutil.virtual_memory().percent`), 디스크(`shutil.disk_usage`) +* **방어:** 계측 예외는 로깅 후 무시하여 앱 안정성 유지 + +### 7.2 이중 기록 (DB + 로그 파일) +* **DB 기록:** `system_resources` 테이블에 INSERT (활성 세션/프로젝트 수 포함) — 대시보드 그래프 조회 소스 +* **로그 파일:** 루트 `log/system_resources.log` 단일 파일에 탭 구분 1줄 append + - 형식: `\tcpu=\tmem=\tdisk=\tstorage_mb=` + - `log/`는 `.gitignore` 처리 (런타임 생성물) + +### 7.3 1개월 롤링 보관 (Retention) +* **보관 기간:** 30일 (`config_system.RESOURCE_LOG_RETENTION_DAYS = 30`) +* **DB:** 매 계측 시 `timestamp < NOW() - 30일` 행 DELETE +* **로그 파일:** 매 계측 시 30일 경과 줄 제거 후 새 줄 추가(오래된 줄 삭제 + 신규 줄 추가 방식) → 파일 크기 무한 증가 방지 + +### 7.4 리소스 API +* **엔드포인트:** `GET /api/dashboard/admin/resources?days=30` (SYSTEM_ADMIN 전용, 범위 1~90일) +* **응답:** + - `current`: 요청 시점 실시간 계측값 (그래프 미저장) + - `history`: `system_resources` 테이블의 최근 N일 시계열 (그래프 렌더링용, **다운샘플링 적용**) + - `stats`: 활성 사용자/프로젝트/저장소 지표 +* **다운샘플링 (조회 시):** + - 30일 원본은 약 21,600점(2분 간격) → 그대로 전송 시 페이로드 과다(~4MB) + - SQL에서 시간버킷 평균으로 축소: `bucket = max(120초, days*86400 / 300)` → 최대 약 300점 + - `GROUP BY FLOOR(UNIX_TIMESTAMP(timestamp) / bucket)` + `AVG(...)`로 집계 + - 계측 간격(2분)보다 버킷이 작으면 원본 해상도 유지 (하루 이하 조회 시) + - 효과: 30일 조회 페이로드 ~4MB → ~55KB 수준 diff --git a/docs/raw/guidelines/db_schema.md b/docs/raw/guidelines/db_schema.md new file mode 100644 index 0000000..5c6cace --- /dev/null +++ b/docs/raw/guidelines/db_schema.md @@ -0,0 +1,851 @@ +# DB 스키마 (테이블 및 열 목록) + +**최종 업데이트:** 2026-07-10 +**DB 명:** `aislo_db` (MariaDB v10.6+, utf8mb4_unicode_ci) +**총 테이블 수:** 34개 (33개 현재 운영 + 1개 향후 사용) + +--- + +## 1. 사용자 & 인증 & 조직 그룹 + +### 1-1. users 테이블 +``` +users +├── id (INT, PK) — 사용자 고유 번호 +├── email (VARCHAR(255), UNIQUE) — 로그인 이메일 +├── password_hash (VARCHAR(255)) — 비밀번호 암호화 저장 +├── name (VARCHAR(255)) — 사용자 이름 +├── position (VARCHAR(100), NULL) — 직급 (예: 과장, 대리, 사원) +├── department (VARCHAR(100), NULL) — 부서명 (예: 설계팀, 영업팀) +├── phone (VARCHAR(20), NULL) — 연락처 (예: 010-1234-5678) +├── company_id (INT, FK → companies.id, NULL) — 소속 회사 +├── role (ENUM) — 역할: SYSTEM_ADMIN, ADMIN, USER (기본값: USER) +├── is_master (TINYINT(1)) — 회사 마스터 여부 (기본값: 0) +├── status (ENUM) — 상태: PENDING_EMAIL, NO_COMPANY, PENDING, ACTIVE, INACTIVE, REJECTED (기본값: PENDING_EMAIL) +├── last_login (DATETIME, NULL) — 마지막 로그인 시간 +├── auth_expires_at (DATETIME, NULL) — 인증 유효 만료 시간 (3개월 주기) +├── last_email_verified_at (TIMESTAMP, NULL) — 마지막 이메일 인증 시간 +├── login_failures (INT) — 연속 로그인 실패 횟수 (기본값: 0, 보안) +├── last_failed_at (TIMESTAMP, NULL) — 마지막 로그인 실패 시간 +├── account_locked_until (TIMESTAMP, NULL) — 계정 잠금 해제 시간 +├── created_at (TIMESTAMP) — 가입일 +├── updated_at (TIMESTAMP) — 수정일 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +**상태 생명주기:** +- PENDING_EMAIL: 회원가입 후 이메일 인증 전 +- NO_COMPANY: 이메일 인증 완료, 회사 미연결 (로그인 가능, B02~B11 차단) +- PENDING: 회사 참여 신청 후 관리자 승인 대기 +- ACTIVE: 회사 연결 완료, 모든 기능 접근 가능 +- INACTIVE: 퇴사/계정 비활성화 +- REJECTED: 회사 참여 신청 거부 + +### 1-2. companies 테이블 +``` +companies +├── id (INT, PK) — 회사 고유 번호 +├── name (VARCHAR(255), UNIQUE) — 회사명 +├── business_registration_number (VARCHAR(20), UNIQUE, NULL) — 사업자등록번호 +├── business_address (VARCHAR(255), NULL) — 사업장 주소 +├── business_owner (VARCHAR(100), NULL) — 사업주 이름 +├── business_status (VARCHAR(50), NULL) — 기업 상태 +├── company_code (VARCHAR(20), NULL) — 회사 코드 +├── phone_number (VARCHAR(20), NULL) — 회사 연락처 +├── representative_name (VARCHAR(100), NULL) — 대표자명 +├── master_user_id (INT, NULL) — 마스터 사용자 ID +├── status (ENUM) — 상태: ACTIVE, INACTIVE, SUSPENDED (기본값: ACTIVE) +├── subscription_status (ENUM) — 구독 상태: FREE, TRIAL, PAID, EXPIRED (기본값: FREE) +├── created_by (INT, FK → users.id, NULL) — 회사 생성자 +├── created_at (TIMESTAMP) — 생성일 +├── updated_at (TIMESTAMP) — 수정일 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 1-3. join_requests 테이블 (가입 신청 - 향후 사용) +``` +join_requests +├── id (INT, PK) — 요청 고유 번호 +├── user_id (INT, FK → users.id) — 신청한 사용자 +├── company_id (INT, FK → companies.id) — 신청 대상 회사 +├── requested_at (TIMESTAMP) — 신청 시간 +├── status (ENUM) — 상태: PENDING, APPROVED, REJECTED (기본값: PENDING) +├── reviewed_by (INT, FK → users.id, NULL) — 검토한 관리자 +├── reviewed_at (TIMESTAMP, NULL) — 검토 시간 +├── review_comment (TEXT, NULL) — 검토 의견/거부 사유 +└── UNIQUE KEY (user_id, company_id) — 중복 신청 방지 +``` + +**동작 (향후 구현 예정):** +- 사용자 가입 신청 → status = PENDING 생성 +- 관리자 승인 → status = APPROVED, users.status = ACTIVE, users.company_id 세팅 +- 관리자 거부 → status = REJECTED, review_comment에 거부 사유 기록, 이메일 발송 + +### 1-5. email_otps 테이블 (이메일 인증) +``` +email_otps +├── id (INT, PK) — OTP 고유 번호 +├── email (VARCHAR(255)) — 이메일 주소 +├── otp_code (VARCHAR(10)) — OTP 코드 +├── purpose (VARCHAR(50)) — 목적: REGISTRATION, PASSWORD_RESET, EMAIL_VERIFICATION +├── expires_at (TIMESTAMP) — 만료 시간 +├── verified_at (TIMESTAMP, NULL) — 인증 시간 +├── created_at (TIMESTAMP) — 생성일 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 1-6. sessions 테이블 (세션 관리) +``` +sessions +├── id (INT, PK) — 세션 고유 번호 +├── user_id (INT, FK → users.id) — 사용자 ID +├── session_token (VARCHAR(255), UNIQUE) — 세션 토큰 +├── expires_at (TIMESTAMP) — 세션 만료 시간 +├── created_at (TIMESTAMP) — 생성일 +├── last_accessed_at (TIMESTAMP, NULL) — 마지막 접근 시간 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 1-7. trusted_devices 테이블 (장치 신뢰 관리) +``` +trusted_devices +├── id (INT, PK) — 장치 고유 번호 +├── user_id (INT, FK → users.id) — 사용자 ID +├── device_fingerprint (VARCHAR(255)) — 장치 지문 +├── device_name (VARCHAR(100), NULL) — 장치명 +├── ip_address (VARCHAR(50)) — IP 주소 +├── user_agent (TEXT) — 브라우저/OS 정보 +├── trusted_until (TIMESTAMP, NULL) — 신뢰 만료 시간 +├── created_at (TIMESTAMP) — 생성일 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 1-8. user_consents 테이블 (사용자 동의 관리) +``` +user_consents +├── id (INT, PK) — 동의 고유 번호 +├── user_id (INT, FK → users.id) — 사용자 ID +├── consent_type (VARCHAR(100)) — 동의 종류: TERMS, PRIVACY, MARKETING, etc +├── consented (TINYINT(1)) — 동의 여부 (1 = 동의, 0 = 미동의) +├── consent_version (VARCHAR(20)) — 약관 버전 +├── created_at (TIMESTAMP) — 생성일 +├── updated_at (TIMESTAMP) — 수정일 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 1-9. login_logs 테이블 (로그인 로그) +``` +login_logs +├── id (INT, PK) — 로그 고유 번호 +├── user_id (INT, FK → users.id, NULL) — 사용자 ID +├── email (VARCHAR(255), NULL) — 로그인 시도 이메일 +├── status (VARCHAR(50)) — 상태: SUCCESS, FAILURE, LOCKED +├── ip_address (VARCHAR(50), NULL) — IP 주소 +├── user_agent (TEXT, NULL) — 브라우저/OS 정보 +├── reason (TEXT, NULL) — 실패 사유 +├── created_at (TIMESTAMP) — 기록 시간 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 1-10. activity_logs 테이블 (활동 로그) +``` +activity_logs +├── id (INT, PK) — 로그 고유 번호 +├── user_id (INT, FK → users.id, NULL) — 사용자 ID +├── action (VARCHAR(100)) — 행동: LOGIN, LOGOUT, FILE_UPLOAD, PROJECT_CREATE, etc +├── entity_type (VARCHAR(100), NULL) — 대상 타입: project, file, route, etc +├── entity_id (VARCHAR(50), NULL) — 대상 ID +├── description (TEXT, NULL) — 행동 설명 +├── ip_address (VARCHAR(50), NULL) — IP 주소 +├── created_at (TIMESTAMP) — 기록 시간 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 1-11. audit_logs 테이블 (감시 로그 - 보안) +``` +audit_logs +├── id (INT, PK) — 로그 고유 번호 +├── user_id (INT, FK → users.id) — 행동 수행자 +├── action (VARCHAR(100)) — 행동: CREATE, READ, UPDATE, DELETE, EXPORT, DOWNLOAD +├── entity_type (VARCHAR(100)) — 대상 타입: projects, routes, structures, outputs +├── entity_id (VARCHAR(50)) — 대상 ID +├── details (LONGTEXT, NULL) — 상세 정보 (JSON 형식) +├── ip_address (VARCHAR(50), NULL) — IP 주소 +├── timestamp (TIMESTAMP) — 기록 시간 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 1-12. system_audit_logs 테이블 (시스템 감시) +``` +system_audit_logs +├── id (INT, PK) — 로그 고유 번호 +├── user_id (INT, FK → users.id) — 행동 수행자 +├── action (VARCHAR(50)) — 행동: LOGIN, LOGOUT, USER_CREATE, COMPANY_CREATE, ROLE_CHANGE +├── resource_type (VARCHAR(50)) — 대상 타입: user, company, project, join_request +├── resource_id (INT, NULL) — 대상 ID +├── ip_address (VARCHAR(50), NULL) — IP 주소 +├── user_agent (TEXT, NULL) — 브라우저/OS 정보 +├── timestamp (TIMESTAMP) — 기록 시간 +└── INDEX (timestamp, user_id) — 성능 최적화 +``` + +### 1-13. system_resources 테이블 (시스템 리소스 모니터링) +``` +system_resources +├── id (INT, PK) — 기록 고유 번호 +├── cpu_usage_percent (FLOAT, NULL) — CPU 사용률 (%) +├── memory_usage_percent (FLOAT, NULL) — 메모리 사용률 (%) +├── disk_usage_percent (FLOAT, NULL) — 디스크 사용률 (%) +├── active_user_count (INT, NULL) — 활성 사용자 수 +├── active_project_count (INT, NULL) — 활성 프로젝트 수 +├── total_storage_mb (FLOAT, NULL) — 전체 저장소 사용량 (MB) +├── timestamp (TIMESTAMP) — 기록 시간 +└── INDEX (timestamp) — 시계열 조회 최적화 +``` + +**리소스 측정 방식:** +- **현재값 실측:** 요청 시점 실시간 측정 (DB 저장 없이 응답에 포함) +- **이력 조회:** `system_resources` 테이블에서 기본 30일치 시계열 조회 +- **활성 지표:** active_user_count는 유효 세션 수, active_project_count는 미삭제 프로젝트 수 실시간 집계 + +### 1-14. support_requests 테이블 (고객 지원) +``` +support_requests +├── id (INT, PK) — 요청 고유 번호 +├── user_id (INT, FK → users.id) — 신청자 +├── title (VARCHAR(255)) — 제목 +├── description (LONGTEXT) — 설명 +├── category (VARCHAR(100), NULL) — 카테고리 +├── priority (VARCHAR(50), NULL) — 우선순위: LOW, MEDIUM, HIGH, URGENT +├── status (VARCHAR(50)) — 상태: OPEN, IN_PROGRESS, RESOLVED, CLOSED +├── assigned_to (INT, FK → users.id, NULL) — 담당자 +├── resolution (LONGTEXT, NULL) — 해결 내용 +├── created_at (TIMESTAMP) — 생성일 +├── updated_at (TIMESTAMP) — 수정일 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +--- + +## 2. 프로젝트 그룹 + +### 2-1. projects 테이블 +``` +projects +├── id (CHAR(36), PK) — 프로젝트 고유 ID (UUID) +├── user_id (INT, FK → users.id) — 프로젝트 소유자 +├── company_id (INT, FK → companies.id) — 소속 회사 +├── name (VARCHAR(255)) — 프로젝트명 (예: "2025년 산불진화임도") +├── region (VARCHAR(100), NULL) — 지역명 (예: "울진군 금강송면") +├── road_type (VARCHAR(100), NULL) — 임도 종류: 간선임도, 지선임도, 산불진화임도, 계류보전 +├── project_year (INT, NULL) — 사업 연도 (예: 2025) +├── estimated_length_m (FLOAT, NULL) — 추정 연장 (미터) +├── memo (TEXT, NULL) — 비고/메모 +├── status (VARCHAR(50), NULL) — 상태: NEW, FILE_UPLOADED, WF1_ANALYZING, WF1_COMPLETE, ... (기본값: NEW) +├── crs_epsg (INT, NULL) — 좌표계 (예: 5178 = 한국 표준, 기본값: 5178) +├── storage_path (VARCHAR(500), NULL) — 파일시스템 경로 (예: "storage/company/user/project_uuid") +├── created_at (TIMESTAMP) — 생성일 +├── updated_at (TIMESTAMP) — 수정일 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 2-2. project_versions 테이블 (프로젝트 버전 관리) +``` +project_versions +├── id (INT, PK) — 버전 고유 번호 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── version_num (INT) — 버전 번호 (1, 2, 3, ...) +├── status (VARCHAR(50), NULL) — 저장된 상태 +├── data (LONGTEXT, NULL) — 설계 데이터 스냅샷 (JSON 형식) +├── snapshot_at (TIMESTAMP) — 스냅샷 시점 +└── created_at (TIMESTAMP) — 생성일 +``` + +### 2-3. project_automations 테이블 (프로젝트 자동화 규칙) +``` +project_automations +├── id (INT, PK) — 자동화 고유 번호 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── name (VARCHAR(100)) — 자동화 규칙명 +├── logic_type (VARCHAR(50)) — 로직 타입: trigger_on_stage_complete, auto_notify, etc +├── config_json (LONGTEXT) — 자동화 설정 (JSON) +├── status (ENUM) — 상태: DRAFT, ACTIVE, INACTIVE (기본값: DRAFT) +├── created_by (INT, FK → users.id) — 생성자 +├── updated_by (INT, FK → users.id, NULL) — 마지막 수정자 +├── last_executed_at (DATETIME, NULL) — 마지막 실행 시간 +├── created_at (TIMESTAMP) — 생성일 +├── updated_at (TIMESTAMP) — 수정일 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +--- + +## 3. 파일 & 업로드 관리 그룹 + +### 3-1. upload_sessions 테이블 (파일 업로드 세션) +``` +upload_sessions +├── id (INT, PK) — 업로드 세션 고유 번호 +├── user_id (INT, FK → users.id) — 업로드자 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── session_id (VARCHAR(255), UNIQUE) — 세션 ID +├── file_name (VARCHAR(255)) — 파일명 +├── file_size_mb (FLOAT) — 파일 크기 +├── chunk_count (INT) — 청크 개수 +├── uploaded_chunks (INT) — 업로드된 청크 수 +├── status (VARCHAR(50)) — 상태: PENDING, IN_PROGRESS, COMPLETED, FAILED (기본값: PENDING) +├── started_at (TIMESTAMP) — 시작 시간 +├── completed_at (TIMESTAMP, NULL) — 완료 시간 +└── expires_at (TIMESTAMP) — 세션 만료 시간 +``` + +### 3-2. upload_chunks 테이블 (파일 청크 관리) +``` +upload_chunks +├── id (INT, PK) — 청크 고유 번호 +├── upload_session_id (INT, FK → upload_sessions.id) — 업로드 세션 ID +├── chunk_index (INT) — 청크 순서 +├── chunk_size_mb (FLOAT) — 청크 크기 +├── checksum (VARCHAR(255), NULL) — 체크섬 (무결성 검사) +├── status (VARCHAR(50)) — 상태: PENDING, UPLOADED, VERIFIED (기본값: PENDING) +├── uploaded_at (TIMESTAMP, NULL) — 업로드 시간 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 3-3. input_files 테이블 (원본 입력 파일) +``` +input_files +├── id (INT, PK) — 파일 고유 번호 +├── project_id (CHAR(36), FK → projects.id) — 속한 프로젝트 +├── file_type (VARCHAR(50), NULL) — 파일 종류: las, tif, tfw, prj, dxf, dwg, other +├── original_filename (VARCHAR(255)) — 원래 파일명 (예: "cloud_merged.las") +├── raw_file_path (VARCHAR(500)) — 원본 저장 경로 (예: "storage/.../raw/las/cloud_merged.las") +├── file_size_mb (FLOAT, NULL) — 파일 크기 (MB) +├── upload_by (INT, FK → users.id, NULL) — 업로드한 사용자 +├── upload_at (TIMESTAMP) — 업로드 날짜 +├── crs_epsg (INT, NULL) — 파일 좌표계 (예: 5178) +├── metadata (LONGTEXT, NULL) — 파일 메타데이터 (JSON) +├── status (VARCHAR(50), NULL) — 상태: UPLOADED, PROCESSED, ARCHIVED (기본값: UPLOADED) +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +--- + +## 4. 지표면 분석 & 처리 그룹 + +### 4-1. processed_point_cloud 테이블 (변환된 포인트클라우드) +``` +processed_point_cloud +├── id (INT, PK) — 변환 데이터 고유 번호 +├── input_file_id (INT, FK → input_files.id) — 원본 LAS 파일 참조 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── process_type (VARCHAR(50), NULL) — 변환 방식: filtered, sampled, classified +├── processed_file_path (VARCHAR(500), NULL) — 변환된 파일 경로 +├── converted_format (VARCHAR(50), NULL) — 변환 포맷: las, ply, laz 등 +├── converted_file_path (VARCHAR(500), NULL) — 변환 포맷 저장 경로 +├── point_count (INT, NULL) — 포인트 개수 +├── min_z (FLOAT, NULL) — 최저 높이 +├── max_z (FLOAT, NULL) — 최고 높이 +├── mean_z (FLOAT, NULL) — 평균 높이 +├── x_min (FLOAT, NULL) — 최소 경도 +├── x_max (FLOAT, NULL) — 최대 경도 +├── y_min (FLOAT, NULL) — 최소 위도 +├── y_max (FLOAT, NULL) — 최대 위도 +├── density_per_sqm (FLOAT, NULL) — 단위 면적당 포인트 밀도 +├── classification_summary (LONGTEXT, NULL) — 분류 요약 (JSON) +├── processing_params (LONGTEXT, NULL) — 변환 파라미터 (JSON) +├── processed_at (TIMESTAMP) — 변환 완료 날짜 +├── status (VARCHAR(50), NULL) — 상태: PROCESSING, COMPLETE, FAILED (기본값: PROCESSING) +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 4-2. surface_models 테이블 (지표면 모델) +``` +surface_models +├── id (INT, PK) — 지표면 모델 고유 번호 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── model_type (VARCHAR(50), NULL) — 모델 종류: dem_grid, tin, mesh_triangulated, contour_lines +├── source_file_id (INT, FK → input_files.id, NULL) — 원본 LAS 파일 +├── processed_cloud_id (INT, FK → processed_point_cloud.id, NULL) — 변환된 포인트클라우드 참조 +├── status (VARCHAR(50), NULL) — 상태: PROCESSING, COMPLETE, FAILED (기본값: PROCESSING) +├── crs_epsg (INT, NULL) — 좌표계 +├── resolution_m (FLOAT, NULL) — 해상도 (래스터인 경우) +├── model_file_path (VARCHAR(500), NULL) — 모델 저장 경로 (예: "storage/.../surface/dem.tif") +├── generation_params (LONGTEXT, NULL) — 생성 파라미터 (JSON) +├── created_at (TIMESTAMP) — 생성일 +├── completed_at (TIMESTAMP, NULL) — 완료 시간 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 4-3. terrain_layers 테이블 (지형 레이어) +``` +terrain_layers +├── id (INT, PK) — 레이어 고유 번호 +├── surface_model_id (INT, FK → surface_models.id) — 지표면 모델 참조 +├── layer_name (VARCHAR(100), NULL) — 레이어명 (예: "지표", "제1층", "제2층") +├── geometry_type (VARCHAR(50), NULL) — 기하 종류: POINTCLOUD, GRID, MESH, CONTOUR +├── layer_file_path (VARCHAR(500), NULL) — 레이어 파일 저장 경로 +├── file_format (VARCHAR(50), NULL) — 파일 형식: geojson, geotiff, ply, obj 등 +├── file_size_mb (FLOAT, NULL) — 파일 크기 +├── statistics (LONGTEXT, NULL) — 통계 (JSON) +├── created_at (TIMESTAMP) — 생성일 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +--- + +## 5. 경로 & 설계 그룹 + +### 5-1. routes 테이블 (경로 설계) +``` +routes +├── id (INT, PK) — 경로 고유 번호 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── surface_model_id (INT, FK → surface_models.id, NULL) — 기반 지표면 모델 +├── status (VARCHAR(50), NULL) — 상태: DRAFT, CONFIRMED, ARCHIVED (기본값: DRAFT) +├── start_chainage_m (FLOAT, NULL) — 시작점 측점 (m) +├── end_chainage_m (FLOAT, NULL) — 종료점 측점 (m) +├── total_length_m (FLOAT, NULL) — 총 연장 (m) +├── grade_percent (LONGTEXT, NULL) — 각 구간 종단 경사도 (JSON array) +├── constraints (LONGTEXT, NULL) — 설계 제약조건 (JSON) +├── algorithm_params (LONGTEXT, NULL) — 알고리즘 파라미터 (JSON) +├── route_data_path (VARCHAR(500), NULL) — 경로 데이터 저장 경로 (GeoJSON) +├── computed_at (TIMESTAMP, NULL) — 계산 완료 날짜 +├── created_at (TIMESTAMP) — 생성일 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +**참고:** 경로 좌표는 JSON 형식으로 `route_data_path` 파일에 저장됨 (GeoJSON LineString) + +### 5-2. route_points 테이블 (경로 샘플 포인트) +``` +route_points +├── id (INT, PK) — 포인트 고유 번호 +├── route_id (INT, FK → routes.id) — 경로 ID +├── chainage_m (FLOAT, NULL) — 측점 (m) +├── elevation_m (FLOAT, NULL) — 높이 +├── slope_percent (FLOAT, NULL) — 경사도 (%) +├── sequence_num (INT, NULL) — 순서번호 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 5-3. route_statistics 테이블 (경로 통계) +``` +route_statistics +├── id (INT, PK) — 통계 고유 번호 +├── route_id (INT, FK → routes.id) — 경로 ID +├── min_slope (FLOAT, NULL) — 최소 경사도 (%) +├── max_slope (FLOAT, NULL) — 최대 경사도 (%) +├── mean_slope (FLOAT, NULL) — 평균 경사도 (%) +├── cut_volume_m3 (FLOAT, NULL) — 절토량 (m³) +├── fill_volume_m3 (FLOAT, NULL) — 성토량 (m³) +├── tree_cutting_volume (FLOAT, NULL) — 목재 절감 추정량 +└── cost_score (FLOAT, NULL) — 알고리즘 점수 +``` + +--- + +## 6. 종단면 & 횡단면 그룹 + +### 6-1. longitudinal_sections 테이블 (종단면) +``` +longitudinal_sections +├── id (INT, PK) — 종단면 고유 번호 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── route_id (INT, FK → routes.id) — 경로 ID +├── status (VARCHAR(50), NULL) — 상태: DRAFT, CONFIRMED (기본값: DRAFT) +├── data (LONGTEXT, NULL) — 상세 데이터 (JSON) +│ ├── chainages (측점 배열, m) +│ ├── elevations (지표 표고 배열) +│ ├── grades (경사도 배열, %) +│ └── design_elevations (설계 표고 배열) +├── longitudinal_file_path (VARCHAR(500), NULL) — 저장 경로 (JSON) +├── computed_at (TIMESTAMP, NULL) — 계산 날짜 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 6-2. cross_sections 테이블 (횡단면) +``` +cross_sections +├── id (INT, PK) — 횡단면 고유 번호 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── route_id (INT, FK → routes.id) — 경로 ID +├── chainage_m (FLOAT, NULL) — 측점 (예: 0, 20, 40, ... m) +├── sequence_num (INT, NULL) — 횡단면 순번 (1, 2, ...) +├── status (VARCHAR(50), NULL) — 상태: DRAFT, CONFIRMED (기본값: DRAFT) +├── data (LONGTEXT, NULL) — 상세 데이터 (JSON) +│ ├── left_slope (좌측 사면 경사, %) +│ ├── right_slope (우측 사면 경사, %) +│ ├── width_m (노폭) +│ ├── cut_volume_m3 (절토량) +│ ├── fill_volume_m3 (성토량) +│ ├── structures (이 단면 내 구조물 ID 배열) +│ └── notes (메모) +├── cross_section_file_path (VARCHAR(500), NULL) — 저장 경로 (JSON) +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +--- + +## 7. 구조물 & 수량 그룹 + +### 7-1. structures 테이블 (구조물) +``` +structures +├── id (INT, PK) — 구조물 고유 번호 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── cross_section_id (INT, FK → cross_sections.id, NULL) — 횡단면 ID +├── structure_type (VARCHAR(100), NULL) — 종류: 낙석방지책, 돌붙임, 계간수로, 낙차공 등 +├── chainage_m (FLOAT, NULL) — 측점 (m) +├── location (VARCHAR(50), NULL) — 위치: LEFT, CENTER, RIGHT +├── length_m (FLOAT, NULL) — 길이 +├── width_m (FLOAT, NULL) — 폭 +├── height_m (FLOAT, NULL) — 높이 +├── material (VARCHAR(100), NULL) — 재료: 강재, 콘크리트, 목재, 돌 등 +├── quantity (INT, NULL) — 개수 +├── unit_price (FLOAT, NULL) — 단가 +├── design_notes (LONGTEXT, NULL) — 설계 노트 (JSON) +├── structure_data_path (VARCHAR(500), NULL) — 구조물 데이터 저장 경로 +├── last_modified_by (INT, FK → users.id, NULL) — 마지막 수정자 +├── created_at (TIMESTAMP) — 생성일 +├── updated_at (TIMESTAMP) — 수정일 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 7-2. quantity_items 테이블 (수량 항목) +``` +quantity_items +├── id (INT, PK) — 수량 항목 고유 번호 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── category (VARCHAR(100), NULL) — 대분류: 토공, 구조물, 포장, 배수, 녹화, 안전시설 +├── item_name (VARCHAR(255), NULL) — 항목명 (예: "절토 일반", "낙석방지책 설치") +├── unit (VARCHAR(50), NULL) — 단위: m3, 개, m, m2 +├── quantity_design (FLOAT, NULL) — 설계 수량 +├── quantity_actual (FLOAT, NULL) — 실제 수량 (사용자 수정 가능) +├── unit_price (FLOAT, NULL) — 단가 +├── total_price (FLOAT, NULL) — 소계 (quantity_actual × unit_price) +├── standard_reference (VARCHAR(255), NULL) — 기준 참고 자료 +├── quantity_data_path (VARCHAR(500), NULL) — 수량 데이터 저장 경로 +├── data (LONGTEXT, NULL) — 계산 과정 메모 (JSON) +│ ├── formula (계산식) +│ ├── source (데이터 출처) +│ └── ... +├── computed_at (TIMESTAMP, NULL) — 계산 날짜 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +--- + +## 8. 산출물 & 문서 그룹 + +### 8-1. outputs 테이블 (최종 산출물 세트) +``` +outputs +├── id (INT, PK) — 산출물 세트 고유 번호 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── output_type (VARCHAR(100), NULL) — 종류: estimation_excel, drawing_dxf, report_pdf, all_bundle +├── status (VARCHAR(50), NULL) — 상태: GENERATING, COMPLETE, FAILED (기본값: GENERATING) +├── generated_by (INT, FK → users.id, NULL) — 생성자 +├── generated_at (TIMESTAMP) — 생성 날짜 +├── version (INT, NULL) — 버전 (기본값: 1) +├── outputs_directory_path (VARCHAR(500), NULL) — 산출물 저장 폴더 (예: "storage/.../outputs/v1/") +├── metadata (LONGTEXT, NULL) — 메타데이터 (JSON) +│ ├── template_used (사용한 양식) +│ ├── company_name (회사명) +│ ├── project_name (프로젝트명) +│ ├── total_cost (총 비용) +│ └── generation_time_sec (생성 소요 시간) +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +### 8-2. output_files 테이블 (최종 산출 파일) +``` +output_files +├── id (INT, PK) — 파일 고유 번호 +├── output_id (INT, FK → outputs.id) — 산출물 ID +├── file_type (VARCHAR(50), NULL) — 파일 형식: xlsx, pdf, dxf, dwg, json, zip +├── original_filename (VARCHAR(255), NULL) — 파일명 (예: "견적서_v1.xlsx") +├── output_file_path (VARCHAR(500), NULL) — 저장 경로 (예: "storage/.../outputs/v1/견적서.xlsx") +├── file_size_mb (FLOAT, NULL) — 파일 크기 +├── download_count (INT, NULL) — 다운로드 횟수 (기본값: 0) +├── created_at (TIMESTAMP) — 생성 날짜 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +--- + +## 9. 변경 이력 & 감시 그룹 + +### 9-1. change_logs 테이블 (설계 변경 기록) +``` +change_logs +├── id (INT, PK) — 변경 고유 번호 +├── project_id (CHAR(36), FK → projects.id) — 프로젝트 ID +├── changed_by (INT, FK → users.id) — 변경자 +├── changed_at (TIMESTAMP) — 변경 날짜 +├── entity_type (VARCHAR(100)) — 대상 타입: routes, cross_sections, structures, quantity_items +├── entity_id (VARCHAR(50)) — 대상 ID +├── old_value (LONGTEXT, NULL) — 변경 전 값 (JSON) +├── new_value (LONGTEXT, NULL) — 변경 후 값 (JSON) +├── reason (TEXT, NULL) — 변경 사유 +└── deleted_at (TIMESTAMP, NULL) — 삭제일 (soft delete) +``` + +--- + +## 10. 테이블 관계도 + +``` +users (사용자) +├── id (PK) +├── email +├── password_hash +├── role (SYSTEM_ADMIN | ADMIN | USER) +├── is_master +├── status (생명주기) +├── company_id (FK) ──→ companies.id +├── last_login +└── auth_expires_at + +companies (회사) +├── id (PK) +├── name +├── status (ACTIVE | INACTIVE | SUSPENDED) +├── subscription_status (FREE | TRIAL | PAID | EXPIRED) +├── created_by (FK) ──→ users.id +└── created_at + +projects (프로젝트) +├── id (UUID, PK) +├── user_id (FK) ──→ users.id +├── company_id (FK) ──→ companies.id +├── name +├── status +├── crs_epsg +├── storage_path +└── created_at + ↓ + ├─→ input_files (입력 파일) + │ └─→ processed_point_cloud (변환된 포인트클라우드) + │ └─→ surface_models (지표면 모델) + │ └─→ terrain_layers (지형 레이어) + ├─→ routes (경로) + │ ├─→ route_points (경로 포인트) + │ ├─→ route_statistics (경로 통계) + │ ├─→ longitudinal_sections (종단면) + │ └─→ cross_sections (횡단면) + │ └─→ structures (구조물) + ├─→ quantity_items (수량 항목) + ├─→ outputs (산출물) + │ └─→ output_files (산출물 파일) + ├─→ project_versions (프로젝트 버전) + ├─→ project_automations (프로젝트 자동화) + ├─→ audit_logs (감시 로그) + └─→ change_logs (변경 로그) +``` + +--- + +## 11. 파일시스템 경로와 DB 링크 (워크플로우 기반 구조) + +### 파일시스템 구조 (6단계 워크플로우) + +``` +storage/ +├── {company_slug}/ +│ └── {user_slug}/ +│ └── {project_id}/ ← projects.storage_path +│ │ +│ ├── B03_FileInput/ ← WF0: 파일 입력 +│ │ └── input/ (원본 입력 파일들) +│ │ ├── las/ +│ │ │ └── cloud_merged.las ← input_files.raw_file_path +│ │ ├── tif/ +│ │ ├── tfw/ +│ │ ├── prj/ +│ │ └── dxf/ +│ │ +│ ├── B04_wf1_Surface/ ← WF1: 지표면 분석 +│ │ ├── processed/ (변환된 포인트클라우드) +│ │ │ ├── cloud_filtered.las ← processed_point_cloud.processed_file_path +│ │ │ └── cloud_sampled.ply ← processed_point_cloud.converted_file_path +│ │ └── models/ (지표면 모델 & 레이어) +│ │ ├── dem_2m.tif ← surface_models.model_file_path +│ │ ├── tin_mesh.obj +│ │ ├── layer_ground.geojson ← terrain_layers.layer_file_path +│ │ └── layer_1.geojson +│ │ +│ ├── B05_wf2_Route/ ← WF2: 경로 설계 +│ │ └── route/ +│ │ ├── route_main.geojson ← routes.route_data_path +│ │ ├── route_points.json +│ │ └── route_statistics.json +│ │ +│ ├── B06_wf3_ProfileCross/ ← WF3: 종횡단 생성 +│ │ ├── longitudinal/ +│ │ │ └── longitudinal.json ← longitudinal_sections.longitudinal_file_path +│ │ └── cross_sections/ +│ │ ├── cross_0000m.json ← cross_sections.cross_section_file_path +│ │ ├── cross_0020m.json +│ │ └── ... +│ │ +│ ├── B07_wf4_DesignDetail/ ← WF4: 상세 설계 +│ │ └── structures/ +│ │ ├── struct_0020m_001.json ← structures.structure_data_path +│ │ └── ... +│ │ +│ ├── B08_wf5_Quantity/ ← WF5: 수량 산출 +│ │ ├── quantities/ +│ │ │ └── items.json ← quantity_items.quantity_data_path +│ │ └── ... +│ │ +│ └── B09_wf6_Estimation/ ← WF6: 견적·문서 +│ ├── v1/ ← outputs.outputs_directory_path +│ │ ├── 견적서.xlsx ← output_files.output_file_path +│ │ ├── 설계도.dxf +│ │ └── ... +│ └── v2/ +│ └── ... +``` + +**핵심 개념:** +- **B03~B09**: 워크플로우 6단계와 1:1 대응 +- **각 단계의 입력/출력**: 명확히 분리 +- **버전 관리**: B09 단계에서만 (v1, v2, ...) + +--- + +## 12. 핵심 쿼리 예제 + +### 예제 1: 사용자의 모든 프로젝트 조회 +```sql +SELECT p.id, p.name, p.status, p.created_at +FROM projects p +WHERE p.user_id = :user_id AND p.deleted_at IS NULL +ORDER BY p.created_at DESC; +``` + +### 예제 2: 프로젝트의 최신 경로 조회 +```sql +SELECT r.id, r.total_length_m, r.status +FROM routes r +WHERE r.project_id = :project_id AND r.deleted_at IS NULL +ORDER BY r.computed_at DESC +LIMIT 1; +``` + +### 예제 3: 경로의 모든 횡단면 조회 +```sql +SELECT cs.id, cs.chainage_m, cs.data +FROM cross_sections cs +WHERE cs.route_id = :route_id AND cs.deleted_at IS NULL +ORDER BY cs.chainage_m; +``` + +### 예제 4: 프로젝트 총 비용 계산 +```sql +SELECT + SUM(quantity_actual * unit_price) as total_cost, + category +FROM quantity_items +WHERE project_id = :project_id AND deleted_at IS NULL +GROUP BY category; +``` + +### 예제 5: 사용자의 감시 로그 (최근 30일) +```sql +SELECT action, entity_type, timestamp +FROM audit_logs +WHERE user_id = :user_id AND timestamp > DATE_SUB(NOW(), INTERVAL 30 DAY) +ORDER BY timestamp DESC; +``` + +--- + +## 13. 데이터 타입 가이드 + +| 타입 | 설명 | 예제 | +|------|------|------| +| INT | 정수 | 1, 2, 100 | +| FLOAT | 실수 | 1.5, 2.25, 100.75 | +| VARCHAR(n) | 문자열 (고정 길이) | "project_name" | +| TEXT / LONGTEXT | 문자열 (가변, 대용량) | 설명문, JSON 데이터 | +| TIMESTAMP | 날짜 + 시간 (자동 업데이트) | 2025-07-05 15:30:00 | +| DATETIME | 날짜 + 시간 (수동) | 2025-07-05 15:30:00 | +| TINYINT(1) | 참/거짓 (0 또는 1) | 0, 1 | +| ENUM | 열거형 | ACTIVE, INACTIVE | +| CHAR(36) | UUID (고정 36자) | 550e8400-e29b-41d4-a716-446655440000 | + +--- + +## 14. 총 테이블 수 및 분류 + +### 34개 테이블 분류 + +**1. 사용자/회사/조직 (14개)** +- users, companies, join_requests (향후), email_otps, sessions, trusted_devices, user_consents +- login_logs, activity_logs, audit_logs, system_audit_logs, system_resources, support_requests + +**2. 프로젝트 관리 (3개)** +- projects, project_versions, project_automations + +**3. 파일/업로드 (3개)** +- upload_sessions, upload_chunks, input_files + +**4. 지표면 분석 (3개)** +- processed_point_cloud, surface_models, terrain_layers + +**5. 경로 설계 (3개)** +- routes, route_points, route_statistics + +**6. 종횡단 설계 (2개)** +- longitudinal_sections, cross_sections + +**7. 구조물/수량 (2개)** +- structures, quantity_items + +**8. 산출물 (2개)** +- outputs, output_files + +**9. 변경/이력 (1개)** +- change_logs + +--- + +## 15. DB vs 파일시스템 역할 분리 + +| 저장 위치 | 내용 | 예시 | +|----------|------|------| +| **DB (MariaDB)** | 메타데이터 + 경로정보 + 상태 | 파일명, 크기, 좌표계, 상태, 저장경로, 통계 | +| **파일시스템** | 실제 파일 데이터 | LAS, PLY, TIF, DXF, Excel, PDF, JSON 파일들 | + +**설계 원칙:** +- DB에는 "어디에 무엇이 있는가"의 메타정보만 저장 +- 실제 대용량 파일은 파일시스템에 저장 +- 각 워크플로우 단계의 입력/출력 경로를 DB에 기록 +- JSON 형식으로 좌표 및 복잡한 데이터 구조를 저장 + +--- + +## 16. 마이그레이션 상태 + +### ✅ 완료됨 +- [x] 33개 테이블 생성 (MariaDB) +- [x] 관계(FK) 설정 +- [x] Soft delete (deleted_at) 지원 +- [x] 인덱스 추가 (주요 조회 경로) + +### 📋 진행 중 +- [ ] API 라우터에서 파일 경로 저장 로직 추가 + - B03 파일 업로드 → `input_files.raw_file_path` 저장 + - B04 WF1 실행 → `surface_models.model_file_path`, `terrain_layers.layer_file_path` 저장 + - B05 WF2 실행 → `routes.route_data_path` 저장 + - B06 WF3 실행 → `longitudinal_sections.longitudinal_file_path`, `cross_sections.cross_section_file_path` 저장 + - B07 WF4 실행 → `structures.structure_data_path` 저장 + - B08 WF5 실행 → `quantity_items.quantity_data_path` 저장 + - B09 WF6 실행 → `outputs.outputs_directory_path`, `output_files.output_file_path` 저장 + +### 🔮 향후 계획 +- [ ] Python Pydantic 모델 정의 (ORM 대신) +- [ ] API 엔드포인트 보안 감시 강화 +- [ ] 실시간 알림 시스템 (WebSocket) diff --git a/docs/raw/guidelines/design.md b/docs/raw/guidelines/design.md new file mode 100644 index 0000000..eaad144 --- /dev/null +++ b/docs/raw/guidelines/design.md @@ -0,0 +1,445 @@ +# Wiza — Style Reference +> Twilight prospecting observatory bathed in lavender mist + +**Theme:** light + +Wiza operates in a light-mode universe where deep violet ink commands attention against a soft lavender atmosphere. The brand lives between a confident enterprise tool and an approachable consumer product—white surfaces, thin borders, and compact Inter type for dense data interfaces, paired with Britti Sans display headlines that feel geometric and assured. The signature move is the gradient wash: pale lavender backgrounds bleeding white-to-violet-to-peach, making even a sprawling data table feel sunlit. Purple is reserved for authority—headlines, logo, filled actions—while the rest of the UI stays in quiet neutrals, letting contact data breathe. + +## Tokens — Colors + +| Name | Value | Token | Role | +|------|-------|-------|------| +| Deep Iris | `#26114a` | `--color-deep-iris` | Violet supporting accent for decorative details and low-frequency emphasis. Do not promote it to the primary CTA color | +| Plum Velvet | `#312749` | `--color-plum-velvet` | Navigation text, secondary headings, card titles, footer copy — slightly lighter companion to Deep Iris | +| Royal Amethyst | `#3e0079` | `--color-royal-amethyst` | Links, input focus rings, accent strokes, icon highlights — the most saturated violet | +| Mist Violet | `#edecff` | `--color-mist-violet` | Soft highlight washes, tinted section backgrounds, decorative blurs — the lavender atmosphere | +| Lavender Wash | `linear-gradient(90deg, rgb(185, 154, 255), rgb(125, 67, 255) 10%, rgba(125, 67, 255, 0))` | `--color-lavender-wash` | Decorative gradient stops and hero atmosphere | +| Twilight Beam | `linear-gradient(to right, rgb(207, 138, 255), rgb(255, 102, 193), rgb(255, 173, 116), rgb(170, 129, 255))` | `--color-twilight-beam` | Multi-stop decorative gradient for hero glow effects | +| Canvas | `#ffffff` | `--color-canvas` | Page background, card surfaces, input fields, button text on dark fills | +| Paper | `#f6f7fa` | `--color-paper` | Subtle surface lift, table row alternation, secondary card backgrounds | +| Mist | `#e6e2e3` | `--color-mist` | Hairline borders, dividers, subtle separators | +| Smoke | `#c1c7cf` | `--color-smoke` | Disabled states, skeleton placeholders, muted background blocks | +| Ash | `#9491a1` | `--color-ash` | Muted helper text, placeholder copy, secondary metadata | +| Slate | `#615e6e` | `--color-slate` | Secondary body text, descriptions, table metadata | +| Charcoal | `#333333` | `--color-charcoal` | Body text, link text, icon strokes in neutral contexts | +| Carbon | `#222222` | `--color-carbon` | Dark UI elements, near-black accents | +| Ink | `#000000` | `--color-ink` | Maximum contrast text and borders in specific dark UI elements | + +## Tokens — Typography + +### Britti Sans — Display and heading typeface used exclusively at 24–64px, always weight 500. The 1.0 line-height is distinctive — headings sit tight with no leading slack, creating geometric, almost architectural presence. Substitute with Plus Jakarta Sans (500) or General Sans (500) for closest geometric match. · `--font-britti-sans` +- **Substitute:** Plus Jakarta Sans +- **Weights:** 500 +- **Sizes:** 24px, 32px, 40px, 56px, 64px +- **Line height:** 1.00 +- **Role:** Display and heading typeface used exclusively at 24–64px, always weight 500. The 1.0 line-height is distinctive — headings sit tight with no leading slack, creating geometric, almost architectural presence. Substitute with Plus Jakarta Sans (500) or General Sans (500) for closest geometric match. + +### Inter — Workhorse UI and body typeface. Weight 400 for body, 500 for buttons/nav/table headers, 700 for emphasized labels. The tight size range (12–16px) and compact line-heights signal a data-dense product, not a marketing site. Substitute with Inter directly or IBM Plex Sans. · `--font-inter` +- **Substitute:** Inter +- **Weights:** 400, 500, 700 +- **Sizes:** 12px, 14px, 16px +- **Line height:** 1.30–1.50 +- **Role:** Workhorse UI and body typeface. Weight 400 for body, 500 for buttons/nav/table headers, 700 for emphasized labels. The tight size range (12–16px) and compact line-heights signal a data-dense product, not a marketing site. Substitute with Inter directly or IBM Plex Sans. + +### Type Scale + +| Role | Size | Line Height | Letter Spacing | Token | +|------|------|-------------|----------------|-------| +| caption | 12px | 1.3 | — | `--text-caption` | +| body-sm | 14px | 1.4 | — | `--text-body-sm` | +| body | 16px | 1.5 | — | `--text-body` | +| subheading | 24px | 1 | — | `--text-subheading` | +| heading-sm | 32px | 1 | — | `--text-heading-sm` | +| heading | 40px | 1 | — | `--text-heading` | +| heading-lg | 56px | 1 | — | `--text-heading-lg` | +| display | 64px | 1 | — | `--text-display` | + +## Tokens — Spacing & Shapes + +**Base unit:** 8px + +**Density:** compact + +### Spacing Scale + +| Name | Value | Token | +|------|-------|-------| +| 8 | 8px | `--spacing-8` | +| 16 | 16px | `--spacing-16` | +| 24 | 24px | `--spacing-24` | +| 32 | 32px | `--spacing-32` | +| 40 | 40px | `--spacing-40` | +| 48 | 48px | `--spacing-48` | +| 56 | 56px | `--spacing-56` | +| 64 | 64px | `--spacing-64` | +| 96 | 96px | `--spacing-96` | +| 104 | 104px | `--spacing-104` | +| 216 | 216px | `--spacing-216` | + +### Border Radius + +| Element | Value | +|---------|-------| +| cards | 8px | +| icons | 8px | +| large | 24px | +| pills | 1440px | +| inputs | 8px | +| buttons | 8px | + +### Shadows + +| Name | Value | Token | +|------|-------|-------| +| sm | `rgba(18, 55, 105, 0.08) 0px 2px 4px 0px, rgba(18, 55, 105...` | `--shadow-sm` | +| lg | `rgba(14, 59, 101, 0.06) 0px 32px 24px -12px, rgba(14, 59,...` | `--shadow-lg` | +| lg-2 | `rgba(114, 49, 255, 0.32) 0px -6px 20px 0px inset, rgba(47...` | `--shadow-lg-2` | +| sm-2 | `rgba(18, 55, 105, 0.08) 0px 2px 4px 0px, rgba(18, 55, 105...` | `--shadow-sm-2` | +| sm-3 | `rgba(47, 1, 151, 0.01) 0px 11px 4px 0px, rgba(47, 1, 151,...` | `--shadow-sm-3` | + +### Layout + +- **Page max-width:** 1200px +- **Section gap:** 64-80px +- **Card padding:** 16-24px +- **Element gap:** 8px + +## Components + +### Filled Brand Button +**Role:** Primary action trigger in hero and CTA blocks + +Background #26114a, text #ffffff, 8px radius, 16px vertical / 24px horizontal padding, Inter 500 at 16px. Carries the brand weight — only used for the most important conversion per screen. + +### Ghost Outlined Button +**Role:** Secondary action paired beside a filled button + +Background transparent, border 1px #26114a, text #26114a, 8px radius, 16px/24px padding, Inter 500 at 16px. Matches the filled button's exact dimensions for optical pairing. + +### Pill Navigation Button +**Role:** Top-level nav items in the floating header + +1440px radius, 8px/16px padding, Inter 500 at 14px, text #312749. Active state may use #edecff background. The full-pill shape is distinctive — not rounded rectangles, but true capsules. + +### Logo Lockup +**Role:** Brand identity in header and footer + +Purple triangular icon mark paired with 'wiza' wordmark in Britti Sans 500 or Inter 700. Icon uses a gradient from #b99aff to #7d43ff. Appears in a white pill container with 8px radius and subtle shadow. + +### Product Screenshot Frame +**Role:** Hero product demonstration and feature illustrations + +White surface with 8px radius, surrounded by the deep layered shadow stack (rgba(14,59,101,0.06) large blur). Floats over the lavender gradient background, creating depth without borders. + +### Data Table Row +**Role:** Contact/prospect list display in product mockups + +Alternating #ffffff and #f6f7fa backgrounds, 1px #e6e2e3 bottom border, 12px/16px cell padding, Inter 400 at 14px for data, Inter 500 for headers. Dense, compact rows with colored status dots. + +### Logo Cloud Bar +**Role:** Social proof — client brand logos + +Monochrome (Charcoal #333333) logo strip on white background, centered, with consistent 40–60px height per logo. No colorful logos — all desaturated for visual calm. + +### Rating Badge Pair +**Role:** Third-party validation scores (G2, Chrome Web Store) + +White pill cards (1440px radius), Inter 500 at 14px for score, 12px for platform name. Star icon in #3e0079 or #f5b800. Displayed in a centered pair with 24px gap. + +### Section Heading Block +**Role:** Intro text for content sections + +Optional pill tag above (Mist Violet #edecff background, Royal Amethyst #3e0079 text, 1440px radius, Inter 500 12px, 4px/12px padding). Main heading in Britti Sans 500 at 40–56px, Deep Iris #26114a. Subtext in Inter 400 at 16–18px, Slate #615e6e. + +### Profile Card (Magic Wand Feature) +**Role:** Contact preview cards in feature illustrations + +White surface, 8px radius, subtle border, 12px/16px padding. Contains circular avatar (32px), name in Inter 500 14px #26114a, title in Inter 400 12px #615e6, company in Inter 400 12px #9491a1. Arranged in 3-column grid with 16px gaps. + +### Floating Navigation Bar +**Role:** Sticky header container + +White background with 8px radius, floats over hero with the layered shadow. Contains logo, nav links (Pill Navigation Button style), and login/signup actions. Max-width contained with side padding. + +### Tag/Badge (Pill) +**Role:** Feature labels, job titles, status indicators + +1440px radius, 4px/12px padding, Inter 500 at 12px. Variants: #edecff bg with #3e0079 text (accent tags), #f6f7fa bg with #615e6 text (neutral tags), or status-specific colors. + +### Input Field +**Role:** Search and form inputs in product UI + +1px #e6e2e3 border, 8px radius, 10px/14px padding, Inter 400 at 14px, placeholder in Ash #9491a1. Focus state uses 2px Royal Amethyst #3e0079 border ring. + +### Feature Icon Tile +**Role:** Small decorative icon containers in section intros + +16px or 24px square tiles with 8px radius, Mist Violet #edecff background, purple stroke icon inside. Used sparingly to mark section types. + +## Do's and Don'ts + +### Do +- Use 8px radius for all rectangular UI surfaces — cards, buttons, inputs, icon containers. The 8px is the signature, not 4px or 12px. +- Use 1440px radius exclusively for pills, tags, and capsule-shaped nav items — never for cards or panels. +- Set Britti Sans headings to line-height 1.0 exactly. The tight leading is what makes the type feel architectural. +- Use Deep Iris #26114a for headlines and filled button backgrounds. Never use it for body text larger than 24px — it overwhelms at small sizes. +- Pair every filled button with an adjacent ghost button of identical dimensions for the hero CTA pattern. +- Anchor section intros with a small pill tag above the heading in Mist Violet + Royal Amethyst. +- Use the Lavender Wash gradient on hero and feature section backgrounds — it defines the atmosphere. +- Keep Inter at 12–16px for all UI text. The compact size range signals a data-dense product. + +### Don't +- Do not use Royal Amethyst #3e0079 for body text — it vibrates uncomfortably at small sizes; reserve it for links, icons, and accent strokes. +- Do not apply 4px or 12px radius to cards — the 8px is non-negotiable for visual consistency. +- Do not use line-height above 1.0 for Britti Sans headings — the tightness is the point. +- Do not introduce new chromatic colors outside the violet family — the palette is deliberately monochromatic-violet. +- Do not use heavy drop shadows. The blue-tinted shadows are subtle (max 32px blur at 6% opacity). +- Do not center body text in multi-line paragraphs — only headlines and short intros get center alignment. +- Do not place dark text directly on the lavender gradient — use a white surface card between them for legibility. +- Do not use rounded images or photos in feature illustrations — the design is iconographic, not photographic. + +## Surfaces + +| Level | Name | Value | Purpose | +|-------|------|-------|---------| +| 0 | Canvas | `#ffffff` | Page background, outermost layer | +| 1 | Paper | `#f6f7fa` | Card surfaces, table containers, subtle lifts | +| 2 | Mist Violet | `#edecff` | Tinted highlight sections, gradient start point | +| 3 | Lavender Glow | `#b99aff` | Hero gradient stops, atmospheric overlays | + +## Elevation + +- **Cards and elevated panels:** `rgba(14, 59, 101, 0.06) 0px 32px 24px -12px, rgba(14, 59, 101, 0.01) 0px 11px 4px 0px, rgba(14, 59, 101, 0.02) 0px 6px 4px 0px, rgba(14, 59, 101, 0.03) 0px 3px 3px 0px, rgba(14, 59, 101, 0.04) 0px 1px 1px 0px` +- **Buttons and nav items:** `rgba(18, 55, 105, 0.08) 0px 2px 4px 0px, rgba(18, 55, 105, 0.04) 0px 1px 1px 0px, rgba(18, 55, 105, 0.08) 0px 0px 0px 1px` +- **Product feature highlights:** `rgba(114, 49, 255, 0.32) 0px -6px 20px 0px inset, rgba(47, 1, 151, 0.12) 0px 11px 12px 0px, rgba(47, 1, 151, 0.12) 0px 3px 3px 0px, rgba(47, 1, 151, 0.12) 0px 1px 1px 0px, rgba(47, 1, 151, 0.08) 0px 0px 0px 1px` + +## Imagery + +The visual language is almost entirely product-screenshot and iconographic — no lifestyle photography, no stock imagery, no people in context. Product mockups show a contact-prospecting data table with purple status indicators, person avatars, and company logos. Decorative visuals use soft purple gradient washes with floating profile cards arranged in grid patterns. Icons are simple, single-stroke, geometric shapes (a triangle logo, outlined feature icons). Logos in the trust bar are desaturated to monochrome. The overall feel is that of a polished SaaS dashboard screenshot rather than a marketing site with imagery. + +## Layout + +Centered, max-width 1200px container with generous vertical breathing room (64–80px section gaps). The hero is a full-bleed lavender-to-white gradient with a centered headline stack and dual CTA buttons, followed by a floating product screenshot that breaks the container edge slightly. Below the fold, content alternates between white surface sections and light lavender tinted sections. The logo cloud is a single centered row. Feature sections use centered heading blocks followed by 2-column or 3-column card grids. A sticky floating navigation bar (pill-shaped, centered) sits over the hero. + +## Agent Prompt Guide + +primary action: no distinct CTA color +**Quick Color Reference** +- text (primary): #26114a +- text (secondary): #615e6e +- text (muted): #9491a1 +- background: #ffffff +- surface: #f6f7fa +- border: #e6e2e3 +- brand/accent: #3e0079 +- filled button background: #26114a + +**Example Component Prompts** + +1. **Hero Section**: White-to-lavender gradient background (linear-gradient from #ffffff to #edecff). Centered headline 'Find verified emails and phone numbers' in Britti Sans weight 500 at 56px, color #26114a, line-height 1.0. Subtext in Inter 400 at 18px, color #615e6e. Two buttons side by side: filled button (background #26114a, text #ffffff, 8px radius, 16px/24px padding, Inter 500 16px) and ghost button (border 1px #26114a, text #26114a, same dimensions). Below: a product screenshot framed in a white card with 8px radius and the deep blue-tinted shadow. + +2. **Data Table Card**: White surface card, 8px radius, 1px #e6e2e3 border, 16px/24px padding. Table header row in Inter 500 at 12px, color #615e6e, uppercase, with 1px #e6e2e3 bottom border. Data rows alternate #ffffff and #f6f7fa backgrounds, Inter 400 at 14px, color #26114a. Action buttons in each row: small pill tags with 1440px radius, #edecff background, #3e0079 text, Inter 500 at 12px. + +3. **Section Heading with Pill Tag**: Optional pill tag above heading: 1440px radius, #edecff background, #3e0079 text, Inter 500 at 12px, 4px/12px padding. Main heading in Britti Sans 500 at 40px, #26114a, line-height 1.0. Subtext in Inter 400 at 16px, #615e6e. All centered. + +4. **Profile Preview Card**: White surface, 8px radius, 1px #e6e2e3 border, 12px/16px padding. 32px circular avatar at top-left. Name in Inter 500 at 14px, #26114a. Title in Inter 400 at 12px, #615e6e. Company in Inter 400 at 12px, #9491a1. Arranged in 3-column grid with 16px gaps, centered in section. + +5. **Trust Logo Bar**: Single horizontal row of 6 client logos, all rendered in monochrome #333333, centered, each logo 40–50px height. White background, 64px vertical padding above and below. Below: two rating badge pills (1440px radius, white bg, subtle border) with star icon and score in Inter 500 14px, platform name in Inter 400 12px #615e6e. + +## Gradient System + +The lavender atmosphere is built from three gradient layers: +- **Hero wash**: linear-gradient(90deg, #b99aff, #7d43ff 10%, transparent) — fades right, creating a directional glow +- **Decorative multi-stop**: linear-gradient(to right, #cf8aff, #ff66c1, #ffad74, #ff63d1, #aa81ff) — used sparingly for special highlights +- **Section tint**: subtle white-to-#edecff vertical fade for alternating content sections +Gradients should always sit behind white content surfaces — never behind text directly. + +## Similar Brands + +- **Apollo.io** — Same deep-violet brand color, similar data-prospecting product, and comparable lavender gradient hero treatment +- **Lusha** — Shared violet/indigo palette, compact data table UI, and light-mode product-first layout +- **Clearbit** — Similar light-mode SaaS with subtle gradient backgrounds and confident sans-serif display type +- **ZoomInfo** — Enterprise data product with dense tabular UI, compact Inter type, and restrained brand color usage +- **Cognism** — Purple-tinted brand identity with soft gradient hero sections and data-table product showcases + +## Quick Start + +### CSS Custom Properties + +```css +:root { + /* Colors */ + --color-deep-iris: #26114a; + --color-plum-velvet: #312749; + --color-royal-amethyst: #3e0079; + --color-mist-violet: #edecff; + --color-lavender-wash: #b99aff; + --gradient-lavender-wash: linear-gradient(90deg, rgb(185, 154, 255), rgb(125, 67, 255) 10%, rgba(125, 67, 255, 0)); + --color-twilight-beam: #cf8aff; + --gradient-twilight-beam: linear-gradient(to right, rgb(207, 138, 255), rgb(255, 102, 193), rgb(255, 173, 116), rgb(170, 129, 255)); + --color-canvas: #ffffff; + --color-paper: #f6f7fa; + --color-mist: #e6e2e3; + --color-smoke: #c1c7cf; + --color-ash: #9491a1; + --color-slate: #615e6e; + --color-charcoal: #333333; + --color-carbon: #222222; + --color-ink: #000000; + + /* Typography — Font Families */ + --font-britti-sans: 'Britti Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + --font-inter: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + + /* Typography — Scale */ + --text-caption: 12px; + --leading-caption: 1.3; + --text-body-sm: 14px; + --leading-body-sm: 1.4; + --text-body: 16px; + --leading-body: 1.5; + --text-subheading: 24px; + --leading-subheading: 1; + --text-heading-sm: 32px; + --leading-heading-sm: 1; + --text-heading: 40px; + --leading-heading: 1; + --text-heading-lg: 56px; + --leading-heading-lg: 1; + --text-display: 64px; + --leading-display: 1; + + /* Typography — Weights */ + --font-weight-regular: 400; + --font-weight-medium: 500; + --font-weight-bold: 700; + + /* Spacing */ + --spacing-unit: 8px; + --spacing-8: 8px; + --spacing-16: 16px; + --spacing-24: 24px; + --spacing-32: 32px; + --spacing-40: 40px; + --spacing-48: 48px; + --spacing-56: 56px; + --spacing-64: 64px; + --spacing-96: 96px; + --spacing-104: 104px; + --spacing-216: 216px; + + /* Layout */ + --page-max-width: 1200px; + --section-gap: 64-80px; + --card-padding: 16-24px; + --element-gap: 8px; + + /* Border Radius */ + --radius-sm: 2px; + --radius-lg: 8px; + --radius-xl: 12px; + --radius-2xl: 16px; + --radius-3xl: 24px; + --radius-3xl-2: 28px; + --radius-3xl-3: 40px; + --radius-full: 56px; + --radius-full-2: 1440px; + + /* Named Radii */ + --radius-cards: 8px; + --radius-icons: 8px; + --radius-large: 24px; + --radius-pills: 1440px; + --radius-inputs: 8px; + --radius-buttons: 8px; + + /* Shadows */ + --shadow-sm: rgba(18, 55, 105, 0.08) 0px 2px 4px 0px, rgba(18, 55, 105, 0.04) 0px 1px 1px 0px, rgba(18, 55, 105, 0.08) 0px 0px 0px 1px; + --shadow-lg: rgba(14, 59, 101, 0.06) 0px 32px 24px -12px, rgba(14, 59, 101, 0.01) 0px 11px 4px 0px, rgba(14, 59, 101, 0.02) 0px 6px 4px 0px, rgba(14, 59, 101, 0.03) 0px 3px 3px 0px, rgba(14, 59, 101, 0.04) 0px 1px 1px 0px; + --shadow-lg-2: rgba(114, 49, 255, 0.32) 0px -6px 20px 0px inset, rgba(47, 1, 151, 0.12) 0px 11px 12px 0px, rgba(47, 1, 151, 0.12) 0px 3px 3px 0px, rgba(47, 1, 151, 0.12) 0px 1px 1px 0px, rgba(47, 1, 151, 0.08) 0px 0px 0px 1px; + --shadow-sm-2: rgba(18, 55, 105, 0.08) 0px 2px 4px 0px, rgba(18, 55, 105, 0.04) 0px 1px 1px 0px; + --shadow-sm-3: rgba(47, 1, 151, 0.01) 0px 11px 4px 0px, rgba(47, 1, 151, 0.04) 0px 6px 4px 0px, rgba(47, 1, 151, 0.06) 0px 3px 3px 0px, rgba(47, 1, 151, 0.08) 0px 1px 1px 0px, rgba(47, 1, 151, 0.08) 0px 0px 0px 1px; + + /* Surfaces */ + --surface-canvas: #ffffff; + --surface-paper: #f6f7fa; + --surface-mist-violet: #edecff; + --surface-lavender-glow: #b99aff; +} +``` + +### Tailwind v4 + +```css +@theme { + /* Colors */ + --color-deep-iris: #26114a; + --color-plum-velvet: #312749; + --color-royal-amethyst: #3e0079; + --color-mist-violet: #edecff; + --color-lavender-wash: #b99aff; + --color-twilight-beam: #cf8aff; + --color-canvas: #ffffff; + --color-paper: #f6f7fa; + --color-mist: #e6e2e3; + --color-smoke: #c1c7cf; + --color-ash: #9491a1; + --color-slate: #615e6e; + --color-charcoal: #333333; + --color-carbon: #222222; + --color-ink: #000000; + + /* Typography */ + --font-britti-sans: 'Britti Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + --font-inter: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + + /* Typography — Scale */ + --text-caption: 12px; + --leading-caption: 1.3; + --text-body-sm: 14px; + --leading-body-sm: 1.4; + --text-body: 16px; + --leading-body: 1.5; + --text-subheading: 24px; + --leading-subheading: 1; + --text-heading-sm: 32px; + --leading-heading-sm: 1; + --text-heading: 40px; + --leading-heading: 1; + --text-heading-lg: 56px; + --leading-heading-lg: 1; + --text-display: 64px; + --leading-display: 1; + + /* Spacing */ + --spacing-8: 8px; + --spacing-16: 16px; + --spacing-24: 24px; + --spacing-32: 32px; + --spacing-40: 40px; + --spacing-48: 48px; + --spacing-56: 56px; + --spacing-64: 64px; + --spacing-96: 96px; + --spacing-104: 104px; + --spacing-216: 216px; + + /* Border Radius */ + --radius-sm: 2px; + --radius-lg: 8px; + --radius-xl: 12px; + --radius-2xl: 16px; + --radius-3xl: 24px; + --radius-3xl-2: 28px; + --radius-3xl-3: 40px; + --radius-full: 56px; + --radius-full-2: 1440px; + + /* Shadows */ + --shadow-sm: rgba(18, 55, 105, 0.08) 0px 2px 4px 0px, rgba(18, 55, 105, 0.04) 0px 1px 1px 0px, rgba(18, 55, 105, 0.08) 0px 0px 0px 1px; + --shadow-lg: rgba(14, 59, 101, 0.06) 0px 32px 24px -12px, rgba(14, 59, 101, 0.01) 0px 11px 4px 0px, rgba(14, 59, 101, 0.02) 0px 6px 4px 0px, rgba(14, 59, 101, 0.03) 0px 3px 3px 0px, rgba(14, 59, 101, 0.04) 0px 1px 1px 0px; + --shadow-lg-2: rgba(114, 49, 255, 0.32) 0px -6px 20px 0px inset, rgba(47, 1, 151, 0.12) 0px 11px 12px 0px, rgba(47, 1, 151, 0.12) 0px 3px 3px 0px, rgba(47, 1, 151, 0.12) 0px 1px 1px 0px, rgba(47, 1, 151, 0.08) 0px 0px 0px 1px; + --shadow-sm-2: rgba(18, 55, 105, 0.08) 0px 2px 4px 0px, rgba(18, 55, 105, 0.04) 0px 1px 1px 0px; + --shadow-sm-3: rgba(47, 1, 151, 0.01) 0px 11px 4px 0px, rgba(47, 1, 151, 0.04) 0px 6px 4px 0px, rgba(47, 1, 151, 0.06) 0px 3px 3px 0px, rgba(47, 1, 151, 0.08) 0px 1px 1px 0px, rgba(47, 1, 151, 0.08) 0px 0px 0px 1px; +} +``` diff --git a/docs/raw/guidelines/frontend.md b/docs/raw/guidelines/frontend.md new file mode 100644 index 0000000..c854565 --- /dev/null +++ b/docs/raw/guidelines/frontend.md @@ -0,0 +1,120 @@ +# 인터페이스 및 UI 제어 명세서 (frontend.md) + +## 1. 글로벌 테마 변수 강제 (Theme Constraints) +* **임의 색상 지정 금지:** 하드코딩된 Hex 코드 직접 입력 금지. +* **CSS 변수 필수 참조:** 테마 전환(라이트/다크) 및 일관성을 위해 `ui_template_theme.css` 선언 변수(`var(--color-bg)`, `var(--color-text)` 등)만 사용. +* **신규 컴포넌트/템플릿:** 신규 컴포넌트나 템플릿이 필요한 경우`.agent\design.md` 파일을 참고하여 양식을 `ui_template\ui_template_elements.ts`, `ui_template\ui_template_locale.ts`, `ui_template\ui_template_theme.css` 양식화하여 사용할 것 + +## 2. UI 요소 및 레이아웃 제약 (Layout Constraints) +* **공통 컴포넌트 최우선:** 임의 스타일링 금지. `ui_template_elements.ts` 규격 및 공통 컴포넌트 최우선 상속/참조. +* **3단 기본 레이아웃 준수:** 워크플로우 페이지 기본 배치 강제 (예외 요청 제외) + 1. 상단 영역: 페이지 타이틀 및 현재 진행 단계 상태 + 2. 좌측 패널: 데이터 입력 폼 및 설정 제어 영역 (너비 고정) + 3. 우측 영역: WebCAD 도면 뷰어 또는 결과 데이터 그리드 (나머지 전체 너비) + +### 2.1 공통 컴포넌트 목록 (`ui_template_elements.ts`) +* **기본:** `createButton`, `createInputField`, `createCard`, `createTag`, `createWorkflowShell` +* **오버레이/알림:** `showLoadingOverlay`, `hideLoadingOverlay`, `showToast` +* **스플라인 차트:** `createLineChart(opts)` — 외부 라이브러리 없이 인라인 SVG로 시계열 렌더링 + - **곡선:** Catmull-Rom → 3차 베지어 변환으로 스플라인(부드러운 곡선) 렌더 + - **색상:** `--color-chart-0~3` 테마 변수 사용 (하드코딩 금지) + - **범례:** 그래프 영역 우상단에 반투명 오버레이 배치 (`opts.series[].name`) + - **X축:** `opts.xLabels` 전달 시 양끝 포함 5개 라벨 균등 표기 + - **결측:** `series[].values`에 `null` 포함 시 해당 구간 선 끊김 처리 + - 데이터 2점 미만이면 빈 상태(`—`) 반환 + - 사용 예: B01_Dashboard 리소스 현황(CPU/메모리/디스크 30일 추이, X축=시간) + +--- + +## 3. 인덱스 기반 다국어 제어 (i18n Constraints) +* **텍스트 하드코딩 금지:** 라벨, 버튼 문구, 안내 메시지 등 모든 UI 문자열의 컴포넌트 내 직접 입력 절대 금지. +* **🚨 동시 수정 프로토콜 (선언 후 구현):** + 1. **선(先) 등록:** 신규 문구 필요 시, `ui_template_locale.ts` 최하단에 키와 언어 배열 `[한국어, 영어]` 우선 추가. + 2. **후(後) 참조:** 컴포넌트 내 `ui_locales.키값[현재언어인덱스]` 형태로만 호출. + * *제약 조건:* UI 수정 요청 시 다국어 파일 업데이트 코드 미제시 경우 가이드 위반(에러) 처리. + +--- + +## 4. JS/TS 코드 제어 및 상태 (Logic Constraints) +* **이벤트 핸들러 명명법:** `on[페이지명]_[기능명]_[액션]` 패턴 필수 준수. (예: `onB04_Surface_Calculate_Click`) +* **비동기 상태 제어:** API 호출 시 즉시 로딩 스피너(Overlay) 활성화, 통신 완료(성공/실패) 후 해제 로직 필수 포함. +* **1차 유효성 검사:** 백엔드 전송 전 빈 값 및 데이터 타입(숫자 범위 등) 프론트엔드 선 검증, 에러 시 입력창 하단 표기. + +```typescript +export const ui_locales = { + A01_Home_Title: ["반갑습니다", "Welcome"], + B04_wf1_Surface_Btn: ["지표면 분석 실행", "Run Surface Analysis"] +}; +``` + +--- + +## 5. 인증, 인가, 역할 및 라우팅 (Authentication, Authorization, Roles & Routing) + +### 5.1 세션 쿠키 기반 인증 +* **방식:** HttpOnly Secure 세션 쿠키 (localStorage 토큰 미사용) +* **API 통신:** 모든 API 요청에 `credentials: "include"` 설정으로 쿠키 자동 전송 +* **로그아웃:** `/auth/logout` API 호출 → 서버 세션 삭제 → 쿠키 자동 제거 +* **인증 갱신:** 로그인 시 `users.auth_expires_at = NOW() + 3개월` 자동 설정 + - 유효한 인증: `auth_expires_at > NOW()` → 바로 대시보드 이동 + - 만료된 인증: `auth_expires_at <= NOW()` → 재인증 모달 표시 + +### 5.1.1 역할 기반 대시보드 렌더링 +* **USER 역할:** + - 프로젝트 리스트 섹션 + - 회사 정보 섹션 (회사 생성/연결 팝업) + - 기본정보 & 보안 섹션 + +* **ADMIN 역할:** + - 프로젝트 리스트 섹션 (회사 전체 프로젝트) + - 회사 정보 섹션 + - 팀원 관리 섹션 + - 가입 요청 섹션 + - 기본정보 & 보안 섹션 + +* **SYSTEM_ADMIN 역할:** + - 리소스 현황 섹션 (CPU, MEM, DISK, 활성 사용자/프로젝트) + - 회사 관리 섹션 (전체 회사 리스트 + 추가/수정/삭제) + - 사용자 관리 섹션 (전체 사용자 + 역할 변경 + 회사 할당) + - 가입 요청 관리 섹션 (전체 가입 신청 + 승인/거절) + - 시스템 로그 섹션 (필터링 지원) + - 리소스 모니터링 그래프 (시계열 데이터) + - 기본정보 & 보안 섹션 + +### 5.2 라우팅 가드 +* **인증 확인:** `isAuthenticated()` 함수로 세션 유효성 검사 (PROTECTED_ROUTES 진입 전) +* **회사 연결 확인:** B02~B11 워크플로우 진입 시 `fetchDashboardMe()` 호출 → `company_id` + `status` 확인 + - `status` 확인: + - NO_COMPANY: B01_Dashboard로 강제 리다이렉트 (회사 연결 필요) + - PENDING: B01_Dashboard로 강제 리다이렉트 (승인 대기 중) + - ACTIVE: 워크플로우 진입 허용 + - `company_id` 없으면 B01_Dashboard로 리다이렉트 +* **역할 기반 라우팅:** + - SYSTEM_ADMIN: 모든 페이지 접근 가능 + - ADMIN: B01_Dashboard (관리 섹션) + B02~B11 워크플로우 접근 가능 + - USER: B01_Dashboard (사용자 섹션) + B02~B11 워크플로우 접근 가능 +* **상태 전이:** + - 회원가입 후 이메일 인증 완료: `users.status = 'NO_COMPANY'` (로그인 가능, 회사 미연결) + - 회사 생성: `users.status = 'ACTIVE'`, `company_id` 세팅, `role = 'ADMIN'`, `is_master = TRUE` + - 회사 참여 신청: `users.status = 'PENDING'` (관리자 승인 대기) + - 관리자 승인: `users.status = 'ACTIVE'`, `company_id` 세팅 + +### 5.3 대시보드 권한 기반 UI 제어 (B01_Dashboard) +* **권한 검증 헬퍼 필수:** `.agent/plan_dashboard_management.md` 섹션 9의 헬퍼 함수 참고 + - `canEditProject(user, project)` - 프로젝트 수정 권한 + - `canDeleteProject(user)` - 프로젝트 삭제 권한 (SYSTEM_ADMIN만) + - `canAddUser(user)` - 사용자 추가 권한 + - `canChangeRole(user, targetUser)` - 역할 변경 권한 (ADMIN: USER↔ADMIN만, SYSTEM_ADMIN 제외) + - `canDeleteUser(user, targetUser)` - 사용자 삭제 권한 (마지막 ADMIN 보호) + - `canManageAutomation(user, automation)` - 자동화 로직 관리 권한 + - `isLastAdmin(company, excludeUserId)` - 회사의 마지막 ADMIN 확인 + +* **UI 컴포넌트 구현:** 권한에 따라 버튼/필드 표시/비활성화 + - 프로젝트: 수정 모달, 삭제 확인 모달 (삭제는 SYSTEM_ADMIN만) + - 사용자: 추가 모달 (가입 계정 목록), 수정 모달, 역할변경 모달, 삭제 확인 모달 + - 자동화 로직: 생성/수정/삭제 모달 (ADMIN/SYSTEM_ADMIN만) + - 모든 삭제 모달에 경고 메시지 포함 (되돌릴 수 없음) + +* **다국어 반영:** 계획서 8장의 모든 키를 `ui_template_locale.ts`에 추가 후 컴포넌트에서 `L(키)` 사용 + - 모달 제목, 버튼 레이블, 확인 메시지, 오류 메시지 모두 다국어 처리 + - 하드코딩된 문구 절대 금지 \ No newline at end of file diff --git a/docs/raw/guidelines/migration_plan.md b/docs/raw/guidelines/migration_plan.md new file mode 100644 index 0000000..f0899d4 --- /dev/null +++ b/docs/raw/guidelines/migration_plan.md @@ -0,0 +1,278 @@ +# B03~B06 기능 마이그레이션 계획서 + +**갱신일:** 2026-07-05 +**상태:** 백엔드 마이그레이션 완료 — Stage 0~4 (B03~B06) 백엔드 이전 완료. 남은 항목은 프론트엔드(Vanilla TS) 재작성과 실제 DB 연동 검증. +**범위:** `B03_FileInput` ~ `B06_wf3_ProfileCross` +**DB:** MariaDB v10.6+ (aiomysql 드라이버, Raw SQL) + +**진척 요약:** +- Stage 0 (공통 기반): ✅ 완료 +- Stage 1 B03 (파일 입력): ✅ 백엔드 완료 +- Stage 2 B04 (지표면 분석): ✅ 백엔드 완료 (필터 4종 + 모델 5종 + 스무딩 + 등고선 + 파이프라인) +- Stage 3 B05 (경로 설계): ✅ 백엔드 완료 (Dijkstra + ridge-valley + skeleton) +- Stage 4 B06 (종횡단 생성): ✅ 백엔드 완료 (sampler + 종횡단 + Repository/Router) +- 공통: 전 페이지 DB 접근을 aiomysql Raw SQL로 통일, 순수 계산부는 실데이터로 검증 +- Stage 2~4 프론트엔드 폼/결과 UI: ✅ 완료 (B04~B06 UI_Page + Api_Fetch + CSS + locale, tsc 타입체크 통과) +- 남은 작업: B04~B06 **WebCAD 3D/차트 뷰어**, 실제 aislo_db 연동·구형 수치 비교 + +--- + +## 1. 확정 기준 + +- 기능 동작의 기준 원본은 `0_old/main.py`와 `0_old/utils/`이다. +- `0_old/backend/app/`은 이전 프로토타입 참고 자료이며 최종 동작 기준으로 사용하지 않는다. +- 신규 배치 구조는 `.agent/structure.md`를 따른다. 구형 파일 구조는 승계하지 않는다. +- 백엔드는 `.agent/backend.md`, 프론트엔드는 `.agent/frontend.md`를 따른다. +- 저장 구조 및 DB 경로 열은 `.agent/db_schema_simple.md`의 단계별 파일시스템 구조를 따른다. +- DB 스키마 작성·수정은 별도 담당 작업이다. 이 마이그레이션은 확정된 DB 계약만 `aiomysql`와 Raw SQL로 사용한다. +- 루트 `main.py`에는 페이지 라우터 등록만 추가한다. +- 구형 React/TSX UI는 복사하지 않고 현재 Vanilla TypeScript 구조와 공통 UI 템플릿에 맞게 재작성한다. + +--- + +## 2. 작업 원칙 + +### 2.1 함수 하나씩 이전 + +각 작업 단위는 다음 순서를 지킨다. + +1. 대상 구형 함수와 직접 의존성 확인 +2. 신규 페이지 폴더에 책임에 맞는 파일 하나 생성 +3. 함수 하나만 이전·수정 +4. 해당 함수 단위 테스트 또는 최소 실행 검증 +5. 포맷터·린터 실행 +6. 검증 완료 후 다음 함수 진행 + +한 번에 구형 모듈 전체를 복사하지 않는다. 구형 전역 경로, 동기식 파일 처리, 하드코딩 설정은 그대로 가져오지 않는다. + +### 2.2 파일 분리 + +- `*_Router.py`: FastAPI 엔드포인트와 응답 변환 +- `*_Schema.py`: Pydantic 요청·응답 검증 +- `*_Engine_*.py`: 페이지 고유 연산 +- `*_Repository.py`: `asyncpg` Raw SQL과 DB 경로 메타데이터 처리 +- `common_util/`: 둘 이상의 페이지가 실제로 공유하는 경로·원자적 파일 쓰기·기하 유틸만 배치 +- 단일 파일이 700줄에 도달하기 전에 기능별 파일 분할을 제안하고 승인 후 `structure.md`를 갱신한다. + +### 2.3 저장소 경계 + +```text +storage/{company_slug}/{user_slug}/{project_id}/ +├── B03_FileInput/ +├── B04_wf1_Surface/ +├── B05_wf2_Route/ +└── B06_wf3_ProfileCross/ +``` + +각 페이지는 자기 폴더만 직접 생성·수정한다. 상위 단계 변경 시 하위 결과를 임의 삭제하지 않고 `stale_from`을 갱신한다. + +--- + +## 3. 구형 기능 분석 결과 + +### 3.1 B03_FileInput + +구형 원본: + +- `0_old/main.py`: `check_sample`, `upload_files` +- 보조 참고: `0_old/backend/app/analyzer.py`의 파일 분석 함수 + +책임: + +- LAS/TIF/TFW/PRJ/DXF 업로드 검증 +- `B03_FileInput/input/{file_type}/` 저장 +- 파일 메타데이터 추출 및 `input_files` 기록 +- 업로드 완료 상태 반환 + +B04로 넘길 기능: + +- `process_pipeline` +- `run_ground_analysis` +- 포인트 필터링 및 지표면 모델 생성 + +### 3.2 B04_wf1_Surface + +구형 원본: + +- `0_old/main.py`: `process_pipeline`, `ensure_terrain_models`, 지표면·포인트 API +- `0_old/utils/structurizer.py` +- `filter_grid_min_z.py`, `filter_csf.py`, `filter_pmf.py`, `filter_ransac.py` +- `terrain_model_converter.py`, `surface_smoother.py`, `contour_extractor.py` + +책임: + +- LAS 구조화와 지면 필터 생성 +- 변환 포인트클라우드 저장 +- TIN/DTM/NURBS/implicit/meshfree 모델 생성 +- 스무딩, 미리보기, 등고선 생성 +- 지표면 모델 선택 확정 및 하위 단계 stale 전파 + +### 3.3 B05_wf2_Route + +구형 원본: + +- `0_old/main.py`: 경로점 CRUD, solve/result/confirm, stale 서명 처리 +- `0_old/utils/route_solver.py` +- `0_old/utils/route_solver_ridgevalley.py` +- `0_old/utils/terrain_skeleton.py` + +책임: + +- BP/EP/CP/AP/FP 입력 검증과 저장 +- Dijkstra 및 ridge-valley 경로 계산 +- 경사·곡선반경·회피/금지 구역 검증 +- 경로 결과 조회·확정 및 B06 stale 전파 + +### 3.4 B06_wf3_ProfileCross + +구형 원본: + +- `0_old/main.py`: sections generate/get/confirm 및 입력 서명 처리 +- `0_old/utils/surface_elevation_sampler.py` +- `0_old/utils/section_generator.py` + +책임: + +- 확정 경로와 확정 지표면 모델 검증 +- 종단 표고 프로필 생성 +- 지정 측점 간격의 횡단면 생성 +- 결과 조회·확정 및 재현성 서명 관리 + +--- + +## 4. 함수 단위 실행 순서 + +### Stage 0 — 공통 기반 + +- [x] `config_system.py`의 저장 경로에서 불필요한 `projects` 경로 제거 +- [x] 프로젝트 루트와 B03~B06 단계별 경로를 안전하게 만드는 공통 경로 함수 추가 +- [x] JSON 원자적 쓰기 함수 이전 +- [x] `workflow.json` 읽기 및 stale 필드 원자적 갱신 함수 이전 +- [x] 공통 함수별 테스트 작성 + +### Stage 1 — B03_FileInput + +- [x] `B03_FileInput_Schema.py`: 파일 종류·크기·확장자 검증 모델 +- [x] `B03_FileInput_Engine.py`: 안전한 파일명과 목적 경로 결정 함수 +- [x] `B03_FileInput_Engine.py`: 업로드 스트림 저장 함수 +- [x] `B03_FileInput_Engine_Analyze.py`: LAS 메타데이터 분석 함수 +- [x] `B03_FileInput_Engine_Analyze.py`: PRJ/TIF/TFW 메타데이터 분석 함수 +- [x] `B03_FileInput_Repository.py`: `input_files` 저장 함수 +- [x] `B03_FileInput_Router.py`: 업로드 엔드포인트 +- [x] B03 프론트 드롭존·목록·검증·로딩 UI를 공통 컴포넌트 기반으로 작성 +- [x] 업로드 통합 테스트 + +### Stage 2 — B04_wf1_Surface + +- [x] LAS 구조화 함수 이전 +- [x] grid-min-z 필터 함수 이전 및 검증 +- [x] CSF 필터 함수 이전 및 검증 +- [x] PMF 필터 함수 이전 및 검증 +- [x] RANSAC 필터 함수 이전 및 검증 +- [x] 지표면 모델 공통 컨텍스트 생성 함수 이전 (ModelContext + 메시 유틸) +- [x] TIN 생성 함수 이전 +- [x] DTM 생성 함수 이전 +- [x] NURBS 생성 함수 이전 +- [x] implicit 생성 함수 이전 +- [x] meshfree 생성 함수 이전 +- [x] DTM/TIN 스무딩 함수 이전 +- [x] 등고선 생성 함수 이전 +- [x] 미리보기·메타데이터·모델 확정 라우트 추가 (analyze/models 라우트 + 파이프라인 manifest) +- [x] `processed_point_cloud`, `surface_models`, `terrain_layers` Raw SQL 저장 함수 추가 (aiomysql) +- [x] B04 폼·모델 목록 UI를 Vanilla TypeScript로 재작성 (UI_Page + Api_Fetch + CSS + locale) +- [ ] B04 WebCAD 3D 뷰어(포인트클라우드/메시 렌더) 추가 +- [ ] 샘플 LAS 결과를 구형 출력과 비교 검증 + +### Stage 3 — B05_wf2_Route + +- [x] 경로점 Pydantic 모델 및 유효성 검사 이전 (Schema) +- [x] 경로점 저장·조회·초기화 함수 이전 (Repository) +- [x] 비용면 생성 및 캐시 함수 이전 (Solver) +- [x] Dijkstra 단일 구간 탐색 함수 이전 (Geometry) +- [x] 최적 경로 조립 함수 이전 (Solver solve_optimal_route) +- [x] 지형 skeleton 생성 함수 이전 (Skeleton, D8 흐름누적) +- [x] ridge-valley 탐색 함수 이전 (RidgeValley, 정속경사+fillet) +- [ ] 입력 서명·stale 판정 함수 이전 +- [x] 경로 확정 함수 이전 (Repository confirm_route + confirm 라우트) +- [x] `routes`, `route_points`, `route_statistics` Raw SQL 저장 함수 추가 (aiomysql) +- [x] B05 경로점 입력·제약조건·결과 메트릭 UI를 Vanilla TypeScript로 재작성 (UI_Page + Api_Fetch + CSS + locale) +- [ ] B05 경로 WebCAD 뷰어(노선 폴리라인 렌더/편집) 추가 +- [x] 기존 route solver 테스트를 신규 구조로 이관·통과 + +### Stage 4 — B06_wf3_ProfileCross + +- [x] 지표면 sampler 인터페이스 이전 (Engine_Sampler: SurfaceElevationSampler Protocol) +- [x] DTM grid sampler 함수 이전 (DtmGridSampler, 4-꼭짓점 valid 검증) +- [x] 보간 sampler 함수 이전 (InterpolatedSurfaceSampler + build_surface_sampler 5종) +- [x] 측점 배열 생성 함수 이전 (Engine_Section: _chainages) +- [x] 경로 보간 및 접선 계산 함수 이전 (_interpolate_xy, _tangent_at) +- [x] 종단·횡단 생성 함수 이전 (generate_sections) +- [ ] 입력 서명·중복 실행 방지 함수 이전 (delete_sections_for_route로 멱등 재실행만 구현) +- [x] 결과 조회·확정 라우트 추가 (sections/generate·get·confirm 라우트) +- [x] `longitudinal_sections`, `cross_sections` Raw SQL 저장 함수 추가 (aiomysql Repository) +- [x] B06 측점·횡단 옵션·결과 메트릭 UI를 Vanilla TypeScript로 재작성 (UI_Page + Api_Fetch + CSS + locale) +- [ ] B06 종단도·횡단 카드 WebCAD 뷰어(프로필 차트 렌더) 추가 +- [ ] 구형 section 결과와 수치 비교 검증 + +**B06 백엔드 구현 파일:** +- `B06_wf3_ProfileCross_Engine_Sampler.py` — 표고 sampler (Protocol + DTM/보간 5종) +- `B06_wf3_ProfileCross_Engine_Section.py` — 종횡단 생성 (측점/접선/횡단 샘플) +- `B06_wf3_ProfileCross_Engine.py` — 오케스트레이터 (경로 GeoJSON→종횡단→파일 저장) +- `B06_wf3_ProfileCross_Repository.py` — aiomysql Raw SQL (2 테이블) +- `B06_wf3_ProfileCross_Schema.py` / `_Router.py` — Pydantic + FastAPI 라우트 + +**검증 상태:** B04(DTM)→B05(경로 70.71m)→B06(종단면+횡단면 5건) end-to-end 파일 생성 확인. +DB 저장 함수는 FakeCursor 기반 문법 검증만 수행 (실제 aislo_db 연동은 나스 서버 준비 후). + +--- + +## 5. API 및 상태 원칙 + +- API 경로는 `/api/projects/{project_id}/...` 형태를 유지하되 페이지별 Router에서 선언한다. +- 모든 JSON 요청은 Pydantic 검증 후 Engine으로 전달한다. +- 긴 지형 연산은 이벤트 루프를 막지 않도록 실행 방식을 별도 검토한다. +- 오류 응답은 `{"status": "error", "message": "원인"}` 형식을 유지한다. +- 프론트 API 호출은 로딩 Overlay를 항상 시작·해제한다. +- UI 문자열은 `ui_template_locale.ts`에 먼저 등록한 뒤 참조한다. +- 상위 단계 재계산 시 하위 결과는 stale 처리하며 다른 페이지 폴더를 직접 삭제하지 않는다. + +--- + +## 6. 검증 체크리스트 + +각 함수 이전 후: + +- [ ] 구형 함수의 입력·출력 계약 비교 +- [ ] 하드코딩 설정 제거 및 `config_system.py` 연결 +- [ ] 신규 단계별 저장 경로 사용 확인 +- [ ] 경로 이탈 및 파일명 공격 방지 확인 +- [ ] 예외 처리와 표준 오류 응답 확인 +- [ ] Python: `ruff format`, `ruff check --fix` +- [ ] TypeScript/CSS: `npx prettier --write` +- [ ] 단위 테스트 실행 +- [ ] 관련 통합 테스트 실행 +- [ ] 단일 파일 700줄 미만 확인 + +단계 완료 후: + +- [ ] B03 업로드 파일과 DB 메타데이터 일치 +- [ ] B04 지표면 모델의 범위·점 수·표고 통계 비교 +- [ ] B05 경로 길이·경사·곡선반경·제약 위반 비교 +- [ ] B06 측점 수·종단 표고·횡단 좌표 비교 +- [ ] 다중 브라우저 polling 및 stale 전파 확인 + +--- + +## 7. 작업 경계와 보류 항목 + +- DB 테이블·FK·인덱스 정의 변경은 본 작업에서 수행하지 않는다. +- `.agent/db_schema_simple.md`는 DB 담당자의 작업 영역이므로 직접 수정하지 않는다. +- DB 스키마가 확정되지 않은 Repository 함수는 인터페이스만 계획하고 임의 열을 만들지 않는다. +- B07 이후 기능은 이번 마이그레이션 범위에서 제외한다. +- 구형 샘플 데이터는 검증 입력으로만 사용하고 신규 영구저장소로 자동 복사하지 않는다. + +--- + +## 8. 다음 실행 단위 + +첫 구현은 Stage 0의 저장 경로 함수 하나로 시작한다. 함수와 테스트를 검증한 뒤 다음 공통 함수로 이동한다. diff --git a/docs/raw/guidelines/structure.md b/docs/raw/guidelines/structure.md new file mode 100644 index 0000000..0155110 --- /dev/null +++ b/docs/raw/guidelines/structure.md @@ -0,0 +1,189 @@ +# 프로젝트 구조 명세서 (structure.md) + +## 1. 폴더 및 파일 명명 규칙 (Naming Convention) + +- **기본 원칙:** 프론트엔드(TypeScript)와 백엔드(Python) 파일을 수직 통합 관리 +- **페이지 폴더 명명:** 로그인 전은 `A01_`, 로그인 후는 `B01_` 형태 적용, 워크플로우는 `wf[번호]` 접두사를 사용 +- **시스템 폴더 명명:** 공통 유틸, DB, 리소스, 영구저장소 등 시스템 및 데이터 인프라 폴더는 접두사 ID 없이 명확한 영문명 분리 +- **파일 명명:** 반드시 `폴더명(페이지명)_기능_기타사양.확장자` 형태 작성 +- **공통 모듈:** 공통 유틸 코드는 `common_util` 폴더 내에 `common_util_기능.확장자` 형태 보관 + +--- + +## 2. 전체 디렉토리 트리 구조 + +```text +my-project/ +├── .agent/ +│ ├── agent.md +│ └── structure.md # 본 파일 +├── A00_Common/ # 프론트엔드 공통 인프라 (부트스트랩, 라우팅, 셸) +│ ├── main.ts # 앱 진입점 (스타일 주입 → 테마 복원 → 셸 → 라우터) +│ ├── router.ts # 해시 기반 SPA 라우터 + 인증 가드 + 지연 로딩 (A·B 전 라우트 등록) +│ ├── app_shell.ts # 공통 헤더/푸터 (로고, 네비, 언어·테마·로그인 토글) +│ ├── b_page_scaffold.ts # B 그룹 공통 스캐폴드 (헤더+준비중 안내 / 워크플로우 셸 래퍼) +│ └── vite-env.d.ts # Vite 클라이언트 타입 선언 +├── common_util/ # 공통 유틸리티 (공통 기능 코드) +│ ├── common_util_validate.ts # 프론트 1차 유효성 검사 (이메일/빈값/최소길이) +│ ├── common_util_auth.py # 비밀번호·OTP·세션 쿠키·권한 검증 +│ ├── common_util_auth_repository.py # 인증·조직·관리 Raw SQL 저장소 +│ ├── common_util_email.py # 비동기 SMTP 발송 및 재시도 +│ ├── common_util_email_templates.py # 인증·조직 알림 이메일 템플릿 +│ ├── common_util_string.ts +│ ├── common_util_storage.py # 프로젝트 및 워크플로우 단계별 저장 경로 +│ ├── common_util_json.py # JSON 원자적 저장 +│ ├── common_util_workflow.py # 공유 workflow.json 상태 처리 +│ ├── common_util_resource_monitor.py # 시스템 리소스 계측(2분 주기) + log/ 로그 + DB 기록 +│ └── common_util_format.py +├── db_management/ # DB 관리 폴더 (PostgreSQL 마이그레이션 및 스키마 관리) +│ ├── schema.sql +│ ├── migration_v1.py +│ └── 002_auth_security.sql # 기존 DB 로그인·보안 증분 마이그레이션 +├── resources/ # 웹앱 UI 구성 리소스 (사진, 회사 로고 등 에셋) +│ ├── logo.png +│ ├── banner.jpg +│ └── legal/ # 약관 및 정책 텍스트 (회원가입 UI에서 사용) +│ ├── terms_of_service.txt # 이용약관 +│ ├── privacy_policy.txt # 개인정보처리방침 +│ └── marketing_consent.txt # 마케팅 정보 수신 동의 +├── storage/ # 영구 저장소 (데이터 커서 및 대용량 파일 별도 저장 로직용) +│ └── [고객사명]/ +│ └── [사용자명]/ +│ └── [프로젝트ID]/ # 프로젝트별 내부 폴더/파일 자동 생성 (별도 폴더 ID 미사용) +├── log/ # 런타임 리소스 로그 (.gitignore, 1개월 롤링) +│ └── system_resources.log # CPU/메모리/디스크 계측 단일 파일 (2분 주기) +├── ui_template/ # 공통 UI 템플릿 및 테마 +│ ├── ui_template_theme.css # 글로벌 디자인 테마 및 CSS 변수 (라이트/다크) +│ ├── ui_template_locale.ts # 다국어 텍스트 배열 방식 관리 파일 +│ └── ui_template_elements.ts # 공통 컴포넌트 및 그룹 템플릿 정의 +├── templates/ # 보고서 출력용 마스터 양식 (DWG, Excel, PPT 등 기본 원본 템플릿 파일) +│ ├── template_report_form.xlsx +│ └── template_drawing_base.dwg +├── config/ # 프로그램 내부 제어 및 시스템 환경 설정 폴더 +│ ├── config_system.py # 백엔드 작동 제어 및 알고리즘 파라미터 +│ ├── config_db.py # 데이터베이스 연결 제어 설정 +│ ├── config_frontend.ts # 프론트엔드 제어 및 웹 환경 설정 +│ ├── package.json # Node.js 의존성 (npm/vite) +│ ├── tsconfig.json # TypeScript 설정 +│ └── vite.config.ts # Vite 빌드 설정 +├── A01_Home/ # 로그인 전 01: 홈 (소개, 소식, 사이트맵 등) +│ ├── A01_Home_UI_Page.ts +│ ├── A01_Home_UI_Style.css +│ └── A01_Home_Api_Fetch.py +├── A02_ProgDetail/ # 로그인 전 02: 프로그램 상세 (6단계 워크플로우 + 핵심 기술) +│ ├── A02_ProgDetail_UI_Page.ts +│ └── A02_ProgDetail_UI_Style.css +├── A03_CompDetail/ # 로그인 전 03: 회사 상세 (미션 + 핵심 가치 + 연락처) +│ ├── A03_CompDetail_UI_Page.ts +│ └── A03_CompDetail_UI_Style.css +├── A04_NewsHistory/ # 로그인 전 04: 최신소식 및 개선 이력 (타임라인) +│ ├── A04_NewsHistory_UI_Page.ts +│ └── A04_NewsHistory_UI_Style.css +├── A05_EduDetail/ # 로그인 전 05: 교육 상세 (과정 소개 + 문의 CTA) +│ ├── A05_EduDetail_UI_Page.ts +│ └── A05_EduDetail_UI_Style.css +├── A06_Login/ # 로그인 전 06: 로그인 (이메일 + 비밀번호 폼) +│ ├── A06_Login_UI_Auth_Page.ts # 세션 쿠키·OTP 로그인 UI (현재 사용 중) +│ ├── A06_Login_UI_Style.css +│ ├── A06_Login_Api_Fetch.ts +│ ├── A06_Login_Schema.py +│ └── A06_Login_Router.py +├── A07_Register/ # 로그인 전 07: 회원가입 (회사/이름/이메일/비밀번호 폼) +│ ├── A07_Register_UI_Page.ts +│ ├── A07_Register_UI_Auth_Page.ts # 조직 유형·약관·OTP 회원가입 UI +│ ├── A07_Register_UI_Style.css +│ ├── A07_Register_Api_Fetch.ts +│ ├── A07_Register_Schema.py +│ └── A07_Register_Router.py +├── A08_Support/ # 로그인 전 08: 기술지원 요청 (문의 폼 + textarea) +│ ├── A08_Support_UI_Page.ts +│ └── A08_Support_UI_Style.css +├── A09_Security/ # 로그인 전 09: 보안 및 약관 동의 (필수/선택 약관 확인) +│ ├── A09_Security_UI_Page.ts # 약관 동의 페이지 (이용약관/개인정보/마케팅/보안정책) +│ ├── A09_Security_UI_Style.css # A09 고유 약관 박스/체크박스 스타일 +│ ├── A09_Security_Api_Fetch.ts # 동의 내용 제출 API 클라이언트 +│ ├── A09_Security_Terms.ts # 약관 텍스트 데이터 (한/영 다국어) +│ ├── A09_Security_Schema.py # 조직·관리자 보안 요청 검증 +│ └── A09_Security_Router.py # 마스터·시스템 관리자·활동 로그 API +│ +│ # ※ B01·B02 본문 완성 / B03~B11 헤더·셸만 (본문은 0_old 참고 후 구체화) +├── B01_Dashboard/ # 로그인 후 01: 대시보드 (역할별 정보 표시) +│ ├── B01_Dashboard_UI_Page.ts # 역할별 섹션 조건부 렌더링 +│ ├── B01_Dashboard_UI_Modals.ts # 프로젝트, 사용자, 자동화 제어 모달 모음 +│ ├── B01_Dashboard_UI_Helper.ts # 역할별 접근 권한 확인 헬퍼 +│ ├── B01_Dashboard_UI_Resources.ts # CPU/Memory/Disk 리소스 렌더링 컴포넌트 +│ ├── B01_Dashboard_UI_Style.css # 프로젝트 테이블, 워크플로우, 팝업 스타일 +│ ├── B01_Dashboard_Api_Fetch.ts # dashboard API 클라이언트 +│ ├── B01_Dashboard_Schema.py # 요청/응답 Pydantic 검증 +│ ├── B01_Dashboard_Repository.py # Raw SQL 저장소 (사용자, 회사, 팀원, 가입 신청) +│ └── B01_Dashboard_Router.py # 역할별 API 엔드포인트 +├── B02_ProjRegister/ # 로그인 후 02: 프로젝트 등록 (기본정보 입력 폼) +│ ├── B02_ProjRegister_UI_Page.ts +│ └── B02_ProjRegister_UI_Style.css +├── B03_FileInput/ # 로그인 후 03: 파일 입력 (헤더+준비중 안내) +│ ├── B03_FileInput_UI_Page.ts +│ ├── B03_FileInput_UI_Style.css +│ ├── B03_FileInput_Api_Fetch.ts # 다중 파일 업로드 API 클라이언트 +│ ├── B03_FileInput_Schema.py # 업로드 파일 Pydantic 검증 +│ ├── B03_FileInput_Engine.py # 업로드 저장 경로·스트림 처리 +│ ├── B03_FileInput_Engine_Analyze.py # 원본 파일 메타데이터 분석 +│ ├── B03_FileInput_Repository.py # input_files asyncpg Raw SQL +│ └── B03_FileInput_Router.py # 다중 파일 업로드 API +├── B04_wf1_Surface/ # 로그인 후 04: 1차 workflow (지표면 모델 분석) +│ ├── B04_wf1_Surface_UI_Page.ts # 3단 레이아웃 (필터/표현 선택 폼 + 모델 목록) +│ ├── B04_wf1_Surface_UI_Style.css # B04 고유 폼 그룹/모델 카드 스타일 +│ ├── B04_wf1_Surface_Api_Fetch.ts # surface/analyze·models API 클라이언트 +│ ├── B04_wf1_Surface_Schema.py # 분석 요청/응답 Pydantic 검증 +│ ├── B04_wf1_Surface_Engine.py # 지표면 분석 오케스트레이터 +│ ├── B04_wf1_Surface_Engine_Structurize.py # LAS/LAZ 구조화 +│ ├── B04_wf1_Surface_Engine_Ground.py # 지면 분석 진입 +│ ├── B04_wf1_Surface_Engine_Filter_Grid.py # grid minimum-Z 필터 +│ ├── B04_wf1_Surface_Engine_Filter_CSF.py # CSF 필터 +│ ├── B04_wf1_Surface_Engine_Filter_PMF.py # PMF 필터 +│ ├── B04_wf1_Surface_Engine_Filter_RANSAC.py # RANSAC 필터 +│ ├── B04_wf1_Surface_Engine_ModelContext.py # 모델 공통 컨텍스트/메시 유틸 +│ ├── B04_wf1_Surface_Engine_ModelBuild.py # TIN/DTM/NURBS/implicit/meshfree 생성 +│ ├── B04_wf1_Surface_Engine_Smooth.py # DTM/TIN 스무딩 +│ ├── B04_wf1_Surface_Engine_Contour.py # 등고선 생성 +│ ├── B04_wf1_Surface_Engine_Pipeline.py # 파이프라인 manifest +│ ├── B04_wf1_Surface_Repository.py # processed_point_cloud/surface_models aiomysql Raw SQL +│ └── B04_wf1_Surface_Router.py # surface/analyze·models API +├── B05_wf2_Route/ # 로그인 후 05: 2차 workflow (경로설계) +│ ├── B05_wf2_Route_UI_Page.ts # 3단 레이아웃 (제어점/제약 폼 + 결과 메트릭) +│ ├── B05_wf2_Route_UI_Style.css # B05 고유 제어점 행/제약 그룹 스타일 +│ ├── B05_wf2_Route_Api_Fetch.ts # route/solve·confirm API 클라이언트 +│ ├── B05_wf2_Route_Schema.py # 경로 탐색 요청/응답 Pydantic 검증 +│ ├── B05_wf2_Route_Engine.py # 경로 설계 오케스트레이터 +│ ├── B05_wf2_Route_Engine_Geometry.py # Dijkstra 단일 구간 탐색 +│ ├── B05_wf2_Route_Engine_Solver.py # 비용면 생성 + 최적 경로 조립 +│ ├── B05_wf2_Route_Engine_Skeleton.py # 지형 skeleton (D8 흐름누적) +│ ├── B05_wf2_Route_Engine_RidgeValley.py # ridge-valley 탐색 +│ ├── B05_wf2_Route_Repository.py # routes/route_points/route_statistics aiomysql Raw SQL +│ └── B05_wf2_Route_Router.py # route/solve·confirm API +├── B06_wf3_ProfileCross/ # 로그인 후 06: 3차 workflow (종횡단 생성) +│ ├── B06_wf3_ProfileCross_UI_Page.ts # 3단 레이아웃 (측점/횡단 옵션 폼 + 결과 메트릭) +│ ├── B06_wf3_ProfileCross_UI_Style.css # B06 고유 옵션 그룹/결과 메트릭 스타일 +│ ├── B06_wf3_ProfileCross_Api_Fetch.ts # sections/generate·get·confirm API 클라이언트 +│ ├── B06_wf3_ProfileCross_Schema.py # 종횡단 생성 요청/응답 Pydantic 검증 +│ ├── B06_wf3_ProfileCross_Engine.py # 종횡단 생성 오케스트레이터 +│ ├── B06_wf3_ProfileCross_Engine_Sampler.py # 표고 sampler (Protocol + DTM/보간 5종) +│ ├── B06_wf3_ProfileCross_Engine_Section.py # 종횡단 생성 (측점/접선/횡단 샘플) +│ ├── B06_wf3_ProfileCross_Repository.py # longitudinal/cross_sections aiomysql Raw SQL +│ └── B06_wf3_ProfileCross_Router.py # sections/generate·get·confirm API +├── B07_wf4_DesignDetail/ # 로그인 후 07: 4차 workflow (상세설계) — 워크플로우 셸 +│ └── B07_wf4_DesignDetail_UI_Page.ts +├── B08_wf5_Quantity/ # 로그인 후 08: 5차 workflow (수량 산출) — 워크플로우 셸 +│ └── B08_wf5_Quantity_UI_Page.ts +├── B09_wf6_Estimation/ # 로그인 후 09: 6차 workflow (견적/문서) — 워크플로우 셸 +│ └── B09_wf6_Estimation_UI_Page.ts +├── B10_Payment/ # 로그인 후 10: 결재 페이지 (헤더+준비중 안내) +│ └── B10_Payment_UI_Page.ts +└── B11_Status/ # 로그인 후 11: 상태 출력 페이지 (헤더+준비중 안내) + └── B11_Status_UI_Page.ts +│ +├── main.py # FastAPI 애플리케이션 진입점 +├── requirements.txt # Python 의존성 (pip) +├── .env.example # 환경 변수 템플릿 +└── node_modules/ # Node.js 패키지 (.gitignore) + └── .build/ # Vite 빌드 결과 (.gitignore) +``` diff --git a/docs/raw/plans/plan_workflow_state_management.md b/docs/raw/plans/plan_workflow_state_management.md new file mode 100644 index 0000000..a8490ad --- /dev/null +++ b/docs/raw/plans/plan_workflow_state_management.md @@ -0,0 +1,207 @@ +# 워크플로우 단계별 상태 관리 재설계 계획서 + +**작성일:** 2026-07-10 +**상태:** 설계 제안 (코드는 다른 AI가 진행) +**범위:** 프로젝트 워크플로우(WF0 파일입력 ~ WF6 견적) 단계별 완료 상태의 DB 저장·조회·무효화(stale) 로직, 그리고 이를 근거로 한 대시보드/파일입력/WF1~WF6 공통 UI의 단계 활성화·페이지 이동 제어 + +--- + +## 1. 현재 구조 진단 (코드 조사 결과) + +### 1.1 상태값이 단일 문자열 하나로 관리됨 + +- `projects.status` — **VARCHAR(50) 단일 컬럼** ([001_create_schema.sql:187](../db_management/001_create_schema.sql#L187)) + - 값 예: `NEW` → `FILE_UPLOADED` → `WF1_ANALYZING` → `WF1_COMPLETE` → `WF2_COMPLETE` → ... → `DONE` + - **하나의 값만 존재** — "지금 어느 단계까지 왔는가"만 표현, "각 단계가 개별적으로 완료됐는가"는 표현 불가 + +- 이 단일 값을 대시보드가 `_stage_from_status()`로 **순서 추론** ([B01_Dashboard_Repository.py:20](../B01_Dashboard/B01_Dashboard_Repository.py#L20)) + ```python + order = [("FILE_UPLOADED", 1), ("WF1_COMPLETE", 2), ("WF2_COMPLETE", 3), ...] + # status 문자열에 토큰이 "포함"되면 그 stage로 간주 → 부분 문자열 매칭 + ``` + +### 1.2 이로 인한 실제 문제 (사용자 보고와 일치) + +1. **단계 독립성 없음**: `WF2_COMPLETE`가 되면 WF1 완료 정보는 문자열에 없고 "순서상 앞이니까 됐겠지"로만 추론. WF1을 다시 열어 재분석해도 그 사실을 status가 담지 못함. + +2. **역방향 재작업(stale) 로직 부재**: 사용자가 WF1으로 돌아가 파일/분석을 바꾸면 WF2~WF6 결과는 **무효**가 되어야 하는데, 이를 표시·차단하는 로직이 전혀 없음. status를 WF1로 되돌리면 이후 완료 이력이 통째로 사라짐(반대로 안 되돌리면 낡은 하위 단계가 열린 채 유지됨). + +3. **이원화된 죽은 설계**: `workflow.json`(`completed: []`, `stale_from`, `current_stage` 필드)이 프로젝트 생성 시 초기화되지만 ([B02_ProjRegister_Repository.py:31](../B02_ProjRegister/B02_ProjRegister_Repository.py#L31)), **실제 단계 판정에는 쓰이지 않음**. `projects.status`가 사실상 유일한 근거. 두 메커니즘이 공존하나 어느 쪽도 완전하지 않음. + +4. **상태 갱신처 분산**: `status` UPDATE가 여러 라우터에 흩어져 있음 + - [B03_FileInput_Router.py:158,210,240](../B03_FileInput/B03_FileInput_Router.py#L158) (`WF1_ANALYZING`/`WF1_COMPLETE`/`WF1_FAILED`) + - [B04_wf1_Surface_Router.py:160,199,217](../B04_wf1_Surface/B04_wf1_Surface_Router.py#L160) (동일 값 중복 세팅) + - **B03과 B04가 같은 WF1 상태를 각자 세팅** → 경쟁·불일치 위험 + +### 1.3 각 단계 산출물 테이블에는 이미 개별 status가 있음 (활용 가능) + +- `surface_models.status` (`PROCESSING`/`COMPLETE`/`FAILED`) ([001_create_schema.sql:258](../db_management/001_create_schema.sql#L258)) +- `processed_point_cloud.status`, `input_files.status` 등 +- **즉 "단계별 완료"의 근거 데이터는 이미 DB에 존재** — 이를 요약할 상위 레이어만 없음 + +--- + +## 2. 재설계 목표 + +| # | 목표 | 설명 | +|---|------|------| +| G1 | 단계별 독립 상태 | 각 WF(0~6)의 상태를 개별적으로 저장 (`not_started` / `in_progress` / `complete` / `failed` / `stale`) | +| G2 | 단일 진실 원천(SSOT) | 상태의 근거를 **DB 한 곳**으로 통일. `projects.status` 단일 문자열 추론 폐기, `workflow.json` 이원화 제거 | +| G3 | 역방향 재작업 무효화 | N단계 재실행 시 N+1~6 단계를 자동 `stale`로 전환 (결과는 보존하되 "낡음" 표시) | +| G4 | UI 단일 규칙 | 대시보드·파일입력·WF1~6 공통 레이아웃이 **같은 상태 API**를 보고 버튼 활성/비활성·이동 결정 | +| G5 | 재실행 시 사용자 입력 보존 | 재분석 시 이전에 사용자가 선택/입력한 파라미터를 재사용 (초기 실행과 달리 값이 이미 있음) | + +--- + +## 3. 제안 설계 + +### 3.1 데이터 모델 — `project_workflow_stages` 테이블 신규 (권장안) + +프로젝트당 워크플로우 단계별로 1행. `projects.status` 문자열 추론을 대체하는 SSOT. + +```sql +CREATE TABLE IF NOT EXISTS project_workflow_stages ( + id INT AUTO_INCREMENT PRIMARY KEY, + project_id CHAR(36) NOT NULL, + stage_no TINYINT NOT NULL, -- 0=파일입력, 1=WF1 ... 6=WF6 + stage_key VARCHAR(30) NOT NULL, -- 'FILE_INPUT','WF1_SURFACE',...,'WF6_ESTIMATION' + state ENUM('NOT_STARTED','IN_PROGRESS','COMPLETE','FAILED','STALE') + NOT NULL DEFAULT 'NOT_STARTED', + progress_percent TINYINT NOT NULL DEFAULT 0, + params JSON NULL, -- 해당 단계에서 사용자가 선택/입력한 값 (재실행 시 재사용, G5) + message VARCHAR(255) NULL, -- 진행/오류 메시지 + started_at TIMESTAMP NULL, + completed_at TIMESTAMP NULL, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + UNIQUE KEY uq_project_stage (project_id, stage_no), + INDEX idx_pws_project (project_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +``` + +- 프로젝트 생성 시 7행(stage 0~6)을 `NOT_STARTED`로 시드. +- `projects.status`는 **표시용 요약 캐시로 강등**(호환 유지)하거나 제거. 판정 근거는 이 테이블로 일원화. +- `workflow.json` 초기화 로직은 제거하거나 이 테이블과 동기화(권장: 제거하고 DB로 통일 — MariaDB가 SSOT). + +**대안(경량):** 신규 테이블 없이 `projects`에 `stage_states JSON` 컬럼 하나 추가하여 `{"0":"COMPLETE","1":"COMPLETE","2":"STALE",...}` 저장. 마이그레이션은 가볍지만 단계별 params/타임스탬프 확장성이 낮음. **권장은 3.1 테이블 방식** (각 단계 params·이력 필요하므로). + +### 3.2 상태 전이 규칙 + +``` +NOT_STARTED ──(실행 시작)──▶ IN_PROGRESS ──(성공)──▶ COMPLETE + │ + └──(실패)──▶ FAILED ──(재실행)──▶ IN_PROGRESS +COMPLETE ──(하위 단계 재작업으로 상위가 재실행됨)──▶ STALE ──(재실행)──▶ IN_PROGRESS +``` + +- **stale 전파 (G3):** stage N이 `IN_PROGRESS`로 전이될 때, stage N+1..6 중 `COMPLETE`인 것을 모두 `STALE`로 변경. + - `STALE`은 결과 파일/DB 행을 삭제하지 않음 — "낡음" 플래그만. 사용자가 해당 단계를 다시 실행하면 `COMPLETE`로 복귀. +- **진입 가능 규칙 (활성화):** stage N은 stage N-1이 `COMPLETE`일 때만 진입(이동) 가능. 단 파일입력(stage 0)은 항상 가능. + - `STALE`/`FAILED` 단계는 진입 가능하되(재작업 목적) 이후 단계로는 못 넘어감. + +### 3.3 상태 조회 API (SSOT 단일 엔드포인트) + +기존 분산된 status 대신 프로젝트 단위 통합 조회를 신설: + +``` +GET /api/projects/{project_id}/workflow-state +→ { + "project_id": "...", + "current_stage": 2, // 진입 가능한 최고 단계 + "stages": [ + {"stage_no":0,"stage_key":"FILE_INPUT","state":"COMPLETE","progress_percent":100}, + {"stage_no":1,"stage_key":"WF1_SURFACE","state":"COMPLETE","progress_percent":100}, + {"stage_no":2,"stage_key":"WF2_ROUTE","state":"IN_PROGRESS","progress_percent":40}, + {"stage_no":3,"stage_key":"WF3_...","state":"STALE","progress_percent":0}, + ... + ] +} +``` + +- 대시보드 프로젝트 목록 API도 이 요약(`current_stage` + 단계별 state 배열)을 포함하도록 확장. +- 기존 `GET /surface/status`(WF1 진행률)는 이 테이블의 stage 1 행을 읽어 반환하도록 내부만 교체(외부 계약 유지 → B03 폴링 호환). + +### 3.4 상태 갱신 지점 통일 + +단계별 상태 전이를 **공통 유틸 함수**로 통일하여 라우터 중복 제거: + +```python +# common_util/common_util_workflow_state.py (신규) +async def start_stage(conn, project_id, stage_no, params=None): ... # IN_PROGRESS + 하위 STALE 전파 +async def complete_stage(conn, project_id, stage_no): ... # COMPLETE + completed_at +async def fail_stage(conn, project_id, stage_no, message): ... # FAILED +async def get_workflow_state(conn, project_id) -> list[dict]: ... # 조회 +``` + +- B03/B04가 각자 하던 `WF1_ANALYZING`/`WF1_COMPLETE` UPDATE를 이 함수 호출로 대체. +- **WF1 상태의 이중 세팅 문제 해소:** 파일입력 완료 후 자동 WF1 분석 흐름에서 stage 0 `complete` → stage 1 `start`/`complete`가 한 경로로만 일어나도록 정리. + +### 3.5 재실행 시 사용자 입력 보존 (G5) + +- 각 stage 행의 `params JSON`에 해당 단계 실행 시 사용자가 고른 값을 저장 + - WF1: `{source_filters, methods, force, input_file_id}` + - WF2: `{algorithm, road_grade, min_radius, ...}` +- 사용자가 단계 재진입 시 UI는 `params`를 불러와 폼 기본값으로 채움 → 초기 실행과 달리 재계산이 즉시 가능. + +--- + +## 4. 프론트엔드 반영 + +### 4.1 공통 규칙 (대시보드 + 파일입력 + WF1~6 레이아웃) + +- 세 곳 모두 **`workflow-state` API 하나**를 근거로 사용 (G4). 개별 페이지가 자체 추론하지 않음. +- 버튼 활성화: `stage.state === 'COMPLETE'`인 다음 단계까지 이동 가능. `STALE`은 "재작업 필요" 배지로 표시하되 진입 허용. +- 대시보드 워크플로우 버튼([B01_Dashboard_UI_Page.ts:370](../B01_Dashboard/B01_Dashboard_UI_Page.ts#L370) `workflow()`)의 `enabled` 계산을 `stages` 배열 기반으로 교체. + +### 4.2 헤더 토글과 전역 헤더 구분 (혼동 방지 메모) + +- WF1~6 공통 레이아웃(`ui_template_workflow_layout`)의 헤더 숨김/표시 토글은 **그 페이지 내부 작업 헤더**에만 작용. 로그인/로그아웃/사용자명이 있는 **전역 상단 헤더(`app_shell.ts`)와는 별개**임. +- 코더 주의: 화면 확장 목적으로 헤더를 숨길 때 전역 헤더(`app-header`)를 건드리지 말 것. 두 헤더는 DOM/스타일이 분리돼 있어야 함. + +### 4.3 페이지 이동 시점 (이미 구현됨 — 유지) + +- 파일 업로드 → WF1 분석 완료 폴링 → 완료 후 B04 이동은 이미 올바르게 구현([B03_FileInput_UI_Page.ts:606-609](../B03_FileInput/B03_FileInput_UI_Page.ts#L606)). +- 재설계 후에도 이 시점을 유지하되, "완료" 판정을 `workflow-state`의 stage 1 == COMPLETE로 통일. + +--- + +## 5. 마이그레이션 & 호환 + +1. `project_workflow_stages` 테이블 생성 SQL을 `db_management/`에 신규 번호로 추가. +2. 기존 프로젝트 백필: 현재 `projects.status` 문자열을 해석해 각 프로젝트의 stage 0~N을 `COMPLETE`로, 나머지는 `NOT_STARTED`로 시드하는 1회성 스크립트. +3. `projects.status`는 당분간 요약 캐시로 유지(외부 참조 호환), 신규 판정은 테이블 기준. 안정화 후 제거 검토. +4. `workflow.json` 초기화 로직 제거(또는 테이블과 동기화). `common_util_workflow.py`의 `stale_from`은 새 stale 전파로 대체되므로 정리 대상. + +--- + +## 6. 구현 순서 (코더용) + +| Phase | 작업 | 파일(예상) | +|-------|------|-----------| +| 1 | 테이블 생성 SQL + 생성 시 7행 시드 | `db_management/00X_*.sql`, B02 생성 로직 | +| 2 | 상태 전이 공통 유틸 (start/complete/fail/get + stale 전파) | `common_util/common_util_workflow_state.py` | +| 3 | `GET /workflow-state` API + 대시보드 목록 API 확장 | B01, 신규 라우터 or 공통 | +| 4 | B03/B04 등 기존 status UPDATE를 공통 유틸 호출로 교체 | B03/B04 Router | +| 5 | 각 단계 실행 시 `params` 저장 + 재진입 시 폼 프리필 | 각 WF Router/UI | +| 6 | 프론트: 세 UI를 `workflow-state` 기반 활성화로 통일 | B01, B03, `ui_template_workflow_layout` | +| 7 | 기존 프로젝트 백필 스크립트 + `workflow.json` 정리 | migration | + +--- + +## 7. 검증 체크리스트 + +- [x] 신규 프로젝트: 모든 단계 `NOT_STARTED`, stage 0만 진입 가능 +- [x] 파일 업로드 후 WF1 자동 분석 → stage 0/1 `COMPLETE`, stage 2 진입 가능 +- [x] WF2 완료 후 WF1으로 돌아가 재분석 → stage 2~6이 `STALE`로 전환되는지 +- [x] `STALE` 단계 재실행 시 `COMPLETE` 복귀 + 결과 파일 보존 확인 +- [x] 대시보드/파일입력/WF 레이아웃 세 곳의 버튼 활성화가 동일 규칙으로 일치 +- [x] 재분석 시 이전 `params`가 폼에 프리필되는지 (G5) +- [x] WF1 상태가 B03·B04 두 곳에서 중복 세팅되지 않는지 (단일 경로) +- [x] 전역 헤더(로그인/로그아웃)가 WF 레이아웃 헤더 토글과 무관하게 항상 표시되는지 + +--- + +## 8. 미해결/확인 필요 사항 (코더 착수 전 결정) + +1. **`projects.status` 유지 vs 제거**: 당장은 요약 캐시로 유지 권장(대시보드 정렬·필터 등 기존 참조 호환). 완전 제거는 참조처 전수 조사 후. +2. **STALE 하위 결과 파일 처리**: 낡은 결과 파일을 즉시 삭제할지, 재실행 시 덮어쓸지. 권장: **보존 후 재실행 시 덮어쓰기**(사용자가 비교/복구 가능). +3. **stage_key 명칭**: `FILE_INPUT`, `WF1_SURFACE`, `WF2_ROUTE`, `WF3_PROFILE_CROSS`, `WF4_DESIGN_DETAIL`, `WF5_QUANTITY`, `WF6_ESTIMATION` 로 확정 제안 (B0N 폴더명과 정합). diff --git a/docs/raw/verification/2026-07-12_verify_add_phase4_role.md b/docs/raw/verification/2026-07-12_verify_add_phase4_role.md new file mode 100644 index 0000000..12718f6 --- /dev/null +++ b/docs/raw/verification/2026-07-12_verify_add_phase4_role.md @@ -0,0 +1,8 @@ +# 검증 보고서: 4단계 기타 작업자 역할 추가 검증 + +* **검증일**: 2026-07-12 +* **검증 대상 파일**: [AGENTS.md](file:///C:/Program_coding/%EC%9E%84%EB%8F%84%EC%84%A4%EA%B3%84%20%EB%B0%8F%20%EA%B2%AC%EC%A0%81%EC%9E%90%EB%8F%99%ED%99%94%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%20%EA%B0%9C%EB%B0%9C/AGENTS.md) +* **검증 결과**: + 1. `#### 4단계: 기타 작업자 (위키 관리 / 작업 보조)` 역할이 `AGENTS.md`에 성공적으로 기술되었습니다. + 2. 3중 역할 분담 협업 체계 다이어그램에도 `[4. 위키 관리]` 흐름이 정확히 명시되었습니다. + 3. 사용자가 요청한 세부 조건(인제스트/린트 시 `.agents/instructions.md` 참조, 위키 업데이트 시 `docs/wiki`로 이동하여 `graphify .` 실행)이 올바르게 반영된 것을 확인하였습니다. diff --git a/docs/wiki 관리 이유.md b/docs/wiki 관리 이유.md new file mode 100644 index 0000000..ebc1a36 --- /dev/null +++ b/docs/wiki 관리 이유.md @@ -0,0 +1,8 @@ +1. 나는 누구인가: 나는 임도설계 실무자이자 Aislo(라이다 기반 임도 설계·견적 자동화 웹앱) 프로젝트의 기획·설계자야. 코드를 직접 작성하거나 깊이 이해하지는 못하지만, 도메인 전문성을 바탕으로 결과물(프론트엔드 화면, 산출물)을 보고 검증할 수 있는 능력이 있고, 이를 바탕으로 AI 코드 어시스턴트들에게 방향성과 구체적 지시를 내리는 사람이야. + +2. 기록의 목적 : 내가 기록하는 목적은 바이브 코딩 할 때 AI 코드 어시스턴스들과 더 효율적은 소통을 하고 개발하고 싶어. 웹앱을 프론트엔드, 백엔드, DB, API 등을 구조화 및 연결하여 AI코드 어시스턴스가 더욱 쉽게 문서 전체를 찾는게 아니라. 효과적으로 관련 문서들만 찾게 도움을 주고 같은 실수나 배경 설명을 줄이기 위해 사용하려고해. 그리고 al 어시스턴트 에이전트도 계획서 작성 > 코드작업 > 계획서의 체크리스트 점검 > 코드 검증 > 검증보고서 > 계획서 업데이트를 함으로써 항상 계획를 업데이트 함으로써 주기적인 관리도 맡기고 싶어. + - 심화 배경: 현재 상위 `.agent` 폴더에 백엔드/프론트엔드/DB/폴더구조/계획서/검증보고서 등 5~10개의 md 파일로 관리 중인데, 개발이 진행될수록 이 문서들이 비대해져서 컨텍스트·토큰 낭비를 일으키고 있음. 그 결과 AI와의 작업 흐름이 자주 끊기고, 코딩 방향성이 반복적으로 틀어지는 문제가 재발하고 있음. 필요한 것은 더 많은 기록이 아니라, 문서를 비대해지지 않게 서로 연결하고 정리해서 여러 AI 코드 어시스턴트들에게 필요한 부분만 효율적으로 공유하는 것. + +3. 최종 결과 : 라이다 데이터를 활용하여 임도 설계에 대한 자동화하는 웹앱 프로그램을 개발하고 싶어. + - 위키의 주 독자: AI 코드 어시스턴트 자신 (코드 작성 전후로 읽는 용도). 흐름은 사용자와 대화 → AI가 계획서 작성/업데이트 → 계획서가 위키 내용을 참조 → AI가 위키를 효율적으로 추적하되 함수·변수 단위, DB 컬럼 정보까지 내려가서 확인 가능해야 함. + - 사용자 본인이 위키를 직접 다시 찾아볼 일은 거의 없음. 대신 6개월 후의 AI(또는 새 세션의 AI)와 팀원이 이 위키를 보고 "왜 이렇게 설계했는지, 어떤 함수/변수를 썼는지, DB에 뭐가 있는지"를 스스로 파악해서 개선 작업이나 인수인계에 활용하는 것이 1년 후 이상적인 모습. \ No newline at end of file diff --git a/docs/wiki/AGENTS.md b/docs/wiki/AGENTS.md new file mode 100644 index 0000000..9c293fd --- /dev/null +++ b/docs/wiki/AGENTS.md @@ -0,0 +1,20 @@ +# wiki/ 폴더 규칙 + +AI가 raw/의 원본을 읽고 편집·유지하는 산출물 계층. 자세한 운영 규칙(Ingest/Query/Lint, 위키 규칙 14가지)은 `docs/CLAUDE.md`의 Wiki Schema 섹션을 따른다. + +## 구조 +- `index.md` — 전체 카탈로그. 모든 질의는 여기서 시작한다. +- `log.md` — 연대기 로그. append-only. +- `pages/B0x_이름/` — 프로젝트의 실제 B01~B09 폴더와 1:1 대응하는 페이지 단위 폴더. 하위에 `frontend.md`, `backend.md`, `db.md`, `api.md`, `dependencies.md`를 필요한 것만 생성한다. +- `concepts/` — 여러 페이지가 함께 쓰는 공유 자원의 1차 정의처. DB 스키마, 인증/RBAC, 저장 경로 규칙, 공통 유틸(`common_util_*`), API 공통 엔드포인트, 공통 Pydantic 스키마, 외부 라이브러리 의존성, workflow 상태 관리 등. + +## 작성 규칙 +- 모든 페이지에 YAML frontmatter 포함. `status`는 `draft`/`stable`/`stale` 셋 중 하나만 사용 (draft=계획서만 반영, stable=검증보고서로 확인, stale=raw 갱신됐는데 미반영). +- **`pages/` 하위 파일에는 반드시 `page_id: B0x_이름`(또는 `A0x_이름`)을 frontmatter에 추가한다.** 파일명(`frontend.md` 등)만으로는 소속 페이지를 알 수 없으므로, 폴더 밖에서 봐도 식별 가능해야 한다. concepts 파일에는 해당 없음. +- 내부 참조는 `[[페이지명]]` 위키링크 형식. +- 새 페이지를 만들기 전에 기존 페이지를 업데이트할 수 있는지 먼저 확인한다. +- 소스 요약은 사실만, 해석·종합은 concepts 페이지에서 다룬다. +- 계획서와 검증보고서가 충돌하면 **검증보고서를 채택**한다 (실제 코드 상태에 더 가까운 소스). 계획서 내용은 지우지 않고 "계획 당시 의도"로 남긴다. +- **공유 자원(두 페이지 이상이 쓰는 테이블·함수·API·의존성 등)은 concepts에만 정의한다.** 페이지 쪽 파일(`db.md` 등)에는 용도 설명 + 위키링크만 남긴다. concepts 쪽에는 사용처(역참조) 목록을 직접 적어 유지한다. +- **함수·API·테이블 등 개별 항목은 `항목 | 위치(파일:줄번호) | 역할` 표 형식으로만 기록한다.** 서술문 금지 — grep 없이 바로 코드 위치를 찾을 수 있어야 한다. +- **페이지(파일) 하나는 100줄을 넘지 않는다.** 넘으면 하위 주제별로 즉시 분할하고 index.md를 갱신한다. diff --git a/docs/wiki/CLAUDE.md b/docs/wiki/CLAUDE.md new file mode 100644 index 0000000..9c293fd --- /dev/null +++ b/docs/wiki/CLAUDE.md @@ -0,0 +1,20 @@ +# wiki/ 폴더 규칙 + +AI가 raw/의 원본을 읽고 편집·유지하는 산출물 계층. 자세한 운영 규칙(Ingest/Query/Lint, 위키 규칙 14가지)은 `docs/CLAUDE.md`의 Wiki Schema 섹션을 따른다. + +## 구조 +- `index.md` — 전체 카탈로그. 모든 질의는 여기서 시작한다. +- `log.md` — 연대기 로그. append-only. +- `pages/B0x_이름/` — 프로젝트의 실제 B01~B09 폴더와 1:1 대응하는 페이지 단위 폴더. 하위에 `frontend.md`, `backend.md`, `db.md`, `api.md`, `dependencies.md`를 필요한 것만 생성한다. +- `concepts/` — 여러 페이지가 함께 쓰는 공유 자원의 1차 정의처. DB 스키마, 인증/RBAC, 저장 경로 규칙, 공통 유틸(`common_util_*`), API 공통 엔드포인트, 공통 Pydantic 스키마, 외부 라이브러리 의존성, workflow 상태 관리 등. + +## 작성 규칙 +- 모든 페이지에 YAML frontmatter 포함. `status`는 `draft`/`stable`/`stale` 셋 중 하나만 사용 (draft=계획서만 반영, stable=검증보고서로 확인, stale=raw 갱신됐는데 미반영). +- **`pages/` 하위 파일에는 반드시 `page_id: B0x_이름`(또는 `A0x_이름`)을 frontmatter에 추가한다.** 파일명(`frontend.md` 등)만으로는 소속 페이지를 알 수 없으므로, 폴더 밖에서 봐도 식별 가능해야 한다. concepts 파일에는 해당 없음. +- 내부 참조는 `[[페이지명]]` 위키링크 형식. +- 새 페이지를 만들기 전에 기존 페이지를 업데이트할 수 있는지 먼저 확인한다. +- 소스 요약은 사실만, 해석·종합은 concepts 페이지에서 다룬다. +- 계획서와 검증보고서가 충돌하면 **검증보고서를 채택**한다 (실제 코드 상태에 더 가까운 소스). 계획서 내용은 지우지 않고 "계획 당시 의도"로 남긴다. +- **공유 자원(두 페이지 이상이 쓰는 테이블·함수·API·의존성 등)은 concepts에만 정의한다.** 페이지 쪽 파일(`db.md` 등)에는 용도 설명 + 위키링크만 남긴다. concepts 쪽에는 사용처(역참조) 목록을 직접 적어 유지한다. +- **함수·API·테이블 등 개별 항목은 `항목 | 위치(파일:줄번호) | 역할` 표 형식으로만 기록한다.** 서술문 금지 — grep 없이 바로 코드 위치를 찾을 수 있어야 한다. +- **페이지(파일) 하나는 100줄을 넘지 않는다.** 넘으면 하위 주제별로 즉시 분할하고 index.md를 갱신한다. diff --git a/docs/wiki/concepts/a00_app_shell_framework.md b/docs/wiki/concepts/a00_app_shell_framework.md new file mode 100644 index 0000000..6b4dc8f --- /dev/null +++ b/docs/wiki/concepts/a00_app_shell_framework.md @@ -0,0 +1,86 @@ +--- +status: stable +related_pages: ["[[A01_Home/A01_frontend]]", "[[A02_ProgDetail/A02_frontend]]", "[[B01_Dashboard/B01_frontend]]", "[[B08_wf5_Quantity/B08_frontend]]"] +last_updated: 2026-07-12 +source: A00_Common 공유 프레임워크 소스 코드 +--- + +# A00_Common — App Shell Framework + +모든 페이지의 공통 스켈레톤. 헤더(로고/네비/언어·테마/인증버튼) + 콘텐츠 아울렛 + 푸터를 통합 관리. + +## 파일 구성 + +| 파일 | 역할 | +|---|---| +| `app_shell.ts` (284줄) | 헤더·푸터 렌더링, 테마·언어 토글, 인증 상태별 버튼 채우기 | +| `b_page_scaffold.ts` (163줄) | B 그룹(B03~B09) 페이지용 스캐폴드—"준비 중" 임시 페이지 래퍼, 워크플로우 셸 헬퍼 | +| `router.ts` (158줄) | SPA 라우터(해시 기반), 인증 가드, 지연 로딩 | + +## app_shell 구성요소 + +### 테마 & 언어 관리 +- `initThemeAndLang()` — localStorage 복원 (THEME_STORAGE_KEY, LANG_STORAGE_KEY) +- `onApp_Theme_Toggle_Click()` — light ↔ dark 전환 +- `onApp_Lang_Toggle_Click()` — 한국어 ↔ 영문 전환 + 현재 페이지 재렌더 + +### 헤더 구성 (64px 높이, sticky) +- **로고**: `BRAND_ICON_URL`(prog_icon.jpg) + 브랜드명("Aislo") +- **네비게이션**: 5개 링크 + - App_Nav_Program → A02_PROG_DETAIL + - App_Nav_Company → A03_COMP_DETAIL + - App_Nav_News → A04_NEWS_HISTORY + - App_Nav_Education → A05_EDU_DETAIL + - App_Nav_Support → A08_SUPPORT +- **우측 액션**: + - 언어 버튼 ("EN" / "한") + - 테마 버튼 ("☀" / "☾") + - 인증 버튼 (로그인/회원가입 또는 계정/로그아웃) + +### 인증 버튼 (비동기 fillAuthActions) +**미로그인 상태**: "로그인", "회원가입" +**로그인 상태**: 사용자명(또는 "내 계정"), "로그아웃" + +### 로그아웃 (onApp_Logout_Click) +- `A06_Login.logout()` 호출 → 세션 쿠키 제거 +- 오류 무시 후 홈(`A01_HOME`)으로 이동 + +### 푸터 +- 높이 56px +- 저작권 텍스트 (App_Footer_Copyright) + +## router 라우팅 테이블 + +| 라우트 | 렌더 함수 위치 | +|---|---| +| A01_HOME | A01_Home/A01_Home_UI_Page.ts | +| A02_PROG_DETAIL | A02_ProgDetail/A02_ProgDetail_UI_Page.ts | +| A03_COMP_DETAIL | A03_CompDetail/A03_CompDetail_UI_Page.ts | +| A04_NEWS_HISTORY | A04_NewsHistory/A04_NewsHistory_UI_Page.ts | +| A05_EDU_DETAIL | A05_EduDetail/A05_EduDetail_UI_Page.ts | +| A06_LOGIN | A06_Login/A06_Login_UI_Auth_Page.ts | +| A07_REGISTER | A07_Register/A07_Register_UI_Auth_Page.ts | +| A08_SUPPORT | A08_Support/A08_Support_UI_Page.ts | +| A09_SECURITY | A09_Security/A09_Security_UI_Page.ts | +| B01_ACCOUNT | B01_Dashboard/B01_Dashboard_UI_Page.ts | +| B02_PROJ_REGISTER | B02_ProjRegister/B02_ProjRegister_UI_Page.ts | +| B03_FILE_INPUT | B03_FileInput/B03_FileInput_UI_Page.ts | +| B04_WF1_SURFACE | B04_wf1_Surface/B04_wf1_Surface_UI_Page.ts | +| B05_WF2_ROUTE | B05_wf2_Route/B05_wf2_Route_UI_Page.ts | +| B06_WF3_PROFILE_CROSS | B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page.ts | +| B07_WF4_DESIGN_DETAIL | B07_wf4_DesignDetail/B07_wf4_DesignDetail_UI_Page.ts | +| B08_WF5_QUANTITY | B08_wf5_Quantity/B08_wf5_Quantity_UI_Page.ts | +| B09_WF6_ESTIMATION | B09_wf6_Estimation/B09_wf6_Estimation_UI_Page.ts | +| B10_PAYMENT | B10_Payment/B10_Payment_UI_Page.ts | +| B11_STATUS | B11_Status/B11_Status_UI_Page.ts | + +## 인증 가드 + +- **PROTECTED_ROUTES** (config_frontend.ts 정의): 토큰 없으면 A06_LOGIN으로 리다이렉트 +- **워크플로우 라우트** (B02~B11): 추가 검증 + - 사용자 없음 → A06_LOGIN으로 리다이렉트 + - company_id 미보유 & SYSTEM_ADMIN 아님 → B01_ACCOUNT로 리다이렉트 (회사 가입 강제) + +## 세부 스캐폴드·CSS·종속성 + +`b_page_scaffold`, CSS 주입, 공통 종속성, 전체 사용처는 [[a00_app_shell_framework_scaffold]]에 분리했다. diff --git a/docs/wiki/concepts/a00_app_shell_framework_scaffold.md b/docs/wiki/concepts/a00_app_shell_framework_scaffold.md new file mode 100644 index 0000000..1c9755b --- /dev/null +++ b/docs/wiki/concepts/a00_app_shell_framework_scaffold.md @@ -0,0 +1,37 @@ +--- +type: concept +status: stable +related_pages: ["[[a00_app_shell_framework]]", "[[B08_wf5_Quantity/B08_frontend]]", "[[B09_wf6_Estimation/B09_frontend]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 A00_Common 코드 및 페이지 인제스트 대조 (2026-07-12) +--- + +# A00_Common — 스캐폴드·CSS·종속성 + +## b_page_scaffold +| 항목 | 역할 | +|---|---| +| `renderPendingContent` | 비 workflow 페이지용 준비 중 블록 | +| `renderPendingWorkflow` | workflow 셸과 좌·우 준비 중 영역 | +| `workflowSteps()` | 7단계 workflow 라벨 배열 | + +## CSS 인젝션 +| 항목 | 역할 | +|---|---| +| `injectShellStyles` | 셸 스타일을 ``에 1회 주입 | +| `app-shell-style` | 헤더·아울렛·푸터 스타일 ID | +| theme 변수 | 헤더 64px·푸터 56px·아울렛 최소높이 | + +## 종속성 +| 항목 | 역할 | +|---|---| +| `ui_template_locale.ts` | 언어 상태·문자열 | +| `ui_template_elements.ts` | 버튼·workflow 셸 | +| `config_frontend.ts` | routes·theme·protected routes | +| `A06_Login_Api_Fetch.ts` | 세션 조회·로그아웃 | + +## 사용처 +| 페이지 | 역할 | +|---|---| +| A01~A09 | 공통 헤더·푸터·아울렛 | +| B01~B09 | 페이지별 workflow 셸·단계 내비게이션 | diff --git a/docs/wiki/concepts/api_common.md b/docs/wiki/concepts/api_common.md new file mode 100644 index 0000000..bf1359a --- /dev/null +++ b/docs/wiki/concepts/api_common.md @@ -0,0 +1,27 @@ +--- +type: concept +status: stable +related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]"] +last_updated: 2026-07-12 +source: raw/plans/plan_workflow_state_management.md, raw/guidelines/backend.md + 실 코드 확인 2026-07-12 +--- + +# API 공통 (여러 페이지가 공유하는 엔드포인트) + +## 공통 오류 응답 포맷 (전 라우터) +```json +{"status": "error", "message": "원인"} +``` +→ [[schema_common]] + +## 워크플로우 상태 조회 +| 항목 | 위치 | 역할 | +|---|---|---| +| `GET /api/projects/{project_id}/workflow-state` | `B03_FileInput_Router.py:667` | 단일 프로젝트의 `current_stage`와 `stages[]` 조회 | +| `get_workflow_states_for_projects()` | `B01_Dashboard_Repository.py:83` | [[B01_Dashboard/B01_backend|B01_Dashboard]] 목록용 다중 프로젝트 상태 배치 조회 | + +상태 모델과 사용처: [[workflow_state]]. + +## 폴링 패턴 (legacy workflow.json 설계; 현재 구현은 workflow-state API 사용) +- 클라이언트가 3초마다 `GET /api/projects/{project_id}/workflow` 호출 +- 과거 설계의 stale 감지 UX 참고용이며, 실제 상태 조회는 [[workflow_state]] API를 사용한다. diff --git a/docs/wiki/concepts/auth_rbac.md b/docs/wiki/concepts/auth_rbac.md new file mode 100644 index 0000000..8ef5e82 --- /dev/null +++ b/docs/wiki/concepts/auth_rbac.md @@ -0,0 +1,69 @@ +--- +type: concept +status: stable +related_pages: ["[[B01_Dashboard/B01_backend]]"] +last_updated: 2026-07-12 +source: raw/guidelines/backend.md, raw/guidelines/frontend.md, raw/guidelines/agent.md +--- + +# 인증 / RBAC + +## 세션 인증 (backend.md 6.3) +- 방식: Secure HttpOnly 세션 쿠키 (`session_id`, JWT 아님), `SameSite=Lax` +- 저장소: `sessions` 테이블 → [[db_schema/users_auth]] +- 유효시간: 활동 기준 4시간 또는 절대 12시간 중 먼저 도달하는 쪽 +- DB 풀: `autocommit=True` (세션 즉시 조회 가능하도록) +- 프론트: 모든 API 요청에 `credentials: "include"` (frontend.md 5.1) + +## OTP / 비밀번호 +- OTP 6자리, 5분 유효, 해시 저장(bcrypt/PBKDF2), 재시도 최대 3회(2s/4s/8s 백오프) +- 비밀번호 최소 8자, bcrypt(라운드≥12) 또는 PBKDF2, 평문 저장 절대 금지 +- 5회 연속 실패 시 계정 15분 잠금 + +## 사용자 상태 생명주기 +``` +PENDING_EMAIL → NO_COMPANY → (PENDING | ACTIVE) → (INACTIVE | REJECTED) +``` +| 상태 | 접근 가능 범위 | +|---|---| +| NO_COMPANY | 로그인 가능, B01만 (B02~B11 차단) | +| PENDING | 로그인 가능, B01만 (승인 대기) | +| ACTIVE | 전체 (B01 + B02~B11) | + +## 역할 (users.role) +| 역할 | 전체회사조회 | 역할변경 | 팀원관리 | 가입승인 | 프로젝트조회 범위 | +|---|---|---|---|---|---| +| SYSTEM_ADMIN | ✅ | ✅ | ✅ | ✅ | 전체 | +| ADMIN | ✗ | ✗ | ✅(자기회사) | ✅(자기회사) | 회사별 | +| USER | ✗ | ✗ | ✗ | ✗ | 회사별 | + +`is_master` 플래그: TRUE=회사 생성자/ADMIN(팀원 승인권), FALSE=일반 팀원 + +## 권한 검증 헬퍼 (B01_Dashboard) +| 항목 | 위치 | 역할 | +|---|---|---| +| `_can_edit_project()` | `B01_Dashboard_Router.py:79` | 역할·회사 기준 프로젝트 수정 권한 | +| `_can_manage_automation()` | `B01_Dashboard_Router.py:87` | USER 차단과 프로젝트 범위 검사 | +| `_can_edit_user()` | `B01_Dashboard_Router.py:93` | 사용자 수정 범위 검사 | +| `count_company_admins()` | `B01_Dashboard_Repository.py:584` | 마지막 ADMIN 삭제·강등 방지 | +| `canEditProject()` 외 5개 | `B01_Dashboard_UI_Helper.ts:3` | 프론트 표시 제어; 백엔드 권한을 대체하지 않음 | + +**원칙:** 백엔드가 모든 수정/삭제/역할변경 API에서 반드시 재검증 (프론트 UI는 표시 제어만, 신뢰 금지). 위반 시 403 `{"status":"error","message":"Access denied"}`. + +## 인증 갱신 +로그인 시 `users.auth_expires_at = NOW() + 3개월` 자동 연장. 만료 시 재인증 모달. + +## 라우팅 가드 (frontend.md 5.2) +B02~B11 진입 시 `fetchDashboardMe()` → `company_id`+`status` 확인 → NO_COMPANY/PENDING이면 B01로 강제 리다이렉트. + +## 사용처 (역참조) +- [[B01_Dashboard/B01_backend|B01_Dashboard]] — 권한 헬퍼 5종, RBAC 접근제어 +- [[A06_Login/A06_backend]] — 세션 발급/OTP 재인증, 상태 확인 +- [[A07_Register/A07_backend]] — 사용자 상태 생명주기(PENDING_EMAIL→NO_COMPANY) +- [[A09_Security/A09_backend]] — require_master/require_system_admin 권한 데코레이터 + +## ⚠️ 계획서-실코드 불일치 (A그룹 인제스트 발견) +이 페이지의 세션/OTP 정책은 **계획서 기준**(세션 12h/4h 만료, OTP 5분·재시도3회·5회실패 15분잠금)이나, +실 코드([[A06_Login/A06_backend]])는 `auth_expires_at = NOW()+3개월` 갱신·신규브라우저/주기 재인증 OTP·5회실패시 관리자 알림 메일 방식. +[[A09_Security/A09_frontend]] 약관 텍스트도 계획서 기준(12h/4h)으로 표기됨. +→ 규칙6(실 코드 우선)에 따라 실 정책 검증 후 이 페이지 갱신 필요. 계획 당시 의도로 위 내용은 보존. diff --git a/docs/wiki/concepts/common_util.md b/docs/wiki/concepts/common_util.md new file mode 100644 index 0000000..52b7fd8 --- /dev/null +++ b/docs/wiki/concepts/common_util.md @@ -0,0 +1,35 @@ +--- +type: concept +status: stable +related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]", "[[B05_wf2_Route/B05_backend]]", "[[B06_wf3_ProfileCross/B06_backend]]"] +last_updated: 2026-07-12 +source: raw/guidelines/structure.md, raw/guidelines/backend.md +--- + +# 공통 유틸 (common_util/) + +> 둘 이상의 페이지가 실제로 공유하는 경로·원자적 파일쓰기·기하 유틸만 이 폴더에 배치 (migration_plan.md 2.2) + +| 파일 | 역할 | 사용처 | +|---|---|---| +| `common_util_validate.ts` | 프론트 1차 유효성 검사 (이메일/빈값/최소길이) | 전 페이지 | +| `common_util_auth.py` | 비밀번호·OTP·세션 쿠키·권한 검증 | 전 페이지 → [[auth_rbac]] | +| `common_util_auth_repository.py` | 인증·조직·관리 Raw SQL 저장소 | 인증 관련 | +| `common_util_email.py` | 비동기 SMTP 발송+재시도(최대3회) | OTP/승인 알림 | +| `common_util_email_templates.py` | 인증·조직 알림 이메일 템플릿 | common_util_email.py | +| `common_util_string.ts` | 문자열 유틸 | 미상세 | +| `common_util_storage.py` | 프로젝트·워크플로우 단계별 저장 경로 | → [[storage_paths]] | +| `common_util_json.py` | JSON 원자적 저장 | workflow.json 등 | +| `common_util_workflow.py` | 공유 workflow.json 상태 처리 | ⚠️ [[workflow_state]] 재설계로 대체/정리 예정 | +| `common_util_resource_monitor.py` | 시스템 리소스 계측(2분 주기) + log + DB 기록 | `sample_resources_loop()` → [[B01_Dashboard/B01_backend|B01_Dashboard]] | +| `common_util_format.py` | 포맷 유틸 | 미상세 | + +## 이메일 발송 (common_util_email.py) +- 개발: Google Gmail SMTP / 상용: Google Workspace 또는 AWS SES +- 발송 유형: OTP, 가입확인, 팀원승인요청(ADMIN), 승인/거부결과, 회사참여신청(SYSTEM_ADMIN), 인증갱신알림 + +## 리소스 모니터링 (common_util_resource_monitor.py) +- `main.py` lifespan에서 `asyncio.create_task` 등록/취소 +- 계측: `psutil.cpu_percent`, `psutil.virtual_memory().percent`, `shutil.disk_usage` +- 이중 기록: `system_resources` 테이블 (DB) + `log/system_resources.log` (탭 구분 1줄, `.gitignore`) +- 30일 롤링 삭제 (DB `DELETE`, 로그파일 오래된 줄 제거) diff --git a/docs/wiki/concepts/db_schema/files_surface.md b/docs/wiki/concepts/db_schema/files_surface.md new file mode 100644 index 0000000..67fa16b --- /dev/null +++ b/docs/wiki/concepts/db_schema/files_surface.md @@ -0,0 +1,95 @@ +--- +type: concept +status: stable +related_pages: ["[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]"] +last_updated: 2026-07-12 +source: raw/guidelines/db_schema.md +--- + +# DB: 파일/지표면분석 테이블 + +← [[overview]] + +## upload_sessions (업로드 세션) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `varchar(36)` | NO | PRI | 세션 UUID | +| `project_id` | `varchar(36)` | NO | MUL | FK→projects.id | +| `original_filename` | `varchar(255)` | NO | | 원본 파일명 | +| `file_size_bytes` / `chunk_size_bytes` | `bigint(20)` | NO | | 파일크기 / 청크크기 | +| `total_chunks` / `completed_chunks` | `int(11)` | - | | 전체 청크수 / 완료 청크수 | +| `status` | `enum('PENDING','IN_PROGRESS','COMPLETED','FAILED')` | YES | MUL | `PENDING` | +| `created_at` / `updated_at` | `timestamp` | YES | | 생성 / 최종수정 일시 | + +## upload_chunks (업로드 청크 데이터) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `session_id` | `varchar(36)` | NO | MUL | FK→upload_sessions.id | +| `chunk_index` | `int(11)` | NO | | 청크 인덱스 (0, 1, 2...) | +| `chunk_hash` | `varchar(64)` | YES | | 청크 검증용 체크섬 | +| `size_bytes` | `bigint(20)` | NO | | 청크 용량 | +| `stored_at` | `varchar(255)` | YES | | 임시 파일 저장 경로 | +| `completed_at` | `timestamp` | YES | MUL | 완료 일시 | + +## input_files (입력 원본 파일) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `project_id` | `char(36)` | NO | MUL | FK→projects.id | +| `file_type` | `varchar(50)` | YES | | `las`/`tif`/`prj`/`tfw`/`dxf` 등 | +| `original_filename` / `raw_file_path` | `varchar` | NO | | 파일명 / storage 상대경로 | +| `file_size_mb` | `float` | YES | | 파일 크기 (MB) | +| `upload_by` / `upload_at` | - | - | MUL | 업로드 유저 FK / 일시 | +| `crs_epsg` | `int(11)` | YES | | EPSG 좌표계 정보 | +| `metadata` | `longtext` | YES | | 헤더/포인트수 등 분석 JSON | +| `status` | `varchar(50)` | YES | | `UPLOADED` ➡️ `PROCESSED` ➡️ `ARCHIVED` | + +## processed_point_cloud (필터/변환 포인트클라우드) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `input_file_id` / `project_id` | - | NO | MUL | FK→input_files / projects | +| `process_type` | `varchar(50)` | YES | | 변환 필터 분류 | +| `processed_file_path` / `converted_file_path` | `varchar` | YES | | 저장 경로 / PLY/LAZ 경로 | +| `converted_format` | `varchar(50)` | YES | | 변환 포맷 | +| `point_count` | `int(11)` | YES | | 포인트 개수 | +| `min_z` / `max_z` / `mean_z` | `float` | YES | | 고도 최저 / 최고 / 평균 | +| `x_min` ~ `y_max` | `float` | YES | | X/Y 좌표 바운딩 박스 범위 | +| `density_per_sqm` | `float` | YES | | ㎡당 점 밀도 | +| `classification_summary` | `longtext` | YES | | ground/unclassified 통계 | +| `processing_params` | `longtext` | YES | | 분석 파라미터 JSON | +| `processed_at` / `status` | - | - | | 변환 일시 / `PROCESSING`\|`COMPLETE`\|`FAILED` | + +## surface_models (지표면 모델 및 등고선) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `project_id` | `char(36)` | NO | MUL | FK→projects.id | +| `model_type` | `varchar(50)` | YES | | `dem_grid`/`tin`/`mesh`/`contour` | +| `source_file_id` / `processed_cloud_id` | `int(11)` | YES | MUL | FK→input_files / processed | +| `status` | `varchar(50)` | YES | | `PROCESSING` ➡️ `COMPLETE` / `FAILED` | +| `crs_epsg` / `resolution_m` | - | YES | | EPSG 좌표 / DEM 격자 해상도 | +| `model_file_path` | `varchar(500)` | YES | | 스토리지 상대 경로 | +| `generation_params` | `longtext` | YES | | 격자화 알고리즘 인자 JSON | +| `created_at` / `completed_at` | `timestamp` | - | | 생성 / 완료 일시 | + +## terrain_layers (지형 레이어) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `surface_model_id` | `int(11)` | NO | MUL | FK→surface_models.id | +| `layer_name` | `varchar(100)` | YES | | 레이어 영문/한글 식별자 | +| `geometry_type` | `varchar(50)` | YES | | `POINTCLOUD`/`GRID`/`MESH`/`CONTOUR` | +| `layer_file_path` | `varchar(500)` | YES | | 개별 레이어 실 파일 경로 | +| `file_format` / `file_size_mb` | - | YES | | 포맷 (ply, tfw, las 등) / 크기 | +| `statistics` | `longtext` | YES | | 통계 수치 JSON | +| `created_at` | `timestamp` | NO | | 생성 일시 | + +## input_files.status 값 +`UPLOADED → PROCESSED → ARCHIVED` + +## surface_models.status / processed_point_cloud.status 값 +`PROCESSING → COMPLETE / FAILED` + +관련 함수 위치 → [[B04_wf1_Surface/B04_db]], 사용 라이브러리 → [[dependencies]] diff --git a/docs/wiki/concepts/db_schema/logs_monitoring.md b/docs/wiki/concepts/db_schema/logs_monitoring.md new file mode 100644 index 0000000..571f9f0 --- /dev/null +++ b/docs/wiki/concepts/db_schema/logs_monitoring.md @@ -0,0 +1,102 @@ +--- +type: concept +status: stable +related_pages: ["[[B01_Dashboard/B01_backend]]"] +last_updated: 2026-07-12 +source: raw/guidelines/db_schema.md, raw/guidelines/backend.md +--- + +# DB: 로그/모니터링 테이블 + +← [[overview]] + +## login_logs (로그인 시도 로그) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `bigint(20)` | NO | PRI | `auto_increment` | +| `user_id` | `int(11)` | YES | MUL | FK→users.id | +| `email` | `varchar(255)` | NO | | | +| `status` | `enum('SUCCESS','FAILURE')` | NO | | | +| `failure_reason` / `user_agent` | `varchar(100)` / `text` | YES | | | +| `login_at` | `timestamp` | NO | MUL | `current_timestamp()` | + +## activity_logs (사용자 활동 로그) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `bigint(20)` | NO | PRI | `auto_increment` | +| `user_id` | `int(11)` | NO | MUL | FK→users.id | +| `action_type` | `varchar(100)` | NO | | 행위 종류 | +| `action_at` | `timestamp` | NO | | `current_timestamp()` | +| `resource_id` / `status` | `varchar(255)` / `enum` | - | | 리소스 ID / SUCCESS\|FAILURE | +| `details` | `longtext` | YES | | JSON 상세 데이터 | + +## audit_logs (감사 로그) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `user_id` | `int(11)` | YES | MUL | FK→users.id | +| `action` / `entity_type` | `varchar(100)` | YES | | CRUD/EXPORT/DOWNLOAD 등 | +| `entity_id` | `varchar(36)` | YES | | 대상 UUID 등 | +| `timestamp` / `ip_address` | `timestamp` / `varchar(45)` | - | | 발생시각 / IP 주소 | +| `details` | `longtext` | YES | | JSON 상세 | + +## system_audit_logs (프로젝트/조직 변경 감사 로그) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `user_id` | `int(11)` | NO | MUL | FK→users.id (행위자) | +| `action` / `resource_type` | `varchar(50)` | - | | PROJECT_CREATE 등 / 종류 | +| `resource_id` | `int(11)` | YES | | | +| `timestamp` | `timestamp` | YES | MUL | `current_timestamp()` | +| `ip_address` / `user_agent` | `varchar(50)` / `text` | YES | | IP 주소 / 브라우저 에이전트 | + +## system_admin_logs (시스템 관리자 행위 로그) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `bigint(20)` | NO | PRI | `auto_increment` | +| `admin_user_id` | `int(11)` | NO | MUL | FK→users.id (관리자 ID) | +| `action_type` / `target_id` | `varchar(100)` / `varchar(255)`| - | | 변경종류(USER_STATUS) / 대상 ID | +| `action_at` | `timestamp` | NO | | `current_timestamp()` | +| `details` | `longtext` | YES | | JSON 형태의 변경 상세 | + +## system_resources (시스템 자원 계측) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `timestamp` | `timestamp` | YES | MUL | `current_timestamp()` | +| `cpu_usage_percent` / `memory_usage_percent` | `float` | YES | | | +| `disk_usage_percent` / `total_storage_mb` | `float` | - | | 디스크사용률 / 전체 스토리지 용량 | +| `active_user_count` / `active_project_count` | `int(11)` | NO | | 활성 사용자 / 프로젝트 수 | + +## support_requests (기술 지원 요청) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `company_id` | `int(11)` | YES | MUL | FK→companies.id | +| `company_name` / `user_name` | `varchar(255)` | - | | 회사명 / 작성자명 | +| `user_email` / `user_phone` | `varchar(255)` / `varchar(30)` | - | | 이메일 / 전화번호 | +| `subject` / `message` | `varchar(255)` / `text` | NO | | 제목 / 문의 메시지 본문 | +| `status` | `enum('NEW','REVIEWED','RESOLVED','DELETED')` | NO | MUL | `NEW` | +| `reviewed_by` | `int(11)` | YES | MUL | FK→users.id (검토자) | +| `created_at` / `reviewed_at` / `review_notes` | - | - | | 접수 / 검토일시 / 메모 | + +## change_logs (설계 변경 이력) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `project_id` | `char(36)` | NO | | FK→projects.id | +| `changed_by` | `int(11)` | YES | MUL | FK→users.id (수정자) | +| `changed_at` | `timestamp` | NO | | `current_timestamp()` | +| `entity_type` / `entity_id` | `varchar(100)` / `int(11)` | YES | | 대상엔티티(routes 등) / 대상 PK | +| `old_value` / `new_value` | `longtext` | YES | | 변경 전 / 후 JSON 스냅샷 | +| `reason` | `varchar(255)` | YES | | 변경 사유 | + +**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]] (SYSTEM_ADMIN 리소스 현황·시스템 로그 섹션), [[A08_Support/A08_backend|A08_Support]] (support_requests INSERT) + +## system_audit_logs — 사용처 (B01, B02) +- **프로젝트 생성**: `B02_ProjRegister_Repository.py:92` (`PROJECT_CREATE` 기록 ➡️ [[B02_ProjRegister/B02_backend]]) +- **기타 관리 행위**: `B01_Dashboard_Repository.py:245,265` (수정·삭제), `:336,367` (회사 생성), `:609` (감사 로그 조회), `:758,779` (자동화 제어) + +## 리소스 API (SYSTEM_ADMIN 전용) +`GET /api/dashboard/admin/resources?days=30` +- 실시간 계측(`current`), 30일 다운샘플링 시계열 조회(`history`, ~4MB ➡️ ~55KB 압축), 활성 지표(`stats`) 제공. diff --git a/docs/wiki/concepts/db_schema/overview.md b/docs/wiki/concepts/db_schema/overview.md new file mode 100644 index 0000000..d871c97 --- /dev/null +++ b/docs/wiki/concepts/db_schema/overview.md @@ -0,0 +1,64 @@ +--- +type: concept +status: stable +related_pages: [] +last_updated: 2026-07-12 +source: raw/guidelines/db_schema.md, raw/guidelines/agent.md +--- + +# DB 스키마 개요 + +**DB명:** `aislo_db` / MariaDB v10.6+ / utf8mb4_unicode_ci / 드라이버 aiomysql + +> ✅ **모순 해결 (2026-07-12, 실 DB 직접 조회 `SHOW TABLES`로 검증):** 실제 운영 DB는 **34개 테이블**. `db_schema.md`(34개)가 정확했고 `agent.md`의 18개/23개는 갱신 안 된 값 — agent.md 쪽 오기로 판정. +> +> **raw 문서에 없던 실제 테이블 2개 발견:** +> - `project_workflow_stages` — [[../workflow_state]] 설계가 **이미 구현되어 실 DB에 존재**함 (컬럼 구성이 계획서와 정확히 일치). status를 draft→stable로 갱신함. +> - `system_admin_logs` — 시스템 관리자(SYSTEM_ADMIN)가 회원/조직 상태(`status`) 등을 변경할 때 감사 이력을 INSERT하는 Write-Only 성격의 테이블 ➡️ [[logs_monitoring]]. +> +> ⚠️ **미확정/미연동 테이블 격리 규칙**: +> - 분석 중이거나 소스코드와의 구체적인 연결고리(백엔드/프론트엔드 실사용처)가 아직 확정되지 않은 테이블이 신규 추가될 경우, 상위 공식 그룹 파일에 포함하지 않고 [[unconfirmed/README|미확정 폴더(unconfirmed/)]] 내에 개별 `[테이블명].md` 마크다운 파일로 저장하여 격리 관리합니다. + +## 테이블 그룹 (9개) + +| 그룹 | 테이블 수 | 상세 페이지 | +|---|---|---| +| 사용자/인증/조직 (핵심) | 7 | [[users_auth]] | +| 로그/모니터링 | 8 | [[logs_monitoring]] | +| 프로젝트 관리 | 3 | [[projects]] | +| 파일/지표면분석 | 6 | [[files_surface]] | +| 경로/종횡단 | 5 | [[route_profile]] | +| 구조물/수량/산출물 | 4 | [[structure_output]] | +| 미확정/연결 대기 테이블 | 0 | [[unconfirmed/README]] | + +## 파일 경로 추적 컬럼 (DB에 경로만 기록, 실 파일은 파일시스템) + +| 테이블.컬럼 | 용도 | 사용 단계 | +|---|---|---| +| `input_files.raw_file_path` | 원본 입력 파일 | B03 | +| `processed_point_cloud.converted_file_path` | 변환된 포인트클라우드 | B04 | +| `surface_models.model_file_path` | 지표면 모델 | B04 | +| `routes.route_data_path` | 경로 데이터(GeoJSON) | B05 | +| `longitudinal_sections.longitudinal_file_path` | 종단면 | B06 | +| `cross_sections.cross_section_file_path` | 횡단면 | B06 | +| `structures.structure_data_path` | 구조물 배치 | B07 | +| `quantity_items.quantity_data_path` | 수량 항목 | B08 | +| `outputs.outputs_directory_path` | 산출물 폴더 | B09 | +| `output_files.output_file_path` | 개별 산출 파일 | B09 | + +상세 경로 규칙 → [[storage_paths]] + +## 설계 원칙 +- DB에는 "어디에 무엇이 있는가"의 메타정보만 저장. 실제 대용량 파일(LAS/PLY/TIF/DXF/Excel/PDF/JSON)은 파일시스템. +- 공간 기하 데이터(GEOMETRY 타입 미지원) → JSON(GeoJSON 형식)으로 저장, 애플리케이션(Shapely/Geopandas)에서 파싱. +- 모든 주요 테이블에 soft delete(`deleted_at`) 적용. + +## 테이블 관계 (핵심 흐름) +``` +users ─company_id→ companies +projects ─user_id/company_id→ users/companies + └→ input_files → processed_point_cloud → surface_models → terrain_layers + └→ routes → route_points/route_statistics/longitudinal_sections/cross_sections → structures + └→ quantity_items + └→ outputs → output_files +``` diff --git a/docs/wiki/concepts/db_schema/projects.md b/docs/wiki/concepts/db_schema/projects.md new file mode 100644 index 0000000..6ef1efc --- /dev/null +++ b/docs/wiki/concepts/db_schema/projects.md @@ -0,0 +1,56 @@ +--- +type: concept +status: stable +related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B02_ProjRegister/B02_backend]]"] +last_updated: 2026-07-12 +source: raw/guidelines/db_schema.md, raw/plans/plan_workflow_state_management.md +--- + +# DB: 프로젝트 관리 테이블 + +← [[overview]] + +## projects (프로젝트) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `char(36)` | NO | PRI | 프로젝트 UUID | +| `user_id` / `company_id` | `int(11)` | NO | MUL | FK→users/companies | +| `name` | `varchar(255)` | NO | | 프로젝트명 | +| `region` / `road_type` | `varchar(100)` | YES | | 지역 / 임도종류 | +| `project_year` | `int(11)` | YES | | 사업년도 | +| `estimated_length_m` | `float` | YES | | 계획 연장(m) | +| `memo` | `text` | YES | | 메모 | +| `status` | `varchar(50)` | YES | | `NEW` (호환용 캐시) | +| `crs_epsg` | `int(11)` | YES | | `5178` (좌표계 EPSG) | +| `storage_path` | `varchar(500)` | YES | | 상대경로 ➡️ [[storage_paths]] | +| `created_at` / `updated_at` / `deleted_at` | `timestamp` | - | | 생성 / 수정 / soft-delete | + +**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]] (목록), [[B02_ProjRegister/B02_backend|B02_ProjRegister]] (생성) + +## project_versions (프로젝트 버전 스냅샷) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `project_id` | `char(36)` | NO | MUL | FK→projects.id | +| `version_num` | `int(11)` | NO | | 버전 번호 | +| `status` | `varchar(50)` | YES | | 버전 상태 | +| `data` | `longtext` | YES | | 설계 스냅샷 JSON 데이터 | +| `snapshot_at` / `created_at` | `timestamp` | NO | | 생성일시 | + +## project_automations (프로젝트 자동화 정책) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `project_id` | `char(36)` | NO | MUL | FK→projects.id | +| `name` | `varchar(100)` | NO | | 자동화 명칭 | +| `logic_type` | `varchar(50)` | NO | | `trigger_on_stage_complete` 등 | +| `config_json` | `longtext` | NO | | 설정 값 JSON | +| `status` | `enum('DRAFT','ACTIVE','INACTIVE')` | NO | MUL | `DRAFT` | +| `created_by` / `updated_by` | `int(11)` | - | MUL | FK→users.id | +| `last_executed_at` | `datetime` | YES | | 최종 실행 일시 | + +**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]] (자동화 로직 관리, USER는 조회 차단) + +## project_workflow_stages (단계별 상세 상태) +- 본 테이블은 워크플로우 7단계(stage 0~6)의 세부 진행도(state, params, progress_percent 등)를 관리하는 SSOT입니다. +- 상세 테이블 정보 및 사용처 ➡️ [[workflow_state]] diff --git a/docs/wiki/concepts/db_schema/route_profile.md b/docs/wiki/concepts/db_schema/route_profile.md new file mode 100644 index 0000000..b412faf --- /dev/null +++ b/docs/wiki/concepts/db_schema/route_profile.md @@ -0,0 +1,69 @@ +--- +type: concept +status: stable +related_pages: ["[[B05_wf2_Route/B05_backend]]", "[[B06_wf3_ProfileCross/B06_backend]]"] +last_updated: 2026-07-12 +source: raw/guidelines/db_schema.md +--- + +# DB: 경로/종횡단 테이블 + +← [[overview]] + +## routes (노선 경로) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `project_id` | `char(36)` | NO | MUL | FK→projects.id | +| `surface_model_id` | `int(11)` | YES | MUL | FK→surface_models.id | +| `status` | `varchar(50)` | YES | | `DRAFT` ➡️ `CONFIRMED` ➡️ `ARCHIVED` | +| `start_chainage_m` / `end_chainage_m` | `float` | YES | | 시작 시점 / 끝 시점 연장(m) | +| `total_length_m` | `float` | YES | | 총 연장(m) | +| `grade_percent` | `longtext` | YES | | 경사도 정보 JSON | +| `constraints` / `algorithm_params` | `longtext` | YES | | 회피 구역 JSON / 알고리즘 가중치 파라미터 JSON | +| `route_data_path` | `varchar(500)` | YES | | 노선 데이터 (GeoJSON) 파일 경로 | +| `computed_at` / `created_at` | - | - | | 연산 완료 일시 / 생성 일시 | + +## route_points (경로 좌표점) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `route_id` | `int(11)` | NO | MUL | FK→routes.id | +| `chainage_m` | `float` | YES | | 시점 거리(m) | +| `elevation_m` / `slope_percent` | `float` | YES | | 표고(m) / 종단 경사율(%) | +| `sequence_num` | `int(11)` | YES | | 점 순서 | + +## route_statistics (노선 통계) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `route_id` | `int(11)` | NO | MUL | FK→routes.id | +| `min_slope` / `max_slope` / `mean_slope` | `float` | YES | | 최저 / 최고 / 평균 경사(%) | +| `cut_volume_m3` / `fill_volume_m3` | `float` | YES | | 절토량(㎥) / 성토량(㎥) | +| `tree_cutting_volume` / `cost_score` | `float` | YES | | 벌채량 / 평점 비용 스코어 | + +## longitudinal_sections (종단면 설계) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `project_id` / `route_id` | `char(36)` / `int` | NO | MUL | FK→projects / routes | +| `computed_at` | `timestamp` | YES | | 종단 계산 일시 | +| `data` | `longtext` | YES | | 지반고/계획고/구배 등 설계 데이터 JSON | +| `longitudinal_file_path` | `varchar(500)` | YES | | 종단도면 캐드 파일 경로 | +| `status` | `varchar(50)` | YES | | `DRAFT` / `CONFIRMED` | + +## cross_sections (횡단면 설계) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `project_id` / `route_id` | `char(36)` / `int` | NO | MUL | FK→projects / routes | +| `chainage_m` / `sequence_num` | - | YES | | 측정 체인 거리(m) / 단면 순서 | +| `data` | `longtext` | YES | | 좌우 사면 경사, 폭, 절성토 단면적 JSON | +| `cross_section_file_path` | `varchar(500)` | YES | | 횡단도면 캐드 파일 경로 | +| `status` | `varchar(50)` | YES | | `DRAFT` / `CONFIRMED` | + +## routes.status 흐름 +`DRAFT → CONFIRMED → ARCHIVED` + +## cross_sections.data.structures +횡단면 하나에 배치된 구조물 ID 배열 → [[structure_output]]#structures 참조 diff --git a/docs/wiki/concepts/db_schema/structure_output.md b/docs/wiki/concepts/db_schema/structure_output.md new file mode 100644 index 0000000..b873247 --- /dev/null +++ b/docs/wiki/concepts/db_schema/structure_output.md @@ -0,0 +1,70 @@ +--- +type: concept +status: stable +related_pages: ["[[B07_wf4_DesignDetail/B07_frontend]]", "[[B08_wf5_Quantity/B08_frontend]]", "[[B09_wf6_Estimation/B09_frontend]]"] +last_updated: 2026-07-12 +source: raw/guidelines/db_schema.md +--- + +# DB: 구조물/수량/산출물 테이블 + +← [[overview]] + +## structures (배치 구조물) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `project_id` / `cross_section_id` | - | - | MUL | FK→projects / cross_sections | +| `structure_type` | `varchar(100)` | YES | | 낙석방지책 / 계간수로 / 돌붙임 등 | +| `chainage_m` | `float` | YES | | 구조물 배치 체인 시점 거리(m) | +| `location` | `varchar(50)` | YES | | 좌 / 우 / 종단 등 배치 위치 | +| `length_m` / `width_m` / `height_m` | `float` | YES | | 길이 / 폭 / 높이 규격(m) | +| `material` | `varchar(100)` | YES | | 구조물 재질/자재 | +| `quantity` / `unit_price` | - | YES | | 수량 / 단가 | +| `design_notes` | `longtext` | YES | | 특기사항 등 메모 | +| `structure_data_path` | `varchar(500)` | YES | | 세부 구조 상세 데이터 파일 경로 | +| `last_modified_by` | `int(11)` | YES | MUL | FK→users.id (최종 수정자) | +| `created_at` / `updated_at` | `timestamp` | - | | 생성 / 수정 일시 | + +## quantity_items (수량 산출 항목) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `project_id` | `char(36)` | NO | MUL | FK→projects.id | +| `category` | `varchar(100)` | YES | | 토공 / 구조물 / 포장 / 배수 등 공종 | +| `item_name` / `unit` | `varchar` | YES | | 품목 항목명 / 단위 (㎡, m 등) | +| `quantity_design` / `quantity_actual` | `float` | YES | | 설계 수량 / 최종 반영 수량 | +| `unit_price` / `total_price` | `float` | YES | | 단가 / 총 금액 | +| `standard_reference` | `varchar(255)` | YES | | 품셈 근거 코드/출처 | +| `computed_at` / `quantity_data_path` | - | YES | | 계산 일시 / 상세 산출근거 데이터 파일 경로 | +| `data` | `longtext` | YES | | 계산 세부 과정 통계 JSON | + +## outputs (최종 견적/도면 산출 세션) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `project_id` | `char(36)` | NO | MUL | FK→projects.id | +| `output_type` | `varchar(100)` | YES | | `estimation_excel`/`drawing_dxf`/`report_pdf`/`all_bundle` | +| `status` | `varchar(50)` | YES | | `GENERATING` ➡️ `COMPLETE` / `FAILED` | +| `generated_by` / `generated_at` | - | - | MUL | 생성자 FK / 생성일시 | +| `version` | `int(11)` | YES | | 산출 버전 | +| `outputs_directory_path` | `varchar(500)` | YES | | 산출 파일 번들 디렉토리 경로 | +| `metadata` | `longtext` | YES | | 기타 도면 스케일 등 정보 JSON | + +## output_files (개별 산출 파일 리스트) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `output_id` | `int(11)` | NO | MUL | FK→outputs.id | +| `file_type` | `varchar(50)` | YES | | `xlsx`/`pdf`/`dxf`/`dwg`/`json`/`zip` 등 | +| `original_filename` | `varchar(255)` | YES | | 원본 파일 식별 이름 | +| `output_file_path` | `varchar(500)` | YES | | 개별 파일 저장 경로 | +| `file_size_mb` / `download_count` | - | YES | | 파일 용량 / 다운로드 누적 카운트 | +| `created_at` | `timestamp` | NO | | 생성일시 | + +## quantity_items 총비용 계산 예 +```sql +SELECT SUM(quantity_actual * unit_price) AS total_cost, category +FROM quantity_items WHERE project_id = :project_id AND deleted_at IS NULL +GROUP BY category; +``` diff --git a/docs/wiki/concepts/db_schema/unconfirmed/README.md b/docs/wiki/concepts/db_schema/unconfirmed/README.md new file mode 100644 index 0000000..0ae8785 --- /dev/null +++ b/docs/wiki/concepts/db_schema/unconfirmed/README.md @@ -0,0 +1,7 @@ +# 미확정 테이블 보관소 (Unconfirmed DB Schemas) + +본 디렉토리는 소스코드 연동 처리가 완료되지 않았거나, 비즈니스 로직(백엔드/프론트엔드) 상의 구체적인 연결고리가 식별되지 않은 미확정 테이블의 명세서 및 임시 분석 내용을 개별 마크다운 파일로 저장·격리하는 공간입니다. + +## 운영 규칙 +1. **임시 격리**: 신규 테이블 추가 또는 레거시 테이블 중 사용처를 즉시 규명하기 어려운 경우 `[테이블명].md`로 파일을 생성해 기록합니다. +2. **확정 이관**: 소스코드에서의 실제 사용처(라우터, 리포지토리 등)가 명확해지면, 상위의 공식 테이블 그룹(예: `users_auth.md`, `logs_monitoring.md` 등)으로 표 명세를 이관하고 본 폴더 내의 마크다운은 삭제합니다. diff --git a/docs/wiki/concepts/db_schema/users_auth.md b/docs/wiki/concepts/db_schema/users_auth.md new file mode 100644 index 0000000..921ef13 --- /dev/null +++ b/docs/wiki/concepts/db_schema/users_auth.md @@ -0,0 +1,92 @@ +--- +type: concept +status: stable +related_pages: ["[[B01_Dashboard/B01_backend]]"] +last_updated: 2026-07-12 +source: raw/guidelines/db_schema.md +--- + +# DB: 사용자/인증/조직 테이블 + +← [[overview]] + +## users (사용자) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `email` | `varchar(255)` | NO | UNI | | +| `password_hash` | `varchar(255)` | NO | | | +| `name` | `varchar(255)` | NO | | | +| `position` / `department` | `varchar(100)` | YES | | 직위 / 부서 | +| `phone` | `varchar(20)` | YES | | | +| `company_id` | `int(11)` | YES | MUL | FK→companies.id | +| `role` | `enum('SYSTEM_ADMIN','ADMIN','USER')` | NO | MUL | `USER` | +| `is_master` | `tinyint(1)` | NO | | `0` (마스터 여부) | +| `status` | `enum('PENDING_EMAIL','NO_COMPANY','PENDING','ACTIVE','INACTIVE','REJECTED')` | NO | MUL | `PENDING_EMAIL` | +| `auth_expires_at` / `last_login` | `datetime` | YES | | 인증만료 / 최종로그인 | +| `login_failures` | `int(11)` | NO | | `0` (실패 횟수) | +| `created_at` / `updated_at` / `deleted_at` | `timestamp` | - | | 생성 / 수정 / soft-delete | + +**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]] (사용자 관리), 전 페이지 공통 인증 + +## companies (회사) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `name` | `varchar(255)` | NO | UNI | 회사명 | +| `business_registration_number` | `varchar(20)` | YES | UNI | 사업자번호 | +| `status` | `enum('ACTIVE','INACTIVE','SUSPENDED')` | NO | | `ACTIVE` | +| `subscription_status` | `enum('FREE','TRIAL','PAID','EXPIRED')` | NO | | `FREE` | +| `created_by` | `int(11)` | YES | MUL | FK→users.id (생성자) | +| `company_code` | `varchar(20)` | YES | | 참여용 코드 | + +**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]] + +## sessions (세션) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `varchar(255)` | NO | PRI | 세션 ID (쿠키 값) | +| `user_id` | `int(11)` | NO | MUL | FK→users.id | +| `user_agent_hash` | `char(64)` | NO | | | +| `expires_at` | `timestamp` | NO | MUL | 만료일시 | +| `last_activity_at` | `timestamp` | NO | | 최종 활동일시 | + +**사용처:** 전 페이지 공통 (세션 인증) — 상세 → [[auth_rbac]] + +## email_otps (이메일 OTP) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `bigint(20)` | NO | PRI | `auto_increment` | +| `user_id` | `int(11)` | NO | MUL | FK→users.id | +| `purpose` | `enum('REGISTER','LOGIN','REVERIFY','PASSWORD_CHANGE')` | NO | | 용도 | +| `otp_hash` | `varchar(255)` | NO | | OTP 해시값 | +| `expires_at` / `consumed_at` | `timestamp` | - | | 만료일시 / 사용일시 | + +## trusted_devices (신뢰 기기) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `bigint(20)` | NO | PRI | `auto_increment` | +| `user_id` | `int(11)` | NO | MUL | FK→users.id | +| `user_agent_hash` | `char(64)` | NO | | 브라우저 지문 해시 | +| `verified_at` / `last_used_at` | `timestamp` | NO | | 검증 / 최종 사용 일시 | + +## join_requests (회사 가입 신청) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `int(11)` | NO | PRI | `auto_increment` | +| `user_id` / `company_id` | `int(11)` | NO | MUL | FK→users/companies | +| `status` | `enum('PENDING','APPROVED','REJECTED')` | NO | | `PENDING` | +| `requested_at` / `reviewed_at` | `timestamp` | - | | 신청 / 검토 일시 | +| `reviewed_by` | `int(11)` | YES | MUL | FK→users.id (검토자) | + +**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]] (`B01_Dashboard_Repository.py:378` 가입 신청·처리) + +## user_consents (약관 동의) +| 컬럼 | 타입 | Null | Key | Default / Extra | +|---|---|---|---|---| +| `id` | `bigint(20)` | NO | PRI | `auto_increment` | +| `user_id` | `int(11)` | NO | MUL | FK→users.id | +| `terms_version` | `varchar(20)` | NO | | 동의한 약관 버전 | +| `terms_agreed` / `privacy_agreed` | `tinyint(1)` | NO | | 필수 동의여부 (1=동의) | +| `marketing_agreed` | `tinyint(1)` | NO | | `0` (선택 마케팅동의) | +| `agreed_at` | `timestamp` | NO | | 동의 일시 | diff --git a/docs/wiki/concepts/dependencies.md b/docs/wiki/concepts/dependencies.md new file mode 100644 index 0000000..5546bc6 --- /dev/null +++ b/docs/wiki/concepts/dependencies.md @@ -0,0 +1,36 @@ +--- +type: concept +status: stable +related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]", "[[B05_wf2_Route/B05_backend]]", "[[B06_wf3_ProfileCross/B06_backend]]"] +last_updated: 2026-07-12 +source: raw/guidelines/agent.md, raw/guidelines/migration_plan.md +--- + +# 외부 라이브러리 의존성 + +## 백엔드 (Python 3.12.7) +| 라이브러리 | 용도 | 사용 페이지 | +|---|---|---| +| FastAPI / Pydantic | API 프레임워크 / 요청·응답 검증 | 전체; [[B01_Dashboard/B01_backend|B01_Dashboard]] 라우터·요청 모델 | +| Trimesh | 3D 메시 처리 | [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]] (모델 생성) | +| Whitebox | 지형 분석(D8 흐름누적 등) | [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]], [[B05_wf2_Route/B05_backend|B05_wf2_Route]] (skeleton) | +| Geopandas | 공간 데이터프레임 | [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]], [[B05_wf2_Route/B05_backend|B05_wf2_Route]] | +| Shapely | 기하 연산 (JSON 파싱 후) | [[B05_wf2_Route/B05_backend|B05_wf2_Route]], [[B06_wf3_ProfileCross/B06_backend|B06_wf3_ProfileCross]] | +| NumPy | 격자·통계·비용면 및 LAS 통계 계산 | [[B03_FileInput/B03_backend|B03_FileInput]], [[B05_wf2_Route/B05_backend|B05_wf2_Route]] | +| SciPy | 수치 보간·계산 보조 | [[B05_wf2_Route/B05_backend|B05_wf2_Route]] | +| Rasterio | 래스터(DEM/TIF) 입출력·메타데이터 | [[B03_FileInput/B03_backend|B03_FileInput]], [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]] | +| Laspy | LAS/LAZ 포인트클라우드 파싱 | [[B03_FileInput/B03_backend|B03_FileInput]], [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]] | +| Pyproj | PRJ/TIF 좌표계 해석 | [[B03_FileInput/B03_backend|B03_FileInput]] | +| aiomysql | 비동기 MariaDB 드라이버 (Raw SQL) | 전체 | +| psutil | CPU·메모리 사용률 계측 | [[B01_Dashboard/B01_backend|B01_Dashboard]] 리소스 현황 | + +## 프론트엔드 (TypeScript/Node.js) +| 항목 | 용도 | 사용처 | +|---|---|---| +| **three.js** (WebGL) | 3D 뷰어(WebGLRenderer, OrbitControls, Points/Mesh) | [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]] 구현 확인. B05/B06은 각 페이지에서 미구현 확인 | +| Vite | 빌드 도구 | 전 프론트 | + +> ⚠️ B04는 three.js 기반 3D 뷰어가 구현되어 있고, B05/B06은 현재 문서 기준 WebCAD 노선·프로필 뷰어가 미구현이다. + +## 선정 원칙 (agent.md 3절) +프로젝트에 맞춰 호환 라이브러리 선정, 불필요한 함수 작성 최소화. `asyncmy` 대신 `aiomysql` 채택 이유: Cython 빌드가 Windows 환경에서 불필요. diff --git a/docs/wiki/concepts/schema_common.md b/docs/wiki/concepts/schema_common.md new file mode 100644 index 0000000..1b3992d --- /dev/null +++ b/docs/wiki/concepts/schema_common.md @@ -0,0 +1,19 @@ +--- +type: concept +status: stable +related_pages: [] +last_updated: 2026-07-12 +source: raw/guidelines/backend.md +--- + +# 공통 스키마 (Pydantic 요청/응답 규칙) + +## 검증 원칙 (backend.md 4절) +- 모든 JSON 요청은 라우터 진입 전 Pydantic 모델로 타입·범위 검증. +- 모든 지형/메쉬 연산은 `try-except` 필수. +- 에러 응답 표준 포맷: `{"status": "error", "message": "원인"}` — 전 라우터 공통, 프론트도 동일 포맷 기대. + +## 명명 규칙 +파일명 `[폴더명]_Schema.py`, 페이지 폴더 내부 배치 (전역 공유 스키마 폴더 없음 — 필요 시 여기에 항목 추가). + +> 현재 raw 자료에서 페이지 간 공유되는 구체적 Pydantic 모델(예: 공통 페이지네이션, 공통 좌표 타입)은 확인되지 않음. 발견 시 이 페이지에 추가. diff --git a/docs/wiki/concepts/storage_paths.md b/docs/wiki/concepts/storage_paths.md new file mode 100644 index 0000000..87e7ba1 --- /dev/null +++ b/docs/wiki/concepts/storage_paths.md @@ -0,0 +1,36 @@ +--- +type: concept +status: stable +related_pages: ["[[B02_ProjRegister/B02_backend]]", "[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]", "[[B05_wf2_Route/B05_backend]]", "[[B06_wf3_ProfileCross/B06_backend]]", "[[B07_wf4_DesignDetail/B07_frontend]]", "[[B08_wf5_Quantity/B08_frontend]]", "[[B09_wf6_Estimation/B09_frontend]]"] +last_updated: 2026-07-12 +source: raw/guidelines/structure.md, raw/guidelines/db_schema.md, raw/guidelines/backend.md, raw/guidelines/agent.md +--- + +# 저장 경로 규칙 (Workflow-based Folder Structure) + +## 경로 패턴 +``` +storage/{company_slug}/{user_slug}/{project_id}/ +├── B03_FileInput/input/{file_type}/ WF0 원본 입력 +├── B04_wf1_Surface/processed/, models/ WF1 변환·모델 +├── B05_wf2_Route/route/ WF2 경로 +├── B06_wf3_ProfileCross/longitudinal/, cross_sections/ WF3 종횡단 +├── B07_wf4_DesignDetail/structures/ WF4 구조물 +├── B08_wf5_Quantity/quantities/ WF5 수량 +└── B09_wf6_Estimation/v1/, v2/, ... WF6 산출물 (버전은 여기서만) +``` + +## 원칙 (backend.md 3절) +1. **하드코딩 금지** — 경로는 `config/config_system.py`에서 import. +2. **물리 파일은 DB 저장 금지** — 대용량 파일은 파일시스템, DB에는 경로만. +3. **단계별 루트 강제** — 각 B0x 폴더명은 실제 워크플로우 페이지명과 동일해야 함. `raw/`, `processed/`, `computed/`를 프로젝트 루트 공용 폴더로 만들지 않음. +4. **경로 생성 책임 분리** — 페이지별 백엔드는 자기 단계 폴더만 생성·수정. 다른 단계 산출물을 직접 삭제·덮어쓰지 않고 stale로 전파 → [[workflow_state]]. +5. **상대 경로만 DB 저장** — 프로젝트 루트 기준 상대경로. 사용자 입력 경로 직접 결합 금지(경로 이탈 방지), 절대경로 저장 금지. + +## DB 컬럼 ↔ 실제 경로 매핑 +상세 표 → [[db_schema/overview]] "파일 경로 추적 컬럼" + +## 파일명 규칙 (structure.md 1절) +- 페이지 폴더: 로그인 전 `A0x_`, 로그인 후 `B0x_`, 워크플로우는 `wf[번호]` 접두사 +- 파일명: `폴더명(페이지명)_기능_기타사양.확장자` +- 공통 유틸: `common_util/common_util_기능.확장자` diff --git a/docs/wiki/concepts/ui_templates.md b/docs/wiki/concepts/ui_templates.md new file mode 100644 index 0000000..94270bb --- /dev/null +++ b/docs/wiki/concepts/ui_templates.md @@ -0,0 +1,85 @@ +--- +status: stable +related_pages: ["[[A01_Home/A01_frontend]]", "[[A02_ProgDetail/A02_frontend]]", "[[B01_Dashboard/B01_frontend]]", "[[B08_wf5_Quantity/B08_frontend]]"] +last_updated: 2026-07-12 +source: ui_template/ 공통 UI 소스 코드 및 스타일시트 +--- + +# UI Templates — Localization & Components + +프론트엔드 공통 UI 요소: 다국어(i18n), 공통 컴포넌트, 테마 스타일. 디자인 시스템: [[design.md]] + +## ui_template_locale.ts (다국어 관리) + +**파일**: `ui_template/ui_template_locale.ts` + +### 핵심 기능 + +| 항목 | 위치 | 역할 | +|---|---|---| +| `currentLanguageIndex` | `ui_template/ui_template_locale.ts:12` | 현재 활성화된 언어 인덱스 (ko=0, en=1) | +| `ui_locales` | `ui_template/ui_template_locale.ts:25` | 다국어 문구가 등록된 2차원 사전 객체 | +| `t(key)` | `ui_template/ui_template_locale.ts:152` | 지정된 키에 대응하는 현재 언어 텍스트 반환 헬퍼 | + +### 사용처 (역참조) +- [[A01_Home/A01_frontend]] — MOCK_NEWS 태그, 섹션 제목 +- [[A02_ProgDetail/A02_frontend]] — 워크플로우 스텝, 기술 카드 +- [[a00_app_shell_framework]] — 헤더 네비, 언어 토글, 버튼 라벨 +- 모든 A0x/B0x 페이지 — 동적 텍스트 로드 + +## ui_template_elements.ts (공통 컴포넌트) + +**파일**: `ui_template/ui_template_elements.ts` + +### 제공 컴포넌트 + +| 항목 | 위치 | 역할 | +|---|---|---| +| `createButton(opts)` | `ui_template/ui_template_elements.ts:60` | 버튼. variant: `filled`(기본)/`ghost`/`pill`/`danger` | +| `createInputField(opts)` | `ui_template/ui_template_elements.ts:102` | 입력필드(라벨+입력+에러슬롯), setError 핸들 반환 | +| `createSelectField(opts)` | `ui_template/ui_template_elements.ts:164` | 드롭다운 select 필드 | +| `createCard(opts)` | `ui_template/ui_template_elements.ts:209` | 카드(title + body 배열, raised 옵션) | +| `createTag(label, variant?)` | `ui_template/ui_template_elements.ts:228` | 태그. variant: `accent`/`neutral`(기본)/`success`/`warning`/`danger` | +| `showLoadingOverlay()` | `ui_template/ui_template_elements.ts:253` | 로딩 스피너 오버레이 표시(참조카운트) | +| `hideLoadingOverlay()` | `ui_template/ui_template_elements.ts:259` | 로딩 오버레이 해제 | +| `showToast(msg, kind?, ms?)` | `ui_template/ui_template_elements.ts:282` | 토스트 알림. kind: success/error/info/warning | +| `createWorkflowShell(opts)` | `ui_template/ui_template_elements.ts:315` | 워크플로우 3단 레이아웃(헤더+좌측패널+우측뷰어) | +| `createLineChart(opts)` | `ui_template/ui_template_elements.ts:402` | 시계열 스플라인 차트(인라인 SVG, 외부 라이브러리 없음) | +| `injectBaseStyles()` | `ui_template/ui_template_elements.ts:843` | 공통 컴포넌트 기본 스타일 1회 주입 | + +### 사용처 (역참조) +- [[A01_Home/A01_frontend]] — createButton, createCard, createTag +- [[A02_ProgDetail/A02_frontend]] — createButton, createCard +- [[A03_CompDetail/A03_frontend]] — createCard +- [[A04_NewsHistory/A04_frontend]] — createTag +- [[A05_EduDetail/A05_frontend]] — createButton, createCard +- [[a00_app_shell_framework]] — createButton(헤더 네비/인증), createWorkflowShell +- B그룹 모든 페이지 — createWorkflowShell, createLineChart(B01 대시보드) + +## theme.css (스타일 변수) + +**파일**: `ui_template/theme.css` + +### 핵심 변수 + +| 항목 | 위치 | 역할 | +|---|---|---| +| `--color-primary`, `--color-primary-text` | `ui_template/theme.css:10` | 기본 색상 및 기본 텍스트 색상 | +| `--color-canvas`, `--color-paper` | `ui_template/theme.css:15` | 기본 캔버스 배경 및 레이어 카드 배경 | +| `--color-deep-iris`, `--color-mist-violet` | `ui_template/theme.css:22` | 라벤더 그라디언트 및 브랜드 서브 컬러 | +| `--spacing-8`, `--spacing-16` 등 | `ui_template/theme.css:45` | 기본 마진/패딩 간격 시스템 (8px 배수) | +| `--text-heading-lg`, `--text-body` 등 | `ui_template/theme.css:70` | 타이포그래피 크기 및 라인하이트 스케일 | +| `--radius-cards`, `--radius-icons` | `ui_template/theme.css:110` | 8px 등의 둥근 테두리 곡률 반지름 변수 | +| `--z-header` | `ui_template/theme.css:125` | 전역 헤더 고정용 z-index 인덱스 값 | + +## 제약 (backend.md §1) + +1. **다국어**: 모든 UI 문구는 반드시 `ui_locales` 등록 후 `L(key)` 또는 `t(key)`로만 참조 +2. **스타일**: CSS는 `theme.css` 변수만 사용, 하드코드 색상/단위 금지 +3. **컴포넌트 재사용**: `createButton`, `createCard`, `createTag`, `createWorkflowShell` 우선 사용 +4. **명명**: 이벤트 핸들러는 `on[페이지]_[기능]_[액션]` 규칙 준수 + +## 의존성 + +- **Locale**: 모든 페이지에서 `currentLanguageIndex` 조회 +- **요소**: 페이지별로 필요한 컴포넌트만 import diff --git a/docs/wiki/concepts/workflow_state.md b/docs/wiki/concepts/workflow_state.md new file mode 100644 index 0000000..98c7ac4 --- /dev/null +++ b/docs/wiki/concepts/workflow_state.md @@ -0,0 +1,74 @@ +--- +type: concept +status: stable +related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B02_ProjRegister/B02_backend]]", "[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]", "[[B05_wf2_Route/B05_backend]]", "[[B06_wf3_ProfileCross/B06_backend]]", "[[B07_wf4_DesignDetail/B07_frontend]]", "[[B08_wf5_Quantity/B08_frontend]]", "[[B09_wf6_Estimation/B09_frontend]]"] +last_updated: 2026-07-12 +source: raw/plans/plan_workflow_state_management.md (계획, 2026-07-10) + 실 코드/DB 직접 확인 (2026-07-12) +--- + +# Workflow 상태 관리 — 구현 완료 (실 DB 확인됨) + +> **status: stable.** 2026-07-12 실 코드 전수 확인 + DB 직접 접속(`SHOW TABLES`/`DESCRIBE`)으로 검증. 계획서(2026-07-10)의 설계가 **B01~B06 전 단계에 이미 적용 완료**됨. 정식 검증보고서는 없지만 코드·DB 실측이 계획과 일치해 stable로 채택. 남은 잔재 1건은 아래 참고. + +## SSOT: `project_workflow_stages` 테이블 (실 DB 확인) +| 컬럼 | 타입 | +| --------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | +| id | INT PK | +| project_id | CHAR(36), FK | +| stage_no | TINYINT (0~6) | +| stage_key | VARCHAR(30) — FILE_INPUT/WF1_SURFACE/WF2_ROUTE/WF3_PROFILE_CROSS/WF4_DESIGN_DETAIL/WF5_QUANTITY/WF6_ESTIMATION | +| state | ENUM('NOT_STARTED','IN_PROGRESS','COMPLETE','FAILED','STALE') | +| progress_percent | TINYINT | +| params | LONGTEXT(JSON) — 재실행 시 폼 프리필용 | +| message, started_at, completed_at, updated_at | 진행/이력 | + +생성 SQL: `db_management/006_workflow_state.sql`, 백필: `db_management/migrate_workflow_state.py` (기존 프로젝트 `projects.status` 해석 후 시드) + +## 공통 유틸 `common_util/common_util_workflow_state.py` +| 함수 | 역할 | +|---|---| +| `initialize_project_stages(cursor, project_id)` | 프로젝트 생성 시 7행 NOT_STARTED 시드 | +| `start_stage(cursor, project_id, stage_no, params)` | IN_PROGRESS 전이 + N+1~6의 COMPLETE를 STALE로 전파 + `projects.status` 캐시 갱신 | +| `complete_stage(cursor, project_id, stage_no)` | COMPLETE 전이 (stage 6 완료 시 `projects.status='DONE'`) | +| `fail_stage(cursor, project_id, stage_no, message)` | FAILED 전이 | +| `update_stage_progress(cursor, project_id, stage_no, progress)` | 진행률만 갱신 | +| `get_workflow_state(cursor, project_id)` | 단건 조회, `current_stage` 계산 포함 | + +## 실 연동 현황 (파일:줄번호) +| 페이지 | 위치 | 연동 stage_no | +|---|---|---| +| [[B02_ProjRegister/B02_backend|B02_ProjRegister]] | `B02_ProjRegister_Repository.py:90` `initialize_project_stages` 호출 | 시드(0~6) | +| [[B03_FileInput/B03_backend|B03_FileInput]] | `B03_FileInput_Router.py:175,224,256,347,570` | stage 0, 1 | +| [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]] | `B04_wf1_Surface_Router.py:168,209,227,233` | stage 1 | +| [[B05_wf2_Route/B05_backend|B05_wf2_Route]] | `B05_wf2_Route_Router.py:51,96,112,117,122,128,152` | stage 2 | +| [[B06_wf3_ProfileCross/B06_backend|B06_wf3_ProfileCross]] | `B06_wf3_ProfileCross_Router.py:68,111,127,132,137,143,187` | stage 3 | +| [[B01_Dashboard/B01_backend|B01_Dashboard]] | `B01_Dashboard_Repository.py:83` `get_workflow_states_for_projects()` (배치 조회, 프로젝트 목록에 `workflow_state` 필드 포함) | 조회 전용 | + +## 조회 API (실제 존재, 계획서와 경로 일치) +`GET /{project_id}/workflow-state` — `B03_FileInput_Router.py:667` +```json +{"status": "success", "workflow_state": {"project_id": "...", "current_stage": 2, "stages": [...]}} +``` +실제 전체 경로는 B03 라우터 prefix를 포함한 `/api/projects/{project_id}/workflow-state`이다. + +## 상태 전이 (구현대로) +``` +NOT_STARTED → IN_PROGRESS → COMPLETE + └→ FAILED → (재실행) IN_PROGRESS +COMPLETE → (하위 단계 재작업) → STALE → (재실행) IN_PROGRESS +``` +stage N이 IN_PROGRESS 전이 시 N+1~6의 COMPLETE를 전부 STALE로 전파 (`start_stage` 내부 UPDATE 쿼리로 확인됨). + +## projects.status 문자열 캐시 (호환용, 계획서 방침대로 유지 중) +`start_stage`/`complete_stage`/`fail_stage`가 `project_workflow_stages`와 `projects.status`를 **동시에** 갱신 (`WF{n}_ANALYZING`/`WF{n}_COMPLETE`/`WF{n}_FAILED`, stage6 COMPLETE 시 `DONE`). + +## B04 상태 조회 — 레거시 폴백 (당초 "잔재"로 표기했으나 정정) +`get_wf1_analysis_status()`([[B04_wf1_Surface/B04_backend]], `B04_wf1_Surface_Router.py:372`)는 +`project_workflow_stages`(SSOT)를 **우선** 조회하고, 행이 없을 때만(백필 미작동 대비) +`projects.status` 문자열 비교로 폴백함(416 `WF1_COMPLETE`, 420 `WF1_ANALYZING`, `:412-427`). +→ B04 실 코드 확인 결과 **정상 경로가 아닌 방어적 폴백**. SSOT 안정화 후 제거 가능하나 현재는 안전장치로 유효. +별개로 `update_project_status()`(`:76`)는 정의만 있고 미호출(죽은 코드) → 정리 권장. + +## 미해결 사항 (계획서 원문, 아직 결정 안 됨) +- `projects.status` 완전 제거 여부 — 현재는 유지 중(위 확인) +- STALE 하위 결과 파일: 즉시 삭제 vs 재실행 시 덮어쓰기 — 코드 레벨 확인 안 함, 별도 점검 필요 diff --git a/docs/wiki/graphify-out/.graphify_labels.json b/docs/wiki/graphify-out/.graphify_labels.json new file mode 100644 index 0000000..f65269e --- /dev/null +++ b/docs/wiki/graphify-out/.graphify_labels.json @@ -0,0 +1,48 @@ +{ + "0": "DB: 로그/모니터링 테이블", + "1": "auth_rbac.md", + "2": "workflow_state.md", + "3": "개념 (Concepts)", + "4": "Wiki Log", + "5": "ui_templates.md", + "6": "A09_Security — Backend", + "7": "A00_Common — App Shell Framework", + "8": "UI Templates — Localization & Components", + "9": "A04_NewsHistory — Frontend", + "10": "A07_Register — Frontend", + "11": "A08_Support — Backend", + "12": "A08_Support — Frontend", + "13": "B02_ProjRegister — Frontend", + "14": "인증 / RBAC", + "15": "A01_Home — Frontend", + "16": "A05_EduDetail — Frontend", + "17": "A06_Login — Backend", + "18": "A06_Login — Frontend", + "19": "A09_Security — Frontend", + "20": "B02_ProjRegister — Backend", + "21": "Workflow 상태 관리 — 구현 완료 (실 DB 확인됨)", + "22": "A03_CompDetail — Frontend", + "23": "B04_wf1_Surface — Backend", + "24": "DB: 경로/종횡단 테이블", + "25": "A07_Register — Backend", + "26": "B04_wf1_Surface — Frontend", + "27": "B07_wf4_DesignDetail — Frontend", + "28": "B09_wf6_Estimation — Frontend", + "29": "B05_wf2_Route — Backend", + "30": "A01_Home — 세부 구현", + "31": "A02_ProgDetail — 세부 구현", + "32": "A02_ProgDetail — Frontend", + "33": "B05_wf2_Route — Frontend", + "34": "B02_ProjRegister — DB", + "35": "B04_wf1_Surface — DB", + "36": "B04_wf1_Surface — Dependencies", + "37": "B06_wf3_ProfileCross — Frontend", + "38": "wiki/ 폴더 규칙", + "39": "wiki/ 폴더 규칙", + "40": "B04_wf1_Surface — API", + "41": "B05_wf2_Route — DB 사용 관계", + "42": "B06_wf3_ProfileCross — DB 사용 관계", + "43": "B01_Dashboard — DB 사용 관계", + "44": "B03_FileInput — DB 사용 관계", + "45": "B08_wf5_Quantity — DB" +} diff --git a/docs/wiki/graphify-out/.graphify_root b/docs/wiki/graphify-out/.graphify_root new file mode 100644 index 0000000..945c9b4 --- /dev/null +++ b/docs/wiki/graphify-out/.graphify_root @@ -0,0 +1 @@ +. \ No newline at end of file diff --git a/docs/wiki/graphify-out/GRAPH_REPORT.md b/docs/wiki/graphify-out/GRAPH_REPORT.md new file mode 100644 index 0000000..441abc0 --- /dev/null +++ b/docs/wiki/graphify-out/GRAPH_REPORT.md @@ -0,0 +1,275 @@ +# Graph Report - wiki (2026-07-12) + +## Corpus Check +- 69 files · ~23,462 words +- Verdict: corpus is large enough that graph structure adds value. + +## Summary +- 530 nodes · 511 edges · 46 communities (43 shown, 3 thin omitted) +- Extraction: 100% EXTRACTED · 0% INFERRED · 0% AMBIGUOUS +- Token cost: 0 input · 0 output + +## Graph Freshness +- Built from commit: `35c65c92` +- Run `git rev-parse HEAD` and compare to check if the graph is stale. +- Run `graphify update .` after code changes (no API cost). + +## Community Hubs (Navigation) +- DB: 로그/모니터링 테이블 +- auth_rbac.md +- workflow_state.md +- 개념 (Concepts) +- Wiki Log +- ui_templates.md +- A09_Security — Backend +- A00_Common — App Shell Framework +- UI Templates — Localization & Components +- A04_NewsHistory — Frontend +- A07_Register — Frontend +- A08_Support — Backend +- A08_Support — Frontend +- B02_ProjRegister — Frontend +- 인증 / RBAC +- A01_Home — Frontend +- A05_EduDetail — Frontend +- A06_Login — Backend +- A06_Login — Frontend +- A09_Security — Frontend +- B02_ProjRegister — Backend +- Workflow 상태 관리 — 구현 완료 (실 DB 확인됨) +- A03_CompDetail — Frontend +- B04_wf1_Surface — Backend +- DB: 경로/종횡단 테이블 +- A07_Register — Backend +- B04_wf1_Surface — Frontend +- B07_wf4_DesignDetail — Frontend +- B09_wf6_Estimation — Frontend +- B05_wf2_Route — Backend +- A01_Home — 세부 구현 +- A02_ProgDetail — 세부 구현 +- A02_ProgDetail — Frontend +- B05_wf2_Route — Frontend +- B02_ProjRegister — DB +- B04_wf1_Surface — DB +- B04_wf1_Surface — Dependencies +- B06_wf3_ProfileCross — Frontend +- wiki/ 폴더 규칙 +- wiki/ 폴더 규칙 +- B04_wf1_Surface — API +- B05_wf2_Route — DB 사용 관계 +- B06_wf3_ProfileCross — DB 사용 관계 +- B01_Dashboard — DB 사용 관계 +- B03_FileInput — DB 사용 관계 +- B08_wf5_Quantity — DB + +## God Nodes (most connected - your core abstractions) +1. `Wiki Log` - 33 edges +2. `개념 (Concepts)` - 12 edges +3. `DB: 로그/모니터링 테이블` - 11 edges +4. `인증 / RBAC` - 10 edges +5. `페이지 — 로그인 후 워크플로우 (B01~B09)` - 10 edges +6. `페이지 — 로그인 전 (A01~A09)` - 10 edges +7. `A07_Register — Frontend` - 10 edges +8. `A08_Support — Backend` - 10 edges +9. `A08_Support — Frontend` - 10 edges +10. `B02_ProjRegister — Frontend` - 10 edges + +## Surprising Connections (you probably didn't know these) +- None detected - all connections are within the same source files. + +## Communities (46 total, 3 thin omitted) + +### Community 0 - "DB: 로그/모니터링 테이블" +Cohesion: 0.05 +Nodes (38): DB: 파일/지표면분석 테이블, input_files.status 값, input_files (입력 원본 파일), processed_point_cloud (필터/변환 포인트클라우드), surface_models.status / processed_point_cloud.status 값, surface_models (지표면 모델 및 등고선), terrain_layers (지형 레이어), upload_chunks (업로드 청크 데이터) (+30 more) + +### Community 1 - "auth_rbac.md" +Cohesion: 0.05 +Nodes (33): API 공통 (여러 페이지가 공유하는 엔드포인트), 공통 오류 응답 포맷 (전 라우터), 워크플로우 상태 조회, 폴링 패턴 (legacy workflow.json 설계; 현재 구현은 workflow-state API 사용), companies (회사), DB: 사용자/인증/조직 테이블, email_otps (이메일 OTP), join_requests (회사 가입 신청) (+25 more) + +### Community 2 - "workflow_state.md" +Cohesion: 0.06 +Nodes (28): 공통 유틸 (common_util/), 리소스 모니터링 (common_util_resource_monitor.py), 이메일 발송 (common_util_email.py), 백엔드 (Python 3.12.7), 선정 원칙 (agent.md 3절), 외부 라이브러리 의존성, 프론트엔드 (TypeScript/Node.js), DB 컬럼 ↔ 실제 경로 매핑 (+20 more) + +### Community 3 - "개념 (Concepts)" +Cohesion: 0.06 +Nodes (35): [[a00_app_shell_framework]], [[a00_app_shell_framework_scaffold]], [[A01_Home/A01_frontend|A01_Home]], [[A02_ProgDetail/A02_frontend|A02_ProgDetail]], [[A03_CompDetail/A03_frontend|A03_CompDetail]], [[A04_NewsHistory/A04_frontend|A04_NewsHistory]], [[A05_EduDetail/A05_frontend|A05_EduDetail]], [[A06_Login/A06_backend|A06_Login]] (+27 more) + +### Community 4 - "Wiki Log" +Cohesion: 0.06 +Nodes (33): [2026-07-12] ingest | A01_Home 실 코드 반영, [2026-07-12] ingest | A02_ProgDetail + A00_Common Framework, [2026-07-12] ingest | A03_CompDetail, [2026-07-12] ingest | A04_NewsHistory, [2026-07-12] ingest | A05_EduDetail, [2026-07-12] ingest | A06_Login (backend + frontend 상세화), [2026-07-12] ingest | A07_Register (backend + frontend 상세화), [2026-07-12] ingest | A08_Support (backend + frontend 상세화) (+25 more) + +### Community 5 - "ui_templates.md" +Cohesion: 0.07 +Nodes (23): A00_Common — 스캐폴드·CSS·종속성, b_page_scaffold, CSS 인젝션, 사용처, 종속성, B01_Dashboard — Dependencies, 프로젝트 공통 모듈, B01_Dashboard — Frontend (+15 more) + +### Community 6 - "A09_Security — Backend" +Cohesion: 0.17 +Nodes (11): A09_Security — Backend, API 엔드포인트, DB 저장 (activity_logs), 권한 헬퍼, 마스터(회사 관리자) 전용 — `require_master`, 시스템 관리자 전용 — `require_system_admin`, 요청 스키마 (Pydantic), 의존성 (공통 유틸) (+3 more) + +### Community 7 - "A00_Common — App Shell Framework" +Cohesion: 0.18 +Nodes (11): A00_Common — App Shell Framework, app_shell 구성요소, router 라우팅 테이블, 로그아웃 (onApp_Logout_Click), 세부 스캐폴드·CSS·종속성, 인증 가드, 인증 버튼 (비동기 fillAuthActions), 테마 & 언어 관리 (+3 more) + +### Community 8 - "UI Templates — Localization & Components" +Cohesion: 0.18 +Nodes (11): theme.css (스타일 변수), ui_template_elements.ts (공통 컴포넌트), ui_template_locale.ts (다국어 관리), UI Templates — Localization & Components, 사용처 (역참조), 사용처 (역참조), 의존성, 제공 컴포넌트 (+3 more) + +### Community 9 - "A04_NewsHistory — Frontend" +Cohesion: 0.18 +Nodes (10): A04_NewsHistory — Frontend, CSS 클래스 구조, Mock 데이터 구조, 로컬라이제이션, 미해결 사항, 반응형, 스타일 (CSS), 의존성 (+2 more) + +### Community 10 - "A07_Register — Frontend" +Cohesion: 0.18 +Nodes (10): A07_Register — Frontend, API 클라이언트 함수, 로컬라이제이션, 스타일 (CSS), 약관 동의 (아코디언), 의존성, 이벤트 핸들러, 제출 로직 (2단계 폼 전환) (+2 more) + +### Community 11 - "A08_Support — Backend" +Cohesion: 0.18 +Nodes (10): A08_Support — Backend, API 엔드포인트, ⚠️ DB 스키마 불일치 (확인 필요), DB 저장 컬럼 (실 코드 INSERT 기준), 내부 헬퍼, 요청 스키마 (Pydantic), 의존성 (공통 유틸), 접수 로직 (+2 more) + +### Community 12 - "A08_Support — Frontend" +Cohesion: 0.18 +Nodes (10): A08_Support — Frontend, 로컬라이제이션, 세션 자동 채움, 스타일 (CSS), 의존성, 이벤트 핸들러, 제출 로직, 참고 (+2 more) + +### Community 13 - "B02_ProjRegister — Frontend" +Cohesion: 0.18 +Nodes (10): B02_ProjRegister — Frontend, 로컬라이제이션, 스타일 (CSS), 의존성, 이벤트 핸들러, 입력 필드, 제출 로직, 참고 (+2 more) + +### Community 14 - "인증 / RBAC" +Cohesion: 0.20 +Nodes (10): OTP / 비밀번호, ⚠️ 계획서-실코드 불일치 (A그룹 인제스트 발견), 권한 검증 헬퍼 (B01_Dashboard), 라우팅 가드 (frontend.md 5.2), 사용자 상태 생명주기, 사용처 (역참조), 세션 인증 (backend.md 6.3), 역할 (users.role) (+2 more) + +### Community 15 - "A01_Home — Frontend" +Cohesion: 0.20 +Nodes (9): A01_Home — Frontend, Hero 섹션, 로컬라이제이션, 세부 구현, 이벤트 핸들러, 주요 기능 섹션, 최신 소식 섹션, 컴포넌트 (+1 more) + +### Community 16 - "A05_EduDetail — Frontend" +Cohesion: 0.20 +Nodes (9): A05_EduDetail — Frontend, CSS 클래스 구조, 로컬라이제이션, 반응형, 스타일 (CSS), 의존성, 이벤트 핸들러, 컴포넌트 (섹션 빌더) (+1 more) + +### Community 17 - "A06_Login — Backend" +Cohesion: 0.20 +Nodes (9): A06_Login — Backend, API 엔드포인트, ⚠️ 계획서와 실 코드 불일치, 내부 헬퍼, 로그인 로직 흐름, 보안 정책 (실 코드 기준), 요청 스키마 (Pydantic), 의존성 (공통 유틸) (+1 more) + +### Community 18 - "A06_Login — Frontend" +Cohesion: 0.20 +Nodes (9): A06_Login — Frontend, API 클라이언트 함수, 로컬라이제이션, 스타일 (CSS), 의존성, 이벤트 핸들러, 제출 로직 (2단계 폼 전환), 컴포넌트 / 함수 (+1 more) + +### Community 19 - "A09_Security — Frontend" +Cohesion: 0.20 +Nodes (9): A09_Security — Frontend, API 클라이언트 함수 (⚠️ 미사용, 정의만), 로컬라이제이션, 스타일 (CSS), 약관 데이터 (A09_Security_Terms.ts), ⚠️ 약관 텍스트와 실 코드 불일치, 의존성, 컴포넌트 / 함수 (+1 more) + +### Community 20 - "B02_ProjRegister — Backend" +Cohesion: 0.20 +Nodes (9): API 엔드포인트, B02_ProjRegister — Backend, DB 저장 컬럼 (projects INSERT), 생성 로직 (create_project 트랜잭션), 요청/응답 스키마 (Pydantic), 의존성 (공통 유틸), 참고, 파일 구조 (+1 more) + +### Community 21 - "Workflow 상태 관리 — 구현 완료 (실 DB 확인됨)" +Cohesion: 0.22 +Nodes (9): B04 상태 조회 — 레거시 폴백 (당초 "잔재"로 표기했으나 정정), projects.status 문자열 캐시 (호환용, 계획서 방침대로 유지 중), SSOT: `project_workflow_stages` 테이블 (실 DB 확인), Workflow 상태 관리 — 구현 완료 (실 DB 확인됨), 공통 유틸 `common_util/common_util_workflow_state.py`, 미해결 사항 (계획서 원문, 아직 결정 안 됨), 상태 전이 (구현대로), 실 연동 현황 (파일:줄번호) (+1 more) + +### Community 22 - "A03_CompDetail — Frontend" +Cohesion: 0.22 +Nodes (8): A03_CompDetail — Frontend, CSS 클래스 구조, 로컬라이제이션, 반응형, 스타일 (CSS), 의존성, 컴포넌트 (섹션 빌더), 파일 구조 + +### Community 23 - "B04_wf1_Surface — Backend" +Cohesion: 0.22 +Nodes (8): B04_wf1_Surface — Backend, ⚠️ 레거시 폴백 (416,420줄), 엔진 서브모듈, 워크플로우 상태 전이, 의존성, 주요 함수 (Router), 책임, 파일 구성 (오케스트레이터/저장소/라우터) + +### Community 24 - "DB: 경로/종횡단 테이블" +Cohesion: 0.25 +Nodes (8): cross_sections.data.structures, cross_sections (횡단면 설계), DB: 경로/종횡단 테이블, longitudinal_sections (종단면 설계), route_points (경로 좌표점), route_statistics (노선 통계), routes.status 흐름, routes (노선 경로) + +### Community 25 - "A07_Register — Backend" +Cohesion: 0.25 +Nodes (7): A07_Register — Backend, API 엔드포인트, 가입 로직 흐름, 요청 스키마 (Pydantic), 의존성 (공통 유틸), 참고, 파일 구조 + +### Community 26 - "B04_wf1_Surface — Frontend" +Cohesion: 0.25 +Nodes (7): API 클라이언트 함수, B04_wf1_Surface — Frontend, ⚠️ 계획서와 실 코드 불일치 (3D 뷰어), 의존성, 처리 흐름, 컴포넌트 / 함수, 파일 구조 + +### Community 27 - "B07_wf4_DesignDetail — Frontend" +Cohesion: 0.25 +Nodes (7): B07_wf4_DesignDetail — Frontend, 로컬라이제이션, 백엔드/DB — 미착수 (계획적 범위 제외), 의존성, 참고, 컴포넌트 / 함수, 파일 구조 + +### Community 28 - "B09_wf6_Estimation — Frontend" +Cohesion: 0.25 +Nodes (7): B09_wf6_Estimation — Frontend, 로컬라이제이션, 백엔드/DB — 미착수, 의존성, 참고, 컴포넌트 / 함수, 파일 구조 + +### Community 29 - "B05_wf2_Route — Backend" +Cohesion: 0.29 +Nodes (6): B05_wf2_Route — Backend, 경로 계산 엔진, 기술부채, 기하·결과 변환, 라우터·workflow, 요청·응답 모델 + +### Community 30 - "A01_Home — 세부 구현" +Cohesion: 0.33 +Nodes (5): A01_Home — 세부 구현, 데이터 흐름, 미해결, 스타일, 의존성 + +### Community 31 - "A02_ProgDetail — 세부 구현" +Cohesion: 0.33 +Nodes (5): A02_ProgDetail — 세부 구현, 데이터 흐름, 미해결 / 특이사항, 스타일 (CSS), 의존성 + +### Community 32 - "A02_ProgDetail — Frontend" +Cohesion: 0.33 +Nodes (5): A02_ProgDetail — Frontend, 구조, 세부 구현, 제약 준수, 컴포넌트 분석 + +### Community 33 - "B05_wf2_Route — Frontend" +Cohesion: 0.33 +Nodes (5): API 클라이언트, B05_wf2_Route — Frontend, 기술부채, 입력 그룹, 화면과 상호작용 + +### Community 34 - "B02_ProjRegister — DB" +Cohesion: 0.40 +Nodes (4): B02_ProjRegister — DB, 쓰는 테이블, 저장소(파일시스템), 참고 (계획 당시 의도) + +### Community 35 - "B04_wf1_Surface — DB" +Cohesion: 0.40 +Nodes (4): B04_wf1_Surface — DB, Repository 함수, 쓰는 테이블, 참고 + +### Community 36 - "B04_wf1_Surface — Dependencies" +Cohesion: 0.40 +Nodes (4): B04_wf1_Surface — Dependencies, ⚠️ dependencies concept 정정 필요, 백엔드 (Python), 프론트엔드 (TypeScript) + +### Community 37 - "B06_wf3_ProfileCross — Frontend" +Cohesion: 0.40 +Nodes (4): API 클라이언트, B06_wf3_ProfileCross — Frontend, 입력 옵션, 화면·workflow + +### Community 38 - "wiki/ 폴더 규칙" +Cohesion: 0.50 +Nodes (3): wiki/ 폴더 규칙, 구조, 작성 규칙 + +### Community 39 - "wiki/ 폴더 규칙" +Cohesion: 0.50 +Nodes (3): wiki/ 폴더 규칙, 구조, 작성 규칙 + +### Community 40 - "B04_wf1_Surface — API" +Cohesion: 0.50 +Nodes (3): B04_wf1_Surface — API, 엔드포인트, 요청/응답 스키마 (Pydantic) + +### Community 41 - "B05_wf2_Route — DB 사용 관계" +Cohesion: 0.50 +Nodes (3): B05_wf2_Route — DB 사용 관계, Repository 함수, 저장 경로 + +### Community 42 - "B06_wf3_ProfileCross — DB 사용 관계" +Cohesion: 0.50 +Nodes (3): B06_wf3_ProfileCross — DB 사용 관계, Repository 함수, 파일 경로 + +## Knowledge Gaps +- **379 isolated node(s):** `구조`, `작성 규칙`, `구조`, `작성 규칙`, `파일 구성` (+374 more) + These have ≤1 connection - possible missing edges or undocumented components. +- **3 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. + +## Suggested Questions +_Questions this graph is uniquely positioned to answer:_ + +- **Why does `UI Templates — Localization & Components` connect `UI Templates — Localization & Components` to `ui_templates.md`?** + _High betweenness centrality (0.015) - this node is a cross-community bridge._ +- **Why does `A00_Common — App Shell Framework` connect `A00_Common — App Shell Framework` to `ui_templates.md`?** + _High betweenness centrality (0.014) - this node is a cross-community bridge._ +- **What connects `구조`, `작성 규칙`, `구조` to the rest of the system?** + _379 weakly-connected nodes found - possible documentation gaps or missing edges._ +- **Should `DB: 로그/모니터링 테이블` be split into smaller, more focused modules?** + _Cohesion score 0.045454545454545456 - nodes in this community are weakly interconnected._ +- **Should `auth_rbac.md` be split into smaller, more focused modules?** + _Cohesion score 0.05110336817653891 - nodes in this community are weakly interconnected._ +- **Should `workflow_state.md` be split into smaller, more focused modules?** + _Cohesion score 0.06156156156156156 - nodes in this community are weakly interconnected._ +- **Should `개념 (Concepts)` be split into smaller, more focused modules?** + _Cohesion score 0.05555555555555555 - nodes in this community are weakly interconnected._ \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/0624d255f06a43b161abeb6fdee9630e320fd97ac8bfcec25673ffef09e4d059.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/0624d255f06a43b161abeb6fdee9630e320fd97ac8bfcec25673ffef09e4d059.json new file mode 100644 index 0000000..1dd5299 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/0624d255f06a43b161abeb6fdee9630e320fd97ac8bfcec25673ffef09e4d059.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_md", "label": "B02_db.md", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_b02_projregister_db", "label": "B02_ProjRegister \u2014 DB", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_\uc4f0\ub294_\ud14c\uc774\ube14", "label": "\uc4f0\ub294 \ud14c\uc774\ube14", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_\uc800\uc7a5\uc18c_\ud30c\uc77c\uc2dc\uc2a4\ud15c", "label": "\uc800\uc7a5\uc18c(\ud30c\uc77c\uc2dc\uc2a4\ud15c)", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L20"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_\ucc38\uace0_\uacc4\ud68d_\ub2f9\uc2dc_\uc758\ub3c4", "label": "\ucc38\uace0 (\uacc4\ud68d \ub2f9\uc2dc \uc758\ub3c4)", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L26"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_projregister_b02_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_projregister_b02_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_db_schema_projects_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_b02_projregister_db", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_b02_projregister_db", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_\uc4f0\ub294_\ud14c\uc774\ube14", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_db_schema_logs_monitoring_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L18", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_b02_projregister_db", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_\uc800\uc7a5\uc18c_\ud30c\uc77c\uc2dc\uc2a4\ud15c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L23", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_b02_projregister_db", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_db_\ucc38\uace0_\uacc4\ud68d_\ub2f9\uc2dc_\uc758\ub3c4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_db.md", "source_location": "L26", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/0b2cdc6e3ca674d334281585329d084ff2d4d330ad6ed1e67b99ee2b144d4d7d.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/0b2cdc6e3ca674d334281585329d084ff2d4d330ad6ed1e67b99ee2b144d4d7d.json new file mode 100644 index 0000000..53b2593 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/0b2cdc6e3ca674d334281585329d084ff2d4d330ad6ed1e67b99ee2b144d4d7d.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_md", "label": "B09_frontend.md", "file_type": "document", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", "label": "B09_wf6_Estimation \u2014 Frontend", "file_type": "document", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", "file_type": "document", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L18"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "file_type": "document", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L24"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L30"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\ubc31\uc5d4\ub4dc_db_\ubbf8\ucc29\uc218", "label": "\ubc31\uc5d4\ub4dc/DB \u2014 \ubbf8\ucc29\uc218", "file_type": "document", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L35"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\ucc38\uace0", "label": "\ucc38\uace0", "file_type": "document", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L42"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_db_schema_structure_output_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L18", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L32", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L33", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\ubc31\uc5d4\ub4dc_db_\ubbf8\ucc29\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L35", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b09_wf6_estimation_b09_frontend_\ucc38\uace0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", "source_location": "L42", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/0dddf33216964b4bf97f34f8bce4436bfa31f27f00ed2057e251ff2f7a31623a.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/0dddf33216964b4bf97f34f8bce4436bfa31f27f00ed2057e251ff2f7a31623a.json new file mode 100644 index 0000000..005d54a --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/0dddf33216964b4bf97f34f8bce4436bfa31f27f00ed2057e251ff2f7a31623a.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "label": "dependencies.md", "file_type": "document", "source_file": "concepts/dependencies.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc758\uc874\uc131", "label": "\uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc758\uc874\uc131", "file_type": "document", "source_file": "concepts/dependencies.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_\ubc31\uc5d4\ub4dc_python_3_12_7", "label": "\ubc31\uc5d4\ub4dc (Python 3.12.7)", "file_type": "document", "source_file": "concepts/dependencies.md", "source_location": "L11"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_\ud504\ub860\ud2b8\uc5d4\ub4dc_typescript_node_js", "label": "\ud504\ub860\ud2b8\uc5d4\ub4dc (TypeScript/Node.js)", "file_type": "document", "source_file": "concepts/dependencies.md", "source_location": "L27"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_\uc120\uc815_\uc6d0\uce59_agent_md_3\uc808", "label": "\uc120\uc815 \uc6d0\uce59 (agent.md 3\uc808)", "file_type": "document", "source_file": "concepts/dependencies.md", "source_location": "L35"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/dependencies.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/dependencies.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b04_wf1_surface_b04_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/dependencies.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/dependencies.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/dependencies.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/dependencies.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc758\uc874\uc131", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_\ubc31\uc5d4\ub4dc_python_3_12_7", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/dependencies.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc758\uc874\uc131", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_\ud504\ub860\ud2b8\uc5d4\ub4dc_typescript_node_js", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/dependencies.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc758\uc874\uc131", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_\uc120\uc815_\uc6d0\uce59_agent_md_3\uc808", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/dependencies.md", "source_location": "L35", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/0f5b6dbb9bebbfa33f4d635f070de504af4b359fb90f4b29ba9688d1d6e17d2e.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/0f5b6dbb9bebbfa33f4d635f070de504af4b359fb90f4b29ba9688d1d6e17d2e.json new file mode 100644 index 0000000..40b1de3 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/0f5b6dbb9bebbfa33f4d635f070de504af4b359fb90f4b29ba9688d1d6e17d2e.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_md", "label": "a00_app_shell_framework_scaffold.md", "file_type": "document", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", "label": "A00_Common \u2014 \uc2a4\uce90\ud3f4\ub4dc\u00b7CSS\u00b7\uc885\uc18d\uc131", "file_type": "document", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_b_page_scaffold", "label": "b_page_scaffold", "file_type": "document", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L11"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_css_\uc778\uc81d\uc158", "label": "CSS \uc778\uc81d\uc158", "file_type": "document", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L18"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_\uc885\uc18d\uc131", "label": "\uc885\uc18d\uc131", "file_type": "document", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L25"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_\uc0ac\uc6a9\ucc98", "label": "\uc0ac\uc6a9\ucc98", "file_type": "document", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L33"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b09_wf6_estimation_b09_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_b_page_scaffold", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_css_\uc778\uc81d\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L18", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_\uc885\uc18d\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L25", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_\uc0ac\uc6a9\ucc98", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework_scaffold.md", "source_location": "L33", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/118279706a1eb23a45441e1ff8903d5dbd50d4d0b51975d3a17b60f7780055ca.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/118279706a1eb23a45441e1ff8903d5dbd50d4d0b51975d3a17b60f7780055ca.json new file mode 100644 index 0000000..29989f4 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/118279706a1eb23a45441e1ff8903d5dbd50d4d0b51975d3a17b60f7780055ca.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_md", "label": "B01_api.md", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_b01_dashboard_api", "label": "B01_Dashboard \u2014 API", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_\uc0ac\uc6a9\uc790_\ud68c\uc0ac", "label": "\uc0ac\uc6a9\uc790\u00b7\ud68c\uc0ac", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L14"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_\ud68c\uc0ac_\uad00\ub9ac\uc790", "label": "\ud68c\uc0ac \uad00\ub9ac\uc790", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L25"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_\ud504\ub85c\uc81d\ud2b8_\uc790\ub3d9\ud654", "label": "\ud504\ub85c\uc81d\ud2b8\u00b7\uc790\ub3d9\ud654", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L35"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790", "label": "\uc2dc\uc2a4\ud15c \uad00\ub9ac\uc790", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L46"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_b01_dashboard_api", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_b01_dashboard_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_\uc0ac\uc6a9\uc790_\ud68c\uc0ac", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L14", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_b01_dashboard_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_\ud68c\uc0ac_\uad00\ub9ac\uc790", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L25", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_b01_dashboard_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_\ud504\ub85c\uc81d\ud2b8_\uc790\ub3d9\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L35", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_b01_dashboard_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_api_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_api.md", "source_location": "L46", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/145e767fcb59085a1ee13d461285411d8b86d513511ea6df46b3348775ca49a4.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/145e767fcb59085a1ee13d461285411d8b86d513511ea6df46b3348775ca49a4.json new file mode 100644 index 0000000..c776e29 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/145e767fcb59085a1ee13d461285411d8b86d513511ea6df46b3348775ca49a4.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_md", "label": "B03_backend.md", "file_type": "document", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_b03_fileinput_backend", "label": "B03_FileInput \u2014 Backend", "file_type": "document", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_\uc785\ub825_\uac80\uc99d_\ud30c\uc77c_\ucc98\ub9ac", "label": "\uc785\ub825 \uac80\uc99d\u00b7\ud30c\uc77c \ucc98\ub9ac", "file_type": "document", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_\uba54\ud0c0\ub370\uc774\ud130_\ubd84\uc11d", "label": "\uba54\ud0c0\ub370\uc774\ud130 \ubd84\uc11d", "file_type": "document", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L22"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_\uc800\uc7a5\uc18c", "label": "\uc800\uc7a5\uc18c", "file_type": "document", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L31"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_workflow_\uc54c\ub9bc", "label": "workflow\u00b7\uc54c\ub9bc", "file_type": "document", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L40"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_b03_fileinput_backend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_b03_fileinput_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_\uc785\ub825_\uac80\uc99d_\ud30c\uc77c_\ucc98\ub9ac", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_b03_fileinput_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_\uba54\ud0c0\ub370\uc774\ud130_\ubd84\uc11d", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L22", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_b03_fileinput_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_\uc800\uc7a5\uc18c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L31", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_b03_fileinput_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_workflow_\uc54c\ub9bc", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L40", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L49", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_backend.md", "source_location": "L49", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/186d47f554f2e797fb63a3167221e324a92f283cd57fa229bc6d47bb5224d32b.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/186d47f554f2e797fb63a3167221e324a92f283cd57fa229bc6d47bb5224d32b.json new file mode 100644 index 0000000..726f460 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/186d47f554f2e797fb63a3167221e324a92f283cd57fa229bc6d47bb5224d32b.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "label": "B03_db.md", "file_type": "document", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_b03_fileinput_db_\uc0ac\uc6a9_\uad00\uacc4", "label": "B03_FileInput \u2014 DB \uc0ac\uc6a9 \uad00\uacc4", "file_type": "document", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_\ud30c\uc77c_\uacbd\ub85c", "label": "\ud30c\uc77c \uacbd\ub85c", "file_type": "document", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L22"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_b03_fileinput_db_\uc0ac\uc6a9_\uad00\uacc4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_db_schema_files_surface_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_b03_fileinput_db_\uc0ac\uc6a9_\uad00\uacc4", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_\ud30c\uc77c_\uacbd\ub85c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L22", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L29", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/1b226e5d018fc38a72090165fa26143b93b6e1c0a7e1073d8c15e0cdddbeb171.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/1b226e5d018fc38a72090165fa26143b93b6e1c0a7e1073d8c15e0cdddbeb171.json new file mode 100644 index 0000000..566e845 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/1b226e5d018fc38a72090165fa26143b93b6e1c0a7e1073d8c15e0cdddbeb171.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_md", "label": "README.md", "file_type": "document", "source_file": "concepts/db_schema/unconfirmed/README.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_\ubbf8\ud655\uc815_\ud14c\uc774\ube14_\ubcf4\uad00\uc18c_unconfirmed_db_schemas", "label": "\ubbf8\ud655\uc815 \ud14c\uc774\ube14 \ubcf4\uad00\uc18c (Unconfirmed DB Schemas)", "file_type": "document", "source_file": "concepts/db_schema/unconfirmed/README.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_\uc6b4\uc601_\uaddc\uce59", "label": "\uc6b4\uc601 \uaddc\uce59", "file_type": "document", "source_file": "concepts/db_schema/unconfirmed/README.md", "source_location": "L5"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_\ubbf8\ud655\uc815_\ud14c\uc774\ube14_\ubcf4\uad00\uc18c_unconfirmed_db_schemas", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/unconfirmed/README.md", "source_location": "L1", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_\ubbf8\ud655\uc815_\ud14c\uc774\ube14_\ubcf4\uad00\uc18c_unconfirmed_db_schemas", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_\uc6b4\uc601_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/unconfirmed/README.md", "source_location": "L5", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/1d05c804dd886b8148e1a246412e6c96776d60ed81e47cd559330fd26a8da829.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/1d05c804dd886b8148e1a246412e6c96776d60ed81e47cd559330fd26a8da829.json new file mode 100644 index 0000000..3dc48db --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/1d05c804dd886b8148e1a246412e6c96776d60ed81e47cd559330fd26a8da829.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_md", "label": "A08_backend.md", "file_type": "document", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_a08_support_backend", "label": "A08_Support \u2014 Backend", "file_type": "document", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "label": "API \uc5d4\ub4dc\ud3ec\uc778\ud2b8", "file_type": "document", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\ub0b4\ubd80_\ud5ec\ud37c", "label": "\ub0b4\ubd80 \ud5ec\ud37c", "file_type": "document", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L25"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", "label": "\uc694\uccad \uc2a4\ud0a4\ub9c8 (Pydantic)", "file_type": "document", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L31"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\uc811\uc218_\ub85c\uc9c1", "label": "\uc811\uc218 \ub85c\uc9c1", "file_type": "document", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L37"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_db_\uc800\uc7a5_\uceec\ub7fc_\uc2e4_\ucf54\ub4dc_insert_\uae30\uc900", "label": "DB \uc800\uc7a5 \uceec\ub7fc (\uc2e4 \ucf54\ub4dc INSERT \uae30\uc900)", "file_type": "document", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L44"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\ud2b9\uc9d5", "label": "\ud2b9\uc9d5", "file_type": "document", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L51"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", "label": "\uc758\uc874\uc131 (\uacf5\ud1b5 \uc720\ud2f8)", "file_type": "document", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L56"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_db_\uc2a4\ud0a4\ub9c8_\ubd88\uc77c\uce58_\ud655\uc778_\ud544\uc694", "label": "\u26a0\ufe0f DB \uc2a4\ud0a4\ub9c8 \ubd88\uc77c\uce58 (\ud655\uc778 \ud544\uc694)", "file_type": "document", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L62"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_support_a08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a06_login_a06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_db_schema_logs_monitoring_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_a08_support_backend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_a08_support_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_a08_support_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_a08_support_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\ub0b4\ubd80_\ud5ec\ud37c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L25", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_a08_support_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L31", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_a08_support_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\uc811\uc218_\ub85c\uc9c1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L37", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_a08_support_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_db_\uc800\uc7a5_\uceec\ub7fc_\uc2e4_\ucf54\ub4dc_insert_\uae30\uc900", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L44", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_a08_support_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\ud2b9\uc9d5", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L51", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_a08_support_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L56", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_common_util_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L58", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_a08_support_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_backend_db_\uc2a4\ud0a4\ub9c8_\ubd88\uc77c\uce58_\ud655\uc778_\ud544\uc694", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_backend.md", "source_location": "L62", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/1dad047374ae3b973fcdcaa189f843557fcfffe8364feccc7ebc92f3ddc04155.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/1dad047374ae3b973fcdcaa189f843557fcfffe8364feccc7ebc92f3ddc04155.json new file mode 100644 index 0000000..64d4f54 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/1dad047374ae3b973fcdcaa189f843557fcfffe8364feccc7ebc92f3ddc04155.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "label": "B06_dependencies.md", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_b06_wf3_profilecross_dependencies", "label": "B06_wf3_ProfileCross \u2014 Dependencies", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", "label": "\uacf5\ud1b5 \ubaa8\ub4c8", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L22"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_b06_wf3_profilecross_dependencies", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_b06_wf3_profilecross_dependencies", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L22", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L25", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L26", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/1e373af97a118ae3015a3afa398085bf5df4a98ba74866cbe2f8697b00379869.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/1e373af97a118ae3015a3afa398085bf5df4a98ba74866cbe2f8697b00379869.json new file mode 100644 index 0000000..34a6080 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/1e373af97a118ae3015a3afa398085bf5df4a98ba74866cbe2f8697b00379869.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_md", "label": "B01_frontend.md", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", "label": "B01_Dashboard \u2014 Frontend", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_\ud30c\uc77c\uacfc_\uc9c4\uc785\uc810", "label": "\ud30c\uc77c\uacfc \uc9c4\uc785\uc810", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_ui_\uad8c\ud55c_\ud5ec\ud37c", "label": "UI \uad8c\ud55c \ud5ec\ud37c", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L20"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_\ubaa8\ub2ec", "label": "\ubaa8\ub2ec", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L32"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_\uacf5\uc720_\uc790\uc6d0_\uc5f0\uacb0", "label": "\uacf5\uc720 \uc790\uc6d0 \uc5f0\uacb0", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L45"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_\uae30\uc220\ubd80\ucc44", "label": "\uae30\uc220\ubd80\ucc44", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L52"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_\ud30c\uc77c\uacfc_\uc9c4\uc785\uc810", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_ui_\uad8c\ud55c_\ud5ec\ud37c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_\ubaa8\ub2ec", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L32", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_\uacf5\uc720_\uc790\uc6d0_\uc5f0\uacb0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L45", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L49", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L50", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_frontend_\uae30\uc220\ubd80\ucc44", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_frontend.md", "source_location": "L52", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/1e9e4be64167f23705811ee00b005b84faf8b3e44cc65a78ac00683ff4cc92ea.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/1e9e4be64167f23705811ee00b005b84faf8b3e44cc65a78ac00683ff4cc92ea.json new file mode 100644 index 0000000..a40c71d --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/1e9e4be64167f23705811ee00b005b84faf8b3e44cc65a78ac00683ff4cc92ea.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_md", "label": "B05_frontend.md", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", "label": "B05_wf2_Route \u2014 Frontend", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_\ud654\uba74\uacfc_\uc0c1\ud638\uc791\uc6a9", "label": "\ud654\uba74\uacfc \uc0c1\ud638\uc791\uc6a9", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L21"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_\uc785\ub825_\uadf8\ub8f9", "label": "\uc785\ub825 \uadf8\ub8f9", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L29"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_\uae30\uc220\ubd80\ucc44", "label": "\uae30\uc220\ubd80\ucc44", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L40"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_\ud654\uba74\uacfc_\uc0c1\ud638\uc791\uc6a9", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L21", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_\uc785\ub825_\uadf8\ub8f9", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L29", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_frontend_\uae30\uc220\ubd80\ucc44", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_frontend.md", "source_location": "L40", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/2511b51e4eb20cf62e268122c88d3fb89dbd706320402a4eccb759b58281fa0a.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/2511b51e4eb20cf62e268122c88d3fb89dbd706320402a4eccb759b58281fa0a.json new file mode 100644 index 0000000..e669bec --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/2511b51e4eb20cf62e268122c88d3fb89dbd706320402a4eccb759b58281fa0a.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_md", "label": "B02_backend.md", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_b02_projregister_backend", "label": "B02_ProjRegister \u2014 Backend", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L14"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "label": "API \uc5d4\ub4dc\ud3ec\uc778\ud2b8", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L22"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\ud568\uc218", "label": "\ud568\uc218", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L28"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\uc694\uccad_\uc751\ub2f5_\uc2a4\ud0a4\ub9c8_pydantic", "label": "\uc694\uccad/\uc751\ub2f5 \uc2a4\ud0a4\ub9c8 (Pydantic)", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L38"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\uc0dd\uc131_\ub85c\uc9c1_create_project_\ud2b8\ub79c\uc7ad\uc158", "label": "\uc0dd\uc131 \ub85c\uc9c1 (create_project \ud2b8\ub79c\uc7ad\uc158)", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L45"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_db_\uc800\uc7a5_\uceec\ub7fc_projects_insert", "label": "DB \uc800\uc7a5 \uceec\ub7fc (projects INSERT)", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L56"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", "label": "\uc758\uc874\uc131 (\uacf5\ud1b5 \uc720\ud2f8)", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L61"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\ucc38\uace0", "label": "\ucc38\uace0", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L69"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_projregister_b02_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_projregister_b02_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_b02_projregister_backend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_b02_projregister_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L14", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_b02_projregister_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L22", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_b02_projregister_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L28", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_b02_projregister_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\uc694\uccad_\uc751\ub2f5_\uc2a4\ud0a4\ub9c8_pydantic", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L38", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_b02_projregister_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\uc0dd\uc131_\ub85c\uc9c1_create_project_\ud2b8\ub79c\uc7ad\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L45", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_b02_projregister_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_db_\uc800\uc7a5_\uceec\ub7fc_projects_insert", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L56", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_db_schema_projects_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L59", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_b02_projregister_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L61", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_common_util_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L63", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_db_schema_logs_monitoring_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L67", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_b02_projregister_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_backend_\ucc38\uace0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_backend.md", "source_location": "L69", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/2808d040f080236ab87ff5d059ee801796b07a63f6a114bd2a2109e0b5806e12.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/2808d040f080236ab87ff5d059ee801796b07a63f6a114bd2a2109e0b5806e12.json new file mode 100644 index 0000000..c0b7868 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/2808d040f080236ab87ff5d059ee801796b07a63f6a114bd2a2109e0b5806e12.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_md", "label": "A02_components.md", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", "label": "A02_ProgDetail \u2014 \uc138\ubd80 \uad6c\ud604", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_\uc2a4\ud0c0\uc77c_css", "label": "\uc2a4\ud0c0\uc77c (CSS)", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L21"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_\ub370\uc774\ud130_\ud750\ub984", "label": "\ub370\uc774\ud130 \ud750\ub984", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L29"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_\ubbf8\ud574\uacb0_\ud2b9\uc774\uc0ac\ud56d", "label": "\ubbf8\ud574\uacb0 / \ud2b9\uc774\uc0ac\ud56d", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L35"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_progdetail_a02_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_\uc2a4\ud0c0\uc77c_css", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L21", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_\ub370\uc774\ud130_\ud750\ub984", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L29", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_components_\ubbf8\ud574\uacb0_\ud2b9\uc774\uc0ac\ud56d", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_components.md", "source_location": "L35", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/29bd2bdc39958157c52fe4e872b1c1b0ff6b6f91aa809ee33b6be89c57ccd9fa.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/29bd2bdc39958157c52fe4e872b1c1b0ff6b6f91aa809ee33b6be89c57ccd9fa.json new file mode 100644 index 0000000..ba700c2 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/29bd2bdc39958157c52fe4e872b1c1b0ff6b6f91aa809ee33b6be89c57ccd9fa.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_md", "label": "users_auth.md", "file_type": "document", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", "label": "DB: \uc0ac\uc6a9\uc790/\uc778\uc99d/\uc870\uc9c1 \ud14c\uc774\ube14", "file_type": "document", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_users_\uc0ac\uc6a9\uc790", "label": "users (\uc0ac\uc6a9\uc790)", "file_type": "document", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L13"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_companies_\ud68c\uc0ac", "label": "companies (\ud68c\uc0ac)", "file_type": "document", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L32"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_sessions_\uc138\uc158", "label": "sessions (\uc138\uc158)", "file_type": "document", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L45"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_email_otps_\uc774\uba54\uc77c_otp", "label": "email_otps (\uc774\uba54\uc77c OTP)", "file_type": "document", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L56"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_trusted_devices_\uc2e0\ub8b0_\uae30\uae30", "label": "trusted_devices (\uc2e0\ub8b0 \uae30\uae30)", "file_type": "document", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L65"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_join_requests_\ud68c\uc0ac_\uac00\uc785_\uc2e0\uccad", "label": "join_requests (\ud68c\uc0ac \uac00\uc785 \uc2e0\uccad)", "file_type": "document", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L73"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_user_consents_\uc57d\uad00_\ub3d9\uc758", "label": "user_consents (\uc57d\uad00 \ub3d9\uc758)", "file_type": "document", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L84"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_users_\uc0ac\uc6a9\uc790", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L13", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_companies_\ud68c\uc0ac", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L32", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_sessions_\uc138\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L45", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L54", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_email_otps_\uc774\uba54\uc77c_otp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L56", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_trusted_devices_\uc2e0\ub8b0_\uae30\uae30", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L65", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_join_requests_\ud68c\uc0ac_\uac00\uc785_\uc2e0\uccad", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L73", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_user_consents_\uc57d\uad00_\ub3d9\uc758", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/users_auth.md", "source_location": "L84", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/2be5bc2fd35d20f0f1eb7c1c707e58347f2b10bcc8843f04fffa74fbdca4d2a7.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/2be5bc2fd35d20f0f1eb7c1c707e58347f2b10bcc8843f04fffa74fbdca4d2a7.json new file mode 100644 index 0000000..01833bd --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/2be5bc2fd35d20f0f1eb7c1c707e58347f2b10bcc8843f04fffa74fbdca4d2a7.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_md", "label": "A03_frontend.md", "file_type": "document", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", "label": "A03_CompDetail \u2014 Frontend", "file_type": "document", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", "label": "\ucef4\ud3ec\ub10c\ud2b8 (\uc139\uc158 \ube4c\ub354)", "file_type": "document", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "file_type": "document", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L29"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\uc2a4\ud0c0\uc77c_css", "label": "\uc2a4\ud0c0\uc77c (CSS)", "file_type": "document", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L45"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", "label": "CSS \ud074\ub798\uc2a4 \uad6c\uc870", "file_type": "document", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L47"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\ubc18\uc751\ud615", "label": "\ubc18\uc751\ud615", "file_type": "document", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L61"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L64"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L29", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\uc2a4\ud0c0\uc77c_css", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L45", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\uc2a4\ud0c0\uc77c_css", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L47", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\uc2a4\ud0c0\uc77c_css", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\ubc18\uc751\ud615", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L61", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a03_compdetail_a03_frontend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A03_CompDetail/A03_frontend.md", "source_location": "L64", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/2db81e60642ebe8f3ec8f7c3673d57ad41156fa1bf6f636be896aa2d44899709.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/2db81e60642ebe8f3ec8f7c3673d57ad41156fa1bf6f636be896aa2d44899709.json new file mode 100644 index 0000000..152215c --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/2db81e60642ebe8f3ec8f7c3673d57ad41156fa1bf6f636be896aa2d44899709.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_md", "label": "B06_db.md", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_b06_wf3_profilecross_db_\uc0ac\uc6a9_\uad00\uacc4", "label": "B06_wf3_ProfileCross \u2014 DB \uc0ac\uc6a9 \uad00\uacc4", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_repository_\ud568\uc218", "label": "Repository \ud568\uc218", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_\ud30c\uc77c_\uacbd\ub85c", "label": "\ud30c\uc77c \uacbd\ub85c", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", "source_location": "L29"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_b06_wf3_profilecross_db_\uc0ac\uc6a9_\uad00\uacc4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_db_schema_route_profile_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_b06_wf3_profilecross_db_\uc0ac\uc6a9_\uad00\uacc4", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_repository_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_b06_wf3_profilecross_db_\uc0ac\uc6a9_\uad00\uacc4", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_\ud30c\uc77c_\uacbd\ub85c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", "source_location": "L29", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", "source_location": "L35", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/32b6d000932825989e419a4136794b28850890191432179205576bde15298bf5.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/32b6d000932825989e419a4136794b28850890191432179205576bde15298bf5.json new file mode 100644 index 0000000..1361e97 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/32b6d000932825989e419a4136794b28850890191432179205576bde15298bf5.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_md", "label": "files_surface.md", "file_type": "document", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", "label": "DB: \ud30c\uc77c/\uc9c0\ud45c\uba74\ubd84\uc11d \ud14c\uc774\ube14", "file_type": "document", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_upload_sessions_\uc5c5\ub85c\ub4dc_\uc138\uc158", "label": "upload_sessions (\uc5c5\ub85c\ub4dc \uc138\uc158)", "file_type": "document", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L13"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_upload_chunks_\uc5c5\ub85c\ub4dc_\uccad\ud06c_\ub370\uc774\ud130", "label": "upload_chunks (\uc5c5\ub85c\ub4dc \uccad\ud06c \ub370\uc774\ud130)", "file_type": "document", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L24"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_input_files_\uc785\ub825_\uc6d0\ubcf8_\ud30c\uc77c", "label": "input_files (\uc785\ub825 \uc6d0\ubcf8 \ud30c\uc77c)", "file_type": "document", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L35"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_processed_point_cloud_\ud544\ud130_\ubcc0\ud658_\ud3ec\uc778\ud2b8\ud074\ub77c\uc6b0\ub4dc", "label": "processed_point_cloud (\ud544\ud130/\ubcc0\ud658 \ud3ec\uc778\ud2b8\ud074\ub77c\uc6b0\ub4dc)", "file_type": "document", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L48"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_surface_models_\uc9c0\ud45c\uba74_\ubaa8\ub378_\ubc0f_\ub4f1\uace0\uc120", "label": "surface_models (\uc9c0\ud45c\uba74 \ubaa8\ub378 \ubc0f \ub4f1\uace0\uc120)", "file_type": "document", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L64"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_terrain_layers_\uc9c0\ud615_\ub808\uc774\uc5b4", "label": "terrain_layers (\uc9c0\ud615 \ub808\uc774\uc5b4)", "file_type": "document", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L77"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_input_files_status_\uac12", "label": "input_files.status \uac12", "file_type": "document", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L89"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_surface_models_status_processed_point_cloud_status_\uac12", "label": "surface_models.status / processed_point_cloud.status \uac12", "file_type": "document", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L92"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b04_wf1_surface_b04_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_upload_sessions_\uc5c5\ub85c\ub4dc_\uc138\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L13", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_upload_chunks_\uc5c5\ub85c\ub4dc_\uccad\ud06c_\ub370\uc774\ud130", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_input_files_\uc785\ub825_\uc6d0\ubcf8_\ud30c\uc77c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L35", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_processed_point_cloud_\ud544\ud130_\ubcc0\ud658_\ud3ec\uc778\ud2b8\ud074\ub77c\uc6b0\ub4dc", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L48", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_surface_models_\uc9c0\ud45c\uba74_\ubaa8\ub378_\ubc0f_\ub4f1\uace0\uc120", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L64", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_terrain_layers_\uc9c0\ud615_\ub808\uc774\uc5b4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L77", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_input_files_status_\uac12", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L89", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_surface_models_status_processed_point_cloud_status_\uac12", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L92", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b04_wf1_surface_b04_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L95", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/files_surface.md", "source_location": "L95", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/36e9c3aa280793956998877458fc2ac0767eeec0172efa0542cb863877908fcb.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/36e9c3aa280793956998877458fc2ac0767eeec0172efa0542cb863877908fcb.json new file mode 100644 index 0000000..d5f979f --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/36e9c3aa280793956998877458fc2ac0767eeec0172efa0542cb863877908fcb.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "label": "B05_db.md", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", "label": "B05_wf2_Route \u2014 DB \uc0ac\uc6a9 \uad00\uacc4", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_repository_\ud568\uc218", "label": "Repository \ud568\uc218", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L20"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_\uc800\uc7a5_\uacbd\ub85c", "label": "\uc800\uc7a5 \uacbd\ub85c", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L30"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_db_schema_route_profile_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_repository_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_\uc800\uc7a5_\uacbd\ub85c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L36", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/37aa0d07aa6c480aa555897c7a3b552f3c4918332701b292c8140bd177fae0f3.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/37aa0d07aa6c480aa555897c7a3b552f3c4918332701b292c8140bd177fae0f3.json new file mode 100644 index 0000000..b8b57b8 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/37aa0d07aa6c480aa555897c7a3b552f3c4918332701b292c8140bd177fae0f3.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_md", "label": "B06_frontend.md", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_b06_wf3_profilecross_frontend", "label": "B06_wf3_ProfileCross \u2014 Frontend", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_\ud654\uba74_workflow", "label": "\ud654\uba74\u00b7workflow", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L21"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_\uc785\ub825_\uc635\uc158", "label": "\uc785\ub825 \uc635\uc158", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L30"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_b06_wf3_profilecross_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_b06_wf3_profilecross_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_\ud654\uba74_workflow", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_b06_wf3_profilecross_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L21", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_b06_wf3_profilecross_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_frontend_\uc785\ub825_\uc635\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", "source_location": "L30", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/3db683a2cde7e94a133978113563de2a3fd70d54fdde9b2002e15145901824c1.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/3db683a2cde7e94a133978113563de2a3fd70d54fdde9b2002e15145901824c1.json new file mode 100644 index 0000000..aaae741 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/3db683a2cde7e94a133978113563de2a3fd70d54fdde9b2002e15145901824c1.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_md", "label": "A09_frontend.md", "file_type": "document", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_a09_security_frontend", "label": "A09_Security \u2014 Frontend", "file_type": "document", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", "file_type": "document", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L25"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\uc57d\uad00_\ub370\uc774\ud130_a09_security_terms_ts", "label": "\uc57d\uad00 \ub370\uc774\ud130 (A09_Security_Terms.ts)", "file_type": "document", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L31"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218_\ubbf8\uc0ac\uc6a9_\uc815\uc758\ub9cc", "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8 \ud568\uc218 (\u26a0\ufe0f \ubbf8\uc0ac\uc6a9, \uc815\uc758\ub9cc)", "file_type": "document", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L40"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "file_type": "document", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L53"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\uc2a4\ud0c0\uc77c_css", "label": "\uc2a4\ud0c0\uc77c (CSS)", "file_type": "document", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L64"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\uc57d\uad00_\ud14d\uc2a4\ud2b8\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58", "label": "\u26a0\ufe0f \uc57d\uad00 \ud14d\uc2a4\ud2b8\uc640 \uc2e4 \ucf54\ub4dc \ubd88\uc77c\uce58", "file_type": "document", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L69"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L75"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_security_a09_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a06_login_a06_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_a09_security_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_a09_security_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_a09_security_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L25", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_a09_security_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\uc57d\uad00_\ub370\uc774\ud130_a09_security_terms_ts", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L31", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_a09_security_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218_\ubbf8\uc0ac\uc6a9_\uc815\uc758\ub9cc", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L40", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_a09_security_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L53", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L55", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_a09_security_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\uc2a4\ud0c0\uc77c_css", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L64", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_a09_security_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\uc57d\uad00_\ud14d\uc2a4\ud2b8\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L69", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a06_login_a06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L72", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_a09_security_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_frontend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_frontend.md", "source_location": "L75", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/430bcc25e31726266357a8339dcac795f30c714099326f504dcf44364ffdfd63.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/430bcc25e31726266357a8339dcac795f30c714099326f504dcf44364ffdfd63.json new file mode 100644 index 0000000..036a734 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/430bcc25e31726266357a8339dcac795f30c714099326f504dcf44364ffdfd63.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_md", "label": "A02_frontend.md", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", "label": "A02_ProgDetail \u2014 Frontend", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_\uad6c\uc870", "label": "\uad6c\uc870", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ubd84\uc11d", "label": "\ucef4\ud3ec\ub10c\ud2b8 \ubd84\uc11d", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L16"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_\uc81c\uc57d_\uc900\uc218", "label": "\uc81c\uc57d \uc900\uc218", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L24"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_\uc138\ubd80_\uad6c\ud604", "label": "\uc138\ubd80 \uad6c\ud604", "file_type": "document", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L31"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a01_home_a01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_progdetail_a02_components_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ubd84\uc11d", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L16", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_\uc81c\uc57d_\uc900\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a02_progdetail_a02_frontend_\uc138\ubd80_\uad6c\ud604", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A02_ProgDetail/A02_frontend.md", "source_location": "L31", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/464194e04c304a155a3445c411403400b6239ad5460dfad3ccdeb03da87f41fb.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/464194e04c304a155a3445c411403400b6239ad5460dfad3ccdeb03da87f41fb.json new file mode 100644 index 0000000..738dc18 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/464194e04c304a155a3445c411403400b6239ad5460dfad3ccdeb03da87f41fb.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_md", "label": "B06_backend.md", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", "label": "B06_wf3_ProfileCross \u2014 Backend", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", "label": "\uc694\uccad\u00b7\uc751\ub2f5 \ubaa8\ub378", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_\uc0dd\uc131_\uc5d4\uc9c4", "label": "\uc0dd\uc131 \uc5d4\uc9c4", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L20"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_\ub77c\uc6b0\ud130_workflow", "label": "\ub77c\uc6b0\ud130\u00b7workflow", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L31"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_\uc7ac\uc2e4\ud589", "label": "\uc7ac\uc2e4\ud589", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L39"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_\uc0dd\uc131_\uc5d4\uc9c4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_\ub77c\uc6b0\ud130_workflow", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L31", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L37", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_backend_\uc7ac\uc2e4\ud589", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", "source_location": "L39", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/474c775ef5ef23ed26e38b39828a52131bedb7f8a770ad07dc99148df7e87c5b.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/474c775ef5ef23ed26e38b39828a52131bedb7f8a770ad07dc99148df7e87c5b.json new file mode 100644 index 0000000..d1a62ad --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/474c775ef5ef23ed26e38b39828a52131bedb7f8a770ad07dc99148df7e87c5b.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_md", "label": "B04_backend.md", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", "label": "B04_wf1_Surface \u2014 Backend", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\ud30c\uc77c_\uad6c\uc131_\uc624\ucf00\uc2a4\ud2b8\ub808\uc774\ud130_\uc800\uc7a5\uc18c_\ub77c\uc6b0\ud130", "label": "\ud30c\uc77c \uad6c\uc131 (\uc624\ucf00\uc2a4\ud2b8\ub808\uc774\ud130/\uc800\uc7a5\uc18c/\ub77c\uc6b0\ud130)", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\uc5d4\uc9c4_\uc11c\ube0c\ubaa8\ub4c8", "label": "\uc5d4\uc9c4 \uc11c\ube0c\ubaa8\ub4c8", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L21"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\uc8fc\uc694_\ud568\uc218_router", "label": "\uc8fc\uc694 \ud568\uc218 (Router)", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L35"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\uc6cc\ud06c\ud50c\ub85c\uc6b0_\uc0c1\ud0dc_\uc804\uc774", "label": "\uc6cc\ud06c\ud50c\ub85c\uc6b0 \uc0c1\ud0dc \uc804\uc774", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L44"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\ub808\uac70\uc2dc_\ud3f4\ubc31_416_420\uc904", "label": "\u26a0\ufe0f \ub808\uac70\uc2dc \ud3f4\ubc31 (416,420\uc904)", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L53"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\ucc45\uc784", "label": "\ucc45\uc784", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L62"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L66"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\ud30c\uc77c_\uad6c\uc131_\uc624\ucf00\uc2a4\ud2b8\ub808\uc774\ud130_\uc800\uc7a5\uc18c_\ub77c\uc6b0\ud130", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\uc5d4\uc9c4_\uc11c\ube0c\ubaa8\ub4c8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L21", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\uc8fc\uc694_\ud568\uc218_router", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L35", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\uc6cc\ud06c\ud50c\ub85c\uc6b0_\uc0c1\ud0dc_\uc804\uc774", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L44", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L51", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\ub808\uac70\uc2dc_\ud3f4\ubc31_416_420\uc904", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L53", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\ucc45\uc784", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L62", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L66", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_common_util_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_backend.md", "source_location": "L68", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/479a8e4089e3bb7a2cc81032c56fd9af63de315e299c5bfaa734f3dc729d25a1.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/479a8e4089e3bb7a2cc81032c56fd9af63de315e299c5bfaa734f3dc729d25a1.json new file mode 100644 index 0000000..b85aeb9 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/479a8e4089e3bb7a2cc81032c56fd9af63de315e299c5bfaa734f3dc729d25a1.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_md", "label": "route_profile.md", "file_type": "document", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", "label": "DB: \uacbd\ub85c/\uc885\ud6a1\ub2e8 \ud14c\uc774\ube14", "file_type": "document", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_routes_\ub178\uc120_\uacbd\ub85c", "label": "routes (\ub178\uc120 \uacbd\ub85c)", "file_type": "document", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L13"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_route_points_\uacbd\ub85c_\uc88c\ud45c\uc810", "label": "route_points (\uacbd\ub85c \uc88c\ud45c\uc810)", "file_type": "document", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L27"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_route_statistics_\ub178\uc120_\ud1b5\uacc4", "label": "route_statistics (\ub178\uc120 \ud1b5\uacc4)", "file_type": "document", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L36"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_longitudinal_sections_\uc885\ub2e8\uba74_\uc124\uacc4", "label": "longitudinal_sections (\uc885\ub2e8\uba74 \uc124\uacc4)", "file_type": "document", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L45"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_cross_sections_\ud6a1\ub2e8\uba74_\uc124\uacc4", "label": "cross_sections (\ud6a1\ub2e8\uba74 \uc124\uacc4)", "file_type": "document", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L55"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_routes_status_\ud750\ub984", "label": "routes.status \ud750\ub984", "file_type": "document", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L65"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_cross_sections_data_structures", "label": "cross_sections.data.structures", "file_type": "document", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L68"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_routes_\ub178\uc120_\uacbd\ub85c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L13", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_route_points_\uacbd\ub85c_\uc88c\ud45c\uc810", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_route_statistics_\ub178\uc120_\ud1b5\uacc4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L36", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_longitudinal_sections_\uc885\ub2e8\uba74_\uc124\uacc4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L45", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_cross_sections_\ud6a1\ub2e8\uba74_\uc124\uacc4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L55", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_routes_status_\ud750\ub984", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L65", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_cross_sections_data_structures", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L68", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/route_profile.md", "source_location": "L69", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/49fd7d94d4b60db667d3b09b49911f92d55600a624ab7905ccbc6e3ad42a3352.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/49fd7d94d4b60db667d3b09b49911f92d55600a624ab7905ccbc6e3ad42a3352.json new file mode 100644 index 0000000..ce0ab54 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/49fd7d94d4b60db667d3b09b49911f92d55600a624ab7905ccbc6e3ad42a3352.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_md", "label": "A01_components.md", "file_type": "document", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", "label": "A01_Home \u2014 \uc138\ubd80 \uad6c\ud604", "file_type": "document", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_\uc2a4\ud0c0\uc77c", "label": "\uc2a4\ud0c0\uc77c", "file_type": "document", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L20"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_\ub370\uc774\ud130_\ud750\ub984", "label": "\ub370\uc774\ud130 \ud750\ub984", "file_type": "document", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L27"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_\ubbf8\ud574\uacb0", "label": "\ubbf8\ud574\uacb0", "file_type": "document", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L34"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_home_a01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_\uc2a4\ud0c0\uc77c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_\ub370\uc774\ud130_\ud750\ub984", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_components_\ubbf8\ud574\uacb0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_components.md", "source_location": "L34", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/4a5f18486fb810daf3f1c5b1551536726d973ee824de69be0d36d0a60322cdaa.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/4a5f18486fb810daf3f1c5b1551536726d973ee824de69be0d36d0a60322cdaa.json new file mode 100644 index 0000000..b773414 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/4a5f18486fb810daf3f1c5b1551536726d973ee824de69be0d36d0a60322cdaa.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_md", "label": "B02_frontend.md", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_b02_projregister_frontend", "label": "B02_ProjRegister \u2014 Frontend", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\uc785\ub825_\ud544\ub4dc", "label": "\uc785\ub825 \ud544\ub4dc", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L26"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\uc81c\ucd9c_\ub85c\uc9c1", "label": "\uc81c\ucd9c \ub85c\uc9c1", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L37"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L45"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\uc2a4\ud0c0\uc77c_css", "label": "\uc2a4\ud0c0\uc77c (CSS)", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L57"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L66"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L72"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\ucc38\uace0", "label": "\ucc38\uace0", "file_type": "document", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L80"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_projregister_b02_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_projregister_b02_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_b02_projregister_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_b02_projregister_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_b02_projregister_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_b02_projregister_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\uc785\ub825_\ud544\ub4dc", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L26", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_b02_projregister_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\uc81c\ucd9c_\ub85c\uc9c1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L37", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_b02_projregister_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L45", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_b02_projregister_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\uc2a4\ud0c0\uc77c_css", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L57", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_b02_projregister_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L66", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_b02_projregister_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L72", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_b02_projregister_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b02_projregister_b02_frontend_\ucc38\uace0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B02_ProjRegister/B02_frontend.md", "source_location": "L80", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/4b09b67e025ab679214a595ed4288633a2c58d466bff1f2e195d8ad42e74d686.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/4b09b67e025ab679214a595ed4288633a2c58d466bff1f2e195d8ad42e74d686.json new file mode 100644 index 0000000..53c6dff --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/4b09b67e025ab679214a595ed4288633a2c58d466bff1f2e195d8ad42e74d686.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "label": "B08_db.md", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_b08_wf5_quantity_db", "label": "B08_wf5_Quantity \u2014 DB", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_\uad6c\ud604_\ub300\uae30_\ud56d\ubaa9", "label": "\uad6c\ud604 \ub300\uae30 \ud56d\ubaa9", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L19"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_b08_wf5_quantity_db", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_db_schema_structure_output_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L16", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L17", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_b08_wf5_quantity_db", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_\uad6c\ud604_\ub300\uae30_\ud56d\ubaa9", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L29", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/4df26e4d9121bc917f5542182c4d4b90fe7405d00db5ca205080ab8b2fcba450.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/4df26e4d9121bc917f5542182c4d4b90fe7405d00db5ca205080ab8b2fcba450.json new file mode 100644 index 0000000..376bdb7 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/4df26e4d9121bc917f5542182c4d4b90fe7405d00db5ca205080ab8b2fcba450.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "label": "index.md", "file_type": "document", "source_file": "index.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_wiki_index", "label": "Wiki Index", "file_type": "document", "source_file": "index.md", "source_location": "L6"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", "label": "\ud398\uc774\uc9c0 \u2014 \ub85c\uadf8\uc778 \ud6c4 \uc6cc\ud06c\ud50c\ub85c\uc6b0 (B01~B09)", "file_type": "document", "source_file": "index.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b01_dashboard_b01_backend_b01_dashboard", "label": "[[B01_Dashboard/B01_backend|B01_Dashboard]]", "file_type": "document", "source_file": "index.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b02_projregister_b02_backend_b02_projregister", "label": "[[B02_ProjRegister/B02_backend|B02_ProjRegister]]", "file_type": "document", "source_file": "index.md", "source_location": "L15"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b03_fileinput_b03_backend_b03_fileinput", "label": "[[B03_FileInput/B03_backend|B03_FileInput]]", "file_type": "document", "source_file": "index.md", "source_location": "L18"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b04_wf1_surface_b04_backend_b04_wf1_surface", "label": "[[B04_wf1_Surface/B04_backend|B04_wf1_Surface]]", "file_type": "document", "source_file": "index.md", "source_location": "L21"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b05_wf2_route_b05_backend_b05_wf2_route", "label": "[[B05_wf2_Route/B05_backend|B05_wf2_Route]]", "file_type": "document", "source_file": "index.md", "source_location": "L24"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross", "label": "[[B06_wf3_ProfileCross/B06_backend|B06_wf3_ProfileCross]]", "file_type": "document", "source_file": "index.md", "source_location": "L27"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail", "label": "[[B07_wf4_DesignDetail/B07_frontend|B07_wf4_DesignDetail]]", "file_type": "document", "source_file": "index.md", "source_location": "L30"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b08_wf5_quantity_b08_frontend_b08_wf5_quantity", "label": "[[B08_wf5_Quantity/B08_frontend|B08_wf5_Quantity]]", "file_type": "document", "source_file": "index.md", "source_location": "L33"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b09_wf6_estimation_b09_frontend_b09_wf6_estimation", "label": "[[B09_wf6_Estimation/B09_frontend|B09_wf6_Estimation]]", "file_type": "document", "source_file": "index.md", "source_location": "L36"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", "label": "\ud398\uc774\uc9c0 \u2014 \ub85c\uadf8\uc778 \uc804 (A01~A09)", "file_type": "document", "source_file": "index.md", "source_location": "L39"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a01_home_a01_frontend_a01_home", "label": "[[A01_Home/A01_frontend|A01_Home]]", "file_type": "document", "source_file": "index.md", "source_location": "L41"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a02_progdetail_a02_frontend_a02_progdetail", "label": "[[A02_ProgDetail/A02_frontend|A02_ProgDetail]]", "file_type": "document", "source_file": "index.md", "source_location": "L44"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a03_compdetail_a03_frontend_a03_compdetail", "label": "[[A03_CompDetail/A03_frontend|A03_CompDetail]]", "file_type": "document", "source_file": "index.md", "source_location": "L47"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a04_newshistory_a04_frontend_a04_newshistory", "label": "[[A04_NewsHistory/A04_frontend|A04_NewsHistory]]", "file_type": "document", "source_file": "index.md", "source_location": "L50"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a05_edudetail_a05_frontend_a05_edudetail", "label": "[[A05_EduDetail/A05_frontend|A05_EduDetail]]", "file_type": "document", "source_file": "index.md", "source_location": "L53"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a06_login_a06_backend_a06_login", "label": "[[A06_Login/A06_backend|A06_Login]]", "file_type": "document", "source_file": "index.md", "source_location": "L56"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a07_register_a07_backend_a07_register", "label": "[[A07_Register/A07_backend|A07_Register]]", "file_type": "document", "source_file": "index.md", "source_location": "L59"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a08_support_a08_backend_a08_support", "label": "[[A08_Support/A08_backend|A08_Support]]", "file_type": "document", "source_file": "index.md", "source_location": "L62"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a09_security_a09_backend_a09_security", "label": "[[A09_Security/A09_backend|A09_Security]]", "file_type": "document", "source_file": "index.md", "source_location": "L65"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "label": "\uac1c\ub150 (Concepts)", "file_type": "document", "source_file": "index.md", "source_location": "L68"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a00_app_shell_framework", "label": "[[a00_app_shell_framework]]", "file_type": "document", "source_file": "index.md", "source_location": "L70"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a00_app_shell_framework_scaffold", "label": "[[a00_app_shell_framework_scaffold]]", "file_type": "document", "source_file": "index.md", "source_location": "L73"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_ui_templates", "label": "[[ui_templates]]", "file_type": "document", "source_file": "index.md", "source_location": "L76"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_db_\uc2a4\ud0a4\ub9c8", "label": "DB \uc2a4\ud0a4\ub9c8", "file_type": "document", "source_file": "index.md", "source_location": "L79"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_auth_rbac", "label": "[[auth_rbac]]", "file_type": "document", "source_file": "index.md", "source_location": "L89"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_storage_paths", "label": "[[storage_paths]]", "file_type": "document", "source_file": "index.md", "source_location": "L92"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_common_util", "label": "[[common_util]]", "file_type": "document", "source_file": "index.md", "source_location": "L95"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "label": "API \uacf5\ud1b5 (\uc5ec\ub7ec \ud398\uc774\uc9c0\uac00 \uacf5\uc720\ud558\ub294 \uc5d4\ub4dc\ud3ec\uc778\ud2b8)", "file_type": "document", "source_file": "index.md", "source_location": "L98"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uc758\uc874\uc131_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac", "label": "\uc758\uc874\uc131 (\uc5ec\ub7ec \ud398\uc774\uc9c0\uac00 \uacf5\uc720\ud558\ub294 \uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac)", "file_type": "document", "source_file": "index.md", "source_location": "L101"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", "label": "\uacf5\ud1b5 \uc2a4\ud0a4\ub9c8 (Pydantic \uc694\uccad/\uc751\ub2f5 \ubaa8\ub378)", "file_type": "document", "source_file": "index.md", "source_location": "L104"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_workflow_\uc0c1\ud0dc_\uad00\ub9ac", "label": "Workflow \uc0c1\ud0dc \uad00\ub9ac", "file_type": "document", "source_file": "index.md", "source_location": "L107"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ubbf8\ud574\uacb0_\ud56d\ubaa9", "label": "\u26a0\ufe0f \ubbf8\ud574\uacb0 \ud56d\ubaa9", "file_type": "document", "source_file": "index.md", "source_location": "L110"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a\uadf8\ub8f9_\uc778\uc81c\uc2a4\ud2b8_\uc774\uc288", "label": "A\uadf8\ub8f9 \uc778\uc81c\uc2a4\ud2b8 \uc774\uc288", "file_type": "document", "source_file": "index.md", "source_location": "L116"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_wiki_index", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L6", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_wiki_index", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b01_dashboard_b01_backend_b01_dashboard", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b02_projregister_b02_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L15", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b02_projregister_b02_backend_b02_projregister", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L15", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L18", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b03_fileinput_b03_backend_b03_fileinput", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L18", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b04_wf1_surface_b04_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L21", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b04_wf1_surface_b04_backend_b04_wf1_surface", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L21", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b05_wf2_route_b05_backend_b05_wf2_route", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b07_wf4_designdetail_b07_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L33", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b08_wf5_quantity_b08_frontend_b08_wf5_quantity", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L33", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b09_wf6_estimation_b09_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L36", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_b09_wf6_estimation_b09_frontend_b09_wf6_estimation", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L36", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_wiki_index", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L39", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a01_home_a01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L41", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a01_home_a01_frontend_a01_home", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L41", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a02_progdetail_a02_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L44", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a02_progdetail_a02_frontend_a02_progdetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L44", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a03_compdetail_a03_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L47", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a03_compdetail_a03_frontend_a03_compdetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L47", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a04_newshistory_a04_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L50", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a04_newshistory_a04_frontend_a04_newshistory", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L50", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a05_edudetail_a05_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L53", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a05_edudetail_a05_frontend_a05_edudetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L53", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a06_login_a06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L56", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a06_login_a06_backend_a06_login", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L56", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a07_register_a07_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L59", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a07_register_a07_backend_a07_register", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L59", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a08_support_a08_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L62", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a08_support_a08_backend_a08_support", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L62", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a09_security_a09_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L65", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a09_security_a09_backend_a09_security", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L65", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_wiki_index", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L68", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L70", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a00_app_shell_framework", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L70", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a00_app_shell_framework_scaffold_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L73", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a00_app_shell_framework_scaffold", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L73", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L76", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_ui_templates", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L76", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_db_\uc2a4\ud0a4\ub9c8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L79", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L80", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_db_schema_users_auth_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L81", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_db_schema_logs_monitoring_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L82", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_db_schema_projects_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L83", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_db_schema_files_surface_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L84", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_db_schema_route_profile_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L85", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_db_schema_structure_output_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L86", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_db_schema_unconfirmed_readme_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L87", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L89", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_auth_rbac", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L89", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L92", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_storage_paths", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L92", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_common_util_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L95", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_common_util", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L95", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L98", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_api_common_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L99", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uc758\uc874\uc131_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L101", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L102", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L104", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_schema_common_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L105", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\uac1c\ub150_concepts", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_workflow_\uc0c1\ud0dc_\uad00\ub9ac", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L107", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L108", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_wiki_index", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ubbf8\ud574\uacb0_\ud56d\ubaa9", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L110", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_\ubbf8\ud574\uacb0_\ud56d\ubaa9", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_index_a\uadf8\ub8f9_\uc778\uc81c\uc2a4\ud2b8_\uc774\uc288", "relation": "contains", "confidence": "EXTRACTED", "source_file": "index.md", "source_location": "L116", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/50e6b6bf0066bb5b891dbcf8988ee06ec3918a47e2e33f1bba85cc3d586c424c.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/50e6b6bf0066bb5b891dbcf8988ee06ec3918a47e2e33f1bba85cc3d586c424c.json new file mode 100644 index 0000000..62ed5fe --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/50e6b6bf0066bb5b891dbcf8988ee06ec3918a47e2e33f1bba85cc3d586c424c.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_md", "label": "A08_frontend.md", "file_type": "document", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_a08_support_frontend", "label": "A08_Support \u2014 Frontend", "file_type": "document", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", "file_type": "document", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\uc81c\ucd9c_\ub85c\uc9c1", "label": "\uc81c\ucd9c \ub85c\uc9c1", "file_type": "document", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L27"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\uc138\uc158_\uc790\ub3d9_\ucc44\uc6c0", "label": "\uc138\uc158 \uc790\ub3d9 \ucc44\uc6c0", "file_type": "document", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L34"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "file_type": "document", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L39"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\uc2a4\ud0c0\uc77c_css", "label": "\uc2a4\ud0c0\uc77c (CSS)", "file_type": "document", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L51"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", "file_type": "document", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L59"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L65"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\ucc38\uace0", "label": "\ucc38\uace0", "file_type": "document", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L73"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_support_a08_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_a08_support_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_a08_support_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_a08_support_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_a08_support_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\uc81c\ucd9c_\ub85c\uc9c1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_a08_support_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\uc138\uc158_\uc790\ub3d9_\ucc44\uc6c0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L34", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a06_login_a06_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L36", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_a08_support_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L39", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_a08_support_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\uc2a4\ud0c0\uc77c_css", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L51", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_a08_support_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L59", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_a08_support_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L65", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_a08_support_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a08_support_a08_frontend_\ucc38\uace0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A08_Support/A08_frontend.md", "source_location": "L73", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/52811408853b074f152e72eca98203c800db677004bc8ae75c253e28b0464ee1.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/52811408853b074f152e72eca98203c800db677004bc8ae75c253e28b0464ee1.json new file mode 100644 index 0000000..fbf4cea --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/52811408853b074f152e72eca98203c800db677004bc8ae75c253e28b0464ee1.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "label": "overview.md", "file_type": "document", "source_file": "concepts/db_schema/overview.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", "label": "DB \uc2a4\ud0a4\ub9c8 \uac1c\uc694", "file_type": "document", "source_file": "concepts/db_schema/overview.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_\ud14c\uc774\ube14_\uadf8\ub8f9_9\uac1c", "label": "\ud14c\uc774\ube14 \uadf8\ub8f9 (9\uac1c)", "file_type": "document", "source_file": "concepts/db_schema/overview.md", "source_location": "L22"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_\ud30c\uc77c_\uacbd\ub85c_\ucd94\uc801_\uceec\ub7fc_db\uc5d0_\uacbd\ub85c\ub9cc_\uae30\ub85d_\uc2e4_\ud30c\uc77c\uc740_\ud30c\uc77c\uc2dc\uc2a4\ud15c", "label": "\ud30c\uc77c \uacbd\ub85c \ucd94\uc801 \uceec\ub7fc (DB\uc5d0 \uacbd\ub85c\ub9cc \uae30\ub85d, \uc2e4 \ud30c\uc77c\uc740 \ud30c\uc77c\uc2dc\uc2a4\ud15c)", "file_type": "document", "source_file": "concepts/db_schema/overview.md", "source_location": "L34"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_\uc124\uacc4_\uc6d0\uce59", "label": "\uc124\uacc4 \uc6d0\uce59", "file_type": "document", "source_file": "concepts/db_schema/overview.md", "source_location": "L51"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_\ud14c\uc774\ube14_\uad00\uacc4_\ud575\uc2ec_\ud750\ub984", "label": "\ud14c\uc774\ube14 \uad00\uacc4 (\ud575\uc2ec \ud750\ub984)", "file_type": "document", "source_file": "concepts/db_schema/overview.md", "source_location": "L56"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L16", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L17", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_\ud14c\uc774\ube14_\uadf8\ub8f9_9\uac1c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L22", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L26", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L28", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_files_surface_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L29", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_route_profile_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L31", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_\ud30c\uc77c_\uacbd\ub85c_\ucd94\uc801_\uceec\ub7fc_db\uc5d0_\uacbd\ub85c\ub9cc_\uae30\ub85d_\uc2e4_\ud30c\uc77c\uc740_\ud30c\uc77c\uc2dc\uc2a4\ud15c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L34", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L49", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_\uc124\uacc4_\uc6d0\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L51", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_\ud14c\uc774\ube14_\uad00\uacc4_\ud575\uc2ec_\ud750\ub984", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/overview.md", "source_location": "L56", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/54d5ac3300a973b62932c4e49e96e3aefea664dc1af074865d994a02ceea83e7.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/54d5ac3300a973b62932c4e49e96e3aefea664dc1af074865d994a02ceea83e7.json new file mode 100644 index 0000000..9237eb1 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/54d5ac3300a973b62932c4e49e96e3aefea664dc1af074865d994a02ceea83e7.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "label": "B06_api.md", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_b06_wf3_profilecross_api", "label": "B06_wf3_ProfileCross \u2014 API", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_\uc0dd\uc131_\uc751\ub2f5", "label": "\uc0dd\uc131 \uc751\ub2f5", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L20"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_b06_wf3_profilecross_api", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_b06_wf3_profilecross_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_\uc0dd\uc131_\uc751\ub2f5", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L20", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/5fec6364bd060aef3f2afe819bea5354565d898bbb2169efed8ae55d8aba79cc.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/5fec6364bd060aef3f2afe819bea5354565d898bbb2169efed8ae55d8aba79cc.json new file mode 100644 index 0000000..8c3d229 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/5fec6364bd060aef3f2afe819bea5354565d898bbb2169efed8ae55d8aba79cc.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_md", "label": "A01_frontend.md", "file_type": "document", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_a01_home_frontend", "label": "A01_Home \u2014 Frontend", "file_type": "document", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\ucef4\ud3ec\ub10c\ud2b8", "label": "\ucef4\ud3ec\ub10c\ud2b8", "file_type": "document", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_hero_\uc139\uc158", "label": "Hero \uc139\uc158", "file_type": "document", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L21"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\ucd5c\uc2e0_\uc18c\uc2dd_\uc139\uc158", "label": "\ucd5c\uc2e0 \uc18c\uc2dd \uc139\uc158", "file_type": "document", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L26"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\uc8fc\uc694_\uae30\ub2a5_\uc139\uc158", "label": "\uc8fc\uc694 \uae30\ub2a5 \uc139\uc158", "file_type": "document", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L31"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", "file_type": "document", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L36"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "file_type": "document", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L43"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\uc138\ubd80_\uad6c\ud604", "label": "\uc138\ubd80 \uad6c\ud604", "file_type": "document", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L58"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a02_progdetail_a02_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a04_newshistory_a04_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_a01_home_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_a01_home_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_a01_home_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\ucef4\ud3ec\ub10c\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\ucef4\ud3ec\ub10c\ud2b8", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_hero_\uc139\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L21", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\ucef4\ud3ec\ub10c\ud2b8", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\ucd5c\uc2e0_\uc18c\uc2dd_\uc139\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L26", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\ucef4\ud3ec\ub10c\ud2b8", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\uc8fc\uc694_\uae30\ub2a5_\uc139\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L31", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_a01_home_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L36", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_a01_home_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L43", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_a01_home_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_\uc138\ubd80_\uad6c\ud604", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L58", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a01_home_a01_home_a01_components_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A01_Home/A01_frontend.md", "source_location": "L60", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/645ae1caf18f1055571c195d5af0488bcb975554ef4227b5d294117aa14d35bc.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/645ae1caf18f1055571c195d5af0488bcb975554ef4227b5d294117aa14d35bc.json new file mode 100644 index 0000000..75ade42 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/645ae1caf18f1055571c195d5af0488bcb975554ef4227b5d294117aa14d35bc.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_md", "label": "projects.md", "file_type": "document", "source_file": "concepts/db_schema/projects.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", "label": "DB: \ud504\ub85c\uc81d\ud2b8 \uad00\ub9ac \ud14c\uc774\ube14", "file_type": "document", "source_file": "concepts/db_schema/projects.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_projects_\ud504\ub85c\uc81d\ud2b8", "label": "projects (\ud504\ub85c\uc81d\ud2b8)", "file_type": "document", "source_file": "concepts/db_schema/projects.md", "source_location": "L13"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_project_versions_\ud504\ub85c\uc81d\ud2b8_\ubc84\uc804_\uc2a4\ub0c5\uc0f7", "label": "project_versions (\ud504\ub85c\uc81d\ud2b8 \ubc84\uc804 \uc2a4\ub0c5\uc0f7)", "file_type": "document", "source_file": "concepts/db_schema/projects.md", "source_location": "L30"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_project_automations_\ud504\ub85c\uc81d\ud2b8_\uc790\ub3d9\ud654_\uc815\ucc45", "label": "project_automations (\ud504\ub85c\uc81d\ud2b8 \uc790\ub3d9\ud654 \uc815\ucc45)", "file_type": "document", "source_file": "concepts/db_schema/projects.md", "source_location": "L40"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_project_workflow_stages_\ub2e8\uacc4\ubcc4_\uc0c1\uc138_\uc0c1\ud0dc", "label": "project_workflow_stages (\ub2e8\uacc4\ubcc4 \uc0c1\uc138 \uc0c1\ud0dc)", "file_type": "document", "source_file": "concepts/db_schema/projects.md", "source_location": "L54"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/projects.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b02_projregister_b02_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/projects.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/projects.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/projects.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_projects_\ud504\ub85c\uc81d\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/projects.md", "source_location": "L13", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/projects.md", "source_location": "L25", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_project_versions_\ud504\ub85c\uc81d\ud2b8_\ubc84\uc804_\uc2a4\ub0c5\uc0f7", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/projects.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_project_automations_\ud504\ub85c\uc81d\ud2b8_\uc790\ub3d9\ud654_\uc815\ucc45", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/projects.md", "source_location": "L40", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_project_workflow_stages_\ub2e8\uacc4\ubcc4_\uc0c1\uc138_\uc0c1\ud0dc", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/projects.md", "source_location": "L54", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_projects_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/projects.md", "source_location": "L56", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/646d6ab79be622a7ff0a6e70be8cff4eba1d7a96287360cb7c92afbf09ce3094.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/646d6ab79be622a7ff0a6e70be8cff4eba1d7a96287360cb7c92afbf09ce3094.json new file mode 100644 index 0000000..ed1d571 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/646d6ab79be622a7ff0a6e70be8cff4eba1d7a96287360cb7c92afbf09ce3094.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_md", "label": "B01_backend.md", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_b01_dashboard_backend", "label": "B01_Dashboard \u2014 Backend", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_\ub77c\uc6b0\ud130_\uad8c\ud55c_\ud5ec\ud37c", "label": "\ub77c\uc6b0\ud130 \uad8c\ud55c \ud5ec\ud37c", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_\uc800\uc7a5\uc18c_\ud568\uc218", "label": "\uc800\uc7a5\uc18c \ud568\uc218", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L24"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8", "label": "\uc694\uccad \uc2a4\ud0a4\ub9c8", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L44"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_\uae30\uc220\ubd80\ucc44", "label": "\uae30\uc220\ubd80\ucc44", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L54"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_b01_dashboard_backend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_b01_dashboard_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_\ub77c\uc6b0\ud130_\uad8c\ud55c_\ud5ec\ud37c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L22", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_b01_dashboard_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_\uc800\uc7a5\uc18c_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_b01_dashboard_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L44", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_b01_dashboard_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_backend_\uae30\uc220\ubd80\ucc44", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_backend.md", "source_location": "L54", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/671505750d39bdfee5448654c63c865bd82059e3dd905065e164202716f19204.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/671505750d39bdfee5448654c63c865bd82059e3dd905065e164202716f19204.json new file mode 100644 index 0000000..3d3d957 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/671505750d39bdfee5448654c63c865bd82059e3dd905065e164202716f19204.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_md", "label": "structure_output.md", "file_type": "document", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", "label": "DB: \uad6c\uc870\ubb3c/\uc218\ub7c9/\uc0b0\ucd9c\ubb3c \ud14c\uc774\ube14", "file_type": "document", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_structures_\ubc30\uce58_\uad6c\uc870\ubb3c", "label": "structures (\ubc30\uce58 \uad6c\uc870\ubb3c)", "file_type": "document", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L13"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_quantity_items_\uc218\ub7c9_\uc0b0\ucd9c_\ud56d\ubaa9", "label": "quantity_items (\uc218\ub7c9 \uc0b0\ucd9c \ud56d\ubaa9)", "file_type": "document", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L29"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_outputs_\ucd5c\uc885_\uacac\uc801_\ub3c4\uba74_\uc0b0\ucd9c_\uc138\uc158", "label": "outputs (\ucd5c\uc885 \uacac\uc801/\ub3c4\uba74 \uc0b0\ucd9c \uc138\uc158)", "file_type": "document", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L42"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_output_files_\uac1c\ubcc4_\uc0b0\ucd9c_\ud30c\uc77c_\ub9ac\uc2a4\ud2b8", "label": "output_files (\uac1c\ubcc4 \uc0b0\ucd9c \ud30c\uc77c \ub9ac\uc2a4\ud2b8)", "file_type": "document", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L54"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_quantity_items_\ucd1d\ube44\uc6a9_\uacc4\uc0b0_\uc608", "label": "quantity_items \ucd1d\ube44\uc6a9 \uacc4\uc0b0 \uc608", "file_type": "document", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L65"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b07_wf4_designdetail_b07_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b09_wf6_estimation_b09_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_structures_\ubc30\uce58_\uad6c\uc870\ubb3c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L13", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_quantity_items_\uc218\ub7c9_\uc0b0\ucd9c_\ud56d\ubaa9", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L29", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_outputs_\ucd5c\uc885_\uacac\uc801_\ub3c4\uba74_\uc0b0\ucd9c_\uc138\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L42", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_output_files_\uac1c\ubcc4_\uc0b0\ucd9c_\ud30c\uc77c_\ub9ac\uc2a4\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L54", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_structure_output_quantity_items_\ucd1d\ube44\uc6a9_\uacc4\uc0b0_\uc608", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/structure_output.md", "source_location": "L65", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/777dc18c8da82ae19d1ef4696015cf4a4f34c2c07d0b440fe86da472081038b8.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/777dc18c8da82ae19d1ef4696015cf4a4f34c2c07d0b440fe86da472081038b8.json new file mode 100644 index 0000000..81fe0a9 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/777dc18c8da82ae19d1ef4696015cf4a4f34c2c07d0b440fe86da472081038b8.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_md", "label": "AGENTS.md", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_wiki_\ud3f4\ub354_\uaddc\uce59", "label": "wiki/ \ud3f4\ub354 \uaddc\uce59", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_\uad6c\uc870", "label": "\uad6c\uc870", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L5"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_\uc791\uc131_\uaddc\uce59", "label": "\uc791\uc131 \uaddc\uce59", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L11"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_wiki_\ud3f4\ub354_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "AGENTS.md", "source_location": "L1", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_wiki_\ud3f4\ub354_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "AGENTS.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_wiki_\ud3f4\ub354_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_\uc791\uc131_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "AGENTS.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_\ud398\uc774\uc9c0\uba85_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "AGENTS.md", "source_location": "L14", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/7a20bcee60ba41e229ef85f767421d7179a7ae138805534d5a8f104afc477a40.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/7a20bcee60ba41e229ef85f767421d7179a7ae138805534d5a8f104afc477a40.json new file mode 100644 index 0000000..2a8bb4a --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/7a20bcee60ba41e229ef85f767421d7179a7ae138805534d5a8f104afc477a40.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_md", "label": "CLAUDE.md", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_wiki_\ud3f4\ub354_\uaddc\uce59", "label": "wiki/ \ud3f4\ub354 \uaddc\uce59", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_\uad6c\uc870", "label": "\uad6c\uc870", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L5"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_\uc791\uc131_\uaddc\uce59", "label": "\uc791\uc131 \uaddc\uce59", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L11"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_wiki_\ud3f4\ub354_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "CLAUDE.md", "source_location": "L1", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_wiki_\ud3f4\ub354_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "CLAUDE.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_wiki_\ud3f4\ub354_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_\uc791\uc131_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "CLAUDE.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_\ud398\uc774\uc9c0\uba85_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "CLAUDE.md", "source_location": "L14", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/7b7b025371ec01828e5296e1181ed9c5c4381d26906e595e1bf74b413f559880.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/7b7b025371ec01828e5296e1181ed9c5c4381d26906e595e1bf74b413f559880.json new file mode 100644 index 0000000..4ebb1a1 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/7b7b025371ec01828e5296e1181ed9c5c4381d26906e595e1bf74b413f559880.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_md", "label": "schema_common.md", "file_type": "document", "source_file": "concepts/schema_common.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", "label": "\uacf5\ud1b5 \uc2a4\ud0a4\ub9c8 (Pydantic \uc694\uccad/\uc751\ub2f5 \uaddc\uce59)", "file_type": "document", "source_file": "concepts/schema_common.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uac80\uc99d_\uc6d0\uce59_backend_md_4\uc808", "label": "\uac80\uc99d \uc6d0\uce59 (backend.md 4\uc808)", "file_type": "document", "source_file": "concepts/schema_common.md", "source_location": "L11"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uba85\uba85_\uaddc\uce59", "label": "\uba85\uba85 \uaddc\uce59", "file_type": "document", "source_file": "concepts/schema_common.md", "source_location": "L16"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/schema_common.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uac80\uc99d_\uc6d0\uce59_backend_md_4\uc808", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/schema_common.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uba85\uba85_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/schema_common.md", "source_location": "L16", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/7fb3857a81e71036c1ce149c4b7245df62a5739b3547ecf4cabbdad69ea26f7d.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/7fb3857a81e71036c1ce149c4b7245df62a5739b3547ecf4cabbdad69ea26f7d.json new file mode 100644 index 0000000..9dd018f --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/7fb3857a81e71036c1ce149c4b7245df62a5739b3547ecf4cabbdad69ea26f7d.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_md", "label": "logs_monitoring.md", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "label": "DB: \ub85c\uadf8/\ubaa8\ub2c8\ud130\ub9c1 \ud14c\uc774\ube14", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_login_logs_\ub85c\uadf8\uc778_\uc2dc\ub3c4_\ub85c\uadf8", "label": "login_logs (\ub85c\uadf8\uc778 \uc2dc\ub3c4 \ub85c\uadf8)", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L13"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_activity_logs_\uc0ac\uc6a9\uc790_\ud65c\ub3d9_\ub85c\uadf8", "label": "activity_logs (\uc0ac\uc6a9\uc790 \ud65c\ub3d9 \ub85c\uadf8)", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L23"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_audit_logs_\uac10\uc0ac_\ub85c\uadf8", "label": "audit_logs (\uac10\uc0ac \ub85c\uadf8)", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L33"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_system_audit_logs_\ud504\ub85c\uc81d\ud2b8_\uc870\uc9c1_\ubcc0\uacbd_\uac10\uc0ac_\ub85c\uadf8", "label": "system_audit_logs (\ud504\ub85c\uc81d\ud2b8/\uc870\uc9c1 \ubcc0\uacbd \uac10\uc0ac \ub85c\uadf8)", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L43"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_system_admin_logs_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790_\ud589\uc704_\ub85c\uadf8", "label": "system_admin_logs (\uc2dc\uc2a4\ud15c \uad00\ub9ac\uc790 \ud589\uc704 \ub85c\uadf8)", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L53"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_system_resources_\uc2dc\uc2a4\ud15c_\uc790\uc6d0_\uacc4\uce21", "label": "system_resources (\uc2dc\uc2a4\ud15c \uc790\uc6d0 \uacc4\uce21)", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L62"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_support_requests_\uae30\uc220_\uc9c0\uc6d0_\uc694\uccad", "label": "support_requests (\uae30\uc220 \uc9c0\uc6d0 \uc694\uccad)", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L71"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_change_logs_\uc124\uacc4_\ubcc0\uacbd_\uc774\ub825", "label": "change_logs (\uc124\uacc4 \ubcc0\uacbd \uc774\ub825)", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L83"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_system_audit_logs_\uc0ac\uc6a9\ucc98_b01_b02", "label": "system_audit_logs \u2014 \uc0ac\uc6a9\ucc98 (B01, B02)", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L96"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_\ub9ac\uc18c\uc2a4_api_system_admin_\uc804\uc6a9", "label": "\ub9ac\uc18c\uc2a4 API (SYSTEM_ADMIN \uc804\uc6a9)", "file_type": "document", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L100"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_login_logs_\ub85c\uadf8\uc778_\uc2dc\ub3c4_\ub85c\uadf8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L13", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_activity_logs_\uc0ac\uc6a9\uc790_\ud65c\ub3d9_\ub85c\uadf8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L23", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_audit_logs_\uac10\uc0ac_\ub85c\uadf8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L33", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_system_audit_logs_\ud504\ub85c\uc81d\ud2b8_\uc870\uc9c1_\ubcc0\uacbd_\uac10\uc0ac_\ub85c\uadf8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L43", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_system_admin_logs_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790_\ud589\uc704_\ub85c\uadf8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L53", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_system_resources_\uc2dc\uc2a4\ud15c_\uc790\uc6d0_\uacc4\uce21", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L62", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_support_requests_\uae30\uc220_\uc9c0\uc6d0_\uc694\uccad", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L71", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_change_logs_\uc124\uacc4_\ubcc0\uacbd_\uc774\ub825", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L83", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_a08_support_a08_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L94", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_system_audit_logs_\uc0ac\uc6a9\ucc98_b01_b02", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L96", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_b02_projregister_b02_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L97", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_logs_monitoring_\ub9ac\uc18c\uc2a4_api_system_admin_\uc804\uc6a9", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/logs_monitoring.md", "source_location": "L100", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/864c1304191de6468d4edc50434ec59bea00a7f2d0eee6bacc57ecbf7b4f7e04.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/864c1304191de6468d4edc50434ec59bea00a7f2d0eee6bacc57ecbf7b4f7e04.json new file mode 100644 index 0000000..d8c2b48 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/864c1304191de6468d4edc50434ec59bea00a7f2d0eee6bacc57ecbf7b4f7e04.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "label": "storage_paths.md", "file_type": "document", "source_file": "concepts/storage_paths.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", "label": "\uc800\uc7a5 \uacbd\ub85c \uaddc\uce59 (Workflow-based Folder Structure)", "file_type": "document", "source_file": "concepts/storage_paths.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\uacbd\ub85c_\ud328\ud134", "label": "\uacbd\ub85c \ud328\ud134", "file_type": "document", "source_file": "concepts/storage_paths.md", "source_location": "L11"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\uc6d0\uce59_backend_md_3\uc808", "label": "\uc6d0\uce59 (backend.md 3\uc808)", "file_type": "document", "source_file": "concepts/storage_paths.md", "source_location": "L23"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_db_\uceec\ub7fc_\uc2e4\uc81c_\uacbd\ub85c_\ub9e4\ud551", "label": "DB \uceec\ub7fc \u2194 \uc2e4\uc81c \uacbd\ub85c \ub9e4\ud551", "file_type": "document", "source_file": "concepts/storage_paths.md", "source_location": "L30"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\ud30c\uc77c\uba85_\uaddc\uce59_structure_md_1\uc808", "label": "\ud30c\uc77c\uba85 \uaddc\uce59 (structure.md 1\uc808)", "file_type": "document", "source_file": "concepts/storage_paths.md", "source_location": "L33"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b02_projregister_b02_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b04_wf1_surface_b04_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b07_wf4_designdetail_b07_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b09_wf6_estimation_b09_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\uacbd\ub85c_\ud328\ud134", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\uc6d0\uce59_backend_md_3\uc808", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L23", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_db_\uceec\ub7fc_\uc2e4\uc81c_\uacbd\ub85c_\ub9e4\ud551", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L31", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_\ud30c\uc77c\uba85_\uaddc\uce59_structure_md_1\uc808", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/storage_paths.md", "source_location": "L33", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/87a19225130d879a47fa512b619a4dfcd67d6a13bcfed08f9280892d055b7aec.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/87a19225130d879a47fa512b619a4dfcd67d6a13bcfed08f9280892d055b7aec.json new file mode 100644 index 0000000..b67e1b7 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/87a19225130d879a47fa512b619a4dfcd67d6a13bcfed08f9280892d055b7aec.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_md", "label": "A06_frontend.md", "file_type": "document", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_a06_login_frontend", "label": "A06_Login \u2014 Frontend", "file_type": "document", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", "file_type": "document", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L20"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8 \ud568\uc218", "file_type": "document", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L27"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\uc81c\ucd9c_\ub85c\uc9c1_2\ub2e8\uacc4_\ud3fc_\uc804\ud658", "label": "\uc81c\ucd9c \ub85c\uc9c1 (2\ub2e8\uacc4 \ud3fc \uc804\ud658)", "file_type": "document", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L40"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "file_type": "document", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L51"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\uc2a4\ud0c0\uc77c_css", "label": "\uc2a4\ud0c0\uc77c (CSS)", "file_type": "document", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L64"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", "file_type": "document", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L72"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L79"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_login_a06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a07_register_a07_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_a06_login_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_a06_login_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_a06_login_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_a06_login_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L38", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_a06_login_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\uc81c\ucd9c_\ub85c\uc9c1_2\ub2e8\uacc4_\ud3fc_\uc804\ud658", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L40", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_a06_login_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L51", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L53", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_a06_login_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\uc2a4\ud0c0\uc77c_css", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L64", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_a06_login_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L72", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_a06_login_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_frontend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_frontend.md", "source_location": "L79", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/890159057c1b315dc2f987cc22cff3d9f78d8a6b70c16341450a63a15eea1e79.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/890159057c1b315dc2f987cc22cff3d9f78d8a6b70c16341450a63a15eea1e79.json new file mode 100644 index 0000000..029d493 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/890159057c1b315dc2f987cc22cff3d9f78d8a6b70c16341450a63a15eea1e79.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_md", "label": "A04_frontend.md", "file_type": "document", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", "label": "A04_NewsHistory \u2014 Frontend", "file_type": "document", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", "label": "\ucef4\ud3ec\ub10c\ud2b8 (\uc139\uc158 \ube4c\ub354)", "file_type": "document", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_mock_\ub370\uc774\ud130_\uad6c\uc870", "label": "Mock \ub370\uc774\ud130 \uad6c\uc870", "file_type": "document", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L30"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "file_type": "document", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L48"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\uc2a4\ud0c0\uc77c_css", "label": "\uc2a4\ud0c0\uc77c (CSS)", "file_type": "document", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L60"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", "label": "CSS \ud074\ub798\uc2a4 \uad6c\uc870", "file_type": "document", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L62"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\ubc18\uc751\ud615", "label": "\ubc18\uc751\ud615", "file_type": "document", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L75"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L78"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\ubbf8\ud574\uacb0_\uc0ac\ud56d", "label": "\ubbf8\ud574\uacb0 \uc0ac\ud56d", "file_type": "document", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L83"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a01_home_a01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_mock_\ub370\uc774\ud130_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L48", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\uc2a4\ud0c0\uc77c_css", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L60", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\uc2a4\ud0c0\uc77c_css", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L62", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\uc2a4\ud0c0\uc77c_css", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\ubc18\uc751\ud615", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L75", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L78", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a04_newshistory_a04_frontend_\ubbf8\ud574\uacb0_\uc0ac\ud56d", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A04_NewsHistory/A04_frontend.md", "source_location": "L83", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/8d85ff410419578b818f52078b23e7a3d3a4a7c9d3c18d6994a3d65420b74bd8.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/8d85ff410419578b818f52078b23e7a3d3a4a7c9d3c18d6994a3d65420b74bd8.json new file mode 100644 index 0000000..b7a1ce4 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/8d85ff410419578b818f52078b23e7a3d3a4a7c9d3c18d6994a3d65420b74bd8.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_md", "label": "B04_frontend.md", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", "label": "B04_wf1_Surface \u2014 Frontend", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_\uacc4\ud68d\uc11c\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58_3d_\ubdf0\uc5b4", "label": "\u26a0\ufe0f \uacc4\ud68d\uc11c\uc640 \uc2e4 \ucf54\ub4dc \ubd88\uc77c\uce58 (3D \ubdf0\uc5b4)", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L22"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L32"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8 \ud568\uc218", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L40"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_\ucc98\ub9ac_\ud750\ub984", "label": "\ucc98\ub9ac \ud750\ub984", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L53"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L60"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_\uacc4\ud68d\uc11c\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58_3d_\ubdf0\uc5b4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L22", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L32", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L40", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_\ucc98\ub9ac_\ud750\ub984", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L53", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L60", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_frontend.md", "source_location": "L62", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/90d7356198e73e4cc9f6377549bb422cac5171f209ac35465cb3cf6afd457c55.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/90d7356198e73e4cc9f6377549bb422cac5171f209ac35465cb3cf6afd457c55.json new file mode 100644 index 0000000..5142a68 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/90d7356198e73e4cc9f6377549bb422cac5171f209ac35465cb3cf6afd457c55.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_md", "label": "a00_app_shell_framework.md", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_a00_common_app_shell_framework", "label": "A00_Common \u2014 App Shell Framework", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\ud30c\uc77c_\uad6c\uc131", "label": "\ud30c\uc77c \uad6c\uc131", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", "label": "app_shell \uad6c\uc131\uc694\uc18c", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L20"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\ud14c\ub9c8_\uc5b8\uc5b4_\uad00\ub9ac", "label": "\ud14c\ub9c8 & \uc5b8\uc5b4 \uad00\ub9ac", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L22"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\ud5e4\ub354_\uad6c\uc131_64px_\ub192\uc774_sticky", "label": "\ud5e4\ub354 \uad6c\uc131 (64px \ub192\uc774, sticky)", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L27"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\uc778\uc99d_\ubc84\ud2bc_\ube44\ub3d9\uae30_fillauthactions", "label": "\uc778\uc99d \ubc84\ud2bc (\ube44\ub3d9\uae30 fillAuthActions)", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L40"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\ub85c\uadf8\uc544\uc6c3_onapp_logout_click", "label": "\ub85c\uadf8\uc544\uc6c3 (onApp_Logout_Click)", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L44"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\ud478\ud130", "label": "\ud478\ud130", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L48"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_router_\ub77c\uc6b0\ud305_\ud14c\uc774\ube14", "label": "router \ub77c\uc6b0\ud305 \ud14c\uc774\ube14", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L52"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\uc778\uc99d_\uac00\ub4dc", "label": "\uc778\uc99d \uac00\ub4dc", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L77"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\uc138\ubd80_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", "label": "\uc138\ubd80 \uc2a4\uce90\ud3f4\ub4dc\u00b7CSS\u00b7\uc885\uc18d\uc131", "file_type": "document", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L84"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a01_home_a01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L3", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a02_progdetail_a02_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L3", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b01_dashboard_b01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L3", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L3", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_a00_common_app_shell_framework", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_a00_common_app_shell_framework", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\ud30c\uc77c_\uad6c\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_a00_common_app_shell_framework", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\ud14c\ub9c8_\uc5b8\uc5b4_\uad00\ub9ac", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L22", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\ud5e4\ub354_\uad6c\uc131_64px_\ub192\uc774_sticky", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\uc778\uc99d_\ubc84\ud2bc_\ube44\ub3d9\uae30_fillauthactions", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L40", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\ub85c\uadf8\uc544\uc6c3_onapp_logout_click", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L44", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\ud478\ud130", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L48", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_a00_common_app_shell_framework", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_router_\ub77c\uc6b0\ud305_\ud14c\uc774\ube14", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L52", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_a00_common_app_shell_framework", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\uc778\uc99d_\uac00\ub4dc", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L77", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_a00_common_app_shell_framework", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_\uc138\ubd80_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L84", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_scaffold_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/a00_app_shell_framework.md", "source_location": "L86", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/913554bc65be372e31038c5b6db99ffb11804957097d503d81077bbf581c6403.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/913554bc65be372e31038c5b6db99ffb11804957097d503d81077bbf581c6403.json new file mode 100644 index 0000000..ee9bab0 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/913554bc65be372e31038c5b6db99ffb11804957097d503d81077bbf581c6403.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "label": "workflow_state.md", "file_type": "document", "source_file": "concepts/workflow_state.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", "label": "Workflow \uc0c1\ud0dc \uad00\ub9ac \u2014 \uad6c\ud604 \uc644\ub8cc (\uc2e4 DB \ud655\uc778\ub428)", "file_type": "document", "source_file": "concepts/workflow_state.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_ssot_project_workflow_stages_\ud14c\uc774\ube14_\uc2e4_db_\ud655\uc778", "label": "SSOT: `project_workflow_stages` \ud14c\uc774\ube14 (\uc2e4 DB \ud655\uc778)", "file_type": "document", "source_file": "concepts/workflow_state.md", "source_location": "L13"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_\uacf5\ud1b5_\uc720\ud2f8_common_util_common_util_workflow_state_py", "label": "\uacf5\ud1b5 \uc720\ud2f8 `common_util/common_util_workflow_state.py`", "file_type": "document", "source_file": "concepts/workflow_state.md", "source_location": "L27"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_\uc2e4_\uc5f0\ub3d9_\ud604\ud669_\ud30c\uc77c_\uc904\ubc88\ud638", "label": "\uc2e4 \uc5f0\ub3d9 \ud604\ud669 (\ud30c\uc77c:\uc904\ubc88\ud638)", "file_type": "document", "source_file": "concepts/workflow_state.md", "source_location": "L37"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_\uc870\ud68c_api_\uc2e4\uc81c_\uc874\uc7ac_\uacc4\ud68d\uc11c\uc640_\uacbd\ub85c_\uc77c\uce58", "label": "\uc870\ud68c API (\uc2e4\uc81c \uc874\uc7ac, \uacc4\ud68d\uc11c\uc640 \uacbd\ub85c \uc77c\uce58)", "file_type": "document", "source_file": "concepts/workflow_state.md", "source_location": "L47"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_\uc0c1\ud0dc_\uc804\uc774_\uad6c\ud604\ub300\ub85c", "label": "\uc0c1\ud0dc \uc804\uc774 (\uad6c\ud604\ub300\ub85c)", "file_type": "document", "source_file": "concepts/workflow_state.md", "source_location": "L54"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_projects_status_\ubb38\uc790\uc5f4_\uce90\uc2dc_\ud638\ud658\uc6a9_\uacc4\ud68d\uc11c_\ubc29\uce68\ub300\ub85c_\uc720\uc9c0_\uc911", "label": "projects.status \ubb38\uc790\uc5f4 \uce90\uc2dc (\ud638\ud658\uc6a9, \uacc4\ud68d\uc11c \ubc29\uce68\ub300\ub85c \uc720\uc9c0 \uc911)", "file_type": "document", "source_file": "concepts/workflow_state.md", "source_location": "L62"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_b04_\uc0c1\ud0dc_\uc870\ud68c_\ub808\uac70\uc2dc_\ud3f4\ubc31_\ub2f9\ucd08_\uc794\uc7ac_\ub85c_\ud45c\uae30\ud588\uc73c\ub098_\uc815\uc815", "label": "B04 \uc0c1\ud0dc \uc870\ud68c \u2014 \ub808\uac70\uc2dc \ud3f4\ubc31 (\ub2f9\ucd08 \"\uc794\uc7ac\"\ub85c \ud45c\uae30\ud588\uc73c\ub098 \uc815\uc815)", "file_type": "document", "source_file": "concepts/workflow_state.md", "source_location": "L65"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_\ubbf8\ud574\uacb0_\uc0ac\ud56d_\uacc4\ud68d\uc11c_\uc6d0\ubb38_\uc544\uc9c1_\uacb0\uc815_\uc548_\ub428", "label": "\ubbf8\ud574\uacb0 \uc0ac\ud56d (\uacc4\ud68d\uc11c \uc6d0\ubb38, \uc544\uc9c1 \uacb0\uc815 \uc548 \ub428)", "file_type": "document", "source_file": "concepts/workflow_state.md", "source_location": "L72"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b02_projregister_b02_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b04_wf1_surface_b04_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b07_wf4_designdetail_b07_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b09_wf6_estimation_b09_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_ssot_project_workflow_stages_\ud14c\uc774\ube14_\uc2e4_db_\ud655\uc778", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L13", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_\uacf5\ud1b5_\uc720\ud2f8_common_util_common_util_workflow_state_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_\uc2e4_\uc5f0\ub3d9_\ud604\ud669_\ud30c\uc77c_\uc904\ubc88\ud638", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L37", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_\uc870\ud68c_api_\uc2e4\uc81c_\uc874\uc7ac_\uacc4\ud68d\uc11c\uc640_\uacbd\ub85c_\uc77c\uce58", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L47", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_\uc0c1\ud0dc_\uc804\uc774_\uad6c\ud604\ub300\ub85c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L54", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_projects_status_\ubb38\uc790\uc5f4_\uce90\uc2dc_\ud638\ud658\uc6a9_\uacc4\ud68d\uc11c_\ubc29\uce68\ub300\ub85c_\uc720\uc9c0_\uc911", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L62", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_b04_\uc0c1\ud0dc_\uc870\ud68c_\ub808\uac70\uc2dc_\ud3f4\ubc31_\ub2f9\ucd08_\uc794\uc7ac_\ub85c_\ud45c\uae30\ud588\uc73c\ub098_\uc815\uc815", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L65", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_\ubbf8\ud574\uacb0_\uc0ac\ud56d_\uacc4\ud68d\uc11c_\uc6d0\ubb38_\uc544\uc9c1_\uacb0\uc815_\uc548_\ub428", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/workflow_state.md", "source_location": "L72", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/9216484c57c256629ee59314bc7d4b9e8ef66c3d8458b9ea16a3f73dd370fe52.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/9216484c57c256629ee59314bc7d4b9e8ef66c3d8458b9ea16a3f73dd370fe52.json new file mode 100644 index 0000000..a6b4e78 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/9216484c57c256629ee59314bc7d4b9e8ef66c3d8458b9ea16a3f73dd370fe52.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_md", "label": "B08_frontend.md", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", "label": "B08_wf5_Quantity \u2014 Frontend", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_\ud604\uc7ac_\uad6c\ud604", "label": "\ud604\uc7ac \uad6c\ud604", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_\ud654\uba74_\uc0c1\ud0dc", "label": "\ud654\uba74 \uc0c1\ud0dc", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L20"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_\uacc4\ud68d_\ucc45\uc784", "label": "\uacc4\ud68d \ucc45\uc784", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L30"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_\uae30\uc220\ubd80\ucc44", "label": "\uae30\uc220\ubd80\ucc44", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L39"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_wf5_quantity_b08_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_\ud604\uc7ac_\uad6c\ud604", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_\ud654\uba74_\uc0c1\ud0dc", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_\uacc4\ud68d_\ucc45\uc784", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L37", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L37", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_frontend_\uae30\uc220\ubd80\ucc44", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", "source_location": "L39", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/944204e569fb7c208be3dd6b08b83c70b5229be9c7f932926aeb285b77807561.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/944204e569fb7c208be3dd6b08b83c70b5229be9c7f932926aeb285b77807561.json new file mode 100644 index 0000000..6f683e0 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/944204e569fb7c208be3dd6b08b83c70b5229be9c7f932926aeb285b77807561.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "label": "B03_dependencies.md", "file_type": "document", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_b03_fileinput_dependencies", "label": "B03_FileInput \u2014 Dependencies", "file_type": "document", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", "label": "\uacf5\ud1b5 \ubaa8\ub4c8", "file_type": "document", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L24"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_b03_fileinput_dependencies", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_b03_fileinput_dependencies", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L28", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/9691ebb53407e479750a796e82774905fe22139f5b049c3f7dc0ad6534c378cf.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/9691ebb53407e479750a796e82774905fe22139f5b049c3f7dc0ad6534c378cf.json new file mode 100644 index 0000000..ff1bebf --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/9691ebb53407e479750a796e82774905fe22139f5b049c3f7dc0ad6534c378cf.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_md", "label": "B05_dependencies.md", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_b05_wf2_route_dependencies", "label": "B05_wf2_Route \u2014 Dependencies", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_\ud398\uc774\uc9c0_\ud30c\uc77c\ubcc4_\uc5f0\uacb0", "label": "\ud398\uc774\uc9c0 \ud30c\uc77c\ubcc4 \uc5f0\uacb0", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L23"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_b05_wf2_route_dependencies", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_b05_wf2_route_dependencies", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_\ud398\uc774\uc9c0_\ud30c\uc77c\ubcc4_\uc5f0\uacb0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L23", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/97478cabbb537844beae71898c5b219a2b94edecb3285f81207390133befebed.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/97478cabbb537844beae71898c5b219a2b94edecb3285f81207390133befebed.json new file mode 100644 index 0000000..dd43ef1 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/97478cabbb537844beae71898c5b219a2b94edecb3285f81207390133befebed.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_md", "label": "B04_dependencies.md", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_b04_wf1_surface_dependencies", "label": "B04_wf1_Surface \u2014 Dependencies", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_\ubc31\uc5d4\ub4dc_python", "label": "\ubc31\uc5d4\ub4dc (Python)", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_\ud504\ub860\ud2b8\uc5d4\ub4dc_typescript", "label": "\ud504\ub860\ud2b8\uc5d4\ub4dc (TypeScript)", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L24"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_dependencies_concept_\uc815\uc815_\ud544\uc694", "label": "\u26a0\ufe0f dependencies concept \uc815\uc815 \ud544\uc694", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L30"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_b04_wf1_surface_dependencies", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_b04_wf1_surface_dependencies", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_\ubc31\uc5d4\ub4dc_python", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_b04_wf1_surface_dependencies", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_\ud504\ub860\ud2b8\uc5d4\ub4dc_typescript", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_b04_wf1_surface_dependencies", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_dependencies_dependencies_concept_\uc815\uc815_\ud544\uc694", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", "source_location": "L30", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/981095fcec47154f4626fb3eab7ecdc4407e949a7aa702a13130c8e1b70920ec.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/981095fcec47154f4626fb3eab7ecdc4407e949a7aa702a13130c8e1b70920ec.json new file mode 100644 index 0000000..1379e4e --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/981095fcec47154f4626fb3eab7ecdc4407e949a7aa702a13130c8e1b70920ec.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "label": "B01_dependencies.md", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_b01_dashboard_dependencies", "label": "B01_Dashboard \u2014 Dependencies", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_\ud504\ub85c\uc81d\ud2b8_\uacf5\ud1b5_\ubaa8\ub4c8", "label": "\ud504\ub85c\uc81d\ud2b8 \uacf5\ud1b5 \ubaa8\ub4c8", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L23"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_b01_dashboard_dependencies", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_b01_dashboard_dependencies", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_\ud504\ub85c\uc81d\ud2b8_\uacf5\ud1b5_\ubaa8\ub4c8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L23", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L26", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L28", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/a38a8ca962fdacc272da8439e0d7d9d1e1c542bc8b65333fd5579891c9857361.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/a38a8ca962fdacc272da8439e0d7d9d1e1c542bc8b65333fd5579891c9857361.json new file mode 100644 index 0000000..fdc66c5 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/a38a8ca962fdacc272da8439e0d7d9d1e1c542bc8b65333fd5579891c9857361.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "label": "api_common.md", "file_type": "document", "source_file": "concepts/api_common.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "label": "API \uacf5\ud1b5 (\uc5ec\ub7ec \ud398\uc774\uc9c0\uac00 \uacf5\uc720\ud558\ub294 \uc5d4\ub4dc\ud3ec\uc778\ud2b8)", "file_type": "document", "source_file": "concepts/api_common.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_\uacf5\ud1b5_\uc624\ub958_\uc751\ub2f5_\ud3ec\ub9f7_\uc804_\ub77c\uc6b0\ud130", "label": "\uacf5\ud1b5 \uc624\ub958 \uc751\ub2f5 \ud3ec\ub9f7 (\uc804 \ub77c\uc6b0\ud130)", "file_type": "document", "source_file": "concepts/api_common.md", "source_location": "L11"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_\uc6cc\ud06c\ud50c\ub85c\uc6b0_\uc0c1\ud0dc_\uc870\ud68c", "label": "\uc6cc\ud06c\ud50c\ub85c\uc6b0 \uc0c1\ud0dc \uc870\ud68c", "file_type": "document", "source_file": "concepts/api_common.md", "source_location": "L17"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_\ud3f4\ub9c1_\ud328\ud134_legacy_workflow_json_\uc124\uacc4_\ud604\uc7ac_\uad6c\ud604\uc740_workflow_state_api_\uc0ac\uc6a9", "label": "\ud3f4\ub9c1 \ud328\ud134 (legacy workflow.json \uc124\uacc4; \ud604\uc7ac \uad6c\ud604\uc740 workflow-state API \uc0ac\uc6a9)", "file_type": "document", "source_file": "concepts/api_common.md", "source_location": "L25"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/api_common.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/api_common.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b04_wf1_surface_b04_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/api_common.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/api_common.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_\uacf5\ud1b5_\uc624\ub958_\uc751\ub2f5_\ud3ec\ub9f7_\uc804_\ub77c\uc6b0\ud130", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/api_common.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/api_common.md", "source_location": "L15", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_\uc6cc\ud06c\ud50c\ub85c\uc6b0_\uc0c1\ud0dc_\uc870\ud68c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/api_common.md", "source_location": "L17", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/api_common.md", "source_location": "L23", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_\ud3f4\ub9c1_\ud328\ud134_legacy_workflow_json_\uc124\uacc4_\ud604\uc7ac_\uad6c\ud604\uc740_workflow_state_api_\uc0ac\uc6a9", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/api_common.md", "source_location": "L25", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/a6d3afe6fc8285143b839973bd8506e5c74fa12760a92b9d72930d4a96d07742.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/a6d3afe6fc8285143b839973bd8506e5c74fa12760a92b9d72930d4a96d07742.json new file mode 100644 index 0000000..e5e4a24 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/a6d3afe6fc8285143b839973bd8506e5c74fa12760a92b9d72930d4a96d07742.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_md", "label": "B05_backend.md", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", "label": "B05_wf2_Route \u2014 Backend", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", "label": "\uc694\uccad\u00b7\uc751\ub2f5 \ubaa8\ub378", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_\uacbd\ub85c_\uacc4\uc0b0_\uc5d4\uc9c4", "label": "\uacbd\ub85c \uacc4\uc0b0 \uc5d4\uc9c4", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L20"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_\uae30\ud558_\uacb0\uacfc_\ubcc0\ud658", "label": "\uae30\ud558\u00b7\uacb0\uacfc \ubcc0\ud658", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L31"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_\ub77c\uc6b0\ud130_workflow", "label": "\ub77c\uc6b0\ud130\u00b7workflow", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L39"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_\uae30\uc220\ubd80\ucc44", "label": "\uae30\uc220\ubd80\ucc44", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L46"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_\uacbd\ub85c_\uacc4\uc0b0_\uc5d4\uc9c4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_\uae30\ud558_\uacb0\uacfc_\ubcc0\ud658", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L31", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_\ub77c\uc6b0\ud130_workflow", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L39", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L44", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_backend_\uae30\uc220\ubd80\ucc44", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_backend.md", "source_location": "L46", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/aacc52798876b1c9f1528049e014dfff812e4362029bf2900537a635cea03345.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/aacc52798876b1c9f1528049e014dfff812e4362029bf2900537a635cea03345.json new file mode 100644 index 0000000..1348d63 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/aacc52798876b1c9f1528049e014dfff812e4362029bf2900537a635cea03345.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_md", "label": "A06_backend.md", "file_type": "document", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_a06_login_backend", "label": "A06_Login \u2014 Backend", "file_type": "document", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "label": "API \uc5d4\ub4dc\ud3ec\uc778\ud2b8", "file_type": "document", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\ub0b4\ubd80_\ud5ec\ud37c", "label": "\ub0b4\ubd80 \ud5ec\ud37c", "file_type": "document", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L29"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", "label": "\uc694\uccad \uc2a4\ud0a4\ub9c8 (Pydantic)", "file_type": "document", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L37"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\ub85c\uadf8\uc778_\ub85c\uc9c1_\ud750\ub984", "label": "\ub85c\uadf8\uc778 \ub85c\uc9c1 \ud750\ub984", "file_type": "document", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L45"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\ubcf4\uc548_\uc815\ucc45_\uc2e4_\ucf54\ub4dc_\uae30\uc900", "label": "\ubcf4\uc548 \uc815\ucc45 (\uc2e4 \ucf54\ub4dc \uae30\uc900)", "file_type": "document", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L54"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", "label": "\uc758\uc874\uc131 (\uacf5\ud1b5 \uc720\ud2f8)", "file_type": "document", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L60"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\uacc4\ud68d\uc11c\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58", "label": "\u26a0\ufe0f \uacc4\ud68d\uc11c\uc640 \uc2e4 \ucf54\ub4dc \ubd88\uc77c\uce58", "file_type": "document", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L66"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_login_a06_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a07_register_a07_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a09_security_a09_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_a06_login_backend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_a06_login_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_a06_login_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_a06_login_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\ub0b4\ubd80_\ud5ec\ud37c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L29", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_a06_login_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L37", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_a06_login_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\ub85c\uadf8\uc778_\ub85c\uc9c1_\ud750\ub984", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L45", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_a06_login_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\ubcf4\uc548_\uc815\ucc45_\uc2e4_\ucf54\ub4dc_\uae30\uc900", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L54", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_a06_login_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L60", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_common_util_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L62", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_a06_login_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a06_login_a06_backend_\uacc4\ud68d\uc11c\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A06_Login/A06_backend.md", "source_location": "L66", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/ab34ed804dca07323ea78583add067fd18e7d17a741c99321bd6c782e82c7c82.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/ab34ed804dca07323ea78583add067fd18e7d17a741c99321bd6c782e82c7c82.json new file mode 100644 index 0000000..3214b02 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/ab34ed804dca07323ea78583add067fd18e7d17a741c99321bd6c782e82c7c82.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_md", "label": "A05_frontend.md", "file_type": "document", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", "label": "A05_EduDetail \u2014 Frontend", "file_type": "document", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", "label": "\ucef4\ud3ec\ub10c\ud2b8 (\uc139\uc158 \ube4c\ub354)", "file_type": "document", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "file_type": "document", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L28"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\uc2a4\ud0c0\uc77c_css", "label": "\uc2a4\ud0c0\uc77c (CSS)", "file_type": "document", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L41"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", "label": "CSS \ud074\ub798\uc2a4 \uad6c\uc870", "file_type": "document", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L43"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\ubc18\uc751\ud615", "label": "\ubc18\uc751\ud615", "file_type": "document", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L56"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", "file_type": "document", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L59"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L65"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L28", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\uc2a4\ud0c0\uc77c_css", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L41", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\uc2a4\ud0c0\uc77c_css", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L43", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\uc2a4\ud0c0\uc77c_css", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\ubc18\uc751\ud615", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L56", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L59", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a05_edudetail_a05_frontend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A05_EduDetail/A05_frontend.md", "source_location": "L65", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/b274d5ee1fd61e7bc3013ac1dfaba29d570264ad0322202e9f907db6a7cd5717.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/b274d5ee1fd61e7bc3013ac1dfaba29d570264ad0322202e9f907db6a7cd5717.json new file mode 100644 index 0000000..bad2616 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/b274d5ee1fd61e7bc3013ac1dfaba29d570264ad0322202e9f907db6a7cd5717.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_md", "label": "A09_backend.md", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_a09_security_backend", "label": "A09_Security \u2014 Backend", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "label": "API \uc5d4\ub4dc\ud3ec\uc778\ud2b8", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\ub9c8\uc2a4\ud130_\ud68c\uc0ac_\uad00\ub9ac\uc790_\uc804\uc6a9_require_master", "label": "\ub9c8\uc2a4\ud130(\ud68c\uc0ac \uad00\ub9ac\uc790) \uc804\uc6a9 \u2014 `require_master`", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L21"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790_\uc804\uc6a9_require_system_admin", "label": "\uc2dc\uc2a4\ud15c \uad00\ub9ac\uc790 \uc804\uc6a9 \u2014 `require_system_admin`", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L31"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\uc778\uc99d_\uc0ac\uc6a9\uc790_\uacf5\ud1b5_verify_session", "label": "\uc778\uc99d \uc0ac\uc6a9\uc790 \uacf5\ud1b5 \u2014 `verify_session`", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L39"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", "label": "\uc694\uccad \uc2a4\ud0a4\ub9c8 (Pydantic)", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L45"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_db_\uc800\uc7a5_activity_logs", "label": "DB \uc800\uc7a5 (activity_logs)", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L55"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\uad8c\ud55c_\ud5ec\ud37c", "label": "\uad8c\ud55c \ud5ec\ud37c", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L60"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", "label": "\uc758\uc874\uc131 (\uacf5\ud1b5 \uc720\ud2f8)", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L67"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\ucc38\uace0", "label": "\ucc38\uace0", "file_type": "document", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L73"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_security_a09_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a06_login_a06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a07_register_a07_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_a09_security_backend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_a09_security_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_a09_security_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\ub9c8\uc2a4\ud130_\ud68c\uc0ac_\uad00\ub9ac\uc790_\uc804\uc6a9_require_master", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L21", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790_\uc804\uc6a9_require_system_admin", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L31", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\uc778\uc99d_\uc0ac\uc6a9\uc790_\uacf5\ud1b5_verify_session", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L39", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_a09_security_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L45", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_a09_security_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_db_\uc800\uc7a5_activity_logs", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L55", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_db_schema_logs_monitoring_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L58", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_a09_security_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\uad8c\ud55c_\ud5ec\ud37c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L60", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_a09_security_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L67", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_common_util_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L69", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L70", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_db_schema_users_auth_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L71", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_a09_security_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a09_security_a09_backend_\ucc38\uace0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A09_Security/A09_backend.md", "source_location": "L73", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/bc8f362e6683fa0ae51daf283b5d2a7813c06e0dc3f073f5680c831ecf7292f0.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/bc8f362e6683fa0ae51daf283b5d2a7813c06e0dc3f073f5680c831ecf7292f0.json new file mode 100644 index 0000000..9344507 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/bc8f362e6683fa0ae51daf283b5d2a7813c06e0dc3f073f5680c831ecf7292f0.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "label": "log.md", "file_type": "document", "source_file": "log.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "label": "Wiki Log", "file_type": "document", "source_file": "log.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_\uad6c\ud615_\uc0c1\uc704_\ud3f4\ub354_\ud0c8\ucd9c_\ub9c1\ud06c_concepts_\uc804\uc218_\uc815\ubc00_\uad50\uc815", "label": "[2026-07-12] lint | \uad6c\ud615 \uc0c1\uc704 \ud3f4\ub354 \ud0c8\ucd9c \ub9c1\ud06c(../../concepts/) \uc804\uc218 \uc815\ubc00 \uad50\uc815", "file_type": "document", "source_file": "log.md", "source_location": "L6"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_5\ud68c_\ubc18\ubcf5_\ub9b0\ud2b8_\uac1c\uc120_\uc0ac\uc774\ud074_\uc218\ud589_\ubc0f_\uc704\ud0a4_\uba54\ud0c0_\uc815\ubcf4_\uc815\ubc00_\ubcf4\uc644", "label": "[2026-07-12] lint | 5\ud68c \ubc18\ubcf5 \ub9b0\ud2b8-\uac1c\uc120 \uc0ac\uc774\ud074 \uc218\ud589 \ubc0f \uc704\ud0a4 \uba54\ud0c0 \uc815\ubcf4 \uc815\ubc00 \ubcf4\uc644", "file_type": "document", "source_file": "log.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_db_34\uac1c_\ud14c\uc774\ube14_\uc804\uc218_\uceec\ub7fc_\uc2e4\uce21_\ubc0f_\uc704\ud0a4_\ucd5c\uc2e0\ud654", "label": "[2026-07-12] ingest | DB 34\uac1c \ud14c\uc774\ube14 \uc804\uc218 \uceec\ub7fc \uc2e4\uce21 \ubc0f \uc704\ud0a4 \ucd5c\uc2e0\ud654", "file_type": "document", "source_file": "log.md", "source_location": "L17"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_lint_3\ud68c_\ubc18\ubcf5_\ub9b0\ud2b8_\uac1c\uc120_\uc0ac\uc774\ud074_\uc218\ud589_\ubc0f_\uc704\ud0a4_\ubb34\uacb0\uc131_\ud655\ubcf4", "label": "[2026-07-12] ingest+lint | 3\ud68c \ubc18\ubcf5 \ub9b0\ud2b8-\uac1c\uc120 \uc0ac\uc774\ud074 \uc218\ud589 \ubc0f \uc704\ud0a4 \ubb34\uacb0\uc131 \ud655\ubcf4", "file_type": "document", "source_file": "log.md", "source_location": "L30"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_b09_wf6_estimation_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\ubbf8\ucc29\uc218_\ud655\uc778", "label": "[2026-07-12] ingest | B09_wf6_Estimation (\uc2e4 \ucf54\ub4dc \ub300\uc870, \ubbf8\ucc29\uc218 \ud655\uc778)", "file_type": "document", "source_file": "log.md", "source_location": "L36"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_b07_wf4_designdetail_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\ubbf8\ucc29\uc218_\ud655\uc778", "label": "[2026-07-12] ingest | B07_wf4_DesignDetail (\uc2e4 \ucf54\ub4dc \ub300\uc870, \ubbf8\ucc29\uc218 \ud655\uc778)", "file_type": "document", "source_file": "log.md", "source_location": "L47"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_b04_wf1_surface_\uc2e4_\ucf54\ub4dc_\ub300\uc870_5\ubd84\ud560_\uc0c1\uc138\ud654", "label": "[2026-07-12] ingest | B04_wf1_Surface (\uc2e4 \ucf54\ub4dc \ub300\uc870\u00b75\ubd84\ud560 \uc0c1\uc138\ud654)", "file_type": "document", "source_file": "log.md", "source_location": "L57"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_b02_projregister_backend_frontend_db_\uc0c1\uc138\ud654", "label": "[2026-07-12] ingest | B02_ProjRegister (backend + frontend + db \uc0c1\uc138\ud654)", "file_type": "document", "source_file": "log.md", "source_location": "L69"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_b01_dashboard_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", "label": "[2026-07-12] query | B01_Dashboard \uc2e4 \ucf54\ub4dc \uae30\uc900 \ucd5c\uc2e0\ud654", "file_type": "document", "source_file": "log.md", "source_location": "L85"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_b03_fileinput_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", "label": "[2026-07-12] query | B03_FileInput \uc2e4 \ucf54\ub4dc \uae30\uc900 \ucd5c\uc2e0\ud654", "file_type": "document", "source_file": "log.md", "source_location": "L93"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_b05_wf2_route_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", "label": "[2026-07-12] query | B05_wf2_Route \uc2e4 \ucf54\ub4dc \uae30\uc900 \ucd5c\uc2e0\ud654", "file_type": "document", "source_file": "log.md", "source_location": "L102"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_b06_wf3_profilecross_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", "label": "[2026-07-12] query | B06_wf3_ProfileCross \uc2e4 \ucf54\ub4dc \uae30\uc900 \ucd5c\uc2e0\ud654", "file_type": "document", "source_file": "log.md", "source_location": "L111"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_b08_wf5_quantity_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", "label": "[2026-07-12] query | B08_wf5_Quantity \uc2e4 \ucf54\ub4dc \uae30\uc900 \ucd5c\uc2e0\ud654", "file_type": "document", "source_file": "log.md", "source_location": "L119"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_\uc804\uccb4_\uc704\ud0a4_\uad6c\uc870_\uc0c1\ud0dc_\uacf5\uc720_\uac1c\ub150_\uc815\ub9ac", "label": "[2026-07-12] lint | \uc804\uccb4 \uc704\ud0a4 \uad6c\uc870\u00b7\uc0c1\ud0dc\u00b7\uacf5\uc720 \uac1c\ub150 \uc815\ub9ac", "file_type": "document", "source_file": "log.md", "source_location": "L126"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_\uc804\uccb4_\uc704\ud0a4_\uad6c\uc870_\uc0c1\ud0dc_\uacf5\uc720_\uac1c\ub150_\uc815\ub9ac_134", "label": "[2026-07-12] lint | \uc804\uccb4 \uc704\ud0a4 \uad6c\uc870\u00b7\uc0c1\ud0dc\u00b7\uacf5\uc720 \uac1c\ub150 \uc815\ub9ac", "file_type": "document", "source_file": "log.md", "source_location": "L134"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_\uc704\ud0a4_\uc2dc\uc2a4\ud15c_\ucd08\uae30_\uc138\ud305", "label": "[2026-07-12] lint | \uc704\ud0a4 \uc2dc\uc2a4\ud15c \ucd08\uae30 \uc138\ud305", "file_type": "document", "source_file": "log.md", "source_location": "L141"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_guidelines_plans_7\uac74_\uc77c\uad04_\ubc18\uc601", "label": "[2026-07-12] ingest | guidelines/plans 7\uac74 \uc77c\uad04 \ubc18\uc601", "file_type": "document", "source_file": "log.md", "source_location": "L148"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_lint_\uc2e4_db_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\uac80\uc99d_\uc77d\uae30_\uc804\uc6a9", "label": "[2026-07-12] query+lint | \uc2e4 DB/\uc2e4 \ucf54\ub4dc \ub300\uc870 \uac80\uc99d (\uc77d\uae30 \uc804\uc6a9)", "file_type": "document", "source_file": "log.md", "source_location": "L157"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_page_id_frontmatter_\ud544\ub4dc_\ub3c4\uc785", "label": "[2026-07-12] lint | page_id frontmatter \ud544\ub4dc \ub3c4\uc785", "file_type": "document", "source_file": "log.md", "source_location": "L167"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a01_home_\uc2e4_\ucf54\ub4dc_\ubc18\uc601", "label": "[2026-07-12] ingest | A01_Home \uc2e4 \ucf54\ub4dc \ubc18\uc601", "file_type": "document", "source_file": "log.md", "source_location": "L173"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_refactor_\ud30c\uc77c\uba85_\uaddc\uce59_\ub3c4\uc785_\ubc0f_\ub9c1\ud06c_\uc218\uc815", "label": "[2026-07-12] refactor | \ud30c\uc77c\uba85 \uaddc\uce59 \ub3c4\uc785 \ubc0f \ub9c1\ud06c \uc218\uc815", "file_type": "document", "source_file": "log.md", "source_location": "L180"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_a\uadf8\ub8f9_a01_a09_\uc804\uccb4_\uac80\uc99d_\ubc0f_\uc815\ud569\uc131_\uc810\uac80", "label": "[2026-07-12] lint | A\uadf8\ub8f9(A01~A09) \uc804\uccb4 \uac80\uc99d \ubc0f \uc815\ud569\uc131 \uc810\uac80", "file_type": "document", "source_file": "log.md", "source_location": "L188"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a09_security_backend_frontend_\uc0c1\uc138\ud654", "label": "[2026-07-12] ingest | A09_Security (backend + frontend \uc0c1\uc138\ud654)", "file_type": "document", "source_file": "log.md", "source_location": "L204"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a08_support_backend_frontend_\uc0c1\uc138\ud654", "label": "[2026-07-12] ingest | A08_Support (backend + frontend \uc0c1\uc138\ud654)", "file_type": "document", "source_file": "log.md", "source_location": "L219"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a07_register_backend_frontend_\uc0c1\uc138\ud654", "label": "[2026-07-12] ingest | A07_Register (backend + frontend \uc0c1\uc138\ud654)", "file_type": "document", "source_file": "log.md", "source_location": "L233"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a06_login_backend_frontend_\uc0c1\uc138\ud654", "label": "[2026-07-12] ingest | A06_Login (backend + frontend \uc0c1\uc138\ud654)", "file_type": "document", "source_file": "log.md", "source_location": "L248"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_a03_a05_\uc778\uc81c\uc2a4\ud2b8_\uc7ac\uc810\uac80", "label": "[2026-07-12] lint | A03~A05 \uc778\uc81c\uc2a4\ud2b8 \uc7ac\uc810\uac80", "file_type": "document", "source_file": "log.md", "source_location": "L263"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a05_edudetail", "label": "[2026-07-12] ingest | A05_EduDetail", "file_type": "document", "source_file": "log.md", "source_location": "L274"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a04_newshistory", "label": "[2026-07-12] ingest | A04_NewsHistory", "file_type": "document", "source_file": "log.md", "source_location": "L284"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a03_compdetail", "label": "[2026-07-12] ingest | A03_CompDetail", "file_type": "document", "source_file": "log.md", "source_location": "L295"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_a01_home_\ud398\uc774\uc9c0_\uac80\uc0ac_\ubc0f_\uc218\uc815", "label": "[2026-07-12] lint | A01_Home \ud398\uc774\uc9c0 \uac80\uc0ac \ubc0f \uc218\uc815", "file_type": "document", "source_file": "log.md", "source_location": "L305"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a02_progdetail_a00_common_framework", "label": "[2026-07-12] ingest | A02_ProgDetail + A00_Common Framework", "file_type": "document", "source_file": "log.md", "source_location": "L318"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L1", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_\uad6c\ud615_\uc0c1\uc704_\ud3f4\ub354_\ud0c8\ucd9c_\ub9c1\ud06c_concepts_\uc804\uc218_\uc815\ubc00_\uad50\uc815", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L6", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_concepts_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L7", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_db_schema_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_5\ud68c_\ubc18\ubcf5_\ub9b0\ud2b8_\uac1c\uc120_\uc0ac\uc774\ud074_\uc218\ud589_\ubc0f_\uc704\ud0a4_\uba54\ud0c0_\uc815\ubcf4_\uc815\ubc00_\ubcf4\uc644", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b02_projregister_b02_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L14", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b07_wf4_designdetail_b07_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L15", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L15", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b09_wf6_estimation_b09_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L15", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_db_34\uac1c_\ud14c\uc774\ube14_\uc804\uc218_\uceec\ub7fc_\uc2e4\uce21_\ubc0f_\uc704\ud0a4_\ucd5c\uc2e0\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L17", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_unconfirmed_readme_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_lint_3\ud68c_\ubc18\ubcf5_\ub9b0\ud2b8_\uac1c\uc120_\uc0ac\uc774\ud074_\uc218\ud589_\ubc0f_\uc704\ud0a4_\ubb34\uacb0\uc131_\ud655\ubcf4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_db_schema_logs_monitoring_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L33", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_b09_wf6_estimation_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\ubbf8\ucc29\uc218_\ud655\uc778", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L36", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b09_wf6_estimation_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L43", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_b07_wf4_designdetail_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\ubbf8\ucc29\uc218_\ud655\uc778", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L47", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b07_wf4_designdetail_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L54", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_b04_wf1_surface_\uc2e4_\ucf54\ub4dc_\ub300\uc870_5\ubd84\ud560_\uc0c1\uc138\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L57", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_b02_projregister_backend_frontend_db_\uc0c1\uc138\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L69", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b02_projregister_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L82", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_b01_dashboard_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L85", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_b03_fileinput_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L93", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_b05_wf2_route_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L102", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_b06_wf3_profilecross_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L111", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_b08_wf5_quantity_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L119", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_\uc804\uccb4_\uc704\ud0a4_\uad6c\uc870_\uc0c1\ud0dc_\uacf5\uc720_\uac1c\ub150_\uc815\ub9ac", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L126", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_\uc804\uccb4_\uc704\ud0a4_\uad6c\uc870_\uc0c1\ud0dc_\uacf5\uc720_\uac1c\ub150_\uc815\ub9ac_134", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L134", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_\uc704\ud0a4_\uc2dc\uc2a4\ud15c_\ucd08\uae30_\uc138\ud305", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L141", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_guidelines_plans_7\uac74_\uc77c\uad04_\ubc18\uc601", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L148", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L153", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L154", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_query_lint_\uc2e4_db_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\uac80\uc99d_\uc77d\uae30_\uc804\uc6a9", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L157", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_concepts_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L159", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L161", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_page_id_frontmatter_\ud544\ub4dc_\ub3c4\uc785", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L167", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a01_home_\uc2e4_\ucf54\ub4dc_\ubc18\uc601", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L173", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_refactor_\ud30c\uc77c\uba85_\uaddc\uce59_\ub3c4\uc785_\ubc0f_\ub9c1\ud06c_\uc218\uc815", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L180", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a01_home_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L184", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a01_home_a01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L184", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_a\uadf8\ub8f9_a01_a09_\uc804\uccb4_\uac80\uc99d_\ubc0f_\uc815\ud569\uc131_\uc810\uac80", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L188", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_b01_dashboard_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L200", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a09_security_backend_frontend_\uc0c1\uc138\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L204", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a09_security_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L217", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a09_security_a09_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L217", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a08_support_backend_frontend_\uc0c1\uc138\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L219", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a08_support_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L231", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a08_support_a08_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L231", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a07_register_backend_frontend_\uc0c1\uc138\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L233", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a07_register_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L246", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a07_register_a07_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L246", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a06_login_backend_frontend_\uc0c1\uc138\ud654", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L248", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L260", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a06_login_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L261", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a06_login_a06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L261", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_a03_a05_\uc778\uc81c\uc2a4\ud2b8_\uc7ac\uc810\uac80", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L263", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a00_common_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L270", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L270", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a05_edudetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L274", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a04_newshistory", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L284", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a03_compdetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L295", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_lint_a01_home_\ud398\uc774\uc9c0_\uac80\uc0ac_\ubc0f_\uc218\uc815", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L305", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_ui_template_locale_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L310", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_ui_template_elements_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L310", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L314", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_wiki_log", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_log_2026_07_12_ingest_a02_progdetail_a00_common_framework", "relation": "contains", "confidence": "EXTRACTED", "source_file": "log.md", "source_location": "L318", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/c0a1926f8af61577dc912e4ca9824e1459355dd7538f1577120a4b7ec9f8a0b6.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/c0a1926f8af61577dc912e4ca9824e1459355dd7538f1577120a4b7ec9f8a0b6.json new file mode 100644 index 0000000..4379bda --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/c0a1926f8af61577dc912e4ca9824e1459355dd7538f1577120a4b7ec9f8a0b6.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_md", "label": "A07_backend.md", "file_type": "document", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_a07_register_backend", "label": "A07_Register \u2014 Backend", "file_type": "document", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "label": "API \uc5d4\ub4dc\ud3ec\uc778\ud2b8", "file_type": "document", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", "label": "\uc694\uccad \uc2a4\ud0a4\ub9c8 (Pydantic)", "file_type": "document", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L27"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_\uac00\uc785_\ub85c\uc9c1_\ud750\ub984", "label": "\uac00\uc785 \ub85c\uc9c1 \ud750\ub984", "file_type": "document", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L36"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", "label": "\uc758\uc874\uc131 (\uacf5\ud1b5 \uc720\ud2f8)", "file_type": "document", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L48"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_\ucc38\uace0", "label": "\ucc38\uace0", "file_type": "document", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L54"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_register_a07_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a06_login_a06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_a07_register_backend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_a07_register_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_a07_register_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_a07_register_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_a07_register_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_\uac00\uc785_\ub85c\uc9c1_\ud750\ub984", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L36", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_a07_register_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L48", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_common_util_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L50", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_db_schema_users_auth_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L52", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_a07_register_backend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_\ucc38\uace0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L54", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_backend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_backend.md", "source_location": "L57", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/c3a3a40df2648ee75578c94723b6824b1050d0df0b0ee7719b7da9115e3e9d5b.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/c3a3a40df2648ee75578c94723b6824b1050d0df0b0ee7719b7da9115e3e9d5b.json new file mode 100644 index 0000000..30812f7 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/c3a3a40df2648ee75578c94723b6824b1050d0df0b0ee7719b7da9115e3e9d5b.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "label": "ui_templates.md", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_templates_localization_components", "label": "UI Templates \u2014 Localization & Components", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_template_locale_ts_\ub2e4\uad6d\uc5b4_\uad00\ub9ac", "label": "ui_template_locale.ts (\ub2e4\uad6d\uc5b4 \uad00\ub9ac)", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\ud575\uc2ec_\uae30\ub2a5", "label": "\ud575\uc2ec \uae30\ub2a5", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L16"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870", "label": "\uc0ac\uc6a9\ucc98 (\uc5ed\ucc38\uc870)", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L24"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_template_elements_ts_\uacf5\ud1b5_\ucef4\ud3ec\ub10c\ud2b8", "label": "ui_template_elements.ts (\uacf5\ud1b5 \ucef4\ud3ec\ub10c\ud2b8)", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L30"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\uc81c\uacf5_\ucef4\ud3ec\ub10c\ud2b8", "label": "\uc81c\uacf5 \ucef4\ud3ec\ub10c\ud2b8", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L34"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870_50", "label": "\uc0ac\uc6a9\ucc98 (\uc5ed\ucc38\uc870)", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L50"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_theme_css_\uc2a4\ud0c0\uc77c_\ubcc0\uc218", "label": "theme.css (\uc2a4\ud0c0\uc77c \ubcc0\uc218)", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L59"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\ud575\uc2ec_\ubcc0\uc218", "label": "\ud575\uc2ec \ubcc0\uc218", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L63"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\uc81c\uc57d_backend_md_1", "label": "\uc81c\uc57d (backend.md \u00a71)", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L75"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "concepts/ui_templates.md", "source_location": "L82"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a01_home_a01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L3", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a02_progdetail_a02_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L3", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b01_dashboard_b01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L3", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L3", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_templates_localization_components", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_templates_localization_components", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_template_locale_ts_\ub2e4\uad6d\uc5b4_\uad00\ub9ac", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_template_locale_ts_\ub2e4\uad6d\uc5b4_\uad00\ub9ac", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\ud575\uc2ec_\uae30\ub2a5", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L16", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_template_locale_ts_\ub2e4\uad6d\uc5b4_\uad00\ub9ac", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_templates_localization_components", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_template_elements_ts_\uacf5\ud1b5_\ucef4\ud3ec\ub10c\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_template_elements_ts_\uacf5\ud1b5_\ucef4\ud3ec\ub10c\ud2b8", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\uc81c\uacf5_\ucef4\ud3ec\ub10c\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L34", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_template_elements_ts_\uacf5\ud1b5_\ucef4\ud3ec\ub10c\ud2b8", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870_50", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L50", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a03_compdetail_a03_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L53", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a04_newshistory_a04_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L54", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a05_edudetail_a05_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L55", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_templates_localization_components", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_theme_css_\uc2a4\ud0c0\uc77c_\ubcc0\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L59", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_theme_css_\uc2a4\ud0c0\uc77c_\ubcc0\uc218", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\ud575\uc2ec_\ubcc0\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L63", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_templates_localization_components", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\uc81c\uc57d_backend_md_1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L75", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_ui_templates_localization_components", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/ui_templates.md", "source_location": "L82", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/c6652706034c525ffeec3bbaf4f9f371698a1070a1adbdffb079bbdb1ce3eb2c.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/c6652706034c525ffeec3bbaf4f9f371698a1070a1adbdffb079bbdb1ce3eb2c.json new file mode 100644 index 0000000..dbe85a1 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/c6652706034c525ffeec3bbaf4f9f371698a1070a1adbdffb079bbdb1ce3eb2c.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_md", "label": "B04_db.md", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_b04_wf1_surface_db", "label": "B04_wf1_Surface \u2014 DB", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_\uc4f0\ub294_\ud14c\uc774\ube14", "label": "\uc4f0\ub294 \ud14c\uc774\ube14", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_repository_\ud568\uc218", "label": "Repository \ud568\uc218", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L23"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_\ucc38\uace0", "label": "\ucc38\uace0", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L31"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_db_schema_files_surface_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_b04_wf1_surface_db", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_b04_wf1_surface_db", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_\uc4f0\ub294_\ud14c\uc774\ube14", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_db_schema_projects_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L21", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_b04_wf1_surface_db", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_repository_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L23", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_b04_wf1_surface_db", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_db_\ucc38\uace0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_db.md", "source_location": "L31", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/c7645ac1d9ed01c49738b733aa69361b91e27034b72846bf1083ee3a0b9aaf35.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/c7645ac1d9ed01c49738b733aa69361b91e27034b72846bf1083ee3a0b9aaf35.json new file mode 100644 index 0000000..36f25ef --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/c7645ac1d9ed01c49738b733aa69361b91e27034b72846bf1083ee3a0b9aaf35.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "label": "B05_api.md", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_b05_wf2_route_api", "label": "B05_wf2_Route \u2014 API", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_solve_\ucc98\ub9ac_\uacb0\uacfc", "label": "solve \ucc98\ub9ac \uacb0\uacfc", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L19"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_b05_wf2_route_api", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_b05_wf2_route_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_solve_\ucc98\ub9ac_\uacb0\uacfc", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L19", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/c82e36238d3bc7e9f58d7a65a208efd22932d394b41f00de2f065920df19c7b7.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/c82e36238d3bc7e9f58d7a65a208efd22932d394b41f00de2f065920df19c7b7.json new file mode 100644 index 0000000..e1066a7 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/c82e36238d3bc7e9f58d7a65a208efd22932d394b41f00de2f065920df19c7b7.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_md", "label": "common_util.md", "file_type": "document", "source_file": "concepts/common_util.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_\uacf5\ud1b5_\uc720\ud2f8_common_util", "label": "\uacf5\ud1b5 \uc720\ud2f8 (common_util/)", "file_type": "document", "source_file": "concepts/common_util.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_\uc774\uba54\uc77c_\ubc1c\uc1a1_common_util_email_py", "label": "\uc774\uba54\uc77c \ubc1c\uc1a1 (common_util_email.py)", "file_type": "document", "source_file": "concepts/common_util.md", "source_location": "L27"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_\ub9ac\uc18c\uc2a4_\ubaa8\ub2c8\ud130\ub9c1_common_util_resource_monitor_py", "label": "\ub9ac\uc18c\uc2a4 \ubaa8\ub2c8\ud130\ub9c1 (common_util_resource_monitor.py)", "file_type": "document", "source_file": "concepts/common_util.md", "source_location": "L31"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/common_util.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/common_util.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b04_wf1_surface_b04_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/common_util.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/common_util.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/common_util.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_\uacf5\ud1b5_\uc720\ud2f8_common_util", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/common_util.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/common_util.md", "source_location": "L16", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/common_util.md", "source_location": "L21", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/common_util.md", "source_location": "L23", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_\uacf5\ud1b5_\uc720\ud2f8_common_util", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_\uc774\uba54\uc77c_\ubc1c\uc1a1_common_util_email_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/common_util.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_\uacf5\ud1b5_\uc720\ud2f8_common_util", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_common_util_\ub9ac\uc18c\uc2a4_\ubaa8\ub2c8\ud130\ub9c1_common_util_resource_monitor_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/common_util.md", "source_location": "L31", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/dbc60034a717404e311f43e3f724df0f5db7fc40240c9b2dea195710e80aa456.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/dbc60034a717404e311f43e3f724df0f5db7fc40240c9b2dea195710e80aa456.json new file mode 100644 index 0000000..4b10a1d --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/dbc60034a717404e311f43e3f724df0f5db7fc40240c9b2dea195710e80aa456.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_md", "label": "A07_frontend.md", "file_type": "document", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_a07_register_frontend", "label": "A07_Register \u2014 Frontend", "file_type": "document", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218_ui_auth_page_\uc2e4\uc0ac\uc6a9", "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218 (UI_Auth_Page \u2014 \uc2e4\uc0ac\uc6a9)", "file_type": "document", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L24"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8 \ud568\uc218", "file_type": "document", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L33"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\uc81c\ucd9c_\ub85c\uc9c1_2\ub2e8\uacc4_\ud3fc_\uc804\ud658", "label": "\uc81c\ucd9c \ub85c\uc9c1 (2\ub2e8\uacc4 \ud3fc \uc804\ud658)", "file_type": "document", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L43"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\uc57d\uad00_\ub3d9\uc758_\uc544\ucf54\ub514\uc5b8", "label": "\uc57d\uad00 \ub3d9\uc758 (\uc544\ucf54\ub514\uc5b8)", "file_type": "document", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L50"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "file_type": "document", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L56"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\uc2a4\ud0c0\uc77c_css", "label": "\uc2a4\ud0c0\uc77c (CSS)", "file_type": "document", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L70"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", "file_type": "document", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L77"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L85"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_register_a07_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a06_login_a06_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_a07_register_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_a07_register_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_a07_register_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218_ui_auth_page_\uc2e4\uc0ac\uc6a9", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_a07_register_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L33", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_a07_register_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\uc81c\ucd9c_\ub85c\uc9c1_2\ub2e8\uacc4_\ud3fc_\uc804\ud658", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L43", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_a07_register_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\uc57d\uad00_\ub3d9\uc758_\uc544\ucf54\ub514\uc5b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L50", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_a07_register_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L56", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L58", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_a07_register_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\uc2a4\ud0c0\uc77c_css", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L70", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_a07_register_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L77", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_a07_register_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L85", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_a07_register_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/A07_Register/A07_frontend.md", "source_location": "L87", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/dc48367a69497d4965a076e5baa28ca167883c8abfb32eff54161c461fcde509.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/dc48367a69497d4965a076e5baa28ca167883c8abfb32eff54161c461fcde509.json new file mode 100644 index 0000000..a35574f --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/dc48367a69497d4965a076e5baa28ca167883c8abfb32eff54161c461fcde509.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_md", "label": "B03_api.md", "file_type": "document", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_b03_fileinput_api", "label": "B03_FileInput \u2014 API", "file_type": "document", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_\uc77c\ubc18_\uc5c5\ub85c\ub4dc", "label": "\uc77c\ubc18 \uc5c5\ub85c\ub4dc", "file_type": "document", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L14"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_\uccad\ud06c_\uc5c5\ub85c\ub4dc", "label": "\uccad\ud06c \uc5c5\ub85c\ub4dc", "file_type": "document", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L19"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_workflow_\uc870\ud68c", "label": "workflow \uc870\ud68c", "file_type": "document", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L27"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_b03_fileinput_api", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_b03_fileinput_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_\uc77c\ubc18_\uc5c5\ub85c\ub4dc", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L14", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_b03_fileinput_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_\uccad\ud06c_\uc5c5\ub85c\ub4dc", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_b03_fileinput_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_workflow_\uc870\ud68c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_api.md", "source_location": "L32", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/dc90c884f2f276e80a57bfc0e2b82b3cf72360db91b22dd9337ef082385050cb.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/dc90c884f2f276e80a57bfc0e2b82b3cf72360db91b22dd9337ef082385050cb.json new file mode 100644 index 0000000..dcfd616 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/dc90c884f2f276e80a57bfc0e2b82b3cf72360db91b22dd9337ef082385050cb.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_md", "label": "B03_frontend.md", "file_type": "document", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", "label": "B03_FileInput \u2014 Frontend", "file_type": "document", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_\ud398\uc774\uc9c0_\uc5c5\ub85c\ub4dc_\ud750\ub984", "label": "\ud398\uc774\uc9c0\u00b7\uc5c5\ub85c\ub4dc \ud750\ub984", "file_type": "document", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8", "file_type": "document", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L21"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_\ube0c\ub77c\uc6b0\uc800_\uc0c1\ud0dc_\uc624\ud504\ub77c\uc778_\ubcf4\uc870", "label": "\ube0c\ub77c\uc6b0\uc800 \uc0c1\ud0dc\u00b7\uc624\ud504\ub77c\uc778 \ubcf4\uc870", "file_type": "document", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L31"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_\uae30\uc220\ubd80\ucc44", "label": "\uae30\uc220\ubd80\ucc44", "file_type": "document", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L42"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_\ud398\uc774\uc9c0_\uc5c5\ub85c\ub4dc_\ud750\ub984", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L21", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_\ube0c\ub77c\uc6b0\uc800_\uc0c1\ud0dc_\uc624\ud504\ub77c\uc778_\ubcf4\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L31", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L40", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L40", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_frontend_\uae30\uc220\ubd80\ucc44", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_frontend.md", "source_location": "L42", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/e5a0d7854dc5f172c997de38f2c4dc21dc761794e098626c17dfffe673b47711.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/e5a0d7854dc5f172c997de38f2c4dc21dc761794e098626c17dfffe673b47711.json new file mode 100644 index 0000000..e0af167 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/e5a0d7854dc5f172c997de38f2c4dc21dc761794e098626c17dfffe673b47711.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "label": "auth_rbac.md", "file_type": "document", "source_file": "concepts/auth_rbac.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_rbac", "label": "\uc778\uc99d / RBAC", "file_type": "document", "source_file": "concepts/auth_rbac.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc138\uc158_\uc778\uc99d_backend_md_6_3", "label": "\uc138\uc158 \uc778\uc99d (backend.md 6.3)", "file_type": "document", "source_file": "concepts/auth_rbac.md", "source_location": "L11"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_otp_\ube44\ubc00\ubc88\ud638", "label": "OTP / \ube44\ubc00\ubc88\ud638", "file_type": "document", "source_file": "concepts/auth_rbac.md", "source_location": "L18"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc0ac\uc6a9\uc790_\uc0c1\ud0dc_\uc0dd\uba85\uc8fc\uae30", "label": "\uc0ac\uc6a9\uc790 \uc0c1\ud0dc \uc0dd\uba85\uc8fc\uae30", "file_type": "document", "source_file": "concepts/auth_rbac.md", "source_location": "L23"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc5ed\ud560_users_role", "label": "\uc5ed\ud560 (users.role)", "file_type": "document", "source_file": "concepts/auth_rbac.md", "source_location": "L33"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uad8c\ud55c_\uac80\uc99d_\ud5ec\ud37c_b01_dashboard", "label": "\uad8c\ud55c \uac80\uc99d \ud5ec\ud37c (B01_Dashboard)", "file_type": "document", "source_file": "concepts/auth_rbac.md", "source_location": "L42"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_\uac31\uc2e0", "label": "\uc778\uc99d \uac31\uc2e0", "file_type": "document", "source_file": "concepts/auth_rbac.md", "source_location": "L53"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\ub77c\uc6b0\ud305_\uac00\ub4dc_frontend_md_5_2", "label": "\ub77c\uc6b0\ud305 \uac00\ub4dc (frontend.md 5.2)", "file_type": "document", "source_file": "concepts/auth_rbac.md", "source_location": "L56"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870", "label": "\uc0ac\uc6a9\ucc98 (\uc5ed\ucc38\uc870)", "file_type": "document", "source_file": "concepts/auth_rbac.md", "source_location": "L59"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uacc4\ud68d\uc11c_\uc2e4\ucf54\ub4dc_\ubd88\uc77c\uce58_a\uadf8\ub8f9_\uc778\uc81c\uc2a4\ud2b8_\ubc1c\uacac", "label": "\u26a0\ufe0f \uacc4\ud68d\uc11c-\uc2e4\ucf54\ub4dc \ubd88\uc77c\uce58 (A\uadf8\ub8f9 \uc778\uc81c\uc2a4\ud2b8 \ubc1c\uacac)", "file_type": "document", "source_file": "concepts/auth_rbac.md", "source_location": "L65"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_rbac", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_rbac", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc138\uc158_\uc778\uc99d_backend_md_6_3", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_users_auth_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L13", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_rbac", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_otp_\ube44\ubc00\ubc88\ud638", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L18", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_rbac", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc0ac\uc6a9\uc790_\uc0c1\ud0dc_\uc0dd\uba85\uc8fc\uae30", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L23", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_rbac", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc5ed\ud560_users_role", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L33", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_rbac", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uad8c\ud55c_\uac80\uc99d_\ud5ec\ud37c_b01_dashboard", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L42", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_rbac", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_\uac31\uc2e0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L53", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_rbac", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\ub77c\uc6b0\ud305_\uac00\ub4dc_frontend_md_5_2", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L56", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_rbac", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L59", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a06_login_a06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L61", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a07_register_a07_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L62", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a09_security_a09_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L63", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uc778\uc99d_rbac", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_\uacc4\ud68d\uc11c_\uc2e4\ucf54\ub4dc_\ubd88\uc77c\uce58_a\uadf8\ub8f9_\uc778\uc81c\uc2a4\ud2b8_\ubc1c\uacac", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L65", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_a09_security_a09_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "concepts/auth_rbac.md", "source_location": "L68", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/ec26c30de18a4df2b859538b4a3b5c4381fb4e5151386baa77d1ca9e6ce185a9.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/ec26c30de18a4df2b859538b4a3b5c4381fb4e5151386baa77d1ca9e6ce185a9.json new file mode 100644 index 0000000..16a6df6 --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/ec26c30de18a4df2b859538b4a3b5c4381fb4e5151386baa77d1ca9e6ce185a9.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_md", "label": "B01_db.md", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_db.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_b01_dashboard_db_\uc0ac\uc6a9_\uad00\uacc4", "label": "B01_Dashboard \u2014 DB \uc0ac\uc6a9 \uad00\uacc4", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_db.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_\ud2b8\ub79c\uc7ad\uc158_\uacbd\uacc4", "label": "\ud2b8\ub79c\uc7ad\uc158 \uacbd\uacc4", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_db.md", "source_location": "L25"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_b01_dashboard_db_\uc0ac\uc6a9_\uad00\uacc4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_db.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_db_schema_users_auth_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_db.md", "source_location": "L16", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_db_schema_projects_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_db.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_db.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_db_schema_logs_monitoring_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_db.md", "source_location": "L22", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_b01_dashboard_db_\uc0ac\uc6a9_\uad00\uacc4", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_db_\ud2b8\ub79c\uc7ad\uc158_\uacbd\uacc4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_db.md", "source_location": "L25", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/f43d7fb7c134b25445c9b5d16d30a4b864c03ee044607301107af0e64c3d9bd9.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/f43d7fb7c134b25445c9b5d16d30a4b864c03ee044607301107af0e64c3d9bd9.json new file mode 100644 index 0000000..1d8bded --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/f43d7fb7c134b25445c9b5d16d30a4b864c03ee044607301107af0e64c3d9bd9.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_md", "label": "B07_frontend.md", "file_type": "document", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", "label": "B07_wf4_DesignDetail \u2014 Frontend", "file_type": "document", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\ud30c\uc77c_\uad6c\uc870", "label": "\ud30c\uc77c \uad6c\uc870", "file_type": "document", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L12"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", "file_type": "document", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L18"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "file_type": "document", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L24"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\uc758\uc874\uc131", "label": "\uc758\uc874\uc131", "file_type": "document", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L30"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\ubc31\uc5d4\ub4dc_db_\ubbf8\ucc29\uc218_\uacc4\ud68d\uc801_\ubc94\uc704_\uc81c\uc678", "label": "\ubc31\uc5d4\ub4dc/DB \u2014 \ubbf8\ucc29\uc218 (\uacc4\ud68d\uc801 \ubc94\uc704 \uc81c\uc678)", "file_type": "document", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L35"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\ucc38\uace0", "label": "\ucc38\uace0", "file_type": "document", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L42"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_db_schema_structure_output_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\ud30c\uc77c_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L18", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\uc758\uc874\uc131", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_a00_app_shell_framework_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L32", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L33", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\ubc31\uc5d4\ub4dc_db_\ubbf8\ucc29\uc218_\uacc4\ud68d\uc801_\ubc94\uc704_\uc81c\uc678", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L35", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b07_wf4_designdetail_b07_frontend_\ucc38\uace0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", "source_location": "L42", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/ast/v0.9.12/f849b661543b4f07113704a24786a67a90cebd48ce726060f43d64c696689583.json b/docs/wiki/graphify-out/cache/ast/v0.9.12/f849b661543b4f07113704a24786a67a90cebd48ce726060f43d64c696689583.json new file mode 100644 index 0000000..9ed6c8f --- /dev/null +++ b/docs/wiki/graphify-out/cache/ast/v0.9.12/f849b661543b4f07113704a24786a67a90cebd48ce726060f43d64c696689583.json @@ -0,0 +1 @@ +{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_md", "label": "B04_api.md", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_b04_wf1_surface_api", "label": "B04_wf1_Surface \u2014 API", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L8"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "label": "\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L15"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_\uc694\uccad_\uc751\ub2f5_\uc2a4\ud0a4\ub9c8_pydantic", "label": "\uc694\uccad/\uc751\ub2f5 \uc2a4\ud0a4\ub9c8 (Pydantic)", "file_type": "document", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L31"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_wf1_surface_b04_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L4", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_b04_wf1_surface_api", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L8", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_b04_wf1_surface_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L15", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_b04_wf1_surface_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_\uc694\uccad_\uc751\ub2f5_\uc2a4\ud0a4\ub9c8_pydantic", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L31", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_b04_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b04_wf1_surface_schema_common_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B04_wf1_Surface/B04_api.md", "source_location": "L42", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/docs/wiki/graphify-out/cache/stat-index.json b/docs/wiki/graphify-out/cache/stat-index.json new file mode 100644 index 0000000..40b8f99 --- /dev/null +++ b/docs/wiki/graphify-out/cache/stat-index.json @@ -0,0 +1 @@ +{"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\AGENTS.md":{"size":2464,"mtime_ns":1783834983060468500,"word_count":251,"hash":"777dc18c8da82ae19d1ef4696015cf4a4f34c2c07d0b440fe86da472081038b8"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\CLAUDE.md":{"size":2464,"mtime_ns":1783834983060468500,"word_count":251,"hash":"7a20bcee60ba41e229ef85f767421d7179a7ae138805534d5a8f104afc477a40"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\a00_app_shell_framework.md":{"size":3819,"mtime_ns":1783850530414116200,"word_count":373,"hash":"90d7356198e73e4cc9f6377549bb422cac5171f209ac35465cb3cf6afd457c55"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\a00_app_shell_framework_scaffold.md":{"size":1287,"mtime_ns":1783844389012691200,"word_count":150,"hash":"0f5b6dbb9bebbfa33f4d635f070de504af4b359fb90f4b29ba9688d1d6e17d2e"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\api_common.md":{"size":1211,"mtime_ns":1783849575585575500,"word_count":113,"hash":"a38a8ca962fdacc272da8439e0d7d9d1e1c542bc8b65333fd5579891c9857361"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\auth_rbac.md":{"size":3720,"mtime_ns":1783849578467314400,"word_count":424,"hash":"e5a0d7854dc5f172c997de38f2c4dc21dc761794e098626c17dfffe673b47711"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\common_util.md":{"size":2298,"mtime_ns":1783849579200175200,"word_count":227,"hash":"c82e36238d3bc7e9f58d7a65a208efd22932d394b41f00de2f065920df19c7b7"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\db_schema\\files_surface.md":{"size":5079,"mtime_ns":1783850268591737200,"word_count":826,"hash":"32b6d000932825989e419a4136794b28850890191432179205576bde15298bf5"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\db_schema\\logs_monitoring.md":{"size":5440,"mtime_ns":1783850257642213500,"word_count":848,"hash":"7fb3857a81e71036c1ce149c4b7245df62a5739b3547ecf4cabbdad69ea26f7d"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\db_schema\\overview.md":{"size":3515,"mtime_ns":1783850340580860400,"word_count":380,"hash":"52811408853b074f152e72eca98203c800db677004bc8ae75c253e28b0464ee1"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\db_schema\\projects.md":{"size":2769,"mtime_ns":1783850262520236500,"word_count":410,"hash":"645ae1caf18f1055571c195d5af0488bcb975554ef4227b5d294117aa14d35bc"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\db_schema\\route_profile.md":{"size":3423,"mtime_ns":1783850288182818000,"word_count":560,"hash":"479a8e4089e3bb7a2cc81032c56fd9af63de315e299c5bfaa734f3dc729d25a1"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\db_schema\\structure_output.md":{"size":3789,"mtime_ns":1783850297429242900,"word_count":618,"hash":"671505750d39bdfee5448654c63c865bd82059e3dd905065e164202716f19204"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\db_schema\\unconfirmed\\README.md":{"size":851,"mtime_ns":1783850335081333800,"word_count":79,"hash":"1b226e5d018fc38a72090165fa26143b93b6e1c0a7e1073d8c15e0cdddbeb171"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\db_schema\\users_auth.md":{"size":4342,"mtime_ns":1783850220271142800,"word_count":689,"hash":"29bd2bdc39958157c52fe4e872b1c1b0ff6b6f91aa809ee33b6be89c57ccd9fa"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\dependencies.md":{"size":2620,"mtime_ns":1783850549511564200,"word_count":244,"hash":"0dddf33216964b4bf97f34f8bce4436bfa31f27f00ed2057e251ff2f7a31623a"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\schema_common.md":{"size":855,"mtime_ns":1783844389016639700,"word_count":99,"hash":"7b7b025371ec01828e5296e1181ed9c5c4381d26906e595e1bf74b413f559880"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\storage_paths.md":{"size":2305,"mtime_ns":1783850555214286100,"word_count":197,"hash":"864c1304191de6468d4edc50434ec59bea00a7f2d0eee6bacc57ecbf7b4f7e04"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\ui_templates.md":{"size":4829,"mtime_ns":1783850532482036500,"word_count":463,"hash":"c3a3a40df2648ee75578c94723b6824b1050d0df0b0ee7719b7da9115e3e9d5b"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\concepts\\workflow_state.md":{"size":6332,"mtime_ns":1783850560332646600,"word_count":494,"hash":"913554bc65be372e31038c5b6db99ffb11804957097d503d81077bbf581c6403"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\index.md":{"size":7464,"mtime_ns":1783850468542085500,"word_count":617,"hash":"4df26e4d9121bc917f5542182c4d4b90fe7405d00db5ca205080ab8b2fcba450"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\log.md":{"size":34477,"mtime_ns":1783850724188808200,"word_count":3348,"hash":"bc8f362e6683fa0ae51daf283b5d2a7813c06e0dc3f073f5680c831ecf7292f0"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A01_Home\\A01_components.md":{"size":1202,"mtime_ns":1783849656616777200,"word_count":150,"hash":"49fd7d94d4b60db667d3b09b49911f92d55600a624ab7905ccbc6e3ad42a3352"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A01_Home\\A01_frontend.md":{"size":2355,"mtime_ns":1783849659828017600,"word_count":245,"hash":"5fec6364bd060aef3f2afe819bea5354565d898bbb2169efed8ae55d8aba79cc"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A02_ProgDetail\\A02_components.md":{"size":1807,"mtime_ns":1783849775265680000,"word_count":203,"hash":"2808d040f080236ab87ff5d059ee801796b07a63f6a114bd2a2109e0b5806e12"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A02_ProgDetail\\A02_frontend.md":{"size":1459,"mtime_ns":1783849775266683300,"word_count":119,"hash":"430bcc25e31726266357a8339dcac795f30c714099326f504dcf44364ffdfd63"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A03_CompDetail\\A03_frontend.md":{"size":2898,"mtime_ns":1783844088302852900,"word_count":305,"hash":"2be5bc2fd35d20f0f1eb7c1c707e58347f2b10bcc8843f04fffa74fbdca4d2a7"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A04_NewsHistory\\A04_frontend.md":{"size":3337,"mtime_ns":1783844098325878300,"word_count":353,"hash":"890159057c1b315dc2f987cc22cff3d9f78d8a6b70c16341450a63a15eea1e79"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A05_EduDetail\\A05_frontend.md":{"size":2731,"mtime_ns":1783844108812844900,"word_count":294,"hash":"ab34ed804dca07323ea78583add067fd18e7d17a741c99321bd6c782e82c7c82"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A06_Login\\A06_backend.md":{"size":3844,"mtime_ns":1783849775268766500,"word_count":400,"hash":"aacc52798876b1c9f1528049e014dfff812e4362029bf2900537a635cea03345"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A06_Login\\A06_frontend.md":{"size":3934,"mtime_ns":1783849775268766500,"word_count":398,"hash":"87a19225130d879a47fa512b619a4dfcd67d6a13bcfed08f9280892d055b7aec"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A07_Register\\A07_backend.md":{"size":2748,"mtime_ns":1783849775269772500,"word_count":258,"hash":"c0a1926f8af61577dc912e4ca9824e1459355dd7538f1577120a4b7ec9f8a0b6"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A07_Register\\A07_frontend.md":{"size":5058,"mtime_ns":1783849775270772200,"word_count":464,"hash":"dbc60034a717404e311f43e3f724df0f5db7fc40240c9b2dea195710e80aa456"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A08_Support\\A08_backend.md":{"size":2671,"mtime_ns":1783849900589599200,"word_count":268,"hash":"1d05c804dd886b8148e1a246412e6c96776d60ed81e47cd559330fd26a8da829"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A08_Support\\A08_frontend.md":{"size":3167,"mtime_ns":1783849775273060500,"word_count":321,"hash":"50e6b6bf0066bb5b891dbcf8988ee06ec3918a47e2e33f1bba85cc3d586c424c"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A09_Security\\A09_backend.md":{"size":4013,"mtime_ns":1783849775274067100,"word_count":354,"hash":"b274d5ee1fd61e7bc3013ac1dfaba29d570264ad0322202e9f907db6a7cd5717"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\A09_Security\\A09_frontend.md":{"size":4171,"mtime_ns":1783849775275076800,"word_count":380,"hash":"3db683a2cde7e94a133978113563de2a3fd70d54fdde9b2002e15145901824c1"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B01_Dashboard\\B01_api.md":{"size":3782,"mtime_ns":1783849775277077100,"word_count":405,"hash":"118279706a1eb23a45441e1ff8903d5dbd50d4d0b51975d3a17b60f7780055ca"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B01_Dashboard\\B01_backend.md":{"size":5363,"mtime_ns":1783849775278077000,"word_count":440,"hash":"646d6ab79be622a7ff0a6e70be8cff4eba1d7a96287360cb7c92afbf09ce3094"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B01_Dashboard\\B01_db.md":{"size":2201,"mtime_ns":1783850631766598100,"word_count":216,"hash":"ec26c30de18a4df2b859538b4a3b5c4381fb4e5151386baa77d1ca9e6ce185a9"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B01_Dashboard\\B01_dependencies.md":{"size":1523,"mtime_ns":1783849775280134300,"word_count":157,"hash":"981095fcec47154f4626fb3eab7ecdc4407e949a7aa702a13130c8e1b70920ec"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B01_Dashboard\\B01_frontend.md":{"size":3177,"mtime_ns":1783849775280134300,"word_count":337,"hash":"1e373af97a118ae3015a3afa398085bf5df4a98ba74866cbe2f8697b00379869"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B02_ProjRegister\\B02_backend.md":{"size":4260,"mtime_ns":1783849775282399000,"word_count":382,"hash":"2511b51e4eb20cf62e268122c88d3fb89dbd706320402a4eccb759b58281fa0a"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B02_ProjRegister\\B02_db.md":{"size":1450,"mtime_ns":1783849775282399000,"word_count":129,"hash":"0624d255f06a43b161abeb6fdee9630e320fd97ac8bfcec25673ffef09e4d059"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B02_ProjRegister\\B02_frontend.md":{"size":3727,"mtime_ns":1783849775283398800,"word_count":379,"hash":"4a5f18486fb810daf3f1c5b1551536726d973ee824de69be0d36d0a60322cdaa"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B03_FileInput\\B03_api.md":{"size":1547,"mtime_ns":1783849775284398900,"word_count":151,"hash":"dc48367a69497d4965a076e5baa28ca167883c8abfb32eff54161c461fcde509"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B03_FileInput\\B03_backend.md":{"size":2973,"mtime_ns":1783849775285399000,"word_count":290,"hash":"145e767fcb59085a1ee13d461285411d8b86d513511ea6df46b3348775ca49a4"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B03_FileInput\\B03_db.md":{"size":1423,"mtime_ns":1783850637448416300,"word_count":147,"hash":"186d47f554f2e797fb63a3167221e324a92f283cd57fa229bc6d47bb5224d32b"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B03_FileInput\\B03_dependencies.md":{"size":1552,"mtime_ns":1783849775287398800,"word_count":160,"hash":"944204e569fb7c208be3dd6b08b83c70b5229be9c7f932926aeb285b77807561"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B03_FileInput\\B03_frontend.md":{"size":2550,"mtime_ns":1783849775287398800,"word_count":278,"hash":"dc90c884f2f276e80a57bfc0e2b82b3cf72360db91b22dd9337ef082385050cb"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B04_wf1_Surface\\B04_api.md":{"size":3006,"mtime_ns":1783849775291034500,"word_count":262,"hash":"f849b661543b4f07113704a24786a67a90cebd48ce726060f43d64c696689583"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B04_wf1_Surface\\B04_backend.md":{"size":4043,"mtime_ns":1783849775292158500,"word_count":355,"hash":"474c775ef5ef23ed26e38b39828a52131bedb7f8a770ad07dc99148df7e87c5b"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B04_wf1_Surface\\B04_db.md":{"size":1681,"mtime_ns":1783849775292957100,"word_count":160,"hash":"c6652706034c525ffeec3bbaf4f9f371698a1070a1adbdffb079bbdb1ce3eb2c"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B04_wf1_Surface\\B04_dependencies.md":{"size":1295,"mtime_ns":1783849775292957100,"word_count":142,"hash":"97478cabbb537844beae71898c5b219a2b94edecb3285f81207390133befebed"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B04_wf1_Surface\\B04_frontend.md":{"size":3750,"mtime_ns":1783849775293959500,"word_count":321,"hash":"8d85ff410419578b818f52078b23e7a3d3a4a7c9d3c18d6994a3d65420b74bd8"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B05_wf2_Route\\B05_api.md":{"size":1194,"mtime_ns":1783849775295465300,"word_count":123,"hash":"c7645ac1d9ed01c49738b733aa69361b91e27034b72846bf1083ee3a0b9aaf35"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B05_wf2_Route\\B05_backend.md":{"size":3005,"mtime_ns":1783849775295465300,"word_count":303,"hash":"a6d3afe6fc8285143b839973bd8506e5c74fa12760a92b9d72930d4a96d07742"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B05_wf2_Route\\B05_db.md":{"size":1676,"mtime_ns":1783850658484400400,"word_count":175,"hash":"36e9c3aa280793956998877458fc2ac0767eeec0172efa0542cb863877908fcb"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B05_wf2_Route\\B05_dependencies.md":{"size":1133,"mtime_ns":1783849775298166400,"word_count":131,"hash":"9691ebb53407e479750a796e82774905fe22139f5b049c3f7dc0ad6534c378cf"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B05_wf2_Route\\B05_frontend.md":{"size":2138,"mtime_ns":1783849775298166400,"word_count":236,"hash":"1e9e4be64167f23705811ee00b005b84faf8b3e44cc65a78ac00683ff4cc92ea"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B06_wf3_ProfileCross\\B06_api.md":{"size":1332,"mtime_ns":1783849775299166300,"word_count":126,"hash":"54d5ac3300a973b62932c4e49e96e3aefea664dc1af074865d994a02ceea83e7"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B06_wf3_ProfileCross\\B06_backend.md":{"size":2674,"mtime_ns":1783849775300166200,"word_count":259,"hash":"464194e04c304a155a3445c411403400b6239ad5460dfad3ccdeb03da87f41fb"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B06_wf3_ProfileCross\\B06_db.md":{"size":1718,"mtime_ns":1783850703123485300,"word_count":158,"hash":"2db81e60642ebe8f3ec8f7c3673d57ad41156fa1bf6f636be896aa2d44899709"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B06_wf3_ProfileCross\\B06_dependencies.md":{"size":1348,"mtime_ns":1783849775301572100,"word_count":130,"hash":"1dad047374ae3b973fcdcaa189f843557fcfffe8364feccc7ebc92f3ddc04155"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B06_wf3_ProfileCross\\B06_frontend.md":{"size":2137,"mtime_ns":1783849775302093500,"word_count":221,"hash":"37aa0d07aa6c480aa555897c7a3b552f3c4918332701b292c8140bd177fae0f3"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B07_wf4_DesignDetail\\B07_frontend.md":{"size":2037,"mtime_ns":1783844389053690900,"word_count":192,"hash":"f43d7fb7c134b25445c9b5d16d30a4b864c03ee044607301107af0e64c3d9bd9"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B08_wf5_Quantity\\B08_db.md":{"size":1112,"mtime_ns":1783850708284249100,"word_count":134,"hash":"4b09b67e025ab679214a595ed4288633a2c58d466bff1f2e195d8ad42e74d686"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B08_wf5_Quantity\\B08_frontend.md":{"size":1694,"mtime_ns":1783849775303746000,"word_count":203,"hash":"9216484c57c256629ee59314bc7d4b9e8ef66c3d8458b9ea16a3f73dd370fe52"},"C:\\Program_coding\\\uc784\ub3c4\uc124\uacc4 \ubc0f \uacac\uc801\uc790\ub3d9\ud654 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\\docs\\wiki\\pages\\B09_wf6_Estimation\\B09_frontend.md":{"size":1941,"mtime_ns":1783844389057481200,"word_count":187,"hash":"0b2cdc6e3ca674d334281585329d084ff2d4d330ad6ed1e67b99ee2b144d4d7d"}} \ No newline at end of file diff --git a/docs/wiki/graphify-out/graph.html b/docs/wiki/graphify-out/graph.html new file mode 100644 index 0000000..7e33393 --- /dev/null +++ b/docs/wiki/graphify-out/graph.html @@ -0,0 +1,307 @@ + + + + +graphify - graphify-out\graph.html + + + + +

+ + + + + \ No newline at end of file diff --git a/docs/wiki/graphify-out/graph.json b/docs/wiki/graphify-out/graph.json new file mode 100644 index 0000000..08ca336 --- /dev/null +++ b/docs/wiki/graphify-out/graph.json @@ -0,0 +1,10421 @@ +{ + "directed": false, + "multigraph": false, + "graph": {}, + "nodes": [ + { + "label": "AGENTS.md", + "file_type": "document", + "source_file": "AGENTS.md", + "source_location": "L1", + "_origin": "ast", + "id": "agents", + "community": 38, + "norm_label": "agents.md" + }, + { + "label": "wiki/ \ud3f4\ub354 \uaddc\uce59", + "file_type": "document", + "source_file": "AGENTS.md", + "source_location": "L1", + "_origin": "ast", + "id": "agents_wiki_\ud3f4\ub354_\uaddc\uce59", + "community": 38, + "norm_label": "wiki/ \u1111\u1169\u11af\u1103\u1165 \u1100\u1172\u110e\u1175\u11a8" + }, + { + "label": "\uad6c\uc870", + "file_type": "document", + "source_file": "AGENTS.md", + "source_location": "L5", + "_origin": "ast", + "id": "agents_\uad6c\uc870", + "community": 38, + "norm_label": "\u1100\u116e\u110c\u1169" + }, + { + "label": "\uc791\uc131 \uaddc\uce59", + "file_type": "document", + "source_file": "AGENTS.md", + "source_location": "L11", + "_origin": "ast", + "id": "agents_\uc791\uc131_\uaddc\uce59", + "community": 38, + "norm_label": "\u110c\u1161\u11a8\u1109\u1165\u11bc \u1100\u1172\u110e\u1175\u11a8" + }, + { + "label": "CLAUDE.md", + "file_type": "document", + "source_file": "CLAUDE.md", + "source_location": "L1", + "_origin": "ast", + "id": "claude", + "community": 39, + "norm_label": "claude.md" + }, + { + "label": "wiki/ \ud3f4\ub354 \uaddc\uce59", + "file_type": "document", + "source_file": "CLAUDE.md", + "source_location": "L1", + "_origin": "ast", + "id": "claude_wiki_\ud3f4\ub354_\uaddc\uce59", + "community": 39, + "norm_label": "wiki/ \u1111\u1169\u11af\u1103\u1165 \u1100\u1172\u110e\u1175\u11a8" + }, + { + "label": "\uad6c\uc870", + "file_type": "document", + "source_file": "CLAUDE.md", + "source_location": "L5", + "_origin": "ast", + "id": "claude_\uad6c\uc870", + "community": 39, + "norm_label": "\u1100\u116e\u110c\u1169" + }, + { + "label": "\uc791\uc131 \uaddc\uce59", + "file_type": "document", + "source_file": "CLAUDE.md", + "source_location": "L11", + "_origin": "ast", + "id": "claude_\uc791\uc131_\uaddc\uce59", + "community": 39, + "norm_label": "\u110c\u1161\u11a8\u1109\u1165\u11bc \u1100\u1172\u110e\u1175\u11a8" + }, + { + "label": "a00_app_shell_framework.md", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework", + "community": 5, + "norm_label": "a00_app_shell_framework.md" + }, + { + "label": "A00_Common \u2014 App Shell Framework", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L8", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_a00_common_app_shell_framework", + "community": 7, + "norm_label": "a00_common \u2014 app shell framework" + }, + { + "label": "\ud30c\uc77c \uad6c\uc131", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L12", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_\ud30c\uc77c_\uad6c\uc131", + "community": 7, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u1109\u1165\u11bc" + }, + { + "label": "app_shell \uad6c\uc131\uc694\uc18c", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L20", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", + "community": 7, + "norm_label": "app_shell \u1100\u116e\u1109\u1165\u11bc\u110b\u116d\u1109\u1169" + }, + { + "label": "\ud14c\ub9c8 & \uc5b8\uc5b4 \uad00\ub9ac", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L22", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_\ud14c\ub9c8_\uc5b8\uc5b4_\uad00\ub9ac", + "community": 7, + "norm_label": "\u1110\u1166\u1106\u1161 & \u110b\u1165\u11ab\u110b\u1165 \u1100\u116a\u11ab\u1105\u1175" + }, + { + "label": "\ud5e4\ub354 \uad6c\uc131 (64px \ub192\uc774, sticky)", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L27", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_\ud5e4\ub354_\uad6c\uc131_64px_\ub192\uc774_sticky", + "community": 7, + "norm_label": "\u1112\u1166\u1103\u1165 \u1100\u116e\u1109\u1165\u11bc (64px \u1102\u1169\u11c1\u110b\u1175, sticky)" + }, + { + "label": "\uc778\uc99d \ubc84\ud2bc (\ube44\ub3d9\uae30 fillAuthActions)", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L40", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_\uc778\uc99d_\ubc84\ud2bc_\ube44\ub3d9\uae30_fillauthactions", + "community": 7, + "norm_label": "\u110b\u1175\u11ab\u110c\u1173\u11bc \u1107\u1165\u1110\u1173\u11ab (\u1107\u1175\u1103\u1169\u11bc\u1100\u1175 fillauthactions)" + }, + { + "label": "\ub85c\uadf8\uc544\uc6c3 (onApp_Logout_Click)", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L44", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_\ub85c\uadf8\uc544\uc6c3_onapp_logout_click", + "community": 7, + "norm_label": "\u1105\u1169\u1100\u1173\u110b\u1161\u110b\u116e\u11ba (onapp_logout_click)" + }, + { + "label": "\ud478\ud130", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L48", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_\ud478\ud130", + "community": 7, + "norm_label": "\u1111\u116e\u1110\u1165" + }, + { + "label": "router \ub77c\uc6b0\ud305 \ud14c\uc774\ube14", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L52", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_router_\ub77c\uc6b0\ud305_\ud14c\uc774\ube14", + "community": 7, + "norm_label": "router \u1105\u1161\u110b\u116e\u1110\u1175\u11bc \u1110\u1166\u110b\u1175\u1107\u1173\u11af" + }, + { + "label": "\uc778\uc99d \uac00\ub4dc", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L77", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_\uc778\uc99d_\uac00\ub4dc", + "community": 7, + "norm_label": "\u110b\u1175\u11ab\u110c\u1173\u11bc \u1100\u1161\u1103\u1173" + }, + { + "label": "\uc138\ubd80 \uc2a4\uce90\ud3f4\ub4dc\u00b7CSS\u00b7\uc885\uc18d\uc131", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L84", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_\uc138\ubd80_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", + "community": 7, + "norm_label": "\u1109\u1166\u1107\u116e \u1109\u1173\u110f\u1162\u1111\u1169\u11af\u1103\u1173\u00b7css\u00b7\u110c\u1169\u11bc\u1109\u1169\u11a8\u1109\u1165\u11bc" + }, + { + "label": "a00_app_shell_framework_scaffold.md", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework_scaffold.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_scaffold", + "community": 5, + "norm_label": "a00_app_shell_framework_scaffold.md" + }, + { + "label": "A00_Common \u2014 \uc2a4\uce90\ud3f4\ub4dc\u00b7CSS\u00b7\uc885\uc18d\uc131", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework_scaffold.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", + "community": 5, + "norm_label": "a00_common \u2014 \u1109\u1173\u110f\u1162\u1111\u1169\u11af\u1103\u1173\u00b7css\u00b7\u110c\u1169\u11bc\u1109\u1169\u11a8\u1109\u1165\u11bc" + }, + { + "label": "b_page_scaffold", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework_scaffold.md", + "source_location": "L11", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_scaffold_b_page_scaffold", + "community": 5, + "norm_label": "b_page_scaffold" + }, + { + "label": "CSS \uc778\uc81d\uc158", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework_scaffold.md", + "source_location": "L18", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_scaffold_css_\uc778\uc81d\uc158", + "community": 5, + "norm_label": "css \u110b\u1175\u11ab\u110c\u1166\u11a8\u1109\u1167\u11ab" + }, + { + "label": "\uc885\uc18d\uc131", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework_scaffold.md", + "source_location": "L25", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_scaffold_\uc885\uc18d\uc131", + "community": 5, + "norm_label": "\u110c\u1169\u11bc\u1109\u1169\u11a8\u1109\u1165\u11bc" + }, + { + "label": "\uc0ac\uc6a9\ucc98", + "file_type": "document", + "source_file": "concepts/a00_app_shell_framework_scaffold.md", + "source_location": "L33", + "_origin": "ast", + "id": "concepts_a00_app_shell_framework_scaffold_\uc0ac\uc6a9\ucc98", + "community": 5, + "norm_label": "\u1109\u1161\u110b\u116d\u11bc\u110e\u1165" + }, + { + "label": "api_common.md", + "file_type": "document", + "source_file": "concepts/api_common.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_api_common", + "community": 1, + "norm_label": "api_common.md" + }, + { + "label": "API \uacf5\ud1b5 (\uc5ec\ub7ec \ud398\uc774\uc9c0\uac00 \uacf5\uc720\ud558\ub294 \uc5d4\ub4dc\ud3ec\uc778\ud2b8)", + "file_type": "document", + "source_file": "concepts/api_common.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_api_common_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "community": 1, + "norm_label": "api \u1100\u1169\u11bc\u1110\u1169\u11bc (\u110b\u1167\u1105\u1165 \u1111\u1166\u110b\u1175\u110c\u1175\u1100\u1161 \u1100\u1169\u11bc\u110b\u1172\u1112\u1161\u1102\u1173\u11ab \u110b\u1166\u11ab\u1103\u1173\u1111\u1169\u110b\u1175\u11ab\u1110\u1173)" + }, + { + "label": "\uacf5\ud1b5 \uc624\ub958 \uc751\ub2f5 \ud3ec\ub9f7 (\uc804 \ub77c\uc6b0\ud130)", + "file_type": "document", + "source_file": "concepts/api_common.md", + "source_location": "L11", + "_origin": "ast", + "id": "concepts_api_common_\uacf5\ud1b5_\uc624\ub958_\uc751\ub2f5_\ud3ec\ub9f7_\uc804_\ub77c\uc6b0\ud130", + "community": 1, + "norm_label": "\u1100\u1169\u11bc\u1110\u1169\u11bc \u110b\u1169\u1105\u1172 \u110b\u1173\u11bc\u1103\u1161\u11b8 \u1111\u1169\u1106\u1162\u11ba (\u110c\u1165\u11ab \u1105\u1161\u110b\u116e\u1110\u1165)" + }, + { + "label": "\uc6cc\ud06c\ud50c\ub85c\uc6b0 \uc0c1\ud0dc \uc870\ud68c", + "file_type": "document", + "source_file": "concepts/api_common.md", + "source_location": "L17", + "_origin": "ast", + "id": "concepts_api_common_\uc6cc\ud06c\ud50c\ub85c\uc6b0_\uc0c1\ud0dc_\uc870\ud68c", + "community": 1, + "norm_label": "\u110b\u116f\u110f\u1173\u1111\u1173\u11af\u1105\u1169\u110b\u116e \u1109\u1161\u11bc\u1110\u1162 \u110c\u1169\u1112\u116c" + }, + { + "label": "\ud3f4\ub9c1 \ud328\ud134 (legacy workflow.json \uc124\uacc4; \ud604\uc7ac \uad6c\ud604\uc740 workflow-state API \uc0ac\uc6a9)", + "file_type": "document", + "source_file": "concepts/api_common.md", + "source_location": "L25", + "_origin": "ast", + "id": "concepts_api_common_\ud3f4\ub9c1_\ud328\ud134_legacy_workflow_json_\uc124\uacc4_\ud604\uc7ac_\uad6c\ud604\uc740_workflow_state_api_\uc0ac\uc6a9", + "community": 1, + "norm_label": "\u1111\u1169\u11af\u1105\u1175\u11bc \u1111\u1162\u1110\u1165\u11ab (legacy workflow.json \u1109\u1165\u11af\u1100\u1168; \u1112\u1167\u11ab\u110c\u1162 \u1100\u116e\u1112\u1167\u11ab\u110b\u1173\u11ab workflow-state api \u1109\u1161\u110b\u116d\u11bc)" + }, + { + "label": "auth_rbac.md", + "file_type": "document", + "source_file": "concepts/auth_rbac.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_auth_rbac", + "community": 1, + "norm_label": "auth_rbac.md" + }, + { + "label": "\uc778\uc99d / RBAC", + "file_type": "document", + "source_file": "concepts/auth_rbac.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_auth_rbac_\uc778\uc99d_rbac", + "community": 14, + "norm_label": "\u110b\u1175\u11ab\u110c\u1173\u11bc / rbac" + }, + { + "label": "\uc138\uc158 \uc778\uc99d (backend.md 6.3)", + "file_type": "document", + "source_file": "concepts/auth_rbac.md", + "source_location": "L11", + "_origin": "ast", + "id": "concepts_auth_rbac_\uc138\uc158_\uc778\uc99d_backend_md_6_3", + "community": 14, + "norm_label": "\u1109\u1166\u1109\u1167\u11ab \u110b\u1175\u11ab\u110c\u1173\u11bc (backend.md 6.3)" + }, + { + "label": "OTP / \ube44\ubc00\ubc88\ud638", + "file_type": "document", + "source_file": "concepts/auth_rbac.md", + "source_location": "L18", + "_origin": "ast", + "id": "concepts_auth_rbac_otp_\ube44\ubc00\ubc88\ud638", + "community": 14, + "norm_label": "otp / \u1107\u1175\u1106\u1175\u11af\u1107\u1165\u11ab\u1112\u1169" + }, + { + "label": "\uc0ac\uc6a9\uc790 \uc0c1\ud0dc \uc0dd\uba85\uc8fc\uae30", + "file_type": "document", + "source_file": "concepts/auth_rbac.md", + "source_location": "L23", + "_origin": "ast", + "id": "concepts_auth_rbac_\uc0ac\uc6a9\uc790_\uc0c1\ud0dc_\uc0dd\uba85\uc8fc\uae30", + "community": 14, + "norm_label": "\u1109\u1161\u110b\u116d\u11bc\u110c\u1161 \u1109\u1161\u11bc\u1110\u1162 \u1109\u1162\u11bc\u1106\u1167\u11bc\u110c\u116e\u1100\u1175" + }, + { + "label": "\uc5ed\ud560 (users.role)", + "file_type": "document", + "source_file": "concepts/auth_rbac.md", + "source_location": "L33", + "_origin": "ast", + "id": "concepts_auth_rbac_\uc5ed\ud560_users_role", + "community": 14, + "norm_label": "\u110b\u1167\u11a8\u1112\u1161\u11af (users.role)" + }, + { + "label": "\uad8c\ud55c \uac80\uc99d \ud5ec\ud37c (B01_Dashboard)", + "file_type": "document", + "source_file": "concepts/auth_rbac.md", + "source_location": "L42", + "_origin": "ast", + "id": "concepts_auth_rbac_\uad8c\ud55c_\uac80\uc99d_\ud5ec\ud37c_b01_dashboard", + "community": 14, + "norm_label": "\u1100\u116f\u11ab\u1112\u1161\u11ab \u1100\u1165\u11b7\u110c\u1173\u11bc \u1112\u1166\u11af\u1111\u1165 (b01_dashboard)" + }, + { + "label": "\uc778\uc99d \uac31\uc2e0", + "file_type": "document", + "source_file": "concepts/auth_rbac.md", + "source_location": "L53", + "_origin": "ast", + "id": "concepts_auth_rbac_\uc778\uc99d_\uac31\uc2e0", + "community": 14, + "norm_label": "\u110b\u1175\u11ab\u110c\u1173\u11bc \u1100\u1162\u11bc\u1109\u1175\u11ab" + }, + { + "label": "\ub77c\uc6b0\ud305 \uac00\ub4dc (frontend.md 5.2)", + "file_type": "document", + "source_file": "concepts/auth_rbac.md", + "source_location": "L56", + "_origin": "ast", + "id": "concepts_auth_rbac_\ub77c\uc6b0\ud305_\uac00\ub4dc_frontend_md_5_2", + "community": 14, + "norm_label": "\u1105\u1161\u110b\u116e\u1110\u1175\u11bc \u1100\u1161\u1103\u1173 (frontend.md 5.2)" + }, + { + "label": "\uc0ac\uc6a9\ucc98 (\uc5ed\ucc38\uc870)", + "file_type": "document", + "source_file": "concepts/auth_rbac.md", + "source_location": "L59", + "_origin": "ast", + "id": "concepts_auth_rbac_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870", + "community": 14, + "norm_label": "\u1109\u1161\u110b\u116d\u11bc\u110e\u1165 (\u110b\u1167\u11a8\u110e\u1161\u11b7\u110c\u1169)" + }, + { + "label": "\u26a0\ufe0f \uacc4\ud68d\uc11c-\uc2e4\ucf54\ub4dc \ubd88\uc77c\uce58 (A\uadf8\ub8f9 \uc778\uc81c\uc2a4\ud2b8 \ubc1c\uacac)", + "file_type": "document", + "source_file": "concepts/auth_rbac.md", + "source_location": "L65", + "_origin": "ast", + "id": "concepts_auth_rbac_\uacc4\ud68d\uc11c_\uc2e4\ucf54\ub4dc_\ubd88\uc77c\uce58_a\uadf8\ub8f9_\uc778\uc81c\uc2a4\ud2b8_\ubc1c\uacac", + "community": 14, + "norm_label": "\u26a0\ufe0f \u1100\u1168\u1112\u116c\u11a8\u1109\u1165-\u1109\u1175\u11af\u110f\u1169\u1103\u1173 \u1107\u116e\u11af\u110b\u1175\u11af\u110e\u1175 (a\u1100\u1173\u1105\u116e\u11b8 \u110b\u1175\u11ab\u110c\u1166\u1109\u1173\u1110\u1173 \u1107\u1161\u11af\u1100\u1167\u11ab)" + }, + { + "label": "common_util.md", + "file_type": "document", + "source_file": "concepts/common_util.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_common_util", + "community": 2, + "norm_label": "common_util.md" + }, + { + "label": "\uacf5\ud1b5 \uc720\ud2f8 (common_util/)", + "file_type": "document", + "source_file": "concepts/common_util.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_common_util_\uacf5\ud1b5_\uc720\ud2f8_common_util", + "community": 2, + "norm_label": "\u1100\u1169\u11bc\u1110\u1169\u11bc \u110b\u1172\u1110\u1175\u11af (common_util/)" + }, + { + "label": "\uc774\uba54\uc77c \ubc1c\uc1a1 (common_util_email.py)", + "file_type": "document", + "source_file": "concepts/common_util.md", + "source_location": "L27", + "_origin": "ast", + "id": "concepts_common_util_\uc774\uba54\uc77c_\ubc1c\uc1a1_common_util_email_py", + "community": 2, + "norm_label": "\u110b\u1175\u1106\u1166\u110b\u1175\u11af \u1107\u1161\u11af\u1109\u1169\u11bc (common_util_email.py)" + }, + { + "label": "\ub9ac\uc18c\uc2a4 \ubaa8\ub2c8\ud130\ub9c1 (common_util_resource_monitor.py)", + "file_type": "document", + "source_file": "concepts/common_util.md", + "source_location": "L31", + "_origin": "ast", + "id": "concepts_common_util_\ub9ac\uc18c\uc2a4_\ubaa8\ub2c8\ud130\ub9c1_common_util_resource_monitor_py", + "community": 2, + "norm_label": "\u1105\u1175\u1109\u1169\u1109\u1173 \u1106\u1169\u1102\u1175\u1110\u1165\u1105\u1175\u11bc (common_util_resource_monitor.py)" + }, + { + "label": "files_surface.md", + "file_type": "document", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_db_schema_files_surface", + "community": 0, + "norm_label": "files_surface.md" + }, + { + "label": "DB: \ud30c\uc77c/\uc9c0\ud45c\uba74\ubd84\uc11d \ud14c\uc774\ube14", + "file_type": "document", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", + "community": 0, + "norm_label": "db: \u1111\u1161\u110b\u1175\u11af/\u110c\u1175\u1111\u116d\u1106\u1167\u11ab\u1107\u116e\u11ab\u1109\u1165\u11a8 \u1110\u1166\u110b\u1175\u1107\u1173\u11af" + }, + { + "label": "upload_sessions (\uc5c5\ub85c\ub4dc \uc138\uc158)", + "file_type": "document", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L13", + "_origin": "ast", + "id": "concepts_db_schema_files_surface_upload_sessions_\uc5c5\ub85c\ub4dc_\uc138\uc158", + "community": 0, + "norm_label": "upload_sessions (\u110b\u1165\u11b8\u1105\u1169\u1103\u1173 \u1109\u1166\u1109\u1167\u11ab)" + }, + { + "label": "upload_chunks (\uc5c5\ub85c\ub4dc \uccad\ud06c \ub370\uc774\ud130)", + "file_type": "document", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L24", + "_origin": "ast", + "id": "concepts_db_schema_files_surface_upload_chunks_\uc5c5\ub85c\ub4dc_\uccad\ud06c_\ub370\uc774\ud130", + "community": 0, + "norm_label": "upload_chunks (\u110b\u1165\u11b8\u1105\u1169\u1103\u1173 \u110e\u1165\u11bc\u110f\u1173 \u1103\u1166\u110b\u1175\u1110\u1165)" + }, + { + "label": "input_files (\uc785\ub825 \uc6d0\ubcf8 \ud30c\uc77c)", + "file_type": "document", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L35", + "_origin": "ast", + "id": "concepts_db_schema_files_surface_input_files_\uc785\ub825_\uc6d0\ubcf8_\ud30c\uc77c", + "community": 0, + "norm_label": "input_files (\u110b\u1175\u11b8\u1105\u1167\u11a8 \u110b\u116f\u11ab\u1107\u1169\u11ab \u1111\u1161\u110b\u1175\u11af)" + }, + { + "label": "processed_point_cloud (\ud544\ud130/\ubcc0\ud658 \ud3ec\uc778\ud2b8\ud074\ub77c\uc6b0\ub4dc)", + "file_type": "document", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L48", + "_origin": "ast", + "id": "concepts_db_schema_files_surface_processed_point_cloud_\ud544\ud130_\ubcc0\ud658_\ud3ec\uc778\ud2b8\ud074\ub77c\uc6b0\ub4dc", + "community": 0, + "norm_label": "processed_point_cloud (\u1111\u1175\u11af\u1110\u1165/\u1107\u1167\u11ab\u1112\u116a\u11ab \u1111\u1169\u110b\u1175\u11ab\u1110\u1173\u110f\u1173\u11af\u1105\u1161\u110b\u116e\u1103\u1173)" + }, + { + "label": "surface_models (\uc9c0\ud45c\uba74 \ubaa8\ub378 \ubc0f \ub4f1\uace0\uc120)", + "file_type": "document", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L64", + "_origin": "ast", + "id": "concepts_db_schema_files_surface_surface_models_\uc9c0\ud45c\uba74_\ubaa8\ub378_\ubc0f_\ub4f1\uace0\uc120", + "community": 0, + "norm_label": "surface_models (\u110c\u1175\u1111\u116d\u1106\u1167\u11ab \u1106\u1169\u1103\u1166\u11af \u1106\u1175\u11be \u1103\u1173\u11bc\u1100\u1169\u1109\u1165\u11ab)" + }, + { + "label": "terrain_layers (\uc9c0\ud615 \ub808\uc774\uc5b4)", + "file_type": "document", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L77", + "_origin": "ast", + "id": "concepts_db_schema_files_surface_terrain_layers_\uc9c0\ud615_\ub808\uc774\uc5b4", + "community": 0, + "norm_label": "terrain_layers (\u110c\u1175\u1112\u1167\u11bc \u1105\u1166\u110b\u1175\u110b\u1165)" + }, + { + "label": "input_files.status \uac12", + "file_type": "document", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L89", + "_origin": "ast", + "id": "concepts_db_schema_files_surface_input_files_status_\uac12", + "community": 0, + "norm_label": "input_files.status \u1100\u1161\u11b9" + }, + { + "label": "surface_models.status / processed_point_cloud.status \uac12", + "file_type": "document", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L92", + "_origin": "ast", + "id": "concepts_db_schema_files_surface_surface_models_status_processed_point_cloud_status_\uac12", + "community": 0, + "norm_label": "surface_models.status / processed_point_cloud.status \u1100\u1161\u11b9" + }, + { + "label": "logs_monitoring.md", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring", + "community": 0, + "norm_label": "logs_monitoring.md" + }, + { + "label": "DB: \ub85c\uadf8/\ubaa8\ub2c8\ud130\ub9c1 \ud14c\uc774\ube14", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "community": 0, + "norm_label": "db: \u1105\u1169\u1100\u1173/\u1106\u1169\u1102\u1175\u1110\u1165\u1105\u1175\u11bc \u1110\u1166\u110b\u1175\u1107\u1173\u11af" + }, + { + "label": "login_logs (\ub85c\uadf8\uc778 \uc2dc\ub3c4 \ub85c\uadf8)", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L13", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring_login_logs_\ub85c\uadf8\uc778_\uc2dc\ub3c4_\ub85c\uadf8", + "community": 0, + "norm_label": "login_logs (\u1105\u1169\u1100\u1173\u110b\u1175\u11ab \u1109\u1175\u1103\u1169 \u1105\u1169\u1100\u1173)" + }, + { + "label": "activity_logs (\uc0ac\uc6a9\uc790 \ud65c\ub3d9 \ub85c\uadf8)", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L23", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring_activity_logs_\uc0ac\uc6a9\uc790_\ud65c\ub3d9_\ub85c\uadf8", + "community": 0, + "norm_label": "activity_logs (\u1109\u1161\u110b\u116d\u11bc\u110c\u1161 \u1112\u116a\u11af\u1103\u1169\u11bc \u1105\u1169\u1100\u1173)" + }, + { + "label": "audit_logs (\uac10\uc0ac \ub85c\uadf8)", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L33", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring_audit_logs_\uac10\uc0ac_\ub85c\uadf8", + "community": 0, + "norm_label": "audit_logs (\u1100\u1161\u11b7\u1109\u1161 \u1105\u1169\u1100\u1173)" + }, + { + "label": "system_audit_logs (\ud504\ub85c\uc81d\ud2b8/\uc870\uc9c1 \ubcc0\uacbd \uac10\uc0ac \ub85c\uadf8)", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L43", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring_system_audit_logs_\ud504\ub85c\uc81d\ud2b8_\uc870\uc9c1_\ubcc0\uacbd_\uac10\uc0ac_\ub85c\uadf8", + "community": 0, + "norm_label": "system_audit_logs (\u1111\u1173\u1105\u1169\u110c\u1166\u11a8\u1110\u1173/\u110c\u1169\u110c\u1175\u11a8 \u1107\u1167\u11ab\u1100\u1167\u11bc \u1100\u1161\u11b7\u1109\u1161 \u1105\u1169\u1100\u1173)" + }, + { + "label": "system_admin_logs (\uc2dc\uc2a4\ud15c \uad00\ub9ac\uc790 \ud589\uc704 \ub85c\uadf8)", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L53", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring_system_admin_logs_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790_\ud589\uc704_\ub85c\uadf8", + "community": 0, + "norm_label": "system_admin_logs (\u1109\u1175\u1109\u1173\u1110\u1166\u11b7 \u1100\u116a\u11ab\u1105\u1175\u110c\u1161 \u1112\u1162\u11bc\u110b\u1171 \u1105\u1169\u1100\u1173)" + }, + { + "label": "system_resources (\uc2dc\uc2a4\ud15c \uc790\uc6d0 \uacc4\uce21)", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L62", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring_system_resources_\uc2dc\uc2a4\ud15c_\uc790\uc6d0_\uacc4\uce21", + "community": 0, + "norm_label": "system_resources (\u1109\u1175\u1109\u1173\u1110\u1166\u11b7 \u110c\u1161\u110b\u116f\u11ab \u1100\u1168\u110e\u1173\u11a8)" + }, + { + "label": "support_requests (\uae30\uc220 \uc9c0\uc6d0 \uc694\uccad)", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L71", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring_support_requests_\uae30\uc220_\uc9c0\uc6d0_\uc694\uccad", + "community": 0, + "norm_label": "support_requests (\u1100\u1175\u1109\u116e\u11af \u110c\u1175\u110b\u116f\u11ab \u110b\u116d\u110e\u1165\u11bc)" + }, + { + "label": "change_logs (\uc124\uacc4 \ubcc0\uacbd \uc774\ub825)", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L83", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring_change_logs_\uc124\uacc4_\ubcc0\uacbd_\uc774\ub825", + "community": 0, + "norm_label": "change_logs (\u1109\u1165\u11af\u1100\u1168 \u1107\u1167\u11ab\u1100\u1167\u11bc \u110b\u1175\u1105\u1167\u11a8)" + }, + { + "label": "system_audit_logs \u2014 \uc0ac\uc6a9\ucc98 (B01, B02)", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L96", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring_system_audit_logs_\uc0ac\uc6a9\ucc98_b01_b02", + "community": 0, + "norm_label": "system_audit_logs \u2014 \u1109\u1161\u110b\u116d\u11bc\u110e\u1165 (b01, b02)" + }, + { + "label": "\ub9ac\uc18c\uc2a4 API (SYSTEM_ADMIN \uc804\uc6a9)", + "file_type": "document", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L100", + "_origin": "ast", + "id": "concepts_db_schema_logs_monitoring_\ub9ac\uc18c\uc2a4_api_system_admin_\uc804\uc6a9", + "community": 0, + "norm_label": "\u1105\u1175\u1109\u1169\u1109\u1173 api (system_admin \u110c\u1165\u11ab\u110b\u116d\u11bc)" + }, + { + "label": "overview.md", + "file_type": "document", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_db_schema_overview", + "community": 0, + "norm_label": "overview.md" + }, + { + "label": "DB \uc2a4\ud0a4\ub9c8 \uac1c\uc694", + "file_type": "document", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", + "community": 0, + "norm_label": "db \u1109\u1173\u110f\u1175\u1106\u1161 \u1100\u1162\u110b\u116d" + }, + { + "label": "\ud14c\uc774\ube14 \uadf8\ub8f9 (9\uac1c)", + "file_type": "document", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L22", + "_origin": "ast", + "id": "concepts_db_schema_overview_\ud14c\uc774\ube14_\uadf8\ub8f9_9\uac1c", + "community": 0, + "norm_label": "\u1110\u1166\u110b\u1175\u1107\u1173\u11af \u1100\u1173\u1105\u116e\u11b8 (9\u1100\u1162)" + }, + { + "label": "\ud30c\uc77c \uacbd\ub85c \ucd94\uc801 \uceec\ub7fc (DB\uc5d0 \uacbd\ub85c\ub9cc \uae30\ub85d, \uc2e4 \ud30c\uc77c\uc740 \ud30c\uc77c\uc2dc\uc2a4\ud15c)", + "file_type": "document", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L34", + "_origin": "ast", + "id": "concepts_db_schema_overview_\ud30c\uc77c_\uacbd\ub85c_\ucd94\uc801_\uceec\ub7fc_db\uc5d0_\uacbd\ub85c\ub9cc_\uae30\ub85d_\uc2e4_\ud30c\uc77c\uc740_\ud30c\uc77c\uc2dc\uc2a4\ud15c", + "community": 0, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u1167\u11bc\u1105\u1169 \u110e\u116e\u110c\u1165\u11a8 \u110f\u1165\u11af\u1105\u1165\u11b7 (db\u110b\u1166 \u1100\u1167\u11bc\u1105\u1169\u1106\u1161\u11ab \u1100\u1175\u1105\u1169\u11a8, \u1109\u1175\u11af \u1111\u1161\u110b\u1175\u11af\u110b\u1173\u11ab \u1111\u1161\u110b\u1175\u11af\u1109\u1175\u1109\u1173\u1110\u1166\u11b7)" + }, + { + "label": "\uc124\uacc4 \uc6d0\uce59", + "file_type": "document", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L51", + "_origin": "ast", + "id": "concepts_db_schema_overview_\uc124\uacc4_\uc6d0\uce59", + "community": 0, + "norm_label": "\u1109\u1165\u11af\u1100\u1168 \u110b\u116f\u11ab\u110e\u1175\u11a8" + }, + { + "label": "\ud14c\uc774\ube14 \uad00\uacc4 (\ud575\uc2ec \ud750\ub984)", + "file_type": "document", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L56", + "_origin": "ast", + "id": "concepts_db_schema_overview_\ud14c\uc774\ube14_\uad00\uacc4_\ud575\uc2ec_\ud750\ub984", + "community": 0, + "norm_label": "\u1110\u1166\u110b\u1175\u1107\u1173\u11af \u1100\u116a\u11ab\u1100\u1168 (\u1112\u1162\u11a8\u1109\u1175\u11b7 \u1112\u1173\u1105\u1173\u11b7)" + }, + { + "label": "projects.md", + "file_type": "document", + "source_file": "concepts/db_schema/projects.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_db_schema_projects", + "community": 0, + "norm_label": "projects.md" + }, + { + "label": "DB: \ud504\ub85c\uc81d\ud2b8 \uad00\ub9ac \ud14c\uc774\ube14", + "file_type": "document", + "source_file": "concepts/db_schema/projects.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", + "community": 0, + "norm_label": "db: \u1111\u1173\u1105\u1169\u110c\u1166\u11a8\u1110\u1173 \u1100\u116a\u11ab\u1105\u1175 \u1110\u1166\u110b\u1175\u1107\u1173\u11af" + }, + { + "label": "projects (\ud504\ub85c\uc81d\ud2b8)", + "file_type": "document", + "source_file": "concepts/db_schema/projects.md", + "source_location": "L13", + "_origin": "ast", + "id": "concepts_db_schema_projects_projects_\ud504\ub85c\uc81d\ud2b8", + "community": 0, + "norm_label": "projects (\u1111\u1173\u1105\u1169\u110c\u1166\u11a8\u1110\u1173)" + }, + { + "label": "project_versions (\ud504\ub85c\uc81d\ud2b8 \ubc84\uc804 \uc2a4\ub0c5\uc0f7)", + "file_type": "document", + "source_file": "concepts/db_schema/projects.md", + "source_location": "L30", + "_origin": "ast", + "id": "concepts_db_schema_projects_project_versions_\ud504\ub85c\uc81d\ud2b8_\ubc84\uc804_\uc2a4\ub0c5\uc0f7", + "community": 0, + "norm_label": "project_versions (\u1111\u1173\u1105\u1169\u110c\u1166\u11a8\u1110\u1173 \u1107\u1165\u110c\u1165\u11ab \u1109\u1173\u1102\u1162\u11b8\u1109\u1163\u11ba)" + }, + { + "label": "project_automations (\ud504\ub85c\uc81d\ud2b8 \uc790\ub3d9\ud654 \uc815\ucc45)", + "file_type": "document", + "source_file": "concepts/db_schema/projects.md", + "source_location": "L40", + "_origin": "ast", + "id": "concepts_db_schema_projects_project_automations_\ud504\ub85c\uc81d\ud2b8_\uc790\ub3d9\ud654_\uc815\ucc45", + "community": 0, + "norm_label": "project_automations (\u1111\u1173\u1105\u1169\u110c\u1166\u11a8\u1110\u1173 \u110c\u1161\u1103\u1169\u11bc\u1112\u116a \u110c\u1165\u11bc\u110e\u1162\u11a8)" + }, + { + "label": "project_workflow_stages (\ub2e8\uacc4\ubcc4 \uc0c1\uc138 \uc0c1\ud0dc)", + "file_type": "document", + "source_file": "concepts/db_schema/projects.md", + "source_location": "L54", + "_origin": "ast", + "id": "concepts_db_schema_projects_project_workflow_stages_\ub2e8\uacc4\ubcc4_\uc0c1\uc138_\uc0c1\ud0dc", + "community": 0, + "norm_label": "project_workflow_stages (\u1103\u1161\u11ab\u1100\u1168\u1107\u1167\u11af \u1109\u1161\u11bc\u1109\u1166 \u1109\u1161\u11bc\u1110\u1162)" + }, + { + "label": "route_profile.md", + "file_type": "document", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_db_schema_route_profile", + "community": 0, + "norm_label": "route_profile.md" + }, + { + "label": "DB: \uacbd\ub85c/\uc885\ud6a1\ub2e8 \ud14c\uc774\ube14", + "file_type": "document", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", + "community": 24, + "norm_label": "db: \u1100\u1167\u11bc\u1105\u1169/\u110c\u1169\u11bc\u1112\u116c\u11bc\u1103\u1161\u11ab \u1110\u1166\u110b\u1175\u1107\u1173\u11af" + }, + { + "label": "routes (\ub178\uc120 \uacbd\ub85c)", + "file_type": "document", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L13", + "_origin": "ast", + "id": "concepts_db_schema_route_profile_routes_\ub178\uc120_\uacbd\ub85c", + "community": 24, + "norm_label": "routes (\u1102\u1169\u1109\u1165\u11ab \u1100\u1167\u11bc\u1105\u1169)" + }, + { + "label": "route_points (\uacbd\ub85c \uc88c\ud45c\uc810)", + "file_type": "document", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L27", + "_origin": "ast", + "id": "concepts_db_schema_route_profile_route_points_\uacbd\ub85c_\uc88c\ud45c\uc810", + "community": 24, + "norm_label": "route_points (\u1100\u1167\u11bc\u1105\u1169 \u110c\u116a\u1111\u116d\u110c\u1165\u11b7)" + }, + { + "label": "route_statistics (\ub178\uc120 \ud1b5\uacc4)", + "file_type": "document", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L36", + "_origin": "ast", + "id": "concepts_db_schema_route_profile_route_statistics_\ub178\uc120_\ud1b5\uacc4", + "community": 24, + "norm_label": "route_statistics (\u1102\u1169\u1109\u1165\u11ab \u1110\u1169\u11bc\u1100\u1168)" + }, + { + "label": "longitudinal_sections (\uc885\ub2e8\uba74 \uc124\uacc4)", + "file_type": "document", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L45", + "_origin": "ast", + "id": "concepts_db_schema_route_profile_longitudinal_sections_\uc885\ub2e8\uba74_\uc124\uacc4", + "community": 24, + "norm_label": "longitudinal_sections (\u110c\u1169\u11bc\u1103\u1161\u11ab\u1106\u1167\u11ab \u1109\u1165\u11af\u1100\u1168)" + }, + { + "label": "cross_sections (\ud6a1\ub2e8\uba74 \uc124\uacc4)", + "file_type": "document", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L55", + "_origin": "ast", + "id": "concepts_db_schema_route_profile_cross_sections_\ud6a1\ub2e8\uba74_\uc124\uacc4", + "community": 24, + "norm_label": "cross_sections (\u1112\u116c\u11bc\u1103\u1161\u11ab\u1106\u1167\u11ab \u1109\u1165\u11af\u1100\u1168)" + }, + { + "label": "routes.status \ud750\ub984", + "file_type": "document", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L65", + "_origin": "ast", + "id": "concepts_db_schema_route_profile_routes_status_\ud750\ub984", + "community": 24, + "norm_label": "routes.status \u1112\u1173\u1105\u1173\u11b7" + }, + { + "label": "cross_sections.data.structures", + "file_type": "document", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L68", + "_origin": "ast", + "id": "concepts_db_schema_route_profile_cross_sections_data_structures", + "community": 24, + "norm_label": "cross_sections.data.structures" + }, + { + "label": "structure_output.md", + "file_type": "document", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_db_schema_structure_output", + "community": 0, + "norm_label": "structure_output.md" + }, + { + "label": "DB: \uad6c\uc870\ubb3c/\uc218\ub7c9/\uc0b0\ucd9c\ubb3c \ud14c\uc774\ube14", + "file_type": "document", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", + "community": 0, + "norm_label": "db: \u1100\u116e\u110c\u1169\u1106\u116e\u11af/\u1109\u116e\u1105\u1163\u11bc/\u1109\u1161\u11ab\u110e\u116e\u11af\u1106\u116e\u11af \u1110\u1166\u110b\u1175\u1107\u1173\u11af" + }, + { + "label": "structures (\ubc30\uce58 \uad6c\uc870\ubb3c)", + "file_type": "document", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L13", + "_origin": "ast", + "id": "concepts_db_schema_structure_output_structures_\ubc30\uce58_\uad6c\uc870\ubb3c", + "community": 0, + "norm_label": "structures (\u1107\u1162\u110e\u1175 \u1100\u116e\u110c\u1169\u1106\u116e\u11af)" + }, + { + "label": "quantity_items (\uc218\ub7c9 \uc0b0\ucd9c \ud56d\ubaa9)", + "file_type": "document", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L29", + "_origin": "ast", + "id": "concepts_db_schema_structure_output_quantity_items_\uc218\ub7c9_\uc0b0\ucd9c_\ud56d\ubaa9", + "community": 0, + "norm_label": "quantity_items (\u1109\u116e\u1105\u1163\u11bc \u1109\u1161\u11ab\u110e\u116e\u11af \u1112\u1161\u11bc\u1106\u1169\u11a8)" + }, + { + "label": "outputs (\ucd5c\uc885 \uacac\uc801/\ub3c4\uba74 \uc0b0\ucd9c \uc138\uc158)", + "file_type": "document", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L42", + "_origin": "ast", + "id": "concepts_db_schema_structure_output_outputs_\ucd5c\uc885_\uacac\uc801_\ub3c4\uba74_\uc0b0\ucd9c_\uc138\uc158", + "community": 0, + "norm_label": "outputs (\u110e\u116c\u110c\u1169\u11bc \u1100\u1167\u11ab\u110c\u1165\u11a8/\u1103\u1169\u1106\u1167\u11ab \u1109\u1161\u11ab\u110e\u116e\u11af \u1109\u1166\u1109\u1167\u11ab)" + }, + { + "label": "output_files (\uac1c\ubcc4 \uc0b0\ucd9c \ud30c\uc77c \ub9ac\uc2a4\ud2b8)", + "file_type": "document", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L54", + "_origin": "ast", + "id": "concepts_db_schema_structure_output_output_files_\uac1c\ubcc4_\uc0b0\ucd9c_\ud30c\uc77c_\ub9ac\uc2a4\ud2b8", + "community": 0, + "norm_label": "output_files (\u1100\u1162\u1107\u1167\u11af \u1109\u1161\u11ab\u110e\u116e\u11af \u1111\u1161\u110b\u1175\u11af \u1105\u1175\u1109\u1173\u1110\u1173)" + }, + { + "label": "quantity_items \ucd1d\ube44\uc6a9 \uacc4\uc0b0 \uc608", + "file_type": "document", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L65", + "_origin": "ast", + "id": "concepts_db_schema_structure_output_quantity_items_\ucd1d\ube44\uc6a9_\uacc4\uc0b0_\uc608", + "community": 0, + "norm_label": "quantity_items \u110e\u1169\u11bc\u1107\u1175\u110b\u116d\u11bc \u1100\u1168\u1109\u1161\u11ab \u110b\u1168" + }, + { + "label": "README.md", + "file_type": "document", + "source_file": "concepts/db_schema/unconfirmed/README.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_db_schema_unconfirmed_readme", + "community": 0, + "norm_label": "readme.md" + }, + { + "label": "\ubbf8\ud655\uc815 \ud14c\uc774\ube14 \ubcf4\uad00\uc18c (Unconfirmed DB Schemas)", + "file_type": "document", + "source_file": "concepts/db_schema/unconfirmed/README.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_db_schema_unconfirmed_readme_\ubbf8\ud655\uc815_\ud14c\uc774\ube14_\ubcf4\uad00\uc18c_unconfirmed_db_schemas", + "community": 0, + "norm_label": "\u1106\u1175\u1112\u116a\u11a8\u110c\u1165\u11bc \u1110\u1166\u110b\u1175\u1107\u1173\u11af \u1107\u1169\u1100\u116a\u11ab\u1109\u1169 (unconfirmed db schemas)" + }, + { + "label": "\uc6b4\uc601 \uaddc\uce59", + "file_type": "document", + "source_file": "concepts/db_schema/unconfirmed/README.md", + "source_location": "L5", + "_origin": "ast", + "id": "concepts_db_schema_unconfirmed_readme_\uc6b4\uc601_\uaddc\uce59", + "community": 0, + "norm_label": "\u110b\u116e\u11ab\u110b\u1167\u11bc \u1100\u1172\u110e\u1175\u11a8" + }, + { + "label": "users_auth.md", + "file_type": "document", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_db_schema_users_auth", + "community": 1, + "norm_label": "users_auth.md" + }, + { + "label": "DB: \uc0ac\uc6a9\uc790/\uc778\uc99d/\uc870\uc9c1 \ud14c\uc774\ube14", + "file_type": "document", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", + "community": 1, + "norm_label": "db: \u1109\u1161\u110b\u116d\u11bc\u110c\u1161/\u110b\u1175\u11ab\u110c\u1173\u11bc/\u110c\u1169\u110c\u1175\u11a8 \u1110\u1166\u110b\u1175\u1107\u1173\u11af" + }, + { + "label": "users (\uc0ac\uc6a9\uc790)", + "file_type": "document", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L13", + "_origin": "ast", + "id": "concepts_db_schema_users_auth_users_\uc0ac\uc6a9\uc790", + "community": 1, + "norm_label": "users (\u1109\u1161\u110b\u116d\u11bc\u110c\u1161)" + }, + { + "label": "companies (\ud68c\uc0ac)", + "file_type": "document", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L32", + "_origin": "ast", + "id": "concepts_db_schema_users_auth_companies_\ud68c\uc0ac", + "community": 1, + "norm_label": "companies (\u1112\u116c\u1109\u1161)" + }, + { + "label": "sessions (\uc138\uc158)", + "file_type": "document", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L45", + "_origin": "ast", + "id": "concepts_db_schema_users_auth_sessions_\uc138\uc158", + "community": 1, + "norm_label": "sessions (\u1109\u1166\u1109\u1167\u11ab)" + }, + { + "label": "email_otps (\uc774\uba54\uc77c OTP)", + "file_type": "document", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L56", + "_origin": "ast", + "id": "concepts_db_schema_users_auth_email_otps_\uc774\uba54\uc77c_otp", + "community": 1, + "norm_label": "email_otps (\u110b\u1175\u1106\u1166\u110b\u1175\u11af otp)" + }, + { + "label": "trusted_devices (\uc2e0\ub8b0 \uae30\uae30)", + "file_type": "document", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L65", + "_origin": "ast", + "id": "concepts_db_schema_users_auth_trusted_devices_\uc2e0\ub8b0_\uae30\uae30", + "community": 1, + "norm_label": "trusted_devices (\u1109\u1175\u11ab\u1105\u116c \u1100\u1175\u1100\u1175)" + }, + { + "label": "join_requests (\ud68c\uc0ac \uac00\uc785 \uc2e0\uccad)", + "file_type": "document", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L73", + "_origin": "ast", + "id": "concepts_db_schema_users_auth_join_requests_\ud68c\uc0ac_\uac00\uc785_\uc2e0\uccad", + "community": 1, + "norm_label": "join_requests (\u1112\u116c\u1109\u1161 \u1100\u1161\u110b\u1175\u11b8 \u1109\u1175\u11ab\u110e\u1165\u11bc)" + }, + { + "label": "user_consents (\uc57d\uad00 \ub3d9\uc758)", + "file_type": "document", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L84", + "_origin": "ast", + "id": "concepts_db_schema_users_auth_user_consents_\uc57d\uad00_\ub3d9\uc758", + "community": 1, + "norm_label": "user_consents (\u110b\u1163\u11a8\u1100\u116a\u11ab \u1103\u1169\u11bc\u110b\u1174)" + }, + { + "label": "dependencies.md", + "file_type": "document", + "source_file": "concepts/dependencies.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_dependencies", + "community": 2, + "norm_label": "dependencies.md" + }, + { + "label": "\uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc758\uc874\uc131", + "file_type": "document", + "source_file": "concepts/dependencies.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_dependencies_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc758\uc874\uc131", + "community": 2, + "norm_label": "\u110b\u116c\u1107\u116e \u1105\u1161\u110b\u1175\u1107\u1173\u1105\u1165\u1105\u1175 \u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "\ubc31\uc5d4\ub4dc (Python 3.12.7)", + "file_type": "document", + "source_file": "concepts/dependencies.md", + "source_location": "L11", + "_origin": "ast", + "id": "concepts_dependencies_\ubc31\uc5d4\ub4dc_python_3_12_7", + "community": 2, + "norm_label": "\u1107\u1162\u11a8\u110b\u1166\u11ab\u1103\u1173 (python 3.12.7)" + }, + { + "label": "\ud504\ub860\ud2b8\uc5d4\ub4dc (TypeScript/Node.js)", + "file_type": "document", + "source_file": "concepts/dependencies.md", + "source_location": "L27", + "_origin": "ast", + "id": "concepts_dependencies_\ud504\ub860\ud2b8\uc5d4\ub4dc_typescript_node_js", + "community": 2, + "norm_label": "\u1111\u1173\u1105\u1169\u11ab\u1110\u1173\u110b\u1166\u11ab\u1103\u1173 (typescript/node.js)" + }, + { + "label": "\uc120\uc815 \uc6d0\uce59 (agent.md 3\uc808)", + "file_type": "document", + "source_file": "concepts/dependencies.md", + "source_location": "L35", + "_origin": "ast", + "id": "concepts_dependencies_\uc120\uc815_\uc6d0\uce59_agent_md_3\uc808", + "community": 2, + "norm_label": "\u1109\u1165\u11ab\u110c\u1165\u11bc \u110b\u116f\u11ab\u110e\u1175\u11a8 (agent.md 3\u110c\u1165\u11af)" + }, + { + "label": "schema_common.md", + "file_type": "document", + "source_file": "concepts/schema_common.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_schema_common", + "community": 1, + "norm_label": "schema_common.md" + }, + { + "label": "\uacf5\ud1b5 \uc2a4\ud0a4\ub9c8 (Pydantic \uc694\uccad/\uc751\ub2f5 \uaddc\uce59)", + "file_type": "document", + "source_file": "concepts/schema_common.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", + "community": 1, + "norm_label": "\u1100\u1169\u11bc\u1110\u1169\u11bc \u1109\u1173\u110f\u1175\u1106\u1161 (pydantic \u110b\u116d\u110e\u1165\u11bc/\u110b\u1173\u11bc\u1103\u1161\u11b8 \u1100\u1172\u110e\u1175\u11a8)" + }, + { + "label": "\uac80\uc99d \uc6d0\uce59 (backend.md 4\uc808)", + "file_type": "document", + "source_file": "concepts/schema_common.md", + "source_location": "L11", + "_origin": "ast", + "id": "concepts_schema_common_\uac80\uc99d_\uc6d0\uce59_backend_md_4\uc808", + "community": 1, + "norm_label": "\u1100\u1165\u11b7\u110c\u1173\u11bc \u110b\u116f\u11ab\u110e\u1175\u11a8 (backend.md 4\u110c\u1165\u11af)" + }, + { + "label": "\uba85\uba85 \uaddc\uce59", + "file_type": "document", + "source_file": "concepts/schema_common.md", + "source_location": "L16", + "_origin": "ast", + "id": "concepts_schema_common_\uba85\uba85_\uaddc\uce59", + "community": 1, + "norm_label": "\u1106\u1167\u11bc\u1106\u1167\u11bc \u1100\u1172\u110e\u1175\u11a8" + }, + { + "label": "storage_paths.md", + "file_type": "document", + "source_file": "concepts/storage_paths.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_storage_paths", + "community": 2, + "norm_label": "storage_paths.md" + }, + { + "label": "\uc800\uc7a5 \uacbd\ub85c \uaddc\uce59 (Workflow-based Folder Structure)", + "file_type": "document", + "source_file": "concepts/storage_paths.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", + "community": 2, + "norm_label": "\u110c\u1165\u110c\u1161\u11bc \u1100\u1167\u11bc\u1105\u1169 \u1100\u1172\u110e\u1175\u11a8 (workflow-based folder structure)" + }, + { + "label": "\uacbd\ub85c \ud328\ud134", + "file_type": "document", + "source_file": "concepts/storage_paths.md", + "source_location": "L11", + "_origin": "ast", + "id": "concepts_storage_paths_\uacbd\ub85c_\ud328\ud134", + "community": 2, + "norm_label": "\u1100\u1167\u11bc\u1105\u1169 \u1111\u1162\u1110\u1165\u11ab" + }, + { + "label": "\uc6d0\uce59 (backend.md 3\uc808)", + "file_type": "document", + "source_file": "concepts/storage_paths.md", + "source_location": "L23", + "_origin": "ast", + "id": "concepts_storage_paths_\uc6d0\uce59_backend_md_3\uc808", + "community": 2, + "norm_label": "\u110b\u116f\u11ab\u110e\u1175\u11a8 (backend.md 3\u110c\u1165\u11af)" + }, + { + "label": "DB \uceec\ub7fc \u2194 \uc2e4\uc81c \uacbd\ub85c \ub9e4\ud551", + "file_type": "document", + "source_file": "concepts/storage_paths.md", + "source_location": "L30", + "_origin": "ast", + "id": "concepts_storage_paths_db_\uceec\ub7fc_\uc2e4\uc81c_\uacbd\ub85c_\ub9e4\ud551", + "community": 2, + "norm_label": "db \u110f\u1165\u11af\u1105\u1165\u11b7 \u2194 \u1109\u1175\u11af\u110c\u1166 \u1100\u1167\u11bc\u1105\u1169 \u1106\u1162\u1111\u1175\u11bc" + }, + { + "label": "\ud30c\uc77c\uba85 \uaddc\uce59 (structure.md 1\uc808)", + "file_type": "document", + "source_file": "concepts/storage_paths.md", + "source_location": "L33", + "_origin": "ast", + "id": "concepts_storage_paths_\ud30c\uc77c\uba85_\uaddc\uce59_structure_md_1\uc808", + "community": 2, + "norm_label": "\u1111\u1161\u110b\u1175\u11af\u1106\u1167\u11bc \u1100\u1172\u110e\u1175\u11a8 (structure.md 1\u110c\u1165\u11af)" + }, + { + "label": "ui_templates.md", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_ui_templates", + "community": 5, + "norm_label": "ui_templates.md" + }, + { + "label": "UI Templates \u2014 Localization & Components", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L8", + "_origin": "ast", + "id": "concepts_ui_templates_ui_templates_localization_components", + "community": 8, + "norm_label": "ui templates \u2014 localization & components" + }, + { + "label": "ui_template_locale.ts (\ub2e4\uad6d\uc5b4 \uad00\ub9ac)", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L12", + "_origin": "ast", + "id": "concepts_ui_templates_ui_template_locale_ts_\ub2e4\uad6d\uc5b4_\uad00\ub9ac", + "community": 8, + "norm_label": "ui_template_locale.ts (\u1103\u1161\u1100\u116e\u11a8\u110b\u1165 \u1100\u116a\u11ab\u1105\u1175)" + }, + { + "label": "\ud575\uc2ec \uae30\ub2a5", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L16", + "_origin": "ast", + "id": "concepts_ui_templates_\ud575\uc2ec_\uae30\ub2a5", + "community": 8, + "norm_label": "\u1112\u1162\u11a8\u1109\u1175\u11b7 \u1100\u1175\u1102\u1173\u11bc" + }, + { + "label": "\uc0ac\uc6a9\ucc98 (\uc5ed\ucc38\uc870)", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L24", + "_origin": "ast", + "id": "concepts_ui_templates_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870", + "community": 8, + "norm_label": "\u1109\u1161\u110b\u116d\u11bc\u110e\u1165 (\u110b\u1167\u11a8\u110e\u1161\u11b7\u110c\u1169)" + }, + { + "label": "ui_template_elements.ts (\uacf5\ud1b5 \ucef4\ud3ec\ub10c\ud2b8)", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L30", + "_origin": "ast", + "id": "concepts_ui_templates_ui_template_elements_ts_\uacf5\ud1b5_\ucef4\ud3ec\ub10c\ud2b8", + "community": 8, + "norm_label": "ui_template_elements.ts (\u1100\u1169\u11bc\u1110\u1169\u11bc \u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173)" + }, + { + "label": "\uc81c\uacf5 \ucef4\ud3ec\ub10c\ud2b8", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L34", + "_origin": "ast", + "id": "concepts_ui_templates_\uc81c\uacf5_\ucef4\ud3ec\ub10c\ud2b8", + "community": 8, + "norm_label": "\u110c\u1166\u1100\u1169\u11bc \u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173" + }, + { + "label": "\uc0ac\uc6a9\ucc98 (\uc5ed\ucc38\uc870)", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L50", + "_origin": "ast", + "id": "concepts_ui_templates_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870_50", + "community": 8, + "norm_label": "\u1109\u1161\u110b\u116d\u11bc\u110e\u1165 (\u110b\u1167\u11a8\u110e\u1161\u11b7\u110c\u1169)" + }, + { + "label": "theme.css (\uc2a4\ud0c0\uc77c \ubcc0\uc218)", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L59", + "_origin": "ast", + "id": "concepts_ui_templates_theme_css_\uc2a4\ud0c0\uc77c_\ubcc0\uc218", + "community": 8, + "norm_label": "theme.css (\u1109\u1173\u1110\u1161\u110b\u1175\u11af \u1107\u1167\u11ab\u1109\u116e)" + }, + { + "label": "\ud575\uc2ec \ubcc0\uc218", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L63", + "_origin": "ast", + "id": "concepts_ui_templates_\ud575\uc2ec_\ubcc0\uc218", + "community": 8, + "norm_label": "\u1112\u1162\u11a8\u1109\u1175\u11b7 \u1107\u1167\u11ab\u1109\u116e" + }, + { + "label": "\uc81c\uc57d (backend.md \u00a71)", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L75", + "_origin": "ast", + "id": "concepts_ui_templates_\uc81c\uc57d_backend_md_1", + "community": 8, + "norm_label": "\u110c\u1166\u110b\u1163\u11a8 (backend.md \u00a71)" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "concepts/ui_templates.md", + "source_location": "L82", + "_origin": "ast", + "id": "concepts_ui_templates_\uc758\uc874\uc131", + "community": 8, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "workflow_state.md", + "file_type": "document", + "source_file": "concepts/workflow_state.md", + "source_location": "L1", + "_origin": "ast", + "id": "concepts_workflow_state", + "community": 2, + "norm_label": "workflow_state.md" + }, + { + "label": "Workflow \uc0c1\ud0dc \uad00\ub9ac \u2014 \uad6c\ud604 \uc644\ub8cc (\uc2e4 DB \ud655\uc778\ub428)", + "file_type": "document", + "source_file": "concepts/workflow_state.md", + "source_location": "L9", + "_origin": "ast", + "id": "concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", + "community": 21, + "norm_label": "workflow \u1109\u1161\u11bc\u1110\u1162 \u1100\u116a\u11ab\u1105\u1175 \u2014 \u1100\u116e\u1112\u1167\u11ab \u110b\u116a\u11ab\u1105\u116d (\u1109\u1175\u11af db \u1112\u116a\u11a8\u110b\u1175\u11ab\u1103\u116c\u11b7)" + }, + { + "label": "SSOT: `project_workflow_stages` \ud14c\uc774\ube14 (\uc2e4 DB \ud655\uc778)", + "file_type": "document", + "source_file": "concepts/workflow_state.md", + "source_location": "L13", + "_origin": "ast", + "id": "concepts_workflow_state_ssot_project_workflow_stages_\ud14c\uc774\ube14_\uc2e4_db_\ud655\uc778", + "community": 21, + "norm_label": "ssot: `project_workflow_stages` \u1110\u1166\u110b\u1175\u1107\u1173\u11af (\u1109\u1175\u11af db \u1112\u116a\u11a8\u110b\u1175\u11ab)" + }, + { + "label": "\uacf5\ud1b5 \uc720\ud2f8 `common_util/common_util_workflow_state.py`", + "file_type": "document", + "source_file": "concepts/workflow_state.md", + "source_location": "L27", + "_origin": "ast", + "id": "concepts_workflow_state_\uacf5\ud1b5_\uc720\ud2f8_common_util_common_util_workflow_state_py", + "community": 21, + "norm_label": "\u1100\u1169\u11bc\u1110\u1169\u11bc \u110b\u1172\u1110\u1175\u11af `common_util/common_util_workflow_state.py`" + }, + { + "label": "\uc2e4 \uc5f0\ub3d9 \ud604\ud669 (\ud30c\uc77c:\uc904\ubc88\ud638)", + "file_type": "document", + "source_file": "concepts/workflow_state.md", + "source_location": "L37", + "_origin": "ast", + "id": "concepts_workflow_state_\uc2e4_\uc5f0\ub3d9_\ud604\ud669_\ud30c\uc77c_\uc904\ubc88\ud638", + "community": 21, + "norm_label": "\u1109\u1175\u11af \u110b\u1167\u11ab\u1103\u1169\u11bc \u1112\u1167\u11ab\u1112\u116a\u11bc (\u1111\u1161\u110b\u1175\u11af:\u110c\u116e\u11af\u1107\u1165\u11ab\u1112\u1169)" + }, + { + "label": "\uc870\ud68c API (\uc2e4\uc81c \uc874\uc7ac, \uacc4\ud68d\uc11c\uc640 \uacbd\ub85c \uc77c\uce58)", + "file_type": "document", + "source_file": "concepts/workflow_state.md", + "source_location": "L47", + "_origin": "ast", + "id": "concepts_workflow_state_\uc870\ud68c_api_\uc2e4\uc81c_\uc874\uc7ac_\uacc4\ud68d\uc11c\uc640_\uacbd\ub85c_\uc77c\uce58", + "community": 21, + "norm_label": "\u110c\u1169\u1112\u116c api (\u1109\u1175\u11af\u110c\u1166 \u110c\u1169\u11ab\u110c\u1162, \u1100\u1168\u1112\u116c\u11a8\u1109\u1165\u110b\u116a \u1100\u1167\u11bc\u1105\u1169 \u110b\u1175\u11af\u110e\u1175)" + }, + { + "label": "\uc0c1\ud0dc \uc804\uc774 (\uad6c\ud604\ub300\ub85c)", + "file_type": "document", + "source_file": "concepts/workflow_state.md", + "source_location": "L54", + "_origin": "ast", + "id": "concepts_workflow_state_\uc0c1\ud0dc_\uc804\uc774_\uad6c\ud604\ub300\ub85c", + "community": 21, + "norm_label": "\u1109\u1161\u11bc\u1110\u1162 \u110c\u1165\u11ab\u110b\u1175 (\u1100\u116e\u1112\u1167\u11ab\u1103\u1162\u1105\u1169)" + }, + { + "label": "projects.status \ubb38\uc790\uc5f4 \uce90\uc2dc (\ud638\ud658\uc6a9, \uacc4\ud68d\uc11c \ubc29\uce68\ub300\ub85c \uc720\uc9c0 \uc911)", + "file_type": "document", + "source_file": "concepts/workflow_state.md", + "source_location": "L62", + "_origin": "ast", + "id": "concepts_workflow_state_projects_status_\ubb38\uc790\uc5f4_\uce90\uc2dc_\ud638\ud658\uc6a9_\uacc4\ud68d\uc11c_\ubc29\uce68\ub300\ub85c_\uc720\uc9c0_\uc911", + "community": 21, + "norm_label": "projects.status \u1106\u116e\u11ab\u110c\u1161\u110b\u1167\u11af \u110f\u1162\u1109\u1175 (\u1112\u1169\u1112\u116a\u11ab\u110b\u116d\u11bc, \u1100\u1168\u1112\u116c\u11a8\u1109\u1165 \u1107\u1161\u11bc\u110e\u1175\u11b7\u1103\u1162\u1105\u1169 \u110b\u1172\u110c\u1175 \u110c\u116e\u11bc)" + }, + { + "label": "B04 \uc0c1\ud0dc \uc870\ud68c \u2014 \ub808\uac70\uc2dc \ud3f4\ubc31 (\ub2f9\ucd08 \"\uc794\uc7ac\"\ub85c \ud45c\uae30\ud588\uc73c\ub098 \uc815\uc815)", + "file_type": "document", + "source_file": "concepts/workflow_state.md", + "source_location": "L65", + "_origin": "ast", + "id": "concepts_workflow_state_b04_\uc0c1\ud0dc_\uc870\ud68c_\ub808\uac70\uc2dc_\ud3f4\ubc31_\ub2f9\ucd08_\uc794\uc7ac_\ub85c_\ud45c\uae30\ud588\uc73c\ub098_\uc815\uc815", + "community": 21, + "norm_label": "b04 \u1109\u1161\u11bc\u1110\u1162 \u110c\u1169\u1112\u116c \u2014 \u1105\u1166\u1100\u1165\u1109\u1175 \u1111\u1169\u11af\u1107\u1162\u11a8 (\u1103\u1161\u11bc\u110e\u1169 \"\u110c\u1161\u11ab\u110c\u1162\"\u1105\u1169 \u1111\u116d\u1100\u1175\u1112\u1162\u11bb\u110b\u1173\u1102\u1161 \u110c\u1165\u11bc\u110c\u1165\u11bc)" + }, + { + "label": "\ubbf8\ud574\uacb0 \uc0ac\ud56d (\uacc4\ud68d\uc11c \uc6d0\ubb38, \uc544\uc9c1 \uacb0\uc815 \uc548 \ub428)", + "file_type": "document", + "source_file": "concepts/workflow_state.md", + "source_location": "L72", + "_origin": "ast", + "id": "concepts_workflow_state_\ubbf8\ud574\uacb0_\uc0ac\ud56d_\uacc4\ud68d\uc11c_\uc6d0\ubb38_\uc544\uc9c1_\uacb0\uc815_\uc548_\ub428", + "community": 21, + "norm_label": "\u1106\u1175\u1112\u1162\u1100\u1167\u11af \u1109\u1161\u1112\u1161\u11bc (\u1100\u1168\u1112\u116c\u11a8\u1109\u1165 \u110b\u116f\u11ab\u1106\u116e\u11ab, \u110b\u1161\u110c\u1175\u11a8 \u1100\u1167\u11af\u110c\u1165\u11bc \u110b\u1161\u11ab \u1103\u116c\u11b7)" + }, + { + "label": "index.md", + "file_type": "document", + "source_file": "index.md", + "source_location": "L1", + "_origin": "ast", + "id": "index", + "community": 3, + "norm_label": "index.md" + }, + { + "label": "Wiki Index", + "file_type": "document", + "source_file": "index.md", + "source_location": "L6", + "_origin": "ast", + "id": "index_wiki_index", + "community": 3, + "norm_label": "wiki index" + }, + { + "label": "\ud398\uc774\uc9c0 \u2014 \ub85c\uadf8\uc778 \ud6c4 \uc6cc\ud06c\ud50c\ub85c\uc6b0 (B01~B09)", + "file_type": "document", + "source_file": "index.md", + "source_location": "L10", + "_origin": "ast", + "id": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", + "community": 3, + "norm_label": "\u1111\u1166\u110b\u1175\u110c\u1175 \u2014 \u1105\u1169\u1100\u1173\u110b\u1175\u11ab \u1112\u116e \u110b\u116f\u110f\u1173\u1111\u1173\u11af\u1105\u1169\u110b\u116e (b01~b09)" + }, + { + "label": "[[B01_Dashboard/B01_backend|B01_Dashboard]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L12", + "_origin": "ast", + "id": "index_b01_dashboard_b01_backend_b01_dashboard", + "community": 3, + "norm_label": "[[b01_dashboard/b01_backend|b01_dashboard]]" + }, + { + "label": "[[B02_ProjRegister/B02_backend|B02_ProjRegister]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L15", + "_origin": "ast", + "id": "index_b02_projregister_b02_backend_b02_projregister", + "community": 3, + "norm_label": "[[b02_projregister/b02_backend|b02_projregister]]" + }, + { + "label": "[[B03_FileInput/B03_backend|B03_FileInput]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L18", + "_origin": "ast", + "id": "index_b03_fileinput_b03_backend_b03_fileinput", + "community": 3, + "norm_label": "[[b03_fileinput/b03_backend|b03_fileinput]]" + }, + { + "label": "[[B04_wf1_Surface/B04_backend|B04_wf1_Surface]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L21", + "_origin": "ast", + "id": "index_b04_wf1_surface_b04_backend_b04_wf1_surface", + "community": 3, + "norm_label": "[[b04_wf1_surface/b04_backend|b04_wf1_surface]]" + }, + { + "label": "[[B05_wf2_Route/B05_backend|B05_wf2_Route]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L24", + "_origin": "ast", + "id": "index_b05_wf2_route_b05_backend_b05_wf2_route", + "community": 3, + "norm_label": "[[b05_wf2_route/b05_backend|b05_wf2_route]]" + }, + { + "label": "[[B06_wf3_ProfileCross/B06_backend|B06_wf3_ProfileCross]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L27", + "_origin": "ast", + "id": "index_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross", + "community": 3, + "norm_label": "[[b06_wf3_profilecross/b06_backend|b06_wf3_profilecross]]" + }, + { + "label": "[[B07_wf4_DesignDetail/B07_frontend|B07_wf4_DesignDetail]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L30", + "_origin": "ast", + "id": "index_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail", + "community": 3, + "norm_label": "[[b07_wf4_designdetail/b07_frontend|b07_wf4_designdetail]]" + }, + { + "label": "[[B08_wf5_Quantity/B08_frontend|B08_wf5_Quantity]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L33", + "_origin": "ast", + "id": "index_b08_wf5_quantity_b08_frontend_b08_wf5_quantity", + "community": 3, + "norm_label": "[[b08_wf5_quantity/b08_frontend|b08_wf5_quantity]]" + }, + { + "label": "[[B09_wf6_Estimation/B09_frontend|B09_wf6_Estimation]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L36", + "_origin": "ast", + "id": "index_b09_wf6_estimation_b09_frontend_b09_wf6_estimation", + "community": 3, + "norm_label": "[[b09_wf6_estimation/b09_frontend|b09_wf6_estimation]]" + }, + { + "label": "\ud398\uc774\uc9c0 \u2014 \ub85c\uadf8\uc778 \uc804 (A01~A09)", + "file_type": "document", + "source_file": "index.md", + "source_location": "L39", + "_origin": "ast", + "id": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", + "community": 3, + "norm_label": "\u1111\u1166\u110b\u1175\u110c\u1175 \u2014 \u1105\u1169\u1100\u1173\u110b\u1175\u11ab \u110c\u1165\u11ab (a01~a09)" + }, + { + "label": "[[A01_Home/A01_frontend|A01_Home]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L41", + "_origin": "ast", + "id": "index_a01_home_a01_frontend_a01_home", + "community": 3, + "norm_label": "[[a01_home/a01_frontend|a01_home]]" + }, + { + "label": "[[A02_ProgDetail/A02_frontend|A02_ProgDetail]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L44", + "_origin": "ast", + "id": "index_a02_progdetail_a02_frontend_a02_progdetail", + "community": 3, + "norm_label": "[[a02_progdetail/a02_frontend|a02_progdetail]]" + }, + { + "label": "[[A03_CompDetail/A03_frontend|A03_CompDetail]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L47", + "_origin": "ast", + "id": "index_a03_compdetail_a03_frontend_a03_compdetail", + "community": 3, + "norm_label": "[[a03_compdetail/a03_frontend|a03_compdetail]]" + }, + { + "label": "[[A04_NewsHistory/A04_frontend|A04_NewsHistory]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L50", + "_origin": "ast", + "id": "index_a04_newshistory_a04_frontend_a04_newshistory", + "community": 3, + "norm_label": "[[a04_newshistory/a04_frontend|a04_newshistory]]" + }, + { + "label": "[[A05_EduDetail/A05_frontend|A05_EduDetail]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L53", + "_origin": "ast", + "id": "index_a05_edudetail_a05_frontend_a05_edudetail", + "community": 3, + "norm_label": "[[a05_edudetail/a05_frontend|a05_edudetail]]" + }, + { + "label": "[[A06_Login/A06_backend|A06_Login]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L56", + "_origin": "ast", + "id": "index_a06_login_a06_backend_a06_login", + "community": 3, + "norm_label": "[[a06_login/a06_backend|a06_login]]" + }, + { + "label": "[[A07_Register/A07_backend|A07_Register]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L59", + "_origin": "ast", + "id": "index_a07_register_a07_backend_a07_register", + "community": 3, + "norm_label": "[[a07_register/a07_backend|a07_register]]" + }, + { + "label": "[[A08_Support/A08_backend|A08_Support]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L62", + "_origin": "ast", + "id": "index_a08_support_a08_backend_a08_support", + "community": 3, + "norm_label": "[[a08_support/a08_backend|a08_support]]" + }, + { + "label": "[[A09_Security/A09_backend|A09_Security]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L65", + "_origin": "ast", + "id": "index_a09_security_a09_backend_a09_security", + "community": 3, + "norm_label": "[[a09_security/a09_backend|a09_security]]" + }, + { + "label": "\uac1c\ub150 (Concepts)", + "file_type": "document", + "source_file": "index.md", + "source_location": "L68", + "_origin": "ast", + "id": "index_\uac1c\ub150_concepts", + "community": 3, + "norm_label": "\u1100\u1162\u1102\u1167\u11b7 (concepts)" + }, + { + "label": "[[a00_app_shell_framework]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L70", + "_origin": "ast", + "id": "index_a00_app_shell_framework", + "community": 3, + "norm_label": "[[a00_app_shell_framework]]" + }, + { + "label": "[[a00_app_shell_framework_scaffold]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L73", + "_origin": "ast", + "id": "index_a00_app_shell_framework_scaffold", + "community": 3, + "norm_label": "[[a00_app_shell_framework_scaffold]]" + }, + { + "label": "[[ui_templates]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L76", + "_origin": "ast", + "id": "index_ui_templates", + "community": 3, + "norm_label": "[[ui_templates]]" + }, + { + "label": "DB \uc2a4\ud0a4\ub9c8", + "file_type": "document", + "source_file": "index.md", + "source_location": "L79", + "_origin": "ast", + "id": "index_db_\uc2a4\ud0a4\ub9c8", + "community": 3, + "norm_label": "db \u1109\u1173\u110f\u1175\u1106\u1161" + }, + { + "label": "[[auth_rbac]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L89", + "_origin": "ast", + "id": "index_auth_rbac", + "community": 3, + "norm_label": "[[auth_rbac]]" + }, + { + "label": "[[storage_paths]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L92", + "_origin": "ast", + "id": "index_storage_paths", + "community": 3, + "norm_label": "[[storage_paths]]" + }, + { + "label": "[[common_util]]", + "file_type": "document", + "source_file": "index.md", + "source_location": "L95", + "_origin": "ast", + "id": "index_common_util", + "community": 3, + "norm_label": "[[common_util]]" + }, + { + "label": "API \uacf5\ud1b5 (\uc5ec\ub7ec \ud398\uc774\uc9c0\uac00 \uacf5\uc720\ud558\ub294 \uc5d4\ub4dc\ud3ec\uc778\ud2b8)", + "file_type": "document", + "source_file": "index.md", + "source_location": "L98", + "_origin": "ast", + "id": "index_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "community": 3, + "norm_label": "api \u1100\u1169\u11bc\u1110\u1169\u11bc (\u110b\u1167\u1105\u1165 \u1111\u1166\u110b\u1175\u110c\u1175\u1100\u1161 \u1100\u1169\u11bc\u110b\u1172\u1112\u1161\u1102\u1173\u11ab \u110b\u1166\u11ab\u1103\u1173\u1111\u1169\u110b\u1175\u11ab\u1110\u1173)" + }, + { + "label": "\uc758\uc874\uc131 (\uc5ec\ub7ec \ud398\uc774\uc9c0\uac00 \uacf5\uc720\ud558\ub294 \uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac)", + "file_type": "document", + "source_file": "index.md", + "source_location": "L101", + "_origin": "ast", + "id": "index_\uc758\uc874\uc131_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac", + "community": 3, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc (\u110b\u1167\u1105\u1165 \u1111\u1166\u110b\u1175\u110c\u1175\u1100\u1161 \u1100\u1169\u11bc\u110b\u1172\u1112\u1161\u1102\u1173\u11ab \u110b\u116c\u1107\u116e \u1105\u1161\u110b\u1175\u1107\u1173\u1105\u1165\u1105\u1175)" + }, + { + "label": "\uacf5\ud1b5 \uc2a4\ud0a4\ub9c8 (Pydantic \uc694\uccad/\uc751\ub2f5 \ubaa8\ub378)", + "file_type": "document", + "source_file": "index.md", + "source_location": "L104", + "_origin": "ast", + "id": "index_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", + "community": 3, + "norm_label": "\u1100\u1169\u11bc\u1110\u1169\u11bc \u1109\u1173\u110f\u1175\u1106\u1161 (pydantic \u110b\u116d\u110e\u1165\u11bc/\u110b\u1173\u11bc\u1103\u1161\u11b8 \u1106\u1169\u1103\u1166\u11af)" + }, + { + "label": "Workflow \uc0c1\ud0dc \uad00\ub9ac", + "file_type": "document", + "source_file": "index.md", + "source_location": "L107", + "_origin": "ast", + "id": "index_workflow_\uc0c1\ud0dc_\uad00\ub9ac", + "community": 3, + "norm_label": "workflow \u1109\u1161\u11bc\u1110\u1162 \u1100\u116a\u11ab\u1105\u1175" + }, + { + "label": "\u26a0\ufe0f \ubbf8\ud574\uacb0 \ud56d\ubaa9", + "file_type": "document", + "source_file": "index.md", + "source_location": "L110", + "_origin": "ast", + "id": "index_\ubbf8\ud574\uacb0_\ud56d\ubaa9", + "community": 3, + "norm_label": "\u26a0\ufe0f \u1106\u1175\u1112\u1162\u1100\u1167\u11af \u1112\u1161\u11bc\u1106\u1169\u11a8" + }, + { + "label": "A\uadf8\ub8f9 \uc778\uc81c\uc2a4\ud2b8 \uc774\uc288", + "file_type": "document", + "source_file": "index.md", + "source_location": "L116", + "_origin": "ast", + "id": "index_a\uadf8\ub8f9_\uc778\uc81c\uc2a4\ud2b8_\uc774\uc288", + "community": 3, + "norm_label": "a\u1100\u1173\u1105\u116e\u11b8 \u110b\u1175\u11ab\u110c\u1166\u1109\u1173\u1110\u1173 \u110b\u1175\u1109\u1172" + }, + { + "label": "log.md", + "file_type": "document", + "source_file": "log.md", + "source_location": "L1", + "_origin": "ast", + "id": "log", + "community": 4, + "norm_label": "log.md" + }, + { + "label": "Wiki Log", + "file_type": "document", + "source_file": "log.md", + "source_location": "L1", + "_origin": "ast", + "id": "log_wiki_log", + "community": 4, + "norm_label": "wiki log" + }, + { + "label": "[2026-07-12] lint | \uad6c\ud615 \uc0c1\uc704 \ud3f4\ub354 \ud0c8\ucd9c \ub9c1\ud06c(../../concepts/) \uc804\uc218 \uc815\ubc00 \uad50\uc815", + "file_type": "document", + "source_file": "log.md", + "source_location": "L6", + "_origin": "ast", + "id": "log_2026_07_12_lint_\uad6c\ud615_\uc0c1\uc704_\ud3f4\ub354_\ud0c8\ucd9c_\ub9c1\ud06c_concepts_\uc804\uc218_\uc815\ubc00_\uad50\uc815", + "community": 4, + "norm_label": "[2026-07-12] lint | \u1100\u116e\u1112\u1167\u11bc \u1109\u1161\u11bc\u110b\u1171 \u1111\u1169\u11af\u1103\u1165 \u1110\u1161\u11af\u110e\u116e\u11af \u1105\u1175\u11bc\u110f\u1173(../../concepts/) \u110c\u1165\u11ab\u1109\u116e \u110c\u1165\u11bc\u1106\u1175\u11af \u1100\u116d\u110c\u1165\u11bc" + }, + { + "label": "[2026-07-12] lint | 5\ud68c \ubc18\ubcf5 \ub9b0\ud2b8-\uac1c\uc120 \uc0ac\uc774\ud074 \uc218\ud589 \ubc0f \uc704\ud0a4 \uba54\ud0c0 \uc815\ubcf4 \uc815\ubc00 \ubcf4\uc644", + "file_type": "document", + "source_file": "log.md", + "source_location": "L10", + "_origin": "ast", + "id": "log_2026_07_12_lint_5\ud68c_\ubc18\ubcf5_\ub9b0\ud2b8_\uac1c\uc120_\uc0ac\uc774\ud074_\uc218\ud589_\ubc0f_\uc704\ud0a4_\uba54\ud0c0_\uc815\ubcf4_\uc815\ubc00_\ubcf4\uc644", + "community": 4, + "norm_label": "[2026-07-12] lint | 5\u1112\u116c \u1107\u1161\u11ab\u1107\u1169\u11a8 \u1105\u1175\u11ab\u1110\u1173-\u1100\u1162\u1109\u1165\u11ab \u1109\u1161\u110b\u1175\u110f\u1173\u11af \u1109\u116e\u1112\u1162\u11bc \u1106\u1175\u11be \u110b\u1171\u110f\u1175 \u1106\u1166\u1110\u1161 \u110c\u1165\u11bc\u1107\u1169 \u110c\u1165\u11bc\u1106\u1175\u11af \u1107\u1169\u110b\u116a\u11ab" + }, + { + "label": "[2026-07-12] ingest | DB 34\uac1c \ud14c\uc774\ube14 \uc804\uc218 \uceec\ub7fc \uc2e4\uce21 \ubc0f \uc704\ud0a4 \ucd5c\uc2e0\ud654", + "file_type": "document", + "source_file": "log.md", + "source_location": "L17", + "_origin": "ast", + "id": "log_2026_07_12_ingest_db_34\uac1c_\ud14c\uc774\ube14_\uc804\uc218_\uceec\ub7fc_\uc2e4\uce21_\ubc0f_\uc704\ud0a4_\ucd5c\uc2e0\ud654", + "community": 4, + "norm_label": "[2026-07-12] ingest | db 34\u1100\u1162 \u1110\u1166\u110b\u1175\u1107\u1173\u11af \u110c\u1165\u11ab\u1109\u116e \u110f\u1165\u11af\u1105\u1165\u11b7 \u1109\u1175\u11af\u110e\u1173\u11a8 \u1106\u1175\u11be \u110b\u1171\u110f\u1175 \u110e\u116c\u1109\u1175\u11ab\u1112\u116a" + }, + { + "label": "[2026-07-12] ingest+lint | 3\ud68c \ubc18\ubcf5 \ub9b0\ud2b8-\uac1c\uc120 \uc0ac\uc774\ud074 \uc218\ud589 \ubc0f \uc704\ud0a4 \ubb34\uacb0\uc131 \ud655\ubcf4", + "file_type": "document", + "source_file": "log.md", + "source_location": "L30", + "_origin": "ast", + "id": "log_2026_07_12_ingest_lint_3\ud68c_\ubc18\ubcf5_\ub9b0\ud2b8_\uac1c\uc120_\uc0ac\uc774\ud074_\uc218\ud589_\ubc0f_\uc704\ud0a4_\ubb34\uacb0\uc131_\ud655\ubcf4", + "community": 4, + "norm_label": "[2026-07-12] ingest+lint | 3\u1112\u116c \u1107\u1161\u11ab\u1107\u1169\u11a8 \u1105\u1175\u11ab\u1110\u1173-\u1100\u1162\u1109\u1165\u11ab \u1109\u1161\u110b\u1175\u110f\u1173\u11af \u1109\u116e\u1112\u1162\u11bc \u1106\u1175\u11be \u110b\u1171\u110f\u1175 \u1106\u116e\u1100\u1167\u11af\u1109\u1165\u11bc \u1112\u116a\u11a8\u1107\u1169" + }, + { + "label": "[2026-07-12] ingest | B09_wf6_Estimation (\uc2e4 \ucf54\ub4dc \ub300\uc870, \ubbf8\ucc29\uc218 \ud655\uc778)", + "file_type": "document", + "source_file": "log.md", + "source_location": "L36", + "_origin": "ast", + "id": "log_2026_07_12_ingest_b09_wf6_estimation_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\ubbf8\ucc29\uc218_\ud655\uc778", + "community": 4, + "norm_label": "[2026-07-12] ingest | b09_wf6_estimation (\u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1103\u1162\u110c\u1169, \u1106\u1175\u110e\u1161\u11a8\u1109\u116e \u1112\u116a\u11a8\u110b\u1175\u11ab)" + }, + { + "label": "[2026-07-12] ingest | B07_wf4_DesignDetail (\uc2e4 \ucf54\ub4dc \ub300\uc870, \ubbf8\ucc29\uc218 \ud655\uc778)", + "file_type": "document", + "source_file": "log.md", + "source_location": "L47", + "_origin": "ast", + "id": "log_2026_07_12_ingest_b07_wf4_designdetail_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\ubbf8\ucc29\uc218_\ud655\uc778", + "community": 4, + "norm_label": "[2026-07-12] ingest | b07_wf4_designdetail (\u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1103\u1162\u110c\u1169, \u1106\u1175\u110e\u1161\u11a8\u1109\u116e \u1112\u116a\u11a8\u110b\u1175\u11ab)" + }, + { + "label": "[2026-07-12] ingest | B04_wf1_Surface (\uc2e4 \ucf54\ub4dc \ub300\uc870\u00b75\ubd84\ud560 \uc0c1\uc138\ud654)", + "file_type": "document", + "source_file": "log.md", + "source_location": "L57", + "_origin": "ast", + "id": "log_2026_07_12_ingest_b04_wf1_surface_\uc2e4_\ucf54\ub4dc_\ub300\uc870_5\ubd84\ud560_\uc0c1\uc138\ud654", + "community": 4, + "norm_label": "[2026-07-12] ingest | b04_wf1_surface (\u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1103\u1162\u110c\u1169\u00b75\u1107\u116e\u11ab\u1112\u1161\u11af \u1109\u1161\u11bc\u1109\u1166\u1112\u116a)" + }, + { + "label": "[2026-07-12] ingest | B02_ProjRegister (backend + frontend + db \uc0c1\uc138\ud654)", + "file_type": "document", + "source_file": "log.md", + "source_location": "L69", + "_origin": "ast", + "id": "log_2026_07_12_ingest_b02_projregister_backend_frontend_db_\uc0c1\uc138\ud654", + "community": 4, + "norm_label": "[2026-07-12] ingest | b02_projregister (backend + frontend + db \u1109\u1161\u11bc\u1109\u1166\u1112\u116a)" + }, + { + "label": "[2026-07-12] query | B01_Dashboard \uc2e4 \ucf54\ub4dc \uae30\uc900 \ucd5c\uc2e0\ud654", + "file_type": "document", + "source_file": "log.md", + "source_location": "L85", + "_origin": "ast", + "id": "log_2026_07_12_query_b01_dashboard_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", + "community": 4, + "norm_label": "[2026-07-12] query | b01_dashboard \u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1100\u1175\u110c\u116e\u11ab \u110e\u116c\u1109\u1175\u11ab\u1112\u116a" + }, + { + "label": "[2026-07-12] query | B03_FileInput \uc2e4 \ucf54\ub4dc \uae30\uc900 \ucd5c\uc2e0\ud654", + "file_type": "document", + "source_file": "log.md", + "source_location": "L93", + "_origin": "ast", + "id": "log_2026_07_12_query_b03_fileinput_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", + "community": 4, + "norm_label": "[2026-07-12] query | b03_fileinput \u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1100\u1175\u110c\u116e\u11ab \u110e\u116c\u1109\u1175\u11ab\u1112\u116a" + }, + { + "label": "[2026-07-12] query | B05_wf2_Route \uc2e4 \ucf54\ub4dc \uae30\uc900 \ucd5c\uc2e0\ud654", + "file_type": "document", + "source_file": "log.md", + "source_location": "L102", + "_origin": "ast", + "id": "log_2026_07_12_query_b05_wf2_route_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", + "community": 4, + "norm_label": "[2026-07-12] query | b05_wf2_route \u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1100\u1175\u110c\u116e\u11ab \u110e\u116c\u1109\u1175\u11ab\u1112\u116a" + }, + { + "label": "[2026-07-12] query | B06_wf3_ProfileCross \uc2e4 \ucf54\ub4dc \uae30\uc900 \ucd5c\uc2e0\ud654", + "file_type": "document", + "source_file": "log.md", + "source_location": "L111", + "_origin": "ast", + "id": "log_2026_07_12_query_b06_wf3_profilecross_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", + "community": 4, + "norm_label": "[2026-07-12] query | b06_wf3_profilecross \u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1100\u1175\u110c\u116e\u11ab \u110e\u116c\u1109\u1175\u11ab\u1112\u116a" + }, + { + "label": "[2026-07-12] query | B08_wf5_Quantity \uc2e4 \ucf54\ub4dc \uae30\uc900 \ucd5c\uc2e0\ud654", + "file_type": "document", + "source_file": "log.md", + "source_location": "L119", + "_origin": "ast", + "id": "log_2026_07_12_query_b08_wf5_quantity_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", + "community": 4, + "norm_label": "[2026-07-12] query | b08_wf5_quantity \u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1100\u1175\u110c\u116e\u11ab \u110e\u116c\u1109\u1175\u11ab\u1112\u116a" + }, + { + "label": "[2026-07-12] lint | \uc804\uccb4 \uc704\ud0a4 \uad6c\uc870\u00b7\uc0c1\ud0dc\u00b7\uacf5\uc720 \uac1c\ub150 \uc815\ub9ac", + "file_type": "document", + "source_file": "log.md", + "source_location": "L126", + "_origin": "ast", + "id": "log_2026_07_12_lint_\uc804\uccb4_\uc704\ud0a4_\uad6c\uc870_\uc0c1\ud0dc_\uacf5\uc720_\uac1c\ub150_\uc815\ub9ac", + "community": 4, + "norm_label": "[2026-07-12] lint | \u110c\u1165\u11ab\u110e\u1166 \u110b\u1171\u110f\u1175 \u1100\u116e\u110c\u1169\u00b7\u1109\u1161\u11bc\u1110\u1162\u00b7\u1100\u1169\u11bc\u110b\u1172 \u1100\u1162\u1102\u1167\u11b7 \u110c\u1165\u11bc\u1105\u1175" + }, + { + "label": "[2026-07-12] lint | \uc804\uccb4 \uc704\ud0a4 \uad6c\uc870\u00b7\uc0c1\ud0dc\u00b7\uacf5\uc720 \uac1c\ub150 \uc815\ub9ac", + "file_type": "document", + "source_file": "log.md", + "source_location": "L134", + "_origin": "ast", + "id": "log_2026_07_12_lint_\uc804\uccb4_\uc704\ud0a4_\uad6c\uc870_\uc0c1\ud0dc_\uacf5\uc720_\uac1c\ub150_\uc815\ub9ac_134", + "community": 4, + "norm_label": "[2026-07-12] lint | \u110c\u1165\u11ab\u110e\u1166 \u110b\u1171\u110f\u1175 \u1100\u116e\u110c\u1169\u00b7\u1109\u1161\u11bc\u1110\u1162\u00b7\u1100\u1169\u11bc\u110b\u1172 \u1100\u1162\u1102\u1167\u11b7 \u110c\u1165\u11bc\u1105\u1175" + }, + { + "label": "[2026-07-12] lint | \uc704\ud0a4 \uc2dc\uc2a4\ud15c \ucd08\uae30 \uc138\ud305", + "file_type": "document", + "source_file": "log.md", + "source_location": "L141", + "_origin": "ast", + "id": "log_2026_07_12_lint_\uc704\ud0a4_\uc2dc\uc2a4\ud15c_\ucd08\uae30_\uc138\ud305", + "community": 4, + "norm_label": "[2026-07-12] lint | \u110b\u1171\u110f\u1175 \u1109\u1175\u1109\u1173\u1110\u1166\u11b7 \u110e\u1169\u1100\u1175 \u1109\u1166\u1110\u1175\u11bc" + }, + { + "label": "[2026-07-12] ingest | guidelines/plans 7\uac74 \uc77c\uad04 \ubc18\uc601", + "file_type": "document", + "source_file": "log.md", + "source_location": "L148", + "_origin": "ast", + "id": "log_2026_07_12_ingest_guidelines_plans_7\uac74_\uc77c\uad04_\ubc18\uc601", + "community": 4, + "norm_label": "[2026-07-12] ingest | guidelines/plans 7\u1100\u1165\u11ab \u110b\u1175\u11af\u1100\u116a\u11af \u1107\u1161\u11ab\u110b\u1167\u11bc" + }, + { + "label": "[2026-07-12] query+lint | \uc2e4 DB/\uc2e4 \ucf54\ub4dc \ub300\uc870 \uac80\uc99d (\uc77d\uae30 \uc804\uc6a9)", + "file_type": "document", + "source_file": "log.md", + "source_location": "L157", + "_origin": "ast", + "id": "log_2026_07_12_query_lint_\uc2e4_db_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\uac80\uc99d_\uc77d\uae30_\uc804\uc6a9", + "community": 4, + "norm_label": "[2026-07-12] query+lint | \u1109\u1175\u11af db/\u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1103\u1162\u110c\u1169 \u1100\u1165\u11b7\u110c\u1173\u11bc (\u110b\u1175\u11b0\u1100\u1175 \u110c\u1165\u11ab\u110b\u116d\u11bc)" + }, + { + "label": "[2026-07-12] lint | page_id frontmatter \ud544\ub4dc \ub3c4\uc785", + "file_type": "document", + "source_file": "log.md", + "source_location": "L167", + "_origin": "ast", + "id": "log_2026_07_12_lint_page_id_frontmatter_\ud544\ub4dc_\ub3c4\uc785", + "community": 4, + "norm_label": "[2026-07-12] lint | page_id frontmatter \u1111\u1175\u11af\u1103\u1173 \u1103\u1169\u110b\u1175\u11b8" + }, + { + "label": "[2026-07-12] ingest | A01_Home \uc2e4 \ucf54\ub4dc \ubc18\uc601", + "file_type": "document", + "source_file": "log.md", + "source_location": "L173", + "_origin": "ast", + "id": "log_2026_07_12_ingest_a01_home_\uc2e4_\ucf54\ub4dc_\ubc18\uc601", + "community": 4, + "norm_label": "[2026-07-12] ingest | a01_home \u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1107\u1161\u11ab\u110b\u1167\u11bc" + }, + { + "label": "[2026-07-12] refactor | \ud30c\uc77c\uba85 \uaddc\uce59 \ub3c4\uc785 \ubc0f \ub9c1\ud06c \uc218\uc815", + "file_type": "document", + "source_file": "log.md", + "source_location": "L180", + "_origin": "ast", + "id": "log_2026_07_12_refactor_\ud30c\uc77c\uba85_\uaddc\uce59_\ub3c4\uc785_\ubc0f_\ub9c1\ud06c_\uc218\uc815", + "community": 4, + "norm_label": "[2026-07-12] refactor | \u1111\u1161\u110b\u1175\u11af\u1106\u1167\u11bc \u1100\u1172\u110e\u1175\u11a8 \u1103\u1169\u110b\u1175\u11b8 \u1106\u1175\u11be \u1105\u1175\u11bc\u110f\u1173 \u1109\u116e\u110c\u1165\u11bc" + }, + { + "label": "[2026-07-12] lint | A\uadf8\ub8f9(A01~A09) \uc804\uccb4 \uac80\uc99d \ubc0f \uc815\ud569\uc131 \uc810\uac80", + "file_type": "document", + "source_file": "log.md", + "source_location": "L188", + "_origin": "ast", + "id": "log_2026_07_12_lint_a\uadf8\ub8f9_a01_a09_\uc804\uccb4_\uac80\uc99d_\ubc0f_\uc815\ud569\uc131_\uc810\uac80", + "community": 4, + "norm_label": "[2026-07-12] lint | a\u1100\u1173\u1105\u116e\u11b8(a01~a09) \u110c\u1165\u11ab\u110e\u1166 \u1100\u1165\u11b7\u110c\u1173\u11bc \u1106\u1175\u11be \u110c\u1165\u11bc\u1112\u1161\u11b8\u1109\u1165\u11bc \u110c\u1165\u11b7\u1100\u1165\u11b7" + }, + { + "label": "[2026-07-12] ingest | A09_Security (backend + frontend \uc0c1\uc138\ud654)", + "file_type": "document", + "source_file": "log.md", + "source_location": "L204", + "_origin": "ast", + "id": "log_2026_07_12_ingest_a09_security_backend_frontend_\uc0c1\uc138\ud654", + "community": 4, + "norm_label": "[2026-07-12] ingest | a09_security (backend + frontend \u1109\u1161\u11bc\u1109\u1166\u1112\u116a)" + }, + { + "label": "[2026-07-12] ingest | A08_Support (backend + frontend \uc0c1\uc138\ud654)", + "file_type": "document", + "source_file": "log.md", + "source_location": "L219", + "_origin": "ast", + "id": "log_2026_07_12_ingest_a08_support_backend_frontend_\uc0c1\uc138\ud654", + "community": 4, + "norm_label": "[2026-07-12] ingest | a08_support (backend + frontend \u1109\u1161\u11bc\u1109\u1166\u1112\u116a)" + }, + { + "label": "[2026-07-12] ingest | A07_Register (backend + frontend \uc0c1\uc138\ud654)", + "file_type": "document", + "source_file": "log.md", + "source_location": "L233", + "_origin": "ast", + "id": "log_2026_07_12_ingest_a07_register_backend_frontend_\uc0c1\uc138\ud654", + "community": 4, + "norm_label": "[2026-07-12] ingest | a07_register (backend + frontend \u1109\u1161\u11bc\u1109\u1166\u1112\u116a)" + }, + { + "label": "[2026-07-12] ingest | A06_Login (backend + frontend \uc0c1\uc138\ud654)", + "file_type": "document", + "source_file": "log.md", + "source_location": "L248", + "_origin": "ast", + "id": "log_2026_07_12_ingest_a06_login_backend_frontend_\uc0c1\uc138\ud654", + "community": 4, + "norm_label": "[2026-07-12] ingest | a06_login (backend + frontend \u1109\u1161\u11bc\u1109\u1166\u1112\u116a)" + }, + { + "label": "[2026-07-12] lint | A03~A05 \uc778\uc81c\uc2a4\ud2b8 \uc7ac\uc810\uac80", + "file_type": "document", + "source_file": "log.md", + "source_location": "L263", + "_origin": "ast", + "id": "log_2026_07_12_lint_a03_a05_\uc778\uc81c\uc2a4\ud2b8_\uc7ac\uc810\uac80", + "community": 4, + "norm_label": "[2026-07-12] lint | a03~a05 \u110b\u1175\u11ab\u110c\u1166\u1109\u1173\u1110\u1173 \u110c\u1162\u110c\u1165\u11b7\u1100\u1165\u11b7" + }, + { + "label": "[2026-07-12] ingest | A05_EduDetail", + "file_type": "document", + "source_file": "log.md", + "source_location": "L274", + "_origin": "ast", + "id": "log_2026_07_12_ingest_a05_edudetail", + "community": 4, + "norm_label": "[2026-07-12] ingest | a05_edudetail" + }, + { + "label": "[2026-07-12] ingest | A04_NewsHistory", + "file_type": "document", + "source_file": "log.md", + "source_location": "L284", + "_origin": "ast", + "id": "log_2026_07_12_ingest_a04_newshistory", + "community": 4, + "norm_label": "[2026-07-12] ingest | a04_newshistory" + }, + { + "label": "[2026-07-12] ingest | A03_CompDetail", + "file_type": "document", + "source_file": "log.md", + "source_location": "L295", + "_origin": "ast", + "id": "log_2026_07_12_ingest_a03_compdetail", + "community": 4, + "norm_label": "[2026-07-12] ingest | a03_compdetail" + }, + { + "label": "[2026-07-12] lint | A01_Home \ud398\uc774\uc9c0 \uac80\uc0ac \ubc0f \uc218\uc815", + "file_type": "document", + "source_file": "log.md", + "source_location": "L305", + "_origin": "ast", + "id": "log_2026_07_12_lint_a01_home_\ud398\uc774\uc9c0_\uac80\uc0ac_\ubc0f_\uc218\uc815", + "community": 4, + "norm_label": "[2026-07-12] lint | a01_home \u1111\u1166\u110b\u1175\u110c\u1175 \u1100\u1165\u11b7\u1109\u1161 \u1106\u1175\u11be \u1109\u116e\u110c\u1165\u11bc" + }, + { + "label": "[2026-07-12] ingest | A02_ProgDetail + A00_Common Framework", + "file_type": "document", + "source_file": "log.md", + "source_location": "L318", + "_origin": "ast", + "id": "log_2026_07_12_ingest_a02_progdetail_a00_common_framework", + "community": 4, + "norm_label": "[2026-07-12] ingest | a02_progdetail + a00_common framework" + }, + { + "label": "A01_components.md", + "file_type": "document", + "source_file": "pages/A01_Home/A01_components.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a01_home_a01_components", + "community": 30, + "norm_label": "a01_components.md" + }, + { + "label": "A01_Home \u2014 \uc138\ubd80 \uad6c\ud604", + "file_type": "document", + "source_file": "pages/A01_Home/A01_components.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", + "community": 30, + "norm_label": "a01_home \u2014 \u1109\u1166\u1107\u116e \u1100\u116e\u1112\u1167\u11ab" + }, + { + "label": "\uc2a4\ud0c0\uc77c", + "file_type": "document", + "source_file": "pages/A01_Home/A01_components.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a01_home_a01_components_\uc2a4\ud0c0\uc77c", + "community": 30, + "norm_label": "\u1109\u1173\u1110\u1161\u110b\u1175\u11af" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/A01_Home/A01_components.md", + "source_location": "L20", + "_origin": "ast", + "id": "pages_a01_home_a01_components_\uc758\uc874\uc131", + "community": 30, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "\ub370\uc774\ud130 \ud750\ub984", + "file_type": "document", + "source_file": "pages/A01_Home/A01_components.md", + "source_location": "L27", + "_origin": "ast", + "id": "pages_a01_home_a01_components_\ub370\uc774\ud130_\ud750\ub984", + "community": 30, + "norm_label": "\u1103\u1166\u110b\u1175\u1110\u1165 \u1112\u1173\u1105\u1173\u11b7" + }, + { + "label": "\ubbf8\ud574\uacb0", + "file_type": "document", + "source_file": "pages/A01_Home/A01_components.md", + "source_location": "L34", + "_origin": "ast", + "id": "pages_a01_home_a01_components_\ubbf8\ud574\uacb0", + "community": 30, + "norm_label": "\u1106\u1175\u1112\u1162\u1100\u1167\u11af" + }, + { + "label": "A01_frontend.md", + "file_type": "document", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a01_home_a01_frontend", + "community": 15, + "norm_label": "a01_frontend.md" + }, + { + "label": "A01_Home \u2014 Frontend", + "file_type": "document", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a01_home_a01_frontend_a01_home_frontend", + "community": 15, + "norm_label": "a01_home \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a01_home_a01_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 15, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8", + "file_type": "document", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_a01_home_a01_frontend_\ucef4\ud3ec\ub10c\ud2b8", + "community": 15, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173" + }, + { + "label": "Hero \uc139\uc158", + "file_type": "document", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L21", + "_origin": "ast", + "id": "pages_a01_home_a01_frontend_hero_\uc139\uc158", + "community": 15, + "norm_label": "hero \u1109\u1166\u11a8\u1109\u1167\u11ab" + }, + { + "label": "\ucd5c\uc2e0 \uc18c\uc2dd \uc139\uc158", + "file_type": "document", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L26", + "_origin": "ast", + "id": "pages_a01_home_a01_frontend_\ucd5c\uc2e0_\uc18c\uc2dd_\uc139\uc158", + "community": 15, + "norm_label": "\u110e\u116c\u1109\u1175\u11ab \u1109\u1169\u1109\u1175\u11a8 \u1109\u1166\u11a8\u1109\u1167\u11ab" + }, + { + "label": "\uc8fc\uc694 \uae30\ub2a5 \uc139\uc158", + "file_type": "document", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L31", + "_origin": "ast", + "id": "pages_a01_home_a01_frontend_\uc8fc\uc694_\uae30\ub2a5_\uc139\uc158", + "community": 15, + "norm_label": "\u110c\u116e\u110b\u116d \u1100\u1175\u1102\u1173\u11bc \u1109\u1166\u11a8\u1109\u1167\u11ab" + }, + { + "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", + "file_type": "document", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L36", + "_origin": "ast", + "id": "pages_a01_home_a01_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "community": 15, + "norm_label": "\u110b\u1175\u1107\u1166\u11ab\u1110\u1173 \u1112\u1162\u11ab\u1103\u1173\u11af\u1105\u1165" + }, + { + "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "file_type": "document", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L43", + "_origin": "ast", + "id": "pages_a01_home_a01_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "community": 15, + "norm_label": "\u1105\u1169\u110f\u1165\u11af\u1105\u1161\u110b\u1175\u110c\u1166\u110b\u1175\u1109\u1167\u11ab" + }, + { + "label": "\uc138\ubd80 \uad6c\ud604", + "file_type": "document", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L58", + "_origin": "ast", + "id": "pages_a01_home_a01_frontend_\uc138\ubd80_\uad6c\ud604", + "community": 15, + "norm_label": "\u1109\u1166\u1107\u116e \u1100\u116e\u1112\u1167\u11ab" + }, + { + "label": "A02_components.md", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_components.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_components", + "community": 31, + "norm_label": "a02_components.md" + }, + { + "label": "A02_ProgDetail \u2014 \uc138\ubd80 \uad6c\ud604", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_components.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", + "community": 31, + "norm_label": "a02_progdetail \u2014 \u1109\u1166\u1107\u116e \u1100\u116e\u1112\u1167\u11ab" + }, + { + "label": "\uc2a4\ud0c0\uc77c (CSS)", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_components.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_components_\uc2a4\ud0c0\uc77c_css", + "community": 31, + "norm_label": "\u1109\u1173\u1110\u1161\u110b\u1175\u11af (css)" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_components.md", + "source_location": "L21", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_components_\uc758\uc874\uc131", + "community": 31, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "\ub370\uc774\ud130 \ud750\ub984", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_components.md", + "source_location": "L29", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_components_\ub370\uc774\ud130_\ud750\ub984", + "community": 31, + "norm_label": "\u1103\u1166\u110b\u1175\u1110\u1165 \u1112\u1173\u1105\u1173\u11b7" + }, + { + "label": "\ubbf8\ud574\uacb0 / \ud2b9\uc774\uc0ac\ud56d", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_components.md", + "source_location": "L35", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_components_\ubbf8\ud574\uacb0_\ud2b9\uc774\uc0ac\ud56d", + "community": 31, + "norm_label": "\u1106\u1175\u1112\u1162\u1100\u1167\u11af / \u1110\u1173\u11a8\u110b\u1175\u1109\u1161\u1112\u1161\u11bc" + }, + { + "label": "A02_frontend.md", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_frontend", + "community": 32, + "norm_label": "a02_frontend.md" + }, + { + "label": "A02_ProgDetail \u2014 Frontend", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", + "community": 32, + "norm_label": "a02_progdetail \u2014 frontend" + }, + { + "label": "\uad6c\uc870", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_frontend_\uad6c\uc870", + "community": 32, + "norm_label": "\u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 \ubd84\uc11d", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_frontend.md", + "source_location": "L16", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ubd84\uc11d", + "community": 32, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 \u1107\u116e\u11ab\u1109\u1165\u11a8" + }, + { + "label": "\uc81c\uc57d \uc900\uc218", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_frontend.md", + "source_location": "L24", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_frontend_\uc81c\uc57d_\uc900\uc218", + "community": 32, + "norm_label": "\u110c\u1166\u110b\u1163\u11a8 \u110c\u116e\u11ab\u1109\u116e" + }, + { + "label": "\uc138\ubd80 \uad6c\ud604", + "file_type": "document", + "source_file": "pages/A02_ProgDetail/A02_frontend.md", + "source_location": "L31", + "_origin": "ast", + "id": "pages_a02_progdetail_a02_frontend_\uc138\ubd80_\uad6c\ud604", + "community": 32, + "norm_label": "\u1109\u1166\u1107\u116e \u1100\u116e\u1112\u1167\u11ab" + }, + { + "label": "A03_frontend.md", + "file_type": "document", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a03_compdetail_a03_frontend", + "community": 22, + "norm_label": "a03_frontend.md" + }, + { + "label": "A03_CompDetail \u2014 Frontend", + "file_type": "document", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", + "community": 22, + "norm_label": "a03_compdetail \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a03_compdetail_a03_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 22, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 (\uc139\uc158 \ube4c\ub354)", + "file_type": "document", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_a03_compdetail_a03_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", + "community": 22, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 (\u1109\u1166\u11a8\u1109\u1167\u11ab \u1107\u1175\u11af\u1103\u1165)" + }, + { + "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "file_type": "document", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L29", + "_origin": "ast", + "id": "pages_a03_compdetail_a03_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "community": 22, + "norm_label": "\u1105\u1169\u110f\u1165\u11af\u1105\u1161\u110b\u1175\u110c\u1166\u110b\u1175\u1109\u1167\u11ab" + }, + { + "label": "\uc2a4\ud0c0\uc77c (CSS)", + "file_type": "document", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L45", + "_origin": "ast", + "id": "pages_a03_compdetail_a03_frontend_\uc2a4\ud0c0\uc77c_css", + "community": 22, + "norm_label": "\u1109\u1173\u1110\u1161\u110b\u1175\u11af (css)" + }, + { + "label": "CSS \ud074\ub798\uc2a4 \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L47", + "_origin": "ast", + "id": "pages_a03_compdetail_a03_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", + "community": 22, + "norm_label": "css \u110f\u1173\u11af\u1105\u1162\u1109\u1173 \u1100\u116e\u110c\u1169" + }, + { + "label": "\ubc18\uc751\ud615", + "file_type": "document", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L61", + "_origin": "ast", + "id": "pages_a03_compdetail_a03_frontend_\ubc18\uc751\ud615", + "community": 22, + "norm_label": "\u1107\u1161\u11ab\u110b\u1173\u11bc\u1112\u1167\u11bc" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L64", + "_origin": "ast", + "id": "pages_a03_compdetail_a03_frontend_\uc758\uc874\uc131", + "community": 22, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "A04_frontend.md", + "file_type": "document", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a04_newshistory_a04_frontend", + "community": 9, + "norm_label": "a04_frontend.md" + }, + { + "label": "A04_NewsHistory \u2014 Frontend", + "file_type": "document", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", + "community": 9, + "norm_label": "a04_newshistory \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a04_newshistory_a04_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 9, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 (\uc139\uc158 \ube4c\ub354)", + "file_type": "document", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_a04_newshistory_a04_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", + "community": 9, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 (\u1109\u1166\u11a8\u1109\u1167\u11ab \u1107\u1175\u11af\u1103\u1165)" + }, + { + "label": "Mock \ub370\uc774\ud130 \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L30", + "_origin": "ast", + "id": "pages_a04_newshistory_a04_frontend_mock_\ub370\uc774\ud130_\uad6c\uc870", + "community": 9, + "norm_label": "mock \u1103\u1166\u110b\u1175\u1110\u1165 \u1100\u116e\u110c\u1169" + }, + { + "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "file_type": "document", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L48", + "_origin": "ast", + "id": "pages_a04_newshistory_a04_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "community": 9, + "norm_label": "\u1105\u1169\u110f\u1165\u11af\u1105\u1161\u110b\u1175\u110c\u1166\u110b\u1175\u1109\u1167\u11ab" + }, + { + "label": "\uc2a4\ud0c0\uc77c (CSS)", + "file_type": "document", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L60", + "_origin": "ast", + "id": "pages_a04_newshistory_a04_frontend_\uc2a4\ud0c0\uc77c_css", + "community": 9, + "norm_label": "\u1109\u1173\u1110\u1161\u110b\u1175\u11af (css)" + }, + { + "label": "CSS \ud074\ub798\uc2a4 \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L62", + "_origin": "ast", + "id": "pages_a04_newshistory_a04_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", + "community": 9, + "norm_label": "css \u110f\u1173\u11af\u1105\u1162\u1109\u1173 \u1100\u116e\u110c\u1169" + }, + { + "label": "\ubc18\uc751\ud615", + "file_type": "document", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L75", + "_origin": "ast", + "id": "pages_a04_newshistory_a04_frontend_\ubc18\uc751\ud615", + "community": 9, + "norm_label": "\u1107\u1161\u11ab\u110b\u1173\u11bc\u1112\u1167\u11bc" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L78", + "_origin": "ast", + "id": "pages_a04_newshistory_a04_frontend_\uc758\uc874\uc131", + "community": 9, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "\ubbf8\ud574\uacb0 \uc0ac\ud56d", + "file_type": "document", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L83", + "_origin": "ast", + "id": "pages_a04_newshistory_a04_frontend_\ubbf8\ud574\uacb0_\uc0ac\ud56d", + "community": 9, + "norm_label": "\u1106\u1175\u1112\u1162\u1100\u1167\u11af \u1109\u1161\u1112\u1161\u11bc" + }, + { + "label": "A05_frontend.md", + "file_type": "document", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a05_edudetail_a05_frontend", + "community": 16, + "norm_label": "a05_frontend.md" + }, + { + "label": "A05_EduDetail \u2014 Frontend", + "file_type": "document", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", + "community": 16, + "norm_label": "a05_edudetail \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a05_edudetail_a05_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 16, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 (\uc139\uc158 \ube4c\ub354)", + "file_type": "document", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_a05_edudetail_a05_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", + "community": 16, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 (\u1109\u1166\u11a8\u1109\u1167\u11ab \u1107\u1175\u11af\u1103\u1165)" + }, + { + "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "file_type": "document", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L28", + "_origin": "ast", + "id": "pages_a05_edudetail_a05_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "community": 16, + "norm_label": "\u1105\u1169\u110f\u1165\u11af\u1105\u1161\u110b\u1175\u110c\u1166\u110b\u1175\u1109\u1167\u11ab" + }, + { + "label": "\uc2a4\ud0c0\uc77c (CSS)", + "file_type": "document", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L41", + "_origin": "ast", + "id": "pages_a05_edudetail_a05_frontend_\uc2a4\ud0c0\uc77c_css", + "community": 16, + "norm_label": "\u1109\u1173\u1110\u1161\u110b\u1175\u11af (css)" + }, + { + "label": "CSS \ud074\ub798\uc2a4 \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L43", + "_origin": "ast", + "id": "pages_a05_edudetail_a05_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", + "community": 16, + "norm_label": "css \u110f\u1173\u11af\u1105\u1162\u1109\u1173 \u1100\u116e\u110c\u1169" + }, + { + "label": "\ubc18\uc751\ud615", + "file_type": "document", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L56", + "_origin": "ast", + "id": "pages_a05_edudetail_a05_frontend_\ubc18\uc751\ud615", + "community": 16, + "norm_label": "\u1107\u1161\u11ab\u110b\u1173\u11bc\u1112\u1167\u11bc" + }, + { + "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", + "file_type": "document", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L59", + "_origin": "ast", + "id": "pages_a05_edudetail_a05_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "community": 16, + "norm_label": "\u110b\u1175\u1107\u1166\u11ab\u1110\u1173 \u1112\u1162\u11ab\u1103\u1173\u11af\u1105\u1165" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L65", + "_origin": "ast", + "id": "pages_a05_edudetail_a05_frontend_\uc758\uc874\uc131", + "community": 16, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "A06_backend.md", + "file_type": "document", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a06_login_a06_backend", + "community": 17, + "norm_label": "a06_backend.md" + }, + { + "label": "A06_Login \u2014 Backend", + "file_type": "document", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a06_login_a06_backend_a06_login_backend", + "community": 17, + "norm_label": "a06_login \u2014 backend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a06_login_a06_backend_\ud30c\uc77c_\uad6c\uc870", + "community": 17, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "API \uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "file_type": "document", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_a06_login_a06_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "community": 17, + "norm_label": "api \u110b\u1166\u11ab\u1103\u1173\u1111\u1169\u110b\u1175\u11ab\u1110\u1173" + }, + { + "label": "\ub0b4\ubd80 \ud5ec\ud37c", + "file_type": "document", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L29", + "_origin": "ast", + "id": "pages_a06_login_a06_backend_\ub0b4\ubd80_\ud5ec\ud37c", + "community": 17, + "norm_label": "\u1102\u1162\u1107\u116e \u1112\u1166\u11af\u1111\u1165" + }, + { + "label": "\uc694\uccad \uc2a4\ud0a4\ub9c8 (Pydantic)", + "file_type": "document", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L37", + "_origin": "ast", + "id": "pages_a06_login_a06_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", + "community": 17, + "norm_label": "\u110b\u116d\u110e\u1165\u11bc \u1109\u1173\u110f\u1175\u1106\u1161 (pydantic)" + }, + { + "label": "\ub85c\uadf8\uc778 \ub85c\uc9c1 \ud750\ub984", + "file_type": "document", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L45", + "_origin": "ast", + "id": "pages_a06_login_a06_backend_\ub85c\uadf8\uc778_\ub85c\uc9c1_\ud750\ub984", + "community": 17, + "norm_label": "\u1105\u1169\u1100\u1173\u110b\u1175\u11ab \u1105\u1169\u110c\u1175\u11a8 \u1112\u1173\u1105\u1173\u11b7" + }, + { + "label": "\ubcf4\uc548 \uc815\ucc45 (\uc2e4 \ucf54\ub4dc \uae30\uc900)", + "file_type": "document", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L54", + "_origin": "ast", + "id": "pages_a06_login_a06_backend_\ubcf4\uc548_\uc815\ucc45_\uc2e4_\ucf54\ub4dc_\uae30\uc900", + "community": 17, + "norm_label": "\u1107\u1169\u110b\u1161\u11ab \u110c\u1165\u11bc\u110e\u1162\u11a8 (\u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1100\u1175\u110c\u116e\u11ab)" + }, + { + "label": "\uc758\uc874\uc131 (\uacf5\ud1b5 \uc720\ud2f8)", + "file_type": "document", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L60", + "_origin": "ast", + "id": "pages_a06_login_a06_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", + "community": 17, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc (\u1100\u1169\u11bc\u1110\u1169\u11bc \u110b\u1172\u1110\u1175\u11af)" + }, + { + "label": "\u26a0\ufe0f \uacc4\ud68d\uc11c\uc640 \uc2e4 \ucf54\ub4dc \ubd88\uc77c\uce58", + "file_type": "document", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L66", + "_origin": "ast", + "id": "pages_a06_login_a06_backend_\uacc4\ud68d\uc11c\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58", + "community": 17, + "norm_label": "\u26a0\ufe0f \u1100\u1168\u1112\u116c\u11a8\u1109\u1165\u110b\u116a \u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1107\u116e\u11af\u110b\u1175\u11af\u110e\u1175" + }, + { + "label": "A06_frontend.md", + "file_type": "document", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a06_login_a06_frontend", + "community": 18, + "norm_label": "a06_frontend.md" + }, + { + "label": "A06_Login \u2014 Frontend", + "file_type": "document", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a06_login_a06_frontend_a06_login_frontend", + "community": 18, + "norm_label": "a06_login \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a06_login_a06_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 18, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", + "file_type": "document", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L20", + "_origin": "ast", + "id": "pages_a06_login_a06_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "community": 18, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 / \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8 \ud568\uc218", + "file_type": "document", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L27", + "_origin": "ast", + "id": "pages_a06_login_a06_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", + "community": 18, + "norm_label": "api \u110f\u1173\u11af\u1105\u1161\u110b\u1175\u110b\u1165\u11ab\u1110\u1173 \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\uc81c\ucd9c \ub85c\uc9c1 (2\ub2e8\uacc4 \ud3fc \uc804\ud658)", + "file_type": "document", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L40", + "_origin": "ast", + "id": "pages_a06_login_a06_frontend_\uc81c\ucd9c_\ub85c\uc9c1_2\ub2e8\uacc4_\ud3fc_\uc804\ud658", + "community": 18, + "norm_label": "\u110c\u1166\u110e\u116e\u11af \u1105\u1169\u110c\u1175\u11a8 (2\u1103\u1161\u11ab\u1100\u1168 \u1111\u1169\u11b7 \u110c\u1165\u11ab\u1112\u116a\u11ab)" + }, + { + "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "file_type": "document", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L51", + "_origin": "ast", + "id": "pages_a06_login_a06_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "community": 18, + "norm_label": "\u1105\u1169\u110f\u1165\u11af\u1105\u1161\u110b\u1175\u110c\u1166\u110b\u1175\u1109\u1167\u11ab" + }, + { + "label": "\uc2a4\ud0c0\uc77c (CSS)", + "file_type": "document", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L64", + "_origin": "ast", + "id": "pages_a06_login_a06_frontend_\uc2a4\ud0c0\uc77c_css", + "community": 18, + "norm_label": "\u1109\u1173\u1110\u1161\u110b\u1175\u11af (css)" + }, + { + "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", + "file_type": "document", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L72", + "_origin": "ast", + "id": "pages_a06_login_a06_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "community": 18, + "norm_label": "\u110b\u1175\u1107\u1166\u11ab\u1110\u1173 \u1112\u1162\u11ab\u1103\u1173\u11af\u1105\u1165" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L79", + "_origin": "ast", + "id": "pages_a06_login_a06_frontend_\uc758\uc874\uc131", + "community": 18, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "A07_backend.md", + "file_type": "document", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a07_register_a07_backend", + "community": 25, + "norm_label": "a07_backend.md" + }, + { + "label": "A07_Register \u2014 Backend", + "file_type": "document", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a07_register_a07_backend_a07_register_backend", + "community": 25, + "norm_label": "a07_register \u2014 backend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a07_register_a07_backend_\ud30c\uc77c_\uad6c\uc870", + "community": 25, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "API \uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "file_type": "document", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_a07_register_a07_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "community": 25, + "norm_label": "api \u110b\u1166\u11ab\u1103\u1173\u1111\u1169\u110b\u1175\u11ab\u1110\u1173" + }, + { + "label": "\uc694\uccad \uc2a4\ud0a4\ub9c8 (Pydantic)", + "file_type": "document", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L27", + "_origin": "ast", + "id": "pages_a07_register_a07_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", + "community": 25, + "norm_label": "\u110b\u116d\u110e\u1165\u11bc \u1109\u1173\u110f\u1175\u1106\u1161 (pydantic)" + }, + { + "label": "\uac00\uc785 \ub85c\uc9c1 \ud750\ub984", + "file_type": "document", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L36", + "_origin": "ast", + "id": "pages_a07_register_a07_backend_\uac00\uc785_\ub85c\uc9c1_\ud750\ub984", + "community": 25, + "norm_label": "\u1100\u1161\u110b\u1175\u11b8 \u1105\u1169\u110c\u1175\u11a8 \u1112\u1173\u1105\u1173\u11b7" + }, + { + "label": "\uc758\uc874\uc131 (\uacf5\ud1b5 \uc720\ud2f8)", + "file_type": "document", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L48", + "_origin": "ast", + "id": "pages_a07_register_a07_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", + "community": 25, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc (\u1100\u1169\u11bc\u1110\u1169\u11bc \u110b\u1172\u1110\u1175\u11af)" + }, + { + "label": "\ucc38\uace0", + "file_type": "document", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L54", + "_origin": "ast", + "id": "pages_a07_register_a07_backend_\ucc38\uace0", + "community": 25, + "norm_label": "\u110e\u1161\u11b7\u1100\u1169" + }, + { + "label": "A07_frontend.md", + "file_type": "document", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a07_register_a07_frontend", + "community": 10, + "norm_label": "a07_frontend.md" + }, + { + "label": "A07_Register \u2014 Frontend", + "file_type": "document", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a07_register_a07_frontend_a07_register_frontend", + "community": 10, + "norm_label": "a07_register \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a07_register_a07_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 10, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218 (UI_Auth_Page \u2014 \uc2e4\uc0ac\uc6a9)", + "file_type": "document", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L24", + "_origin": "ast", + "id": "pages_a07_register_a07_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218_ui_auth_page_\uc2e4\uc0ac\uc6a9", + "community": 10, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 / \u1112\u1161\u11b7\u1109\u116e (ui_auth_page \u2014 \u1109\u1175\u11af\u1109\u1161\u110b\u116d\u11bc)" + }, + { + "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8 \ud568\uc218", + "file_type": "document", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L33", + "_origin": "ast", + "id": "pages_a07_register_a07_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", + "community": 10, + "norm_label": "api \u110f\u1173\u11af\u1105\u1161\u110b\u1175\u110b\u1165\u11ab\u1110\u1173 \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\uc81c\ucd9c \ub85c\uc9c1 (2\ub2e8\uacc4 \ud3fc \uc804\ud658)", + "file_type": "document", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L43", + "_origin": "ast", + "id": "pages_a07_register_a07_frontend_\uc81c\ucd9c_\ub85c\uc9c1_2\ub2e8\uacc4_\ud3fc_\uc804\ud658", + "community": 10, + "norm_label": "\u110c\u1166\u110e\u116e\u11af \u1105\u1169\u110c\u1175\u11a8 (2\u1103\u1161\u11ab\u1100\u1168 \u1111\u1169\u11b7 \u110c\u1165\u11ab\u1112\u116a\u11ab)" + }, + { + "label": "\uc57d\uad00 \ub3d9\uc758 (\uc544\ucf54\ub514\uc5b8)", + "file_type": "document", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L50", + "_origin": "ast", + "id": "pages_a07_register_a07_frontend_\uc57d\uad00_\ub3d9\uc758_\uc544\ucf54\ub514\uc5b8", + "community": 10, + "norm_label": "\u110b\u1163\u11a8\u1100\u116a\u11ab \u1103\u1169\u11bc\u110b\u1174 (\u110b\u1161\u110f\u1169\u1103\u1175\u110b\u1165\u11ab)" + }, + { + "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "file_type": "document", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L56", + "_origin": "ast", + "id": "pages_a07_register_a07_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "community": 10, + "norm_label": "\u1105\u1169\u110f\u1165\u11af\u1105\u1161\u110b\u1175\u110c\u1166\u110b\u1175\u1109\u1167\u11ab" + }, + { + "label": "\uc2a4\ud0c0\uc77c (CSS)", + "file_type": "document", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L70", + "_origin": "ast", + "id": "pages_a07_register_a07_frontend_\uc2a4\ud0c0\uc77c_css", + "community": 10, + "norm_label": "\u1109\u1173\u1110\u1161\u110b\u1175\u11af (css)" + }, + { + "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", + "file_type": "document", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L77", + "_origin": "ast", + "id": "pages_a07_register_a07_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "community": 10, + "norm_label": "\u110b\u1175\u1107\u1166\u11ab\u1110\u1173 \u1112\u1162\u11ab\u1103\u1173\u11af\u1105\u1165" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L85", + "_origin": "ast", + "id": "pages_a07_register_a07_frontend_\uc758\uc874\uc131", + "community": 10, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "A08_backend.md", + "file_type": "document", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a08_support_a08_backend", + "community": 11, + "norm_label": "a08_backend.md" + }, + { + "label": "A08_Support \u2014 Backend", + "file_type": "document", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a08_support_a08_backend_a08_support_backend", + "community": 11, + "norm_label": "a08_support \u2014 backend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a08_support_a08_backend_\ud30c\uc77c_\uad6c\uc870", + "community": 11, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "API \uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "file_type": "document", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_a08_support_a08_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "community": 11, + "norm_label": "api \u110b\u1166\u11ab\u1103\u1173\u1111\u1169\u110b\u1175\u11ab\u1110\u1173" + }, + { + "label": "\ub0b4\ubd80 \ud5ec\ud37c", + "file_type": "document", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L25", + "_origin": "ast", + "id": "pages_a08_support_a08_backend_\ub0b4\ubd80_\ud5ec\ud37c", + "community": 11, + "norm_label": "\u1102\u1162\u1107\u116e \u1112\u1166\u11af\u1111\u1165" + }, + { + "label": "\uc694\uccad \uc2a4\ud0a4\ub9c8 (Pydantic)", + "file_type": "document", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L31", + "_origin": "ast", + "id": "pages_a08_support_a08_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", + "community": 11, + "norm_label": "\u110b\u116d\u110e\u1165\u11bc \u1109\u1173\u110f\u1175\u1106\u1161 (pydantic)" + }, + { + "label": "\uc811\uc218 \ub85c\uc9c1", + "file_type": "document", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L37", + "_origin": "ast", + "id": "pages_a08_support_a08_backend_\uc811\uc218_\ub85c\uc9c1", + "community": 11, + "norm_label": "\u110c\u1165\u11b8\u1109\u116e \u1105\u1169\u110c\u1175\u11a8" + }, + { + "label": "DB \uc800\uc7a5 \uceec\ub7fc (\uc2e4 \ucf54\ub4dc INSERT \uae30\uc900)", + "file_type": "document", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L44", + "_origin": "ast", + "id": "pages_a08_support_a08_backend_db_\uc800\uc7a5_\uceec\ub7fc_\uc2e4_\ucf54\ub4dc_insert_\uae30\uc900", + "community": 11, + "norm_label": "db \u110c\u1165\u110c\u1161\u11bc \u110f\u1165\u11af\u1105\u1165\u11b7 (\u1109\u1175\u11af \u110f\u1169\u1103\u1173 insert \u1100\u1175\u110c\u116e\u11ab)" + }, + { + "label": "\ud2b9\uc9d5", + "file_type": "document", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L51", + "_origin": "ast", + "id": "pages_a08_support_a08_backend_\ud2b9\uc9d5", + "community": 11, + "norm_label": "\u1110\u1173\u11a8\u110c\u1175\u11bc" + }, + { + "label": "\uc758\uc874\uc131 (\uacf5\ud1b5 \uc720\ud2f8)", + "file_type": "document", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L56", + "_origin": "ast", + "id": "pages_a08_support_a08_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", + "community": 11, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc (\u1100\u1169\u11bc\u1110\u1169\u11bc \u110b\u1172\u1110\u1175\u11af)" + }, + { + "label": "\u26a0\ufe0f DB \uc2a4\ud0a4\ub9c8 \ubd88\uc77c\uce58 (\ud655\uc778 \ud544\uc694)", + "file_type": "document", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L62", + "_origin": "ast", + "id": "pages_a08_support_a08_backend_db_\uc2a4\ud0a4\ub9c8_\ubd88\uc77c\uce58_\ud655\uc778_\ud544\uc694", + "community": 11, + "norm_label": "\u26a0\ufe0f db \u1109\u1173\u110f\u1175\u1106\u1161 \u1107\u116e\u11af\u110b\u1175\u11af\u110e\u1175 (\u1112\u116a\u11a8\u110b\u1175\u11ab \u1111\u1175\u11af\u110b\u116d)" + }, + { + "label": "A08_frontend.md", + "file_type": "document", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a08_support_a08_frontend", + "community": 12, + "norm_label": "a08_frontend.md" + }, + { + "label": "A08_Support \u2014 Frontend", + "file_type": "document", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a08_support_a08_frontend_a08_support_frontend", + "community": 12, + "norm_label": "a08_support \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a08_support_a08_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 12, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", + "file_type": "document", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_a08_support_a08_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "community": 12, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 / \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\uc81c\ucd9c \ub85c\uc9c1", + "file_type": "document", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L27", + "_origin": "ast", + "id": "pages_a08_support_a08_frontend_\uc81c\ucd9c_\ub85c\uc9c1", + "community": 12, + "norm_label": "\u110c\u1166\u110e\u116e\u11af \u1105\u1169\u110c\u1175\u11a8" + }, + { + "label": "\uc138\uc158 \uc790\ub3d9 \ucc44\uc6c0", + "file_type": "document", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L34", + "_origin": "ast", + "id": "pages_a08_support_a08_frontend_\uc138\uc158_\uc790\ub3d9_\ucc44\uc6c0", + "community": 12, + "norm_label": "\u1109\u1166\u1109\u1167\u11ab \u110c\u1161\u1103\u1169\u11bc \u110e\u1162\u110b\u116e\u11b7" + }, + { + "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "file_type": "document", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L39", + "_origin": "ast", + "id": "pages_a08_support_a08_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "community": 12, + "norm_label": "\u1105\u1169\u110f\u1165\u11af\u1105\u1161\u110b\u1175\u110c\u1166\u110b\u1175\u1109\u1167\u11ab" + }, + { + "label": "\uc2a4\ud0c0\uc77c (CSS)", + "file_type": "document", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L51", + "_origin": "ast", + "id": "pages_a08_support_a08_frontend_\uc2a4\ud0c0\uc77c_css", + "community": 12, + "norm_label": "\u1109\u1173\u1110\u1161\u110b\u1175\u11af (css)" + }, + { + "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", + "file_type": "document", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L59", + "_origin": "ast", + "id": "pages_a08_support_a08_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "community": 12, + "norm_label": "\u110b\u1175\u1107\u1166\u11ab\u1110\u1173 \u1112\u1162\u11ab\u1103\u1173\u11af\u1105\u1165" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L65", + "_origin": "ast", + "id": "pages_a08_support_a08_frontend_\uc758\uc874\uc131", + "community": 12, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "\ucc38\uace0", + "file_type": "document", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L73", + "_origin": "ast", + "id": "pages_a08_support_a08_frontend_\ucc38\uace0", + "community": 12, + "norm_label": "\u110e\u1161\u11b7\u1100\u1169" + }, + { + "label": "A09_backend.md", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a09_security_a09_backend", + "community": 6, + "norm_label": "a09_backend.md" + }, + { + "label": "A09_Security \u2014 Backend", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a09_security_a09_backend_a09_security_backend", + "community": 6, + "norm_label": "a09_security \u2014 backend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a09_security_a09_backend_\ud30c\uc77c_\uad6c\uc870", + "community": 6, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "API \uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_a09_security_a09_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "community": 6, + "norm_label": "api \u110b\u1166\u11ab\u1103\u1173\u1111\u1169\u110b\u1175\u11ab\u1110\u1173" + }, + { + "label": "\ub9c8\uc2a4\ud130(\ud68c\uc0ac \uad00\ub9ac\uc790) \uc804\uc6a9 \u2014 `require_master`", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L21", + "_origin": "ast", + "id": "pages_a09_security_a09_backend_\ub9c8\uc2a4\ud130_\ud68c\uc0ac_\uad00\ub9ac\uc790_\uc804\uc6a9_require_master", + "community": 6, + "norm_label": "\u1106\u1161\u1109\u1173\u1110\u1165(\u1112\u116c\u1109\u1161 \u1100\u116a\u11ab\u1105\u1175\u110c\u1161) \u110c\u1165\u11ab\u110b\u116d\u11bc \u2014 `require_master`" + }, + { + "label": "\uc2dc\uc2a4\ud15c \uad00\ub9ac\uc790 \uc804\uc6a9 \u2014 `require_system_admin`", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L31", + "_origin": "ast", + "id": "pages_a09_security_a09_backend_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790_\uc804\uc6a9_require_system_admin", + "community": 6, + "norm_label": "\u1109\u1175\u1109\u1173\u1110\u1166\u11b7 \u1100\u116a\u11ab\u1105\u1175\u110c\u1161 \u110c\u1165\u11ab\u110b\u116d\u11bc \u2014 `require_system_admin`" + }, + { + "label": "\uc778\uc99d \uc0ac\uc6a9\uc790 \uacf5\ud1b5 \u2014 `verify_session`", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L39", + "_origin": "ast", + "id": "pages_a09_security_a09_backend_\uc778\uc99d_\uc0ac\uc6a9\uc790_\uacf5\ud1b5_verify_session", + "community": 6, + "norm_label": "\u110b\u1175\u11ab\u110c\u1173\u11bc \u1109\u1161\u110b\u116d\u11bc\u110c\u1161 \u1100\u1169\u11bc\u1110\u1169\u11bc \u2014 `verify_session`" + }, + { + "label": "\uc694\uccad \uc2a4\ud0a4\ub9c8 (Pydantic)", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L45", + "_origin": "ast", + "id": "pages_a09_security_a09_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", + "community": 6, + "norm_label": "\u110b\u116d\u110e\u1165\u11bc \u1109\u1173\u110f\u1175\u1106\u1161 (pydantic)" + }, + { + "label": "DB \uc800\uc7a5 (activity_logs)", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L55", + "_origin": "ast", + "id": "pages_a09_security_a09_backend_db_\uc800\uc7a5_activity_logs", + "community": 6, + "norm_label": "db \u110c\u1165\u110c\u1161\u11bc (activity_logs)" + }, + { + "label": "\uad8c\ud55c \ud5ec\ud37c", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L60", + "_origin": "ast", + "id": "pages_a09_security_a09_backend_\uad8c\ud55c_\ud5ec\ud37c", + "community": 6, + "norm_label": "\u1100\u116f\u11ab\u1112\u1161\u11ab \u1112\u1166\u11af\u1111\u1165" + }, + { + "label": "\uc758\uc874\uc131 (\uacf5\ud1b5 \uc720\ud2f8)", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L67", + "_origin": "ast", + "id": "pages_a09_security_a09_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", + "community": 6, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc (\u1100\u1169\u11bc\u1110\u1169\u11bc \u110b\u1172\u1110\u1175\u11af)" + }, + { + "label": "\ucc38\uace0", + "file_type": "document", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L73", + "_origin": "ast", + "id": "pages_a09_security_a09_backend_\ucc38\uace0", + "community": 6, + "norm_label": "\u110e\u1161\u11b7\u1100\u1169" + }, + { + "label": "A09_frontend.md", + "file_type": "document", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_a09_security_a09_frontend", + "community": 19, + "norm_label": "a09_frontend.md" + }, + { + "label": "A09_Security \u2014 Frontend", + "file_type": "document", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_a09_security_a09_frontend_a09_security_frontend", + "community": 19, + "norm_label": "a09_security \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_a09_security_a09_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 19, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", + "file_type": "document", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L25", + "_origin": "ast", + "id": "pages_a09_security_a09_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "community": 19, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 / \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\uc57d\uad00 \ub370\uc774\ud130 (A09_Security_Terms.ts)", + "file_type": "document", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L31", + "_origin": "ast", + "id": "pages_a09_security_a09_frontend_\uc57d\uad00_\ub370\uc774\ud130_a09_security_terms_ts", + "community": 19, + "norm_label": "\u110b\u1163\u11a8\u1100\u116a\u11ab \u1103\u1166\u110b\u1175\u1110\u1165 (a09_security_terms.ts)" + }, + { + "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8 \ud568\uc218 (\u26a0\ufe0f \ubbf8\uc0ac\uc6a9, \uc815\uc758\ub9cc)", + "file_type": "document", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L40", + "_origin": "ast", + "id": "pages_a09_security_a09_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218_\ubbf8\uc0ac\uc6a9_\uc815\uc758\ub9cc", + "community": 19, + "norm_label": "api \u110f\u1173\u11af\u1105\u1161\u110b\u1175\u110b\u1165\u11ab\u1110\u1173 \u1112\u1161\u11b7\u1109\u116e (\u26a0\ufe0f \u1106\u1175\u1109\u1161\u110b\u116d\u11bc, \u110c\u1165\u11bc\u110b\u1174\u1106\u1161\u11ab)" + }, + { + "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "file_type": "document", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L53", + "_origin": "ast", + "id": "pages_a09_security_a09_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "community": 19, + "norm_label": "\u1105\u1169\u110f\u1165\u11af\u1105\u1161\u110b\u1175\u110c\u1166\u110b\u1175\u1109\u1167\u11ab" + }, + { + "label": "\uc2a4\ud0c0\uc77c (CSS)", + "file_type": "document", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L64", + "_origin": "ast", + "id": "pages_a09_security_a09_frontend_\uc2a4\ud0c0\uc77c_css", + "community": 19, + "norm_label": "\u1109\u1173\u1110\u1161\u110b\u1175\u11af (css)" + }, + { + "label": "\u26a0\ufe0f \uc57d\uad00 \ud14d\uc2a4\ud2b8\uc640 \uc2e4 \ucf54\ub4dc \ubd88\uc77c\uce58", + "file_type": "document", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L69", + "_origin": "ast", + "id": "pages_a09_security_a09_frontend_\uc57d\uad00_\ud14d\uc2a4\ud2b8\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58", + "community": 19, + "norm_label": "\u26a0\ufe0f \u110b\u1163\u11a8\u1100\u116a\u11ab \u1110\u1166\u11a8\u1109\u1173\u1110\u1173\u110b\u116a \u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1107\u116e\u11af\u110b\u1175\u11af\u110e\u1175" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L75", + "_origin": "ast", + "id": "pages_a09_security_a09_frontend_\uc758\uc874\uc131", + "community": 19, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "B01_api.md", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_api", + "community": 1, + "norm_label": "b01_api.md" + }, + { + "label": "B01_Dashboard \u2014 API", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_api_b01_dashboard_api", + "community": 1, + "norm_label": "b01_dashboard \u2014 api" + }, + { + "label": "\uc0ac\uc6a9\uc790\u00b7\ud68c\uc0ac", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L14", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_api_\uc0ac\uc6a9\uc790_\ud68c\uc0ac", + "community": 1, + "norm_label": "\u1109\u1161\u110b\u116d\u11bc\u110c\u1161\u00b7\u1112\u116c\u1109\u1161" + }, + { + "label": "\ud68c\uc0ac \uad00\ub9ac\uc790", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L25", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_api_\ud68c\uc0ac_\uad00\ub9ac\uc790", + "community": 1, + "norm_label": "\u1112\u116c\u1109\u1161 \u1100\u116a\u11ab\u1105\u1175\u110c\u1161" + }, + { + "label": "\ud504\ub85c\uc81d\ud2b8\u00b7\uc790\ub3d9\ud654", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L35", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_api_\ud504\ub85c\uc81d\ud2b8_\uc790\ub3d9\ud654", + "community": 1, + "norm_label": "\u1111\u1173\u1105\u1169\u110c\u1166\u11a8\u1110\u1173\u00b7\u110c\u1161\u1103\u1169\u11bc\u1112\u116a" + }, + { + "label": "\uc2dc\uc2a4\ud15c \uad00\ub9ac\uc790", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L46", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_api_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790", + "community": 1, + "norm_label": "\u1109\u1175\u1109\u1173\u1110\u1166\u11b7 \u1100\u116a\u11ab\u1105\u1175\u110c\u1161" + }, + { + "label": "B01_backend.md", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_backend", + "community": 1, + "norm_label": "b01_backend.md" + }, + { + "label": "B01_Dashboard \u2014 Backend", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_backend_b01_dashboard_backend", + "community": 1, + "norm_label": "b01_dashboard \u2014 backend" + }, + { + "label": "\ub77c\uc6b0\ud130 \uad8c\ud55c \ud5ec\ud37c", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_backend_\ub77c\uc6b0\ud130_\uad8c\ud55c_\ud5ec\ud37c", + "community": 1, + "norm_label": "\u1105\u1161\u110b\u116e\u1110\u1165 \u1100\u116f\u11ab\u1112\u1161\u11ab \u1112\u1166\u11af\u1111\u1165" + }, + { + "label": "\uc800\uc7a5\uc18c \ud568\uc218", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L24", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_backend_\uc800\uc7a5\uc18c_\ud568\uc218", + "community": 1, + "norm_label": "\u110c\u1165\u110c\u1161\u11bc\u1109\u1169 \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\uc694\uccad \uc2a4\ud0a4\ub9c8", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L44", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8", + "community": 1, + "norm_label": "\u110b\u116d\u110e\u1165\u11bc \u1109\u1173\u110f\u1175\u1106\u1161" + }, + { + "label": "\uae30\uc220\ubd80\ucc44", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L54", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_backend_\uae30\uc220\ubd80\ucc44", + "community": 1, + "norm_label": "\u1100\u1175\u1109\u116e\u11af\u1107\u116e\u110e\u1162" + }, + { + "label": "B01_db.md", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_db.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_db", + "community": 43, + "norm_label": "b01_db.md" + }, + { + "label": "B01_Dashboard \u2014 DB \uc0ac\uc6a9 \uad00\uacc4", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_db.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_db_b01_dashboard_db_\uc0ac\uc6a9_\uad00\uacc4", + "community": 43, + "norm_label": "b01_dashboard \u2014 db \u1109\u1161\u110b\u116d\u11bc \u1100\u116a\u11ab\u1100\u1168" + }, + { + "label": "\ud2b8\ub79c\uc7ad\uc158 \uacbd\uacc4", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_db.md", + "source_location": "L25", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_db_\ud2b8\ub79c\uc7ad\uc158_\uacbd\uacc4", + "community": 43, + "norm_label": "\u1110\u1173\u1105\u1162\u11ab\u110c\u1162\u11a8\u1109\u1167\u11ab \u1100\u1167\u11bc\u1100\u1168" + }, + { + "label": "B01_dependencies.md", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_dependencies.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_dependencies", + "community": 5, + "norm_label": "b01_dependencies.md" + }, + { + "label": "B01_Dashboard \u2014 Dependencies", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_dependencies.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_dependencies_b01_dashboard_dependencies", + "community": 5, + "norm_label": "b01_dashboard \u2014 dependencies" + }, + { + "label": "\ud504\ub85c\uc81d\ud2b8 \uacf5\ud1b5 \ubaa8\ub4c8", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_dependencies.md", + "source_location": "L23", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_dependencies_\ud504\ub85c\uc81d\ud2b8_\uacf5\ud1b5_\ubaa8\ub4c8", + "community": 5, + "norm_label": "\u1111\u1173\u1105\u1169\u110c\u1166\u11a8\u1110\u1173 \u1100\u1169\u11bc\u1110\u1169\u11bc \u1106\u1169\u1103\u1172\u11af" + }, + { + "label": "B01_frontend.md", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_frontend", + "community": 5, + "norm_label": "b01_frontend.md" + }, + { + "label": "B01_Dashboard \u2014 Frontend", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", + "community": 5, + "norm_label": "b01_dashboard \u2014 frontend" + }, + { + "label": "\ud30c\uc77c\uacfc \uc9c4\uc785\uc810", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_frontend_\ud30c\uc77c\uacfc_\uc9c4\uc785\uc810", + "community": 5, + "norm_label": "\u1111\u1161\u110b\u1175\u11af\u1100\u116a \u110c\u1175\u11ab\u110b\u1175\u11b8\u110c\u1165\u11b7" + }, + { + "label": "UI \uad8c\ud55c \ud5ec\ud37c", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L20", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_frontend_ui_\uad8c\ud55c_\ud5ec\ud37c", + "community": 5, + "norm_label": "ui \u1100\u116f\u11ab\u1112\u1161\u11ab \u1112\u1166\u11af\u1111\u1165" + }, + { + "label": "\ubaa8\ub2ec", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L32", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_frontend_\ubaa8\ub2ec", + "community": 5, + "norm_label": "\u1106\u1169\u1103\u1161\u11af" + }, + { + "label": "\uacf5\uc720 \uc790\uc6d0 \uc5f0\uacb0", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L45", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_frontend_\uacf5\uc720_\uc790\uc6d0_\uc5f0\uacb0", + "community": 5, + "norm_label": "\u1100\u1169\u11bc\u110b\u1172 \u110c\u1161\u110b\u116f\u11ab \u110b\u1167\u11ab\u1100\u1167\u11af" + }, + { + "label": "\uae30\uc220\ubd80\ucc44", + "file_type": "document", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L52", + "_origin": "ast", + "id": "pages_b01_dashboard_b01_frontend_\uae30\uc220\ubd80\ucc44", + "community": 5, + "norm_label": "\u1100\u1175\u1109\u116e\u11af\u1107\u116e\u110e\u1162" + }, + { + "label": "B02_backend.md", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b02_projregister_b02_backend", + "community": 20, + "norm_label": "b02_backend.md" + }, + { + "label": "B02_ProjRegister \u2014 Backend", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_b02_projregister_b02_backend_b02_projregister_backend", + "community": 20, + "norm_label": "b02_projregister \u2014 backend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L14", + "_origin": "ast", + "id": "pages_b02_projregister_b02_backend_\ud30c\uc77c_\uad6c\uc870", + "community": 20, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "API \uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L22", + "_origin": "ast", + "id": "pages_b02_projregister_b02_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "community": 20, + "norm_label": "api \u110b\u1166\u11ab\u1103\u1173\u1111\u1169\u110b\u1175\u11ab\u1110\u1173" + }, + { + "label": "\ud568\uc218", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L28", + "_origin": "ast", + "id": "pages_b02_projregister_b02_backend_\ud568\uc218", + "community": 20, + "norm_label": "\u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\uc694\uccad/\uc751\ub2f5 \uc2a4\ud0a4\ub9c8 (Pydantic)", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L38", + "_origin": "ast", + "id": "pages_b02_projregister_b02_backend_\uc694\uccad_\uc751\ub2f5_\uc2a4\ud0a4\ub9c8_pydantic", + "community": 20, + "norm_label": "\u110b\u116d\u110e\u1165\u11bc/\u110b\u1173\u11bc\u1103\u1161\u11b8 \u1109\u1173\u110f\u1175\u1106\u1161 (pydantic)" + }, + { + "label": "\uc0dd\uc131 \ub85c\uc9c1 (create_project \ud2b8\ub79c\uc7ad\uc158)", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L45", + "_origin": "ast", + "id": "pages_b02_projregister_b02_backend_\uc0dd\uc131_\ub85c\uc9c1_create_project_\ud2b8\ub79c\uc7ad\uc158", + "community": 20, + "norm_label": "\u1109\u1162\u11bc\u1109\u1165\u11bc \u1105\u1169\u110c\u1175\u11a8 (create_project \u1110\u1173\u1105\u1162\u11ab\u110c\u1162\u11a8\u1109\u1167\u11ab)" + }, + { + "label": "DB \uc800\uc7a5 \uceec\ub7fc (projects INSERT)", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L56", + "_origin": "ast", + "id": "pages_b02_projregister_b02_backend_db_\uc800\uc7a5_\uceec\ub7fc_projects_insert", + "community": 20, + "norm_label": "db \u110c\u1165\u110c\u1161\u11bc \u110f\u1165\u11af\u1105\u1165\u11b7 (projects insert)" + }, + { + "label": "\uc758\uc874\uc131 (\uacf5\ud1b5 \uc720\ud2f8)", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L61", + "_origin": "ast", + "id": "pages_b02_projregister_b02_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", + "community": 20, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc (\u1100\u1169\u11bc\u1110\u1169\u11bc \u110b\u1172\u1110\u1175\u11af)" + }, + { + "label": "\ucc38\uace0", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L69", + "_origin": "ast", + "id": "pages_b02_projregister_b02_backend_\ucc38\uace0", + "community": 20, + "norm_label": "\u110e\u1161\u11b7\u1100\u1169" + }, + { + "label": "B02_db.md", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_db.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b02_projregister_b02_db", + "community": 34, + "norm_label": "b02_db.md" + }, + { + "label": "B02_ProjRegister \u2014 DB", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_db.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_b02_projregister_b02_db_b02_projregister_db", + "community": 34, + "norm_label": "b02_projregister \u2014 db" + }, + { + "label": "\uc4f0\ub294 \ud14c\uc774\ube14", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_db.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b02_projregister_b02_db_\uc4f0\ub294_\ud14c\uc774\ube14", + "community": 34, + "norm_label": "\u110a\u1173\u1102\u1173\u11ab \u1110\u1166\u110b\u1175\u1107\u1173\u11af" + }, + { + "label": "\uc800\uc7a5\uc18c(\ud30c\uc77c\uc2dc\uc2a4\ud15c)", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_db.md", + "source_location": "L20", + "_origin": "ast", + "id": "pages_b02_projregister_b02_db_\uc800\uc7a5\uc18c_\ud30c\uc77c\uc2dc\uc2a4\ud15c", + "community": 34, + "norm_label": "\u110c\u1165\u110c\u1161\u11bc\u1109\u1169(\u1111\u1161\u110b\u1175\u11af\u1109\u1175\u1109\u1173\u1110\u1166\u11b7)" + }, + { + "label": "\ucc38\uace0 (\uacc4\ud68d \ub2f9\uc2dc \uc758\ub3c4)", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_db.md", + "source_location": "L26", + "_origin": "ast", + "id": "pages_b02_projregister_b02_db_\ucc38\uace0_\uacc4\ud68d_\ub2f9\uc2dc_\uc758\ub3c4", + "community": 34, + "norm_label": "\u110e\u1161\u11b7\u1100\u1169 (\u1100\u1168\u1112\u116c\u11a8 \u1103\u1161\u11bc\u1109\u1175 \u110b\u1174\u1103\u1169)" + }, + { + "label": "B02_frontend.md", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b02_projregister_b02_frontend", + "community": 13, + "norm_label": "b02_frontend.md" + }, + { + "label": "B02_ProjRegister \u2014 Frontend", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_b02_projregister_b02_frontend_b02_projregister_frontend", + "community": 13, + "norm_label": "b02_projregister \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b02_projregister_b02_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 13, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_b02_projregister_b02_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "community": 13, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 / \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\uc785\ub825 \ud544\ub4dc", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L26", + "_origin": "ast", + "id": "pages_b02_projregister_b02_frontend_\uc785\ub825_\ud544\ub4dc", + "community": 13, + "norm_label": "\u110b\u1175\u11b8\u1105\u1167\u11a8 \u1111\u1175\u11af\u1103\u1173" + }, + { + "label": "\uc81c\ucd9c \ub85c\uc9c1", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L37", + "_origin": "ast", + "id": "pages_b02_projregister_b02_frontend_\uc81c\ucd9c_\ub85c\uc9c1", + "community": 13, + "norm_label": "\u110c\u1166\u110e\u116e\u11af \u1105\u1169\u110c\u1175\u11a8" + }, + { + "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L45", + "_origin": "ast", + "id": "pages_b02_projregister_b02_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "community": 13, + "norm_label": "\u1105\u1169\u110f\u1165\u11af\u1105\u1161\u110b\u1175\u110c\u1166\u110b\u1175\u1109\u1167\u11ab" + }, + { + "label": "\uc2a4\ud0c0\uc77c (CSS)", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L57", + "_origin": "ast", + "id": "pages_b02_projregister_b02_frontend_\uc2a4\ud0c0\uc77c_css", + "community": 13, + "norm_label": "\u1109\u1173\u1110\u1161\u110b\u1175\u11af (css)" + }, + { + "label": "\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L66", + "_origin": "ast", + "id": "pages_b02_projregister_b02_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "community": 13, + "norm_label": "\u110b\u1175\u1107\u1166\u11ab\u1110\u1173 \u1112\u1162\u11ab\u1103\u1173\u11af\u1105\u1165" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L72", + "_origin": "ast", + "id": "pages_b02_projregister_b02_frontend_\uc758\uc874\uc131", + "community": 13, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "\ucc38\uace0", + "file_type": "document", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L80", + "_origin": "ast", + "id": "pages_b02_projregister_b02_frontend_\ucc38\uace0", + "community": 13, + "norm_label": "\u110e\u1161\u11b7\u1100\u1169" + }, + { + "label": "B03_api.md", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_api", + "community": 1, + "norm_label": "b03_api.md" + }, + { + "label": "B03_FileInput \u2014 API", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_api_b03_fileinput_api", + "community": 1, + "norm_label": "b03_fileinput \u2014 api" + }, + { + "label": "\uc77c\ubc18 \uc5c5\ub85c\ub4dc", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L14", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_api_\uc77c\ubc18_\uc5c5\ub85c\ub4dc", + "community": 1, + "norm_label": "\u110b\u1175\u11af\u1107\u1161\u11ab \u110b\u1165\u11b8\u1105\u1169\u1103\u1173" + }, + { + "label": "\uccad\ud06c \uc5c5\ub85c\ub4dc", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_api_\uccad\ud06c_\uc5c5\ub85c\ub4dc", + "community": 1, + "norm_label": "\u110e\u1165\u11bc\u110f\u1173 \u110b\u1165\u11b8\u1105\u1169\u1103\u1173" + }, + { + "label": "workflow \uc870\ud68c", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L27", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_api_workflow_\uc870\ud68c", + "community": 1, + "norm_label": "workflow \u110c\u1169\u1112\u116c" + }, + { + "label": "B03_backend.md", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_backend", + "community": 2, + "norm_label": "b03_backend.md" + }, + { + "label": "B03_FileInput \u2014 Backend", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_backend_b03_fileinput_backend", + "community": 2, + "norm_label": "b03_fileinput \u2014 backend" + }, + { + "label": "\uc785\ub825 \uac80\uc99d\u00b7\ud30c\uc77c \ucc98\ub9ac", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_backend_\uc785\ub825_\uac80\uc99d_\ud30c\uc77c_\ucc98\ub9ac", + "community": 2, + "norm_label": "\u110b\u1175\u11b8\u1105\u1167\u11a8 \u1100\u1165\u11b7\u110c\u1173\u11bc\u00b7\u1111\u1161\u110b\u1175\u11af \u110e\u1165\u1105\u1175" + }, + { + "label": "\uba54\ud0c0\ub370\uc774\ud130 \ubd84\uc11d", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L22", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_backend_\uba54\ud0c0\ub370\uc774\ud130_\ubd84\uc11d", + "community": 2, + "norm_label": "\u1106\u1166\u1110\u1161\u1103\u1166\u110b\u1175\u1110\u1165 \u1107\u116e\u11ab\u1109\u1165\u11a8" + }, + { + "label": "\uc800\uc7a5\uc18c", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L31", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_backend_\uc800\uc7a5\uc18c", + "community": 2, + "norm_label": "\u110c\u1165\u110c\u1161\u11bc\u1109\u1169" + }, + { + "label": "workflow\u00b7\uc54c\ub9bc", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L40", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_backend_workflow_\uc54c\ub9bc", + "community": 2, + "norm_label": "workflow\u00b7\u110b\u1161\u11af\u1105\u1175\u11b7" + }, + { + "label": "B03_db.md", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_db.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_db", + "community": 44, + "norm_label": "b03_db.md" + }, + { + "label": "B03_FileInput \u2014 DB \uc0ac\uc6a9 \uad00\uacc4", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_db.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_db_b03_fileinput_db_\uc0ac\uc6a9_\uad00\uacc4", + "community": 44, + "norm_label": "b03_fileinput \u2014 db \u1109\u1161\u110b\u116d\u11bc \u1100\u116a\u11ab\u1100\u1168" + }, + { + "label": "\ud30c\uc77c \uacbd\ub85c", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_db.md", + "source_location": "L22", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_db_\ud30c\uc77c_\uacbd\ub85c", + "community": 44, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u1167\u11bc\u1105\u1169" + }, + { + "label": "B03_dependencies.md", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_dependencies.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_dependencies", + "community": 2, + "norm_label": "b03_dependencies.md" + }, + { + "label": "B03_FileInput \u2014 Dependencies", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_dependencies.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_dependencies_b03_fileinput_dependencies", + "community": 2, + "norm_label": "b03_fileinput \u2014 dependencies" + }, + { + "label": "\uacf5\ud1b5 \ubaa8\ub4c8", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_dependencies.md", + "source_location": "L24", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", + "community": 2, + "norm_label": "\u1100\u1169\u11bc\u1110\u1169\u11bc \u1106\u1169\u1103\u1172\u11af" + }, + { + "label": "B03_frontend.md", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_frontend", + "community": 5, + "norm_label": "b03_frontend.md" + }, + { + "label": "B03_FileInput \u2014 Frontend", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", + "community": 5, + "norm_label": "b03_fileinput \u2014 frontend" + }, + { + "label": "\ud398\uc774\uc9c0\u00b7\uc5c5\ub85c\ub4dc \ud750\ub984", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_frontend_\ud398\uc774\uc9c0_\uc5c5\ub85c\ub4dc_\ud750\ub984", + "community": 5, + "norm_label": "\u1111\u1166\u110b\u1175\u110c\u1175\u00b7\u110b\u1165\u11b8\u1105\u1169\u1103\u1173 \u1112\u1173\u1105\u1173\u11b7" + }, + { + "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L21", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", + "community": 5, + "norm_label": "api \u110f\u1173\u11af\u1105\u1161\u110b\u1175\u110b\u1165\u11ab\u1110\u1173" + }, + { + "label": "\ube0c\ub77c\uc6b0\uc800 \uc0c1\ud0dc\u00b7\uc624\ud504\ub77c\uc778 \ubcf4\uc870", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L31", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_frontend_\ube0c\ub77c\uc6b0\uc800_\uc0c1\ud0dc_\uc624\ud504\ub77c\uc778_\ubcf4\uc870", + "community": 5, + "norm_label": "\u1107\u1173\u1105\u1161\u110b\u116e\u110c\u1165 \u1109\u1161\u11bc\u1110\u1162\u00b7\u110b\u1169\u1111\u1173\u1105\u1161\u110b\u1175\u11ab \u1107\u1169\u110c\u1169" + }, + { + "label": "\uae30\uc220\ubd80\ucc44", + "file_type": "document", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L42", + "_origin": "ast", + "id": "pages_b03_fileinput_b03_frontend_\uae30\uc220\ubd80\ucc44", + "community": 5, + "norm_label": "\u1100\u1175\u1109\u116e\u11af\u1107\u116e\u110e\u1162" + }, + { + "label": "B04_api.md", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_api.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_api", + "community": 40, + "norm_label": "b04_api.md" + }, + { + "label": "B04_wf1_Surface \u2014 API", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_api.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_api_b04_wf1_surface_api", + "community": 40, + "norm_label": "b04_wf1_surface \u2014 api" + }, + { + "label": "\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_api.md", + "source_location": "L15", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "community": 40, + "norm_label": "\u110b\u1166\u11ab\u1103\u1173\u1111\u1169\u110b\u1175\u11ab\u1110\u1173" + }, + { + "label": "\uc694\uccad/\uc751\ub2f5 \uc2a4\ud0a4\ub9c8 (Pydantic)", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_api.md", + "source_location": "L31", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_api_\uc694\uccad_\uc751\ub2f5_\uc2a4\ud0a4\ub9c8_pydantic", + "community": 40, + "norm_label": "\u110b\u116d\u110e\u1165\u11bc/\u110b\u1173\u11bc\u1103\u1161\u11b8 \u1109\u1173\u110f\u1175\u1106\u1161 (pydantic)" + }, + { + "label": "B04_backend.md", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_backend", + "community": 23, + "norm_label": "b04_backend.md" + }, + { + "label": "B04_wf1_Surface \u2014 Backend", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", + "community": 23, + "norm_label": "b04_wf1_surface \u2014 backend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc131 (\uc624\ucf00\uc2a4\ud2b8\ub808\uc774\ud130/\uc800\uc7a5\uc18c/\ub77c\uc6b0\ud130)", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_backend_\ud30c\uc77c_\uad6c\uc131_\uc624\ucf00\uc2a4\ud2b8\ub808\uc774\ud130_\uc800\uc7a5\uc18c_\ub77c\uc6b0\ud130", + "community": 23, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u1109\u1165\u11bc (\u110b\u1169\u110f\u1166\u1109\u1173\u1110\u1173\u1105\u1166\u110b\u1175\u1110\u1165/\u110c\u1165\u110c\u1161\u11bc\u1109\u1169/\u1105\u1161\u110b\u116e\u1110\u1165)" + }, + { + "label": "\uc5d4\uc9c4 \uc11c\ube0c\ubaa8\ub4c8", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L21", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_backend_\uc5d4\uc9c4_\uc11c\ube0c\ubaa8\ub4c8", + "community": 23, + "norm_label": "\u110b\u1166\u11ab\u110c\u1175\u11ab \u1109\u1165\u1107\u1173\u1106\u1169\u1103\u1172\u11af" + }, + { + "label": "\uc8fc\uc694 \ud568\uc218 (Router)", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L35", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_backend_\uc8fc\uc694_\ud568\uc218_router", + "community": 23, + "norm_label": "\u110c\u116e\u110b\u116d \u1112\u1161\u11b7\u1109\u116e (router)" + }, + { + "label": "\uc6cc\ud06c\ud50c\ub85c\uc6b0 \uc0c1\ud0dc \uc804\uc774", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L44", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_backend_\uc6cc\ud06c\ud50c\ub85c\uc6b0_\uc0c1\ud0dc_\uc804\uc774", + "community": 23, + "norm_label": "\u110b\u116f\u110f\u1173\u1111\u1173\u11af\u1105\u1169\u110b\u116e \u1109\u1161\u11bc\u1110\u1162 \u110c\u1165\u11ab\u110b\u1175" + }, + { + "label": "\u26a0\ufe0f \ub808\uac70\uc2dc \ud3f4\ubc31 (416,420\uc904)", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L53", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_backend_\ub808\uac70\uc2dc_\ud3f4\ubc31_416_420\uc904", + "community": 23, + "norm_label": "\u26a0\ufe0f \u1105\u1166\u1100\u1165\u1109\u1175 \u1111\u1169\u11af\u1107\u1162\u11a8 (416,420\u110c\u116e\u11af)" + }, + { + "label": "\ucc45\uc784", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L62", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_backend_\ucc45\uc784", + "community": 23, + "norm_label": "\u110e\u1162\u11a8\u110b\u1175\u11b7" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L66", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_backend_\uc758\uc874\uc131", + "community": 23, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "B04_db.md", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_db.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_db", + "community": 35, + "norm_label": "b04_db.md" + }, + { + "label": "B04_wf1_Surface \u2014 DB", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_db.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_db_b04_wf1_surface_db", + "community": 35, + "norm_label": "b04_wf1_surface \u2014 db" + }, + { + "label": "\uc4f0\ub294 \ud14c\uc774\ube14", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_db.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_db_\uc4f0\ub294_\ud14c\uc774\ube14", + "community": 35, + "norm_label": "\u110a\u1173\u1102\u1173\u11ab \u1110\u1166\u110b\u1175\u1107\u1173\u11af" + }, + { + "label": "Repository \ud568\uc218", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_db.md", + "source_location": "L23", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_db_repository_\ud568\uc218", + "community": 35, + "norm_label": "repository \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\ucc38\uace0", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_db.md", + "source_location": "L31", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_db_\ucc38\uace0", + "community": 35, + "norm_label": "\u110e\u1161\u11b7\u1100\u1169" + }, + { + "label": "B04_dependencies.md", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_dependencies", + "community": 36, + "norm_label": "b04_dependencies.md" + }, + { + "label": "B04_wf1_Surface \u2014 Dependencies", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_dependencies_b04_wf1_surface_dependencies", + "community": 36, + "norm_label": "b04_wf1_surface \u2014 dependencies" + }, + { + "label": "\ubc31\uc5d4\ub4dc (Python)", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_dependencies_\ubc31\uc5d4\ub4dc_python", + "community": 36, + "norm_label": "\u1107\u1162\u11a8\u110b\u1166\u11ab\u1103\u1173 (python)" + }, + { + "label": "\ud504\ub860\ud2b8\uc5d4\ub4dc (TypeScript)", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", + "source_location": "L24", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_dependencies_\ud504\ub860\ud2b8\uc5d4\ub4dc_typescript", + "community": 36, + "norm_label": "\u1111\u1173\u1105\u1169\u11ab\u1110\u1173\u110b\u1166\u11ab\u1103\u1173 (typescript)" + }, + { + "label": "\u26a0\ufe0f dependencies concept \uc815\uc815 \ud544\uc694", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", + "source_location": "L30", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_dependencies_dependencies_concept_\uc815\uc815_\ud544\uc694", + "community": 36, + "norm_label": "\u26a0\ufe0f dependencies concept \u110c\u1165\u11bc\u110c\u1165\u11bc \u1111\u1175\u11af\u110b\u116d" + }, + { + "label": "B04_frontend.md", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_frontend", + "community": 26, + "norm_label": "b04_frontend.md" + }, + { + "label": "B04_wf1_Surface \u2014 Frontend", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", + "community": 26, + "norm_label": "b04_wf1_surface \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 26, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\u26a0\ufe0f \uacc4\ud68d\uc11c\uc640 \uc2e4 \ucf54\ub4dc \ubd88\uc77c\uce58 (3D \ubdf0\uc5b4)", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L22", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_frontend_\uacc4\ud68d\uc11c\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58_3d_\ubdf0\uc5b4", + "community": 26, + "norm_label": "\u26a0\ufe0f \u1100\u1168\u1112\u116c\u11a8\u1109\u1165\u110b\u116a \u1109\u1175\u11af \u110f\u1169\u1103\u1173 \u1107\u116e\u11af\u110b\u1175\u11af\u110e\u1175 (3d \u1107\u1172\u110b\u1165)" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L32", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "community": 26, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 / \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8 \ud568\uc218", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L40", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", + "community": 26, + "norm_label": "api \u110f\u1173\u11af\u1105\u1161\u110b\u1175\u110b\u1165\u11ab\u1110\u1173 \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\ucc98\ub9ac \ud750\ub984", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L53", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_frontend_\ucc98\ub9ac_\ud750\ub984", + "community": 26, + "norm_label": "\u110e\u1165\u1105\u1175 \u1112\u1173\u1105\u1173\u11b7" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L60", + "_origin": "ast", + "id": "pages_b04_wf1_surface_b04_frontend_\uc758\uc874\uc131", + "community": 26, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "B05_api.md", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_api.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_api", + "community": 1, + "norm_label": "b05_api.md" + }, + { + "label": "B05_wf2_Route \u2014 API", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_api.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_api_b05_wf2_route_api", + "community": 1, + "norm_label": "b05_wf2_route \u2014 api" + }, + { + "label": "solve \ucc98\ub9ac \uacb0\uacfc", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_api.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_api_solve_\ucc98\ub9ac_\uacb0\uacfc", + "community": 1, + "norm_label": "solve \u110e\u1165\u1105\u1175 \u1100\u1167\u11af\u1100\u116a" + }, + { + "label": "B05_backend.md", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_backend", + "community": 29, + "norm_label": "b05_backend.md" + }, + { + "label": "B05_wf2_Route \u2014 Backend", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", + "community": 29, + "norm_label": "b05_wf2_route \u2014 backend" + }, + { + "label": "\uc694\uccad\u00b7\uc751\ub2f5 \ubaa8\ub378", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_backend_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", + "community": 29, + "norm_label": "\u110b\u116d\u110e\u1165\u11bc\u00b7\u110b\u1173\u11bc\u1103\u1161\u11b8 \u1106\u1169\u1103\u1166\u11af" + }, + { + "label": "\uacbd\ub85c \uacc4\uc0b0 \uc5d4\uc9c4", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L20", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_backend_\uacbd\ub85c_\uacc4\uc0b0_\uc5d4\uc9c4", + "community": 29, + "norm_label": "\u1100\u1167\u11bc\u1105\u1169 \u1100\u1168\u1109\u1161\u11ab \u110b\u1166\u11ab\u110c\u1175\u11ab" + }, + { + "label": "\uae30\ud558\u00b7\uacb0\uacfc \ubcc0\ud658", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L31", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_backend_\uae30\ud558_\uacb0\uacfc_\ubcc0\ud658", + "community": 29, + "norm_label": "\u1100\u1175\u1112\u1161\u00b7\u1100\u1167\u11af\u1100\u116a \u1107\u1167\u11ab\u1112\u116a\u11ab" + }, + { + "label": "\ub77c\uc6b0\ud130\u00b7workflow", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L39", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_backend_\ub77c\uc6b0\ud130_workflow", + "community": 29, + "norm_label": "\u1105\u1161\u110b\u116e\u1110\u1165\u00b7workflow" + }, + { + "label": "\uae30\uc220\ubd80\ucc44", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L46", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_backend_\uae30\uc220\ubd80\ucc44", + "community": 29, + "norm_label": "\u1100\u1175\u1109\u116e\u11af\u1107\u116e\u110e\u1162" + }, + { + "label": "B05_db.md", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_db.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_db", + "community": 41, + "norm_label": "b05_db.md" + }, + { + "label": "B05_wf2_Route \u2014 DB \uc0ac\uc6a9 \uad00\uacc4", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_db.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", + "community": 41, + "norm_label": "b05_wf2_route \u2014 db \u1109\u1161\u110b\u116d\u11bc \u1100\u116a\u11ab\u1100\u1168" + }, + { + "label": "Repository \ud568\uc218", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_db.md", + "source_location": "L20", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_db_repository_\ud568\uc218", + "community": 41, + "norm_label": "repository \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\uc800\uc7a5 \uacbd\ub85c", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_db.md", + "source_location": "L30", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_db_\uc800\uc7a5_\uacbd\ub85c", + "community": 41, + "norm_label": "\u110c\u1165\u110c\u1161\u11bc \u1100\u1167\u11bc\u1105\u1169" + }, + { + "label": "B05_dependencies.md", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_dependencies.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_dependencies", + "community": 2, + "norm_label": "b05_dependencies.md" + }, + { + "label": "B05_wf2_Route \u2014 Dependencies", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_dependencies.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_dependencies_b05_wf2_route_dependencies", + "community": 2, + "norm_label": "b05_wf2_route \u2014 dependencies" + }, + { + "label": "\ud398\uc774\uc9c0 \ud30c\uc77c\ubcc4 \uc5f0\uacb0", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_dependencies.md", + "source_location": "L23", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_dependencies_\ud398\uc774\uc9c0_\ud30c\uc77c\ubcc4_\uc5f0\uacb0", + "community": 2, + "norm_label": "\u1111\u1166\u110b\u1175\u110c\u1175 \u1111\u1161\u110b\u1175\u11af\u1107\u1167\u11af \u110b\u1167\u11ab\u1100\u1167\u11af" + }, + { + "label": "B05_frontend.md", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_frontend", + "community": 33, + "norm_label": "b05_frontend.md" + }, + { + "label": "B05_wf2_Route \u2014 Frontend", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_frontend.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", + "community": 33, + "norm_label": "b05_wf2_route \u2014 frontend" + }, + { + "label": "\ud654\uba74\uacfc \uc0c1\ud638\uc791\uc6a9", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_frontend_\ud654\uba74\uacfc_\uc0c1\ud638\uc791\uc6a9", + "community": 33, + "norm_label": "\u1112\u116a\u1106\u1167\u11ab\u1100\u116a \u1109\u1161\u11bc\u1112\u1169\u110c\u1161\u11a8\u110b\u116d\u11bc" + }, + { + "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_frontend.md", + "source_location": "L21", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", + "community": 33, + "norm_label": "api \u110f\u1173\u11af\u1105\u1161\u110b\u1175\u110b\u1165\u11ab\u1110\u1173" + }, + { + "label": "\uc785\ub825 \uadf8\ub8f9", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_frontend.md", + "source_location": "L29", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_frontend_\uc785\ub825_\uadf8\ub8f9", + "community": 33, + "norm_label": "\u110b\u1175\u11b8\u1105\u1167\u11a8 \u1100\u1173\u1105\u116e\u11b8" + }, + { + "label": "\uae30\uc220\ubd80\ucc44", + "file_type": "document", + "source_file": "pages/B05_wf2_Route/B05_frontend.md", + "source_location": "L40", + "_origin": "ast", + "id": "pages_b05_wf2_route_b05_frontend_\uae30\uc220\ubd80\ucc44", + "community": 33, + "norm_label": "\u1100\u1175\u1109\u116e\u11af\u1107\u116e\u110e\u1162" + }, + { + "label": "B06_api.md", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_api", + "community": 1, + "norm_label": "b06_api.md" + }, + { + "label": "B06_wf3_ProfileCross \u2014 API", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_api_b06_wf3_profilecross_api", + "community": 1, + "norm_label": "b06_wf3_profilecross \u2014 api" + }, + { + "label": "\uc0dd\uc131 \uc751\ub2f5", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", + "source_location": "L20", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_api_\uc0dd\uc131_\uc751\ub2f5", + "community": 1, + "norm_label": "\u1109\u1162\u11bc\u1109\u1165\u11bc \u110b\u1173\u11bc\u1103\u1161\u11b8" + }, + { + "label": "B06_backend.md", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_backend", + "community": 2, + "norm_label": "b06_backend.md" + }, + { + "label": "B06_wf3_ProfileCross \u2014 Backend", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", + "community": 2, + "norm_label": "b06_wf3_profilecross \u2014 backend" + }, + { + "label": "\uc694\uccad\u00b7\uc751\ub2f5 \ubaa8\ub378", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_backend_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", + "community": 2, + "norm_label": "\u110b\u116d\u110e\u1165\u11bc\u00b7\u110b\u1173\u11bc\u1103\u1161\u11b8 \u1106\u1169\u1103\u1166\u11af" + }, + { + "label": "\uc0dd\uc131 \uc5d4\uc9c4", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L20", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_backend_\uc0dd\uc131_\uc5d4\uc9c4", + "community": 2, + "norm_label": "\u1109\u1162\u11bc\u1109\u1165\u11bc \u110b\u1166\u11ab\u110c\u1175\u11ab" + }, + { + "label": "\ub77c\uc6b0\ud130\u00b7workflow", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L31", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_backend_\ub77c\uc6b0\ud130_workflow", + "community": 2, + "norm_label": "\u1105\u1161\u110b\u116e\u1110\u1165\u00b7workflow" + }, + { + "label": "\uc7ac\uc2e4\ud589", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L39", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_backend_\uc7ac\uc2e4\ud589", + "community": 2, + "norm_label": "\u110c\u1162\u1109\u1175\u11af\u1112\u1162\u11bc" + }, + { + "label": "B06_db.md", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_db", + "community": 42, + "norm_label": "b06_db.md" + }, + { + "label": "B06_wf3_ProfileCross \u2014 DB \uc0ac\uc6a9 \uad00\uacc4", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_db_b06_wf3_profilecross_db_\uc0ac\uc6a9_\uad00\uacc4", + "community": 42, + "norm_label": "b06_wf3_profilecross \u2014 db \u1109\u1161\u110b\u116d\u11bc \u1100\u116a\u11ab\u1100\u1168" + }, + { + "label": "Repository \ud568\uc218", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_db_repository_\ud568\uc218", + "community": 42, + "norm_label": "repository \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\ud30c\uc77c \uacbd\ub85c", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", + "source_location": "L29", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_db_\ud30c\uc77c_\uacbd\ub85c", + "community": 42, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u1167\u11bc\u1105\u1169" + }, + { + "label": "B06_dependencies.md", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_dependencies", + "community": 2, + "norm_label": "b06_dependencies.md" + }, + { + "label": "B06_wf3_ProfileCross \u2014 Dependencies", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_dependencies_b06_wf3_profilecross_dependencies", + "community": 2, + "norm_label": "b06_wf3_profilecross \u2014 dependencies" + }, + { + "label": "\uacf5\ud1b5 \ubaa8\ub4c8", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", + "source_location": "L22", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", + "community": 2, + "norm_label": "\u1100\u1169\u11bc\u1110\u1169\u11bc \u1106\u1169\u1103\u1172\u11af" + }, + { + "label": "B06_frontend.md", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_frontend", + "community": 37, + "norm_label": "b06_frontend.md" + }, + { + "label": "B06_wf3_ProfileCross \u2014 Frontend", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_frontend_b06_wf3_profilecross_frontend", + "community": 37, + "norm_label": "b06_wf3_profilecross \u2014 frontend" + }, + { + "label": "\ud654\uba74\u00b7workflow", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_frontend_\ud654\uba74_workflow", + "community": 37, + "norm_label": "\u1112\u116a\u1106\u1167\u11ab\u00b7workflow" + }, + { + "label": "API \ud074\ub77c\uc774\uc5b8\ud2b8", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", + "source_location": "L21", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", + "community": 37, + "norm_label": "api \u110f\u1173\u11af\u1105\u1161\u110b\u1175\u110b\u1165\u11ab\u1110\u1173" + }, + { + "label": "\uc785\ub825 \uc635\uc158", + "file_type": "document", + "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", + "source_location": "L30", + "_origin": "ast", + "id": "pages_b06_wf3_profilecross_b06_frontend_\uc785\ub825_\uc635\uc158", + "community": 37, + "norm_label": "\u110b\u1175\u11b8\u1105\u1167\u11a8 \u110b\u1169\u11b8\u1109\u1167\u11ab" + }, + { + "label": "B07_frontend.md", + "file_type": "document", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b07_wf4_designdetail_b07_frontend", + "community": 27, + "norm_label": "b07_frontend.md" + }, + { + "label": "B07_wf4_DesignDetail \u2014 Frontend", + "file_type": "document", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", + "community": 27, + "norm_label": "b07_wf4_designdetail \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b07_wf4_designdetail_b07_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 27, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", + "file_type": "document", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L18", + "_origin": "ast", + "id": "pages_b07_wf4_designdetail_b07_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "community": 27, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 / \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "file_type": "document", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L24", + "_origin": "ast", + "id": "pages_b07_wf4_designdetail_b07_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "community": 27, + "norm_label": "\u1105\u1169\u110f\u1165\u11af\u1105\u1161\u110b\u1175\u110c\u1166\u110b\u1175\u1109\u1167\u11ab" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L30", + "_origin": "ast", + "id": "pages_b07_wf4_designdetail_b07_frontend_\uc758\uc874\uc131", + "community": 27, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "\ubc31\uc5d4\ub4dc/DB \u2014 \ubbf8\ucc29\uc218 (\uacc4\ud68d\uc801 \ubc94\uc704 \uc81c\uc678)", + "file_type": "document", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L35", + "_origin": "ast", + "id": "pages_b07_wf4_designdetail_b07_frontend_\ubc31\uc5d4\ub4dc_db_\ubbf8\ucc29\uc218_\uacc4\ud68d\uc801_\ubc94\uc704_\uc81c\uc678", + "community": 27, + "norm_label": "\u1107\u1162\u11a8\u110b\u1166\u11ab\u1103\u1173/db \u2014 \u1106\u1175\u110e\u1161\u11a8\u1109\u116e (\u1100\u1168\u1112\u116c\u11a8\u110c\u1165\u11a8 \u1107\u1165\u11b7\u110b\u1171 \u110c\u1166\u110b\u116c)" + }, + { + "label": "\ucc38\uace0", + "file_type": "document", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L42", + "_origin": "ast", + "id": "pages_b07_wf4_designdetail_b07_frontend_\ucc38\uace0", + "community": 27, + "norm_label": "\u110e\u1161\u11b7\u1100\u1169" + }, + { + "label": "B08_db.md", + "file_type": "document", + "source_file": "pages/B08_wf5_Quantity/B08_db.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b08_wf5_quantity_b08_db", + "community": 45, + "norm_label": "b08_db.md" + }, + { + "label": "B08_wf5_Quantity \u2014 DB", + "file_type": "document", + "source_file": "pages/B08_wf5_Quantity/B08_db.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b08_wf5_quantity_b08_db_b08_wf5_quantity_db", + "community": 45, + "norm_label": "b08_wf5_quantity \u2014 db" + }, + { + "label": "\uad6c\ud604 \ub300\uae30 \ud56d\ubaa9", + "file_type": "document", + "source_file": "pages/B08_wf5_Quantity/B08_db.md", + "source_location": "L19", + "_origin": "ast", + "id": "pages_b08_wf5_quantity_b08_db_\uad6c\ud604_\ub300\uae30_\ud56d\ubaa9", + "community": 45, + "norm_label": "\u1100\u116e\u1112\u1167\u11ab \u1103\u1162\u1100\u1175 \u1112\u1161\u11bc\u1106\u1169\u11a8" + }, + { + "label": "B08_frontend.md", + "file_type": "document", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b08_wf5_quantity_b08_frontend", + "community": 5, + "norm_label": "b08_frontend.md" + }, + { + "label": "B08_wf5_Quantity \u2014 Frontend", + "file_type": "document", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L10", + "_origin": "ast", + "id": "pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", + "community": 5, + "norm_label": "b08_wf5_quantity \u2014 frontend" + }, + { + "label": "\ud604\uc7ac \uad6c\ud604", + "file_type": "document", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b08_wf5_quantity_b08_frontend_\ud604\uc7ac_\uad6c\ud604", + "community": 5, + "norm_label": "\u1112\u1167\u11ab\u110c\u1162 \u1100\u116e\u1112\u1167\u11ab" + }, + { + "label": "\ud654\uba74 \uc0c1\ud0dc", + "file_type": "document", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L20", + "_origin": "ast", + "id": "pages_b08_wf5_quantity_b08_frontend_\ud654\uba74_\uc0c1\ud0dc", + "community": 5, + "norm_label": "\u1112\u116a\u1106\u1167\u11ab \u1109\u1161\u11bc\u1110\u1162" + }, + { + "label": "\uacc4\ud68d \ucc45\uc784", + "file_type": "document", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L30", + "_origin": "ast", + "id": "pages_b08_wf5_quantity_b08_frontend_\uacc4\ud68d_\ucc45\uc784", + "community": 5, + "norm_label": "\u1100\u1168\u1112\u116c\u11a8 \u110e\u1162\u11a8\u110b\u1175\u11b7" + }, + { + "label": "\uae30\uc220\ubd80\ucc44", + "file_type": "document", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L39", + "_origin": "ast", + "id": "pages_b08_wf5_quantity_b08_frontend_\uae30\uc220\ubd80\ucc44", + "community": 5, + "norm_label": "\u1100\u1175\u1109\u116e\u11af\u1107\u116e\u110e\u1162" + }, + { + "label": "B09_frontend.md", + "file_type": "document", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L1", + "_origin": "ast", + "id": "pages_b09_wf6_estimation_b09_frontend", + "community": 28, + "norm_label": "b09_frontend.md" + }, + { + "label": "B09_wf6_Estimation \u2014 Frontend", + "file_type": "document", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L8", + "_origin": "ast", + "id": "pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", + "community": 28, + "norm_label": "b09_wf6_estimation \u2014 frontend" + }, + { + "label": "\ud30c\uc77c \uad6c\uc870", + "file_type": "document", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L12", + "_origin": "ast", + "id": "pages_b09_wf6_estimation_b09_frontend_\ud30c\uc77c_\uad6c\uc870", + "community": 28, + "norm_label": "\u1111\u1161\u110b\u1175\u11af \u1100\u116e\u110c\u1169" + }, + { + "label": "\ucef4\ud3ec\ub10c\ud2b8 / \ud568\uc218", + "file_type": "document", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L18", + "_origin": "ast", + "id": "pages_b09_wf6_estimation_b09_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "community": 28, + "norm_label": "\u110f\u1165\u11b7\u1111\u1169\u1102\u1165\u11ab\u1110\u1173 / \u1112\u1161\u11b7\u1109\u116e" + }, + { + "label": "\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "file_type": "document", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L24", + "_origin": "ast", + "id": "pages_b09_wf6_estimation_b09_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "community": 28, + "norm_label": "\u1105\u1169\u110f\u1165\u11af\u1105\u1161\u110b\u1175\u110c\u1166\u110b\u1175\u1109\u1167\u11ab" + }, + { + "label": "\uc758\uc874\uc131", + "file_type": "document", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L30", + "_origin": "ast", + "id": "pages_b09_wf6_estimation_b09_frontend_\uc758\uc874\uc131", + "community": 28, + "norm_label": "\u110b\u1174\u110c\u1169\u11ab\u1109\u1165\u11bc" + }, + { + "label": "\ubc31\uc5d4\ub4dc/DB \u2014 \ubbf8\ucc29\uc218", + "file_type": "document", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L35", + "_origin": "ast", + "id": "pages_b09_wf6_estimation_b09_frontend_\ubc31\uc5d4\ub4dc_db_\ubbf8\ucc29\uc218", + "community": 28, + "norm_label": "\u1107\u1162\u11a8\u110b\u1166\u11ab\u1103\u1173/db \u2014 \u1106\u1175\u110e\u1161\u11a8\u1109\u116e" + }, + { + "label": "\ucc38\uace0", + "file_type": "document", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L42", + "_origin": "ast", + "id": "pages_b09_wf6_estimation_b09_frontend_\ucc38\uace0", + "community": 28, + "norm_label": "\u110e\u1161\u11b7\u1100\u1169" + } + ], + "links": [ + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "AGENTS.md", + "source_location": "L1", + "weight": 1.0, + "source": "agents", + "target": "agents_wiki_\ud3f4\ub354_\uaddc\uce59", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "AGENTS.md", + "source_location": "L5", + "weight": 1.0, + "source": "agents_wiki_\ud3f4\ub354_\uaddc\uce59", + "target": "agents_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "AGENTS.md", + "source_location": "L11", + "weight": 1.0, + "source": "agents_wiki_\ud3f4\ub354_\uaddc\uce59", + "target": "agents_\uc791\uc131_\uaddc\uce59", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "CLAUDE.md", + "source_location": "L1", + "weight": 1.0, + "source": "claude", + "target": "claude_wiki_\ud3f4\ub354_\uaddc\uce59", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "CLAUDE.md", + "source_location": "L5", + "weight": 1.0, + "source": "claude_wiki_\ud3f4\ub354_\uaddc\uce59", + "target": "claude_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "CLAUDE.md", + "source_location": "L11", + "weight": 1.0, + "source": "claude_wiki_\ud3f4\ub354_\uaddc\uce59", + "target": "claude_\uc791\uc131_\uaddc\uce59", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L8", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework", + "target": "concepts_a00_app_shell_framework_a00_common_app_shell_framework", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L86", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework", + "target": "concepts_a00_app_shell_framework_scaffold", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L27", + "weight": 1.0, + "source": "concepts_ui_templates", + "target": "concepts_a00_app_shell_framework", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L37", + "weight": 1.0, + "source": "pages_b08_wf5_quantity_b08_frontend", + "target": "concepts_a00_app_shell_framework", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L20", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_a00_common_app_shell_framework", + "target": "concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L52", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_a00_common_app_shell_framework", + "target": "concepts_a00_app_shell_framework_router_\ub77c\uc6b0\ud305_\ud14c\uc774\ube14", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L84", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_a00_common_app_shell_framework", + "target": "concepts_a00_app_shell_framework_\uc138\ubd80_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L77", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_a00_common_app_shell_framework", + "target": "concepts_a00_app_shell_framework_\uc778\uc99d_\uac00\ub4dc", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L12", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_a00_common_app_shell_framework", + "target": "concepts_a00_app_shell_framework_\ud30c\uc77c_\uad6c\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L44", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", + "target": "concepts_a00_app_shell_framework_\ub85c\uadf8\uc544\uc6c3_onapp_logout_click", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L40", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", + "target": "concepts_a00_app_shell_framework_\uc778\uc99d_\ubc84\ud2bc_\ube44\ub3d9\uae30_fillauthactions", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L22", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", + "target": "concepts_a00_app_shell_framework_\ud14c\ub9c8_\uc5b8\uc5b4_\uad00\ub9ac", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L48", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", + "target": "concepts_a00_app_shell_framework_\ud478\ud130", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework.md", + "source_location": "L27", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_app_shell_\uad6c\uc131\uc694\uc18c", + "target": "concepts_a00_app_shell_framework_\ud5e4\ub354_\uad6c\uc131_64px_\ub192\uc774_sticky", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework_scaffold.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_scaffold", + "target": "concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework_scaffold.md", + "source_location": "L11", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", + "target": "concepts_a00_app_shell_framework_scaffold_b_page_scaffold", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework_scaffold.md", + "source_location": "L18", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", + "target": "concepts_a00_app_shell_framework_scaffold_css_\uc778\uc81d\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework_scaffold.md", + "source_location": "L33", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", + "target": "concepts_a00_app_shell_framework_scaffold_\uc0ac\uc6a9\ucc98", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/a00_app_shell_framework_scaffold.md", + "source_location": "L25", + "weight": 1.0, + "source": "concepts_a00_app_shell_framework_scaffold_a00_common_\uc2a4\uce90\ud3f4\ub4dc_css_\uc885\uc18d\uc131", + "target": "concepts_a00_app_shell_framework_scaffold_\uc885\uc18d\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/api_common.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_api_common", + "target": "concepts_api_common_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/api_common.md", + "source_location": "L15", + "weight": 1.0, + "source": "concepts_api_common", + "target": "concepts_schema_common", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/api_common.md", + "source_location": "L23", + "weight": 1.0, + "source": "concepts_api_common", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_api", + "target": "concepts_api_common", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_api", + "target": "concepts_api_common", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_api.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_api", + "target": "concepts_api_common", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_api", + "target": "concepts_api_common", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/api_common.md", + "source_location": "L11", + "weight": 1.0, + "source": "concepts_api_common_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "target": "concepts_api_common_\uacf5\ud1b5_\uc624\ub958_\uc751\ub2f5_\ud3ec\ub9f7_\uc804_\ub77c\uc6b0\ud130", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/api_common.md", + "source_location": "L17", + "weight": 1.0, + "source": "concepts_api_common_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "target": "concepts_api_common_\uc6cc\ud06c\ud50c\ub85c\uc6b0_\uc0c1\ud0dc_\uc870\ud68c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/api_common.md", + "source_location": "L25", + "weight": 1.0, + "source": "concepts_api_common_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "target": "concepts_api_common_\ud3f4\ub9c1_\ud328\ud134_legacy_workflow_json_\uc124\uacc4_\ud604\uc7ac_\uad6c\ud604\uc740_workflow_state_api_\uc0ac\uc6a9", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/auth_rbac.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_auth_rbac", + "target": "concepts_auth_rbac_\uc778\uc99d_rbac", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/auth_rbac.md", + "source_location": "L13", + "weight": 1.0, + "source": "concepts_auth_rbac", + "target": "concepts_db_schema_users_auth", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/common_util.md", + "source_location": "L16", + "weight": 1.0, + "source": "concepts_common_util", + "target": "concepts_auth_rbac", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_api", + "target": "concepts_auth_rbac", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L22", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_backend", + "target": "concepts_auth_rbac", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_dependencies.md", + "source_location": "L26", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_dependencies", + "target": "concepts_auth_rbac", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L30", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_frontend", + "target": "concepts_auth_rbac", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_api", + "target": "concepts_auth_rbac", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_api.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_api", + "target": "concepts_auth_rbac", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_api", + "target": "concepts_auth_rbac", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/auth_rbac.md", + "source_location": "L18", + "weight": 1.0, + "source": "concepts_auth_rbac_\uc778\uc99d_rbac", + "target": "concepts_auth_rbac_otp_\ube44\ubc00\ubc88\ud638", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/auth_rbac.md", + "source_location": "L65", + "weight": 1.0, + "source": "concepts_auth_rbac_\uc778\uc99d_rbac", + "target": "concepts_auth_rbac_\uacc4\ud68d\uc11c_\uc2e4\ucf54\ub4dc_\ubd88\uc77c\uce58_a\uadf8\ub8f9_\uc778\uc81c\uc2a4\ud2b8_\ubc1c\uacac", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/auth_rbac.md", + "source_location": "L42", + "weight": 1.0, + "source": "concepts_auth_rbac_\uc778\uc99d_rbac", + "target": "concepts_auth_rbac_\uad8c\ud55c_\uac80\uc99d_\ud5ec\ud37c_b01_dashboard", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/auth_rbac.md", + "source_location": "L56", + "weight": 1.0, + "source": "concepts_auth_rbac_\uc778\uc99d_rbac", + "target": "concepts_auth_rbac_\ub77c\uc6b0\ud305_\uac00\ub4dc_frontend_md_5_2", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/auth_rbac.md", + "source_location": "L23", + "weight": 1.0, + "source": "concepts_auth_rbac_\uc778\uc99d_rbac", + "target": "concepts_auth_rbac_\uc0ac\uc6a9\uc790_\uc0c1\ud0dc_\uc0dd\uba85\uc8fc\uae30", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/auth_rbac.md", + "source_location": "L59", + "weight": 1.0, + "source": "concepts_auth_rbac_\uc778\uc99d_rbac", + "target": "concepts_auth_rbac_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/auth_rbac.md", + "source_location": "L11", + "weight": 1.0, + "source": "concepts_auth_rbac_\uc778\uc99d_rbac", + "target": "concepts_auth_rbac_\uc138\uc158_\uc778\uc99d_backend_md_6_3", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/auth_rbac.md", + "source_location": "L33", + "weight": 1.0, + "source": "concepts_auth_rbac_\uc778\uc99d_rbac", + "target": "concepts_auth_rbac_\uc5ed\ud560_users_role", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/auth_rbac.md", + "source_location": "L53", + "weight": 1.0, + "source": "concepts_auth_rbac_\uc778\uc99d_rbac", + "target": "concepts_auth_rbac_\uc778\uc99d_\uac31\uc2e0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/common_util.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_common_util", + "target": "concepts_common_util_\uacf5\ud1b5_\uc720\ud2f8_common_util", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/common_util.md", + "source_location": "L21", + "weight": 1.0, + "source": "concepts_common_util", + "target": "concepts_storage_paths", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/common_util.md", + "source_location": "L23", + "weight": 1.0, + "source": "concepts_common_util", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/common_util.md", + "source_location": "L31", + "weight": 1.0, + "source": "concepts_common_util_\uacf5\ud1b5_\uc720\ud2f8_common_util", + "target": "concepts_common_util_\ub9ac\uc18c\uc2a4_\ubaa8\ub2c8\ud130\ub9c1_common_util_resource_monitor_py", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/common_util.md", + "source_location": "L27", + "weight": 1.0, + "source": "concepts_common_util_\uacf5\ud1b5_\uc720\ud2f8_common_util", + "target": "concepts_common_util_\uc774\uba54\uc77c_\ubc1c\uc1a1_common_util_email_py", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_db_schema_files_surface", + "target": "concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L11", + "weight": 1.0, + "source": "concepts_db_schema_files_surface", + "target": "concepts_db_schema_overview", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L89", + "weight": 1.0, + "source": "concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", + "target": "concepts_db_schema_files_surface_input_files_status_\uac12", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L35", + "weight": 1.0, + "source": "concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", + "target": "concepts_db_schema_files_surface_input_files_\uc785\ub825_\uc6d0\ubcf8_\ud30c\uc77c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L48", + "weight": 1.0, + "source": "concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", + "target": "concepts_db_schema_files_surface_processed_point_cloud_\ud544\ud130_\ubcc0\ud658_\ud3ec\uc778\ud2b8\ud074\ub77c\uc6b0\ub4dc", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L92", + "weight": 1.0, + "source": "concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", + "target": "concepts_db_schema_files_surface_surface_models_status_processed_point_cloud_status_\uac12", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L64", + "weight": 1.0, + "source": "concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", + "target": "concepts_db_schema_files_surface_surface_models_\uc9c0\ud45c\uba74_\ubaa8\ub378_\ubc0f_\ub4f1\uace0\uc120", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L77", + "weight": 1.0, + "source": "concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", + "target": "concepts_db_schema_files_surface_terrain_layers_\uc9c0\ud615_\ub808\uc774\uc5b4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L24", + "weight": 1.0, + "source": "concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", + "target": "concepts_db_schema_files_surface_upload_chunks_\uc5c5\ub85c\ub4dc_\uccad\ud06c_\ub370\uc774\ud130", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/files_surface.md", + "source_location": "L13", + "weight": 1.0, + "source": "concepts_db_schema_files_surface_db_\ud30c\uc77c_\uc9c0\ud45c\uba74\ubd84\uc11d_\ud14c\uc774\ube14", + "target": "concepts_db_schema_files_surface_upload_sessions_\uc5c5\ub85c\ub4dc_\uc138\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring", + "target": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L11", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring", + "target": "concepts_db_schema_overview", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L23", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_logs_monitoring_activity_logs_\uc0ac\uc6a9\uc790_\ud65c\ub3d9_\ub85c\uadf8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L33", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_logs_monitoring_audit_logs_\uac10\uc0ac_\ub85c\uadf8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L83", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_logs_monitoring_change_logs_\uc124\uacc4_\ubcc0\uacbd_\uc774\ub825", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L13", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_logs_monitoring_login_logs_\ub85c\uadf8\uc778_\uc2dc\ub3c4_\ub85c\uadf8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L71", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_logs_monitoring_support_requests_\uae30\uc220_\uc9c0\uc6d0_\uc694\uccad", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L53", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_logs_monitoring_system_admin_logs_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790_\ud589\uc704_\ub85c\uadf8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L96", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_logs_monitoring_system_audit_logs_\uc0ac\uc6a9\ucc98_b01_b02", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L43", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_logs_monitoring_system_audit_logs_\ud504\ub85c\uc81d\ud2b8_\uc870\uc9c1_\ubcc0\uacbd_\uac10\uc0ac_\ub85c\uadf8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L62", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_logs_monitoring_system_resources_\uc2dc\uc2a4\ud15c_\uc790\uc6d0_\uacc4\uce21", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/logs_monitoring.md", + "source_location": "L100", + "weight": 1.0, + "source": "concepts_db_schema_logs_monitoring_db_\ub85c\uadf8_\ubaa8\ub2c8\ud130\ub9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_logs_monitoring_\ub9ac\uc18c\uc2a4_api_system_admin_\uc804\uc6a9", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_db_schema_overview", + "target": "concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L28", + "weight": 1.0, + "source": "concepts_db_schema_overview", + "target": "concepts_db_schema_projects", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L30", + "weight": 1.0, + "source": "concepts_db_schema_overview", + "target": "concepts_db_schema_route_profile", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L31", + "weight": 1.0, + "source": "concepts_db_schema_overview", + "target": "concepts_db_schema_structure_output", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L20", + "weight": 1.0, + "source": "concepts_db_schema_overview", + "target": "concepts_db_schema_unconfirmed_readme", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L26", + "weight": 1.0, + "source": "concepts_db_schema_overview", + "target": "concepts_db_schema_users_auth", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L16", + "weight": 1.0, + "source": "concepts_db_schema_overview", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/storage_paths.md", + "source_location": "L31", + "weight": 1.0, + "source": "concepts_storage_paths", + "target": "concepts_db_schema_overview", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L51", + "weight": 1.0, + "source": "concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", + "target": "concepts_db_schema_overview_\uc124\uacc4_\uc6d0\uce59", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L56", + "weight": 1.0, + "source": "concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", + "target": "concepts_db_schema_overview_\ud14c\uc774\ube14_\uad00\uacc4_\ud575\uc2ec_\ud750\ub984", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L22", + "weight": 1.0, + "source": "concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", + "target": "concepts_db_schema_overview_\ud14c\uc774\ube14_\uadf8\ub8f9_9\uac1c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/overview.md", + "source_location": "L34", + "weight": 1.0, + "source": "concepts_db_schema_overview_db_\uc2a4\ud0a4\ub9c8_\uac1c\uc694", + "target": "concepts_db_schema_overview_\ud30c\uc77c_\uacbd\ub85c_\ucd94\uc801_\uceec\ub7fc_db\uc5d0_\uacbd\ub85c\ub9cc_\uae30\ub85d_\uc2e4_\ud30c\uc77c\uc740_\ud30c\uc77c\uc2dc\uc2a4\ud15c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/projects.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_db_schema_projects", + "target": "concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/projects.md", + "source_location": "L40", + "weight": 1.0, + "source": "concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", + "target": "concepts_db_schema_projects_project_automations_\ud504\ub85c\uc81d\ud2b8_\uc790\ub3d9\ud654_\uc815\ucc45", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/projects.md", + "source_location": "L30", + "weight": 1.0, + "source": "concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", + "target": "concepts_db_schema_projects_project_versions_\ud504\ub85c\uc81d\ud2b8_\ubc84\uc804_\uc2a4\ub0c5\uc0f7", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/projects.md", + "source_location": "L54", + "weight": 1.0, + "source": "concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", + "target": "concepts_db_schema_projects_project_workflow_stages_\ub2e8\uacc4\ubcc4_\uc0c1\uc138_\uc0c1\ud0dc", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/projects.md", + "source_location": "L13", + "weight": 1.0, + "source": "concepts_db_schema_projects_db_\ud504\ub85c\uc81d\ud2b8_\uad00\ub9ac_\ud14c\uc774\ube14", + "target": "concepts_db_schema_projects_projects_\ud504\ub85c\uc81d\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_db_schema_route_profile", + "target": "concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L69", + "weight": 1.0, + "source": "concepts_db_schema_route_profile", + "target": "concepts_db_schema_structure_output", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L68", + "weight": 1.0, + "source": "concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", + "target": "concepts_db_schema_route_profile_cross_sections_data_structures", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L55", + "weight": 1.0, + "source": "concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", + "target": "concepts_db_schema_route_profile_cross_sections_\ud6a1\ub2e8\uba74_\uc124\uacc4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L45", + "weight": 1.0, + "source": "concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", + "target": "concepts_db_schema_route_profile_longitudinal_sections_\uc885\ub2e8\uba74_\uc124\uacc4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L27", + "weight": 1.0, + "source": "concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", + "target": "concepts_db_schema_route_profile_route_points_\uacbd\ub85c_\uc88c\ud45c\uc810", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L36", + "weight": 1.0, + "source": "concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", + "target": "concepts_db_schema_route_profile_route_statistics_\ub178\uc120_\ud1b5\uacc4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L65", + "weight": 1.0, + "source": "concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", + "target": "concepts_db_schema_route_profile_routes_status_\ud750\ub984", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/route_profile.md", + "source_location": "L13", + "weight": 1.0, + "source": "concepts_db_schema_route_profile_db_\uacbd\ub85c_\uc885\ud6a1\ub2e8_\ud14c\uc774\ube14", + "target": "concepts_db_schema_route_profile_routes_\ub178\uc120_\uacbd\ub85c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_db_schema_structure_output", + "target": "concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L54", + "weight": 1.0, + "source": "concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", + "target": "concepts_db_schema_structure_output_output_files_\uac1c\ubcc4_\uc0b0\ucd9c_\ud30c\uc77c_\ub9ac\uc2a4\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L42", + "weight": 1.0, + "source": "concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", + "target": "concepts_db_schema_structure_output_outputs_\ucd5c\uc885_\uacac\uc801_\ub3c4\uba74_\uc0b0\ucd9c_\uc138\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L29", + "weight": 1.0, + "source": "concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", + "target": "concepts_db_schema_structure_output_quantity_items_\uc218\ub7c9_\uc0b0\ucd9c_\ud56d\ubaa9", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L65", + "weight": 1.0, + "source": "concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", + "target": "concepts_db_schema_structure_output_quantity_items_\ucd1d\ube44\uc6a9_\uacc4\uc0b0_\uc608", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/structure_output.md", + "source_location": "L13", + "weight": 1.0, + "source": "concepts_db_schema_structure_output_db_\uad6c\uc870\ubb3c_\uc218\ub7c9_\uc0b0\ucd9c\ubb3c_\ud14c\uc774\ube14", + "target": "concepts_db_schema_structure_output_structures_\ubc30\uce58_\uad6c\uc870\ubb3c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/unconfirmed/README.md", + "source_location": "L1", + "weight": 1.0, + "source": "concepts_db_schema_unconfirmed_readme", + "target": "concepts_db_schema_unconfirmed_readme_\ubbf8\ud655\uc815_\ud14c\uc774\ube14_\ubcf4\uad00\uc18c_unconfirmed_db_schemas", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/unconfirmed/README.md", + "source_location": "L5", + "weight": 1.0, + "source": "concepts_db_schema_unconfirmed_readme_\ubbf8\ud655\uc815_\ud14c\uc774\ube14_\ubcf4\uad00\uc18c_unconfirmed_db_schemas", + "target": "concepts_db_schema_unconfirmed_readme_\uc6b4\uc601_\uaddc\uce59", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_db_schema_users_auth", + "target": "concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L32", + "weight": 1.0, + "source": "concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_users_auth_companies_\ud68c\uc0ac", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L56", + "weight": 1.0, + "source": "concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_users_auth_email_otps_\uc774\uba54\uc77c_otp", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L73", + "weight": 1.0, + "source": "concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_users_auth_join_requests_\ud68c\uc0ac_\uac00\uc785_\uc2e0\uccad", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L45", + "weight": 1.0, + "source": "concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_users_auth_sessions_\uc138\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L65", + "weight": 1.0, + "source": "concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_users_auth_trusted_devices_\uc2e0\ub8b0_\uae30\uae30", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L84", + "weight": 1.0, + "source": "concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_users_auth_user_consents_\uc57d\uad00_\ub3d9\uc758", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/db_schema/users_auth.md", + "source_location": "L13", + "weight": 1.0, + "source": "concepts_db_schema_users_auth_db_\uc0ac\uc6a9\uc790_\uc778\uc99d_\uc870\uc9c1_\ud14c\uc774\ube14", + "target": "concepts_db_schema_users_auth_users_\uc0ac\uc6a9\uc790", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/dependencies.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_dependencies", + "target": "concepts_dependencies_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_dependencies.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_dependencies", + "target": "concepts_dependencies", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_dependencies.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_dependencies", + "target": "concepts_dependencies", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_dependencies.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_dependencies", + "target": "concepts_dependencies", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_dependencies", + "target": "concepts_dependencies", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/dependencies.md", + "source_location": "L11", + "weight": 1.0, + "source": "concepts_dependencies_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc758\uc874\uc131", + "target": "concepts_dependencies_\ubc31\uc5d4\ub4dc_python_3_12_7", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/dependencies.md", + "source_location": "L35", + "weight": 1.0, + "source": "concepts_dependencies_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc758\uc874\uc131", + "target": "concepts_dependencies_\uc120\uc815_\uc6d0\uce59_agent_md_3\uc808", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/dependencies.md", + "source_location": "L27", + "weight": 1.0, + "source": "concepts_dependencies_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc758\uc874\uc131", + "target": "concepts_dependencies_\ud504\ub860\ud2b8\uc5d4\ub4dc_typescript_node_js", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/schema_common.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_schema_common", + "target": "concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/schema_common.md", + "source_location": "L11", + "weight": 1.0, + "source": "concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", + "target": "concepts_schema_common_\uac80\uc99d_\uc6d0\uce59_backend_md_4\uc808", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/schema_common.md", + "source_location": "L16", + "weight": 1.0, + "source": "concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", + "target": "concepts_schema_common_\uba85\uba85_\uaddc\uce59", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/storage_paths.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_storage_paths", + "target": "concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "concepts/storage_paths.md", + "source_location": "L27", + "weight": 1.0, + "source": "concepts_storage_paths", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L49", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_backend", + "target": "concepts_storage_paths", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_dependencies.md", + "source_location": "L27", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_dependencies", + "target": "concepts_storage_paths", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", + "source_location": "L26", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_dependencies", + "target": "concepts_storage_paths", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/storage_paths.md", + "source_location": "L30", + "weight": 1.0, + "source": "concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", + "target": "concepts_storage_paths_db_\uceec\ub7fc_\uc2e4\uc81c_\uacbd\ub85c_\ub9e4\ud551", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/storage_paths.md", + "source_location": "L11", + "weight": 1.0, + "source": "concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", + "target": "concepts_storage_paths_\uacbd\ub85c_\ud328\ud134", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/storage_paths.md", + "source_location": "L23", + "weight": 1.0, + "source": "concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", + "target": "concepts_storage_paths_\uc6d0\uce59_backend_md_3\uc808", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/storage_paths.md", + "source_location": "L33", + "weight": 1.0, + "source": "concepts_storage_paths_\uc800\uc7a5_\uacbd\ub85c_\uaddc\uce59_workflow_based_folder_structure", + "target": "concepts_storage_paths_\ud30c\uc77c\uba85_\uaddc\uce59_structure_md_1\uc808", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L8", + "weight": 1.0, + "source": "concepts_ui_templates", + "target": "concepts_ui_templates_ui_templates_localization_components", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_dependencies.md", + "source_location": "L28", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_dependencies", + "target": "concepts_ui_templates", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L50", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_frontend", + "target": "concepts_ui_templates", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L40", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_frontend", + "target": "concepts_ui_templates", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L37", + "weight": 1.0, + "source": "pages_b08_wf5_quantity_b08_frontend", + "target": "concepts_ui_templates", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L59", + "weight": 1.0, + "source": "concepts_ui_templates_ui_templates_localization_components", + "target": "concepts_ui_templates_theme_css_\uc2a4\ud0c0\uc77c_\ubcc0\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L30", + "weight": 1.0, + "source": "concepts_ui_templates_ui_templates_localization_components", + "target": "concepts_ui_templates_ui_template_elements_ts_\uacf5\ud1b5_\ucef4\ud3ec\ub10c\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L12", + "weight": 1.0, + "source": "concepts_ui_templates_ui_templates_localization_components", + "target": "concepts_ui_templates_ui_template_locale_ts_\ub2e4\uad6d\uc5b4_\uad00\ub9ac", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L82", + "weight": 1.0, + "source": "concepts_ui_templates_ui_templates_localization_components", + "target": "concepts_ui_templates_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L75", + "weight": 1.0, + "source": "concepts_ui_templates_ui_templates_localization_components", + "target": "concepts_ui_templates_\uc81c\uc57d_backend_md_1", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L24", + "weight": 1.0, + "source": "concepts_ui_templates_ui_template_locale_ts_\ub2e4\uad6d\uc5b4_\uad00\ub9ac", + "target": "concepts_ui_templates_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L16", + "weight": 1.0, + "source": "concepts_ui_templates_ui_template_locale_ts_\ub2e4\uad6d\uc5b4_\uad00\ub9ac", + "target": "concepts_ui_templates_\ud575\uc2ec_\uae30\ub2a5", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L50", + "weight": 1.0, + "source": "concepts_ui_templates_ui_template_elements_ts_\uacf5\ud1b5_\ucef4\ud3ec\ub10c\ud2b8", + "target": "concepts_ui_templates_\uc0ac\uc6a9\ucc98_\uc5ed\ucc38\uc870_50", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L34", + "weight": 1.0, + "source": "concepts_ui_templates_ui_template_elements_ts_\uacf5\ud1b5_\ucef4\ud3ec\ub10c\ud2b8", + "target": "concepts_ui_templates_\uc81c\uacf5_\ucef4\ud3ec\ub10c\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/ui_templates.md", + "source_location": "L63", + "weight": 1.0, + "source": "concepts_ui_templates_theme_css_\uc2a4\ud0c0\uc77c_\ubcc0\uc218", + "target": "concepts_ui_templates_\ud575\uc2ec_\ubcc0\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/workflow_state.md", + "source_location": "L9", + "weight": 1.0, + "source": "concepts_workflow_state", + "target": "concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L49", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_frontend", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L32", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_api", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L49", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_backend", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_dependencies.md", + "source_location": "L28", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_dependencies", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L40", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_frontend", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L44", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_backend", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L37", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_backend", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", + "source_location": "L25", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_dependencies", + "target": "concepts_workflow_state", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/workflow_state.md", + "source_location": "L65", + "weight": 1.0, + "source": "concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", + "target": "concepts_workflow_state_b04_\uc0c1\ud0dc_\uc870\ud68c_\ub808\uac70\uc2dc_\ud3f4\ubc31_\ub2f9\ucd08_\uc794\uc7ac_\ub85c_\ud45c\uae30\ud588\uc73c\ub098_\uc815\uc815", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/workflow_state.md", + "source_location": "L62", + "weight": 1.0, + "source": "concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", + "target": "concepts_workflow_state_projects_status_\ubb38\uc790\uc5f4_\uce90\uc2dc_\ud638\ud658\uc6a9_\uacc4\ud68d\uc11c_\ubc29\uce68\ub300\ub85c_\uc720\uc9c0_\uc911", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/workflow_state.md", + "source_location": "L13", + "weight": 1.0, + "source": "concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", + "target": "concepts_workflow_state_ssot_project_workflow_stages_\ud14c\uc774\ube14_\uc2e4_db_\ud655\uc778", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/workflow_state.md", + "source_location": "L27", + "weight": 1.0, + "source": "concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", + "target": "concepts_workflow_state_\uacf5\ud1b5_\uc720\ud2f8_common_util_common_util_workflow_state_py", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/workflow_state.md", + "source_location": "L72", + "weight": 1.0, + "source": "concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", + "target": "concepts_workflow_state_\ubbf8\ud574\uacb0_\uc0ac\ud56d_\uacc4\ud68d\uc11c_\uc6d0\ubb38_\uc544\uc9c1_\uacb0\uc815_\uc548_\ub428", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/workflow_state.md", + "source_location": "L54", + "weight": 1.0, + "source": "concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", + "target": "concepts_workflow_state_\uc0c1\ud0dc_\uc804\uc774_\uad6c\ud604\ub300\ub85c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/workflow_state.md", + "source_location": "L37", + "weight": 1.0, + "source": "concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", + "target": "concepts_workflow_state_\uc2e4_\uc5f0\ub3d9_\ud604\ud669_\ud30c\uc77c_\uc904\ubc88\ud638", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "concepts/workflow_state.md", + "source_location": "L47", + "weight": 1.0, + "source": "concepts_workflow_state_workflow_\uc0c1\ud0dc_\uad00\ub9ac_\uad6c\ud604_\uc644\ub8cc_\uc2e4_db_\ud655\uc778\ub428", + "target": "concepts_workflow_state_\uc870\ud68c_api_\uc2e4\uc81c_\uc874\uc7ac_\uacc4\ud68d\uc11c\uc640_\uacbd\ub85c_\uc77c\uce58", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L6", + "weight": 1.0, + "source": "index", + "target": "index_wiki_index", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L68", + "weight": 1.0, + "source": "index_wiki_index", + "target": "index_\uac1c\ub150_concepts", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L110", + "weight": 1.0, + "source": "index_wiki_index", + "target": "index_\ubbf8\ud574\uacb0_\ud56d\ubaa9", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L39", + "weight": 1.0, + "source": "index_wiki_index", + "target": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L10", + "weight": 1.0, + "source": "index_wiki_index", + "target": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L12", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", + "target": "index_b01_dashboard_b01_backend_b01_dashboard", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L15", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", + "target": "index_b02_projregister_b02_backend_b02_projregister", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L18", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", + "target": "index_b03_fileinput_b03_backend_b03_fileinput", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L21", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", + "target": "index_b04_wf1_surface_b04_backend_b04_wf1_surface", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L24", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", + "target": "index_b05_wf2_route_b05_backend_b05_wf2_route", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L27", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", + "target": "index_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L30", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", + "target": "index_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L33", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", + "target": "index_b08_wf5_quantity_b08_frontend_b08_wf5_quantity", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L36", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\ud6c4_\uc6cc\ud06c\ud50c\ub85c\uc6b0_b01_b09", + "target": "index_b09_wf6_estimation_b09_frontend_b09_wf6_estimation", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L41", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", + "target": "index_a01_home_a01_frontend_a01_home", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L44", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", + "target": "index_a02_progdetail_a02_frontend_a02_progdetail", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L47", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", + "target": "index_a03_compdetail_a03_frontend_a03_compdetail", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L50", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", + "target": "index_a04_newshistory_a04_frontend_a04_newshistory", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L53", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", + "target": "index_a05_edudetail_a05_frontend_a05_edudetail", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L56", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", + "target": "index_a06_login_a06_backend_a06_login", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L59", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", + "target": "index_a07_register_a07_backend_a07_register", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L62", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", + "target": "index_a08_support_a08_backend_a08_support", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L65", + "weight": 1.0, + "source": "index_\ud398\uc774\uc9c0_\ub85c\uadf8\uc778_\uc804_a01_a09", + "target": "index_a09_security_a09_backend_a09_security", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L70", + "weight": 1.0, + "source": "index_\uac1c\ub150_concepts", + "target": "index_a00_app_shell_framework", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L73", + "weight": 1.0, + "source": "index_\uac1c\ub150_concepts", + "target": "index_a00_app_shell_framework_scaffold", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L98", + "weight": 1.0, + "source": "index_\uac1c\ub150_concepts", + "target": "index_api_\uacf5\ud1b5_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L89", + "weight": 1.0, + "source": "index_\uac1c\ub150_concepts", + "target": "index_auth_rbac", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L95", + "weight": 1.0, + "source": "index_\uac1c\ub150_concepts", + "target": "index_common_util", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L79", + "weight": 1.0, + "source": "index_\uac1c\ub150_concepts", + "target": "index_db_\uc2a4\ud0a4\ub9c8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L92", + "weight": 1.0, + "source": "index_\uac1c\ub150_concepts", + "target": "index_storage_paths", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L76", + "weight": 1.0, + "source": "index_\uac1c\ub150_concepts", + "target": "index_ui_templates", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L107", + "weight": 1.0, + "source": "index_\uac1c\ub150_concepts", + "target": "index_workflow_\uc0c1\ud0dc_\uad00\ub9ac", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L104", + "weight": 1.0, + "source": "index_\uac1c\ub150_concepts", + "target": "index_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L101", + "weight": 1.0, + "source": "index_\uac1c\ub150_concepts", + "target": "index_\uc758\uc874\uc131_\uc5ec\ub7ec_\ud398\uc774\uc9c0\uac00_\uacf5\uc720\ud558\ub294_\uc678\ubd80_\ub77c\uc774\ube0c\ub7ec\ub9ac", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "index.md", + "source_location": "L116", + "weight": 1.0, + "source": "index_\ubbf8\ud574\uacb0_\ud56d\ubaa9", + "target": "index_a\uadf8\ub8f9_\uc778\uc81c\uc2a4\ud2b8_\uc774\uc288", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L1", + "weight": 1.0, + "source": "log", + "target": "log_wiki_log", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L173", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_a01_home_\uc2e4_\ucf54\ub4dc_\ubc18\uc601", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L318", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_a02_progdetail_a00_common_framework", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L295", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_a03_compdetail", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L284", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_a04_newshistory", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L274", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_a05_edudetail", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L248", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_a06_login_backend_frontend_\uc0c1\uc138\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L233", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_a07_register_backend_frontend_\uc0c1\uc138\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L219", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_a08_support_backend_frontend_\uc0c1\uc138\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L204", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_a09_security_backend_frontend_\uc0c1\uc138\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L69", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_b02_projregister_backend_frontend_db_\uc0c1\uc138\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L57", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_b04_wf1_surface_\uc2e4_\ucf54\ub4dc_\ub300\uc870_5\ubd84\ud560_\uc0c1\uc138\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L47", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_b07_wf4_designdetail_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\ubbf8\ucc29\uc218_\ud655\uc778", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L36", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_b09_wf6_estimation_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\ubbf8\ucc29\uc218_\ud655\uc778", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L17", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_db_34\uac1c_\ud14c\uc774\ube14_\uc804\uc218_\uceec\ub7fc_\uc2e4\uce21_\ubc0f_\uc704\ud0a4_\ucd5c\uc2e0\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L148", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_guidelines_plans_7\uac74_\uc77c\uad04_\ubc18\uc601", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L30", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_ingest_lint_3\ud68c_\ubc18\ubcf5_\ub9b0\ud2b8_\uac1c\uc120_\uc0ac\uc774\ud074_\uc218\ud589_\ubc0f_\uc704\ud0a4_\ubb34\uacb0\uc131_\ud655\ubcf4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L10", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_lint_5\ud68c_\ubc18\ubcf5_\ub9b0\ud2b8_\uac1c\uc120_\uc0ac\uc774\ud074_\uc218\ud589_\ubc0f_\uc704\ud0a4_\uba54\ud0c0_\uc815\ubcf4_\uc815\ubc00_\ubcf4\uc644", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L305", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_lint_a01_home_\ud398\uc774\uc9c0_\uac80\uc0ac_\ubc0f_\uc218\uc815", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L263", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_lint_a03_a05_\uc778\uc81c\uc2a4\ud2b8_\uc7ac\uc810\uac80", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L188", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_lint_a\uadf8\ub8f9_a01_a09_\uc804\uccb4_\uac80\uc99d_\ubc0f_\uc815\ud569\uc131_\uc810\uac80", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L167", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_lint_page_id_frontmatter_\ud544\ub4dc_\ub3c4\uc785", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L6", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_lint_\uad6c\ud615_\uc0c1\uc704_\ud3f4\ub354_\ud0c8\ucd9c_\ub9c1\ud06c_concepts_\uc804\uc218_\uc815\ubc00_\uad50\uc815", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L141", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_lint_\uc704\ud0a4_\uc2dc\uc2a4\ud15c_\ucd08\uae30_\uc138\ud305", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L126", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_lint_\uc804\uccb4_\uc704\ud0a4_\uad6c\uc870_\uc0c1\ud0dc_\uacf5\uc720_\uac1c\ub150_\uc815\ub9ac", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L134", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_lint_\uc804\uccb4_\uc704\ud0a4_\uad6c\uc870_\uc0c1\ud0dc_\uacf5\uc720_\uac1c\ub150_\uc815\ub9ac_134", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L85", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_query_b01_dashboard_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L93", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_query_b03_fileinput_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L102", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_query_b05_wf2_route_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L111", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_query_b06_wf3_profilecross_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L119", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_query_b08_wf5_quantity_\uc2e4_\ucf54\ub4dc_\uae30\uc900_\ucd5c\uc2e0\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L157", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_query_lint_\uc2e4_db_\uc2e4_\ucf54\ub4dc_\ub300\uc870_\uac80\uc99d_\uc77d\uae30_\uc804\uc6a9", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "log.md", + "source_location": "L180", + "weight": 1.0, + "source": "log_wiki_log", + "target": "log_2026_07_12_refactor_\ud30c\uc77c\uba85_\uaddc\uce59_\ub3c4\uc785_\ubc0f_\ub9c1\ud06c_\uc218\uc815", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_components.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_a01_home_a01_components", + "target": "pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_components.md", + "source_location": "L27", + "weight": 1.0, + "source": "pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", + "target": "pages_a01_home_a01_components_\ub370\uc774\ud130_\ud750\ub984", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_components.md", + "source_location": "L34", + "weight": 1.0, + "source": "pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", + "target": "pages_a01_home_a01_components_\ubbf8\ud574\uacb0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_components.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", + "target": "pages_a01_home_a01_components_\uc2a4\ud0c0\uc77c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_components.md", + "source_location": "L20", + "weight": 1.0, + "source": "pages_a01_home_a01_components_a01_home_\uc138\ubd80_\uad6c\ud604", + "target": "pages_a01_home_a01_components_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a01_home_a01_frontend", + "target": "pages_a01_home_a01_frontend_a01_home_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L43", + "weight": 1.0, + "source": "pages_a01_home_a01_frontend_a01_home_frontend", + "target": "pages_a01_home_a01_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L58", + "weight": 1.0, + "source": "pages_a01_home_a01_frontend_a01_home_frontend", + "target": "pages_a01_home_a01_frontend_\uc138\ubd80_\uad6c\ud604", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L36", + "weight": 1.0, + "source": "pages_a01_home_a01_frontend_a01_home_frontend", + "target": "pages_a01_home_a01_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_a01_home_a01_frontend_a01_home_frontend", + "target": "pages_a01_home_a01_frontend_\ucef4\ud3ec\ub10c\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a01_home_a01_frontend_a01_home_frontend", + "target": "pages_a01_home_a01_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L21", + "weight": 1.0, + "source": "pages_a01_home_a01_frontend_\ucef4\ud3ec\ub10c\ud2b8", + "target": "pages_a01_home_a01_frontend_hero_\uc139\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L31", + "weight": 1.0, + "source": "pages_a01_home_a01_frontend_\ucef4\ud3ec\ub10c\ud2b8", + "target": "pages_a01_home_a01_frontend_\uc8fc\uc694_\uae30\ub2a5_\uc139\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A01_Home/A01_frontend.md", + "source_location": "L26", + "weight": 1.0, + "source": "pages_a01_home_a01_frontend_\ucef4\ud3ec\ub10c\ud2b8", + "target": "pages_a01_home_a01_frontend_\ucd5c\uc2e0_\uc18c\uc2dd_\uc139\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A02_ProgDetail/A02_components.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_a02_progdetail_a02_components", + "target": "pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A02_ProgDetail/A02_components.md", + "source_location": "L29", + "weight": 1.0, + "source": "pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", + "target": "pages_a02_progdetail_a02_components_\ub370\uc774\ud130_\ud750\ub984", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A02_ProgDetail/A02_components.md", + "source_location": "L35", + "weight": 1.0, + "source": "pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", + "target": "pages_a02_progdetail_a02_components_\ubbf8\ud574\uacb0_\ud2b9\uc774\uc0ac\ud56d", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A02_ProgDetail/A02_components.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", + "target": "pages_a02_progdetail_a02_components_\uc2a4\ud0c0\uc77c_css", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A02_ProgDetail/A02_components.md", + "source_location": "L21", + "weight": 1.0, + "source": "pages_a02_progdetail_a02_components_a02_progdetail_\uc138\ubd80_\uad6c\ud604", + "target": "pages_a02_progdetail_a02_components_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A02_ProgDetail/A02_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a02_progdetail_a02_frontend", + "target": "pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A02_ProgDetail/A02_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", + "target": "pages_a02_progdetail_a02_frontend_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A02_ProgDetail/A02_frontend.md", + "source_location": "L31", + "weight": 1.0, + "source": "pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", + "target": "pages_a02_progdetail_a02_frontend_\uc138\ubd80_\uad6c\ud604", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A02_ProgDetail/A02_frontend.md", + "source_location": "L24", + "weight": 1.0, + "source": "pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", + "target": "pages_a02_progdetail_a02_frontend_\uc81c\uc57d_\uc900\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A02_ProgDetail/A02_frontend.md", + "source_location": "L16", + "weight": 1.0, + "source": "pages_a02_progdetail_a02_frontend_a02_progdetail_frontend", + "target": "pages_a02_progdetail_a02_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ubd84\uc11d", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a03_compdetail_a03_frontend", + "target": "pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L29", + "weight": 1.0, + "source": "pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", + "target": "pages_a03_compdetail_a03_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L45", + "weight": 1.0, + "source": "pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", + "target": "pages_a03_compdetail_a03_frontend_\uc2a4\ud0c0\uc77c_css", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L64", + "weight": 1.0, + "source": "pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", + "target": "pages_a03_compdetail_a03_frontend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", + "target": "pages_a03_compdetail_a03_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a03_compdetail_a03_frontend_a03_compdetail_frontend", + "target": "pages_a03_compdetail_a03_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L47", + "weight": 1.0, + "source": "pages_a03_compdetail_a03_frontend_\uc2a4\ud0c0\uc77c_css", + "target": "pages_a03_compdetail_a03_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A03_CompDetail/A03_frontend.md", + "source_location": "L61", + "weight": 1.0, + "source": "pages_a03_compdetail_a03_frontend_\uc2a4\ud0c0\uc77c_css", + "target": "pages_a03_compdetail_a03_frontend_\ubc18\uc751\ud615", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a04_newshistory_a04_frontend", + "target": "pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L30", + "weight": 1.0, + "source": "pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", + "target": "pages_a04_newshistory_a04_frontend_mock_\ub370\uc774\ud130_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L48", + "weight": 1.0, + "source": "pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", + "target": "pages_a04_newshistory_a04_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L83", + "weight": 1.0, + "source": "pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", + "target": "pages_a04_newshistory_a04_frontend_\ubbf8\ud574\uacb0_\uc0ac\ud56d", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L60", + "weight": 1.0, + "source": "pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", + "target": "pages_a04_newshistory_a04_frontend_\uc2a4\ud0c0\uc77c_css", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L78", + "weight": 1.0, + "source": "pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", + "target": "pages_a04_newshistory_a04_frontend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", + "target": "pages_a04_newshistory_a04_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a04_newshistory_a04_frontend_a04_newshistory_frontend", + "target": "pages_a04_newshistory_a04_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L62", + "weight": 1.0, + "source": "pages_a04_newshistory_a04_frontend_\uc2a4\ud0c0\uc77c_css", + "target": "pages_a04_newshistory_a04_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A04_NewsHistory/A04_frontend.md", + "source_location": "L75", + "weight": 1.0, + "source": "pages_a04_newshistory_a04_frontend_\uc2a4\ud0c0\uc77c_css", + "target": "pages_a04_newshistory_a04_frontend_\ubc18\uc751\ud615", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a05_edudetail_a05_frontend", + "target": "pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L28", + "weight": 1.0, + "source": "pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", + "target": "pages_a05_edudetail_a05_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L41", + "weight": 1.0, + "source": "pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", + "target": "pages_a05_edudetail_a05_frontend_\uc2a4\ud0c0\uc77c_css", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L65", + "weight": 1.0, + "source": "pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", + "target": "pages_a05_edudetail_a05_frontend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L59", + "weight": 1.0, + "source": "pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", + "target": "pages_a05_edudetail_a05_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", + "target": "pages_a05_edudetail_a05_frontend_\ucef4\ud3ec\ub10c\ud2b8_\uc139\uc158_\ube4c\ub354", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a05_edudetail_a05_frontend_a05_edudetail_frontend", + "target": "pages_a05_edudetail_a05_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L43", + "weight": 1.0, + "source": "pages_a05_edudetail_a05_frontend_\uc2a4\ud0c0\uc77c_css", + "target": "pages_a05_edudetail_a05_frontend_css_\ud074\ub798\uc2a4_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A05_EduDetail/A05_frontend.md", + "source_location": "L56", + "weight": 1.0, + "source": "pages_a05_edudetail_a05_frontend_\uc2a4\ud0c0\uc77c_css", + "target": "pages_a05_edudetail_a05_frontend_\ubc18\uc751\ud615", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a06_login_a06_backend", + "target": "pages_a06_login_a06_backend_a06_login_backend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_a06_login_a06_backend_a06_login_backend", + "target": "pages_a06_login_a06_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L66", + "weight": 1.0, + "source": "pages_a06_login_a06_backend_a06_login_backend", + "target": "pages_a06_login_a06_backend_\uacc4\ud68d\uc11c\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L29", + "weight": 1.0, + "source": "pages_a06_login_a06_backend_a06_login_backend", + "target": "pages_a06_login_a06_backend_\ub0b4\ubd80_\ud5ec\ud37c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L45", + "weight": 1.0, + "source": "pages_a06_login_a06_backend_a06_login_backend", + "target": "pages_a06_login_a06_backend_\ub85c\uadf8\uc778_\ub85c\uc9c1_\ud750\ub984", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L54", + "weight": 1.0, + "source": "pages_a06_login_a06_backend_a06_login_backend", + "target": "pages_a06_login_a06_backend_\ubcf4\uc548_\uc815\ucc45_\uc2e4_\ucf54\ub4dc_\uae30\uc900", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L37", + "weight": 1.0, + "source": "pages_a06_login_a06_backend_a06_login_backend", + "target": "pages_a06_login_a06_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L60", + "weight": 1.0, + "source": "pages_a06_login_a06_backend_a06_login_backend", + "target": "pages_a06_login_a06_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_backend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a06_login_a06_backend_a06_login_backend", + "target": "pages_a06_login_a06_backend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a06_login_a06_frontend", + "target": "pages_a06_login_a06_frontend_a06_login_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L27", + "weight": 1.0, + "source": "pages_a06_login_a06_frontend_a06_login_frontend", + "target": "pages_a06_login_a06_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L51", + "weight": 1.0, + "source": "pages_a06_login_a06_frontend_a06_login_frontend", + "target": "pages_a06_login_a06_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L64", + "weight": 1.0, + "source": "pages_a06_login_a06_frontend_a06_login_frontend", + "target": "pages_a06_login_a06_frontend_\uc2a4\ud0c0\uc77c_css", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L79", + "weight": 1.0, + "source": "pages_a06_login_a06_frontend_a06_login_frontend", + "target": "pages_a06_login_a06_frontend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L72", + "weight": 1.0, + "source": "pages_a06_login_a06_frontend_a06_login_frontend", + "target": "pages_a06_login_a06_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L40", + "weight": 1.0, + "source": "pages_a06_login_a06_frontend_a06_login_frontend", + "target": "pages_a06_login_a06_frontend_\uc81c\ucd9c_\ub85c\uc9c1_2\ub2e8\uacc4_\ud3fc_\uc804\ud658", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L20", + "weight": 1.0, + "source": "pages_a06_login_a06_frontend_a06_login_frontend", + "target": "pages_a06_login_a06_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A06_Login/A06_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a06_login_a06_frontend_a06_login_frontend", + "target": "pages_a06_login_a06_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a07_register_a07_backend", + "target": "pages_a07_register_a07_backend_a07_register_backend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_a07_register_a07_backend_a07_register_backend", + "target": "pages_a07_register_a07_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L36", + "weight": 1.0, + "source": "pages_a07_register_a07_backend_a07_register_backend", + "target": "pages_a07_register_a07_backend_\uac00\uc785_\ub85c\uc9c1_\ud750\ub984", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L27", + "weight": 1.0, + "source": "pages_a07_register_a07_backend_a07_register_backend", + "target": "pages_a07_register_a07_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L48", + "weight": 1.0, + "source": "pages_a07_register_a07_backend_a07_register_backend", + "target": "pages_a07_register_a07_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L54", + "weight": 1.0, + "source": "pages_a07_register_a07_backend_a07_register_backend", + "target": "pages_a07_register_a07_backend_\ucc38\uace0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_backend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a07_register_a07_backend_a07_register_backend", + "target": "pages_a07_register_a07_backend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a07_register_a07_frontend", + "target": "pages_a07_register_a07_frontend_a07_register_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L33", + "weight": 1.0, + "source": "pages_a07_register_a07_frontend_a07_register_frontend", + "target": "pages_a07_register_a07_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L56", + "weight": 1.0, + "source": "pages_a07_register_a07_frontend_a07_register_frontend", + "target": "pages_a07_register_a07_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L70", + "weight": 1.0, + "source": "pages_a07_register_a07_frontend_a07_register_frontend", + "target": "pages_a07_register_a07_frontend_\uc2a4\ud0c0\uc77c_css", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L50", + "weight": 1.0, + "source": "pages_a07_register_a07_frontend_a07_register_frontend", + "target": "pages_a07_register_a07_frontend_\uc57d\uad00_\ub3d9\uc758_\uc544\ucf54\ub514\uc5b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L85", + "weight": 1.0, + "source": "pages_a07_register_a07_frontend_a07_register_frontend", + "target": "pages_a07_register_a07_frontend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L77", + "weight": 1.0, + "source": "pages_a07_register_a07_frontend_a07_register_frontend", + "target": "pages_a07_register_a07_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L43", + "weight": 1.0, + "source": "pages_a07_register_a07_frontend_a07_register_frontend", + "target": "pages_a07_register_a07_frontend_\uc81c\ucd9c_\ub85c\uc9c1_2\ub2e8\uacc4_\ud3fc_\uc804\ud658", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L24", + "weight": 1.0, + "source": "pages_a07_register_a07_frontend_a07_register_frontend", + "target": "pages_a07_register_a07_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218_ui_auth_page_\uc2e4\uc0ac\uc6a9", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A07_Register/A07_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a07_register_a07_frontend_a07_register_frontend", + "target": "pages_a07_register_a07_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a08_support_a08_backend", + "target": "pages_a08_support_a08_backend_a08_support_backend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_a08_support_a08_backend_a08_support_backend", + "target": "pages_a08_support_a08_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L62", + "weight": 1.0, + "source": "pages_a08_support_a08_backend_a08_support_backend", + "target": "pages_a08_support_a08_backend_db_\uc2a4\ud0a4\ub9c8_\ubd88\uc77c\uce58_\ud655\uc778_\ud544\uc694", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L44", + "weight": 1.0, + "source": "pages_a08_support_a08_backend_a08_support_backend", + "target": "pages_a08_support_a08_backend_db_\uc800\uc7a5_\uceec\ub7fc_\uc2e4_\ucf54\ub4dc_insert_\uae30\uc900", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L25", + "weight": 1.0, + "source": "pages_a08_support_a08_backend_a08_support_backend", + "target": "pages_a08_support_a08_backend_\ub0b4\ubd80_\ud5ec\ud37c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L31", + "weight": 1.0, + "source": "pages_a08_support_a08_backend_a08_support_backend", + "target": "pages_a08_support_a08_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L56", + "weight": 1.0, + "source": "pages_a08_support_a08_backend_a08_support_backend", + "target": "pages_a08_support_a08_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L37", + "weight": 1.0, + "source": "pages_a08_support_a08_backend_a08_support_backend", + "target": "pages_a08_support_a08_backend_\uc811\uc218_\ub85c\uc9c1", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L51", + "weight": 1.0, + "source": "pages_a08_support_a08_backend_a08_support_backend", + "target": "pages_a08_support_a08_backend_\ud2b9\uc9d5", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_backend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a08_support_a08_backend_a08_support_backend", + "target": "pages_a08_support_a08_backend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a08_support_a08_frontend", + "target": "pages_a08_support_a08_frontend_a08_support_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L39", + "weight": 1.0, + "source": "pages_a08_support_a08_frontend_a08_support_frontend", + "target": "pages_a08_support_a08_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L34", + "weight": 1.0, + "source": "pages_a08_support_a08_frontend_a08_support_frontend", + "target": "pages_a08_support_a08_frontend_\uc138\uc158_\uc790\ub3d9_\ucc44\uc6c0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L51", + "weight": 1.0, + "source": "pages_a08_support_a08_frontend_a08_support_frontend", + "target": "pages_a08_support_a08_frontend_\uc2a4\ud0c0\uc77c_css", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L65", + "weight": 1.0, + "source": "pages_a08_support_a08_frontend_a08_support_frontend", + "target": "pages_a08_support_a08_frontend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L59", + "weight": 1.0, + "source": "pages_a08_support_a08_frontend_a08_support_frontend", + "target": "pages_a08_support_a08_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L27", + "weight": 1.0, + "source": "pages_a08_support_a08_frontend_a08_support_frontend", + "target": "pages_a08_support_a08_frontend_\uc81c\ucd9c_\ub85c\uc9c1", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L73", + "weight": 1.0, + "source": "pages_a08_support_a08_frontend_a08_support_frontend", + "target": "pages_a08_support_a08_frontend_\ucc38\uace0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_a08_support_a08_frontend_a08_support_frontend", + "target": "pages_a08_support_a08_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A08_Support/A08_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a08_support_a08_frontend_a08_support_frontend", + "target": "pages_a08_support_a08_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a09_security_a09_backend", + "target": "pages_a09_security_a09_backend_a09_security_backend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_a09_security_a09_backend_a09_security_backend", + "target": "pages_a09_security_a09_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L55", + "weight": 1.0, + "source": "pages_a09_security_a09_backend_a09_security_backend", + "target": "pages_a09_security_a09_backend_db_\uc800\uc7a5_activity_logs", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L60", + "weight": 1.0, + "source": "pages_a09_security_a09_backend_a09_security_backend", + "target": "pages_a09_security_a09_backend_\uad8c\ud55c_\ud5ec\ud37c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L45", + "weight": 1.0, + "source": "pages_a09_security_a09_backend_a09_security_backend", + "target": "pages_a09_security_a09_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8_pydantic", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L67", + "weight": 1.0, + "source": "pages_a09_security_a09_backend_a09_security_backend", + "target": "pages_a09_security_a09_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L73", + "weight": 1.0, + "source": "pages_a09_security_a09_backend_a09_security_backend", + "target": "pages_a09_security_a09_backend_\ucc38\uace0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a09_security_a09_backend_a09_security_backend", + "target": "pages_a09_security_a09_backend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L21", + "weight": 1.0, + "source": "pages_a09_security_a09_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "target": "pages_a09_security_a09_backend_\ub9c8\uc2a4\ud130_\ud68c\uc0ac_\uad00\ub9ac\uc790_\uc804\uc6a9_require_master", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L31", + "weight": 1.0, + "source": "pages_a09_security_a09_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "target": "pages_a09_security_a09_backend_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790_\uc804\uc6a9_require_system_admin", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_backend.md", + "source_location": "L39", + "weight": 1.0, + "source": "pages_a09_security_a09_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "target": "pages_a09_security_a09_backend_\uc778\uc99d_\uc0ac\uc6a9\uc790_\uacf5\ud1b5_verify_session", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_a09_security_a09_frontend", + "target": "pages_a09_security_a09_frontend_a09_security_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L40", + "weight": 1.0, + "source": "pages_a09_security_a09_frontend_a09_security_frontend", + "target": "pages_a09_security_a09_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218_\ubbf8\uc0ac\uc6a9_\uc815\uc758\ub9cc", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L53", + "weight": 1.0, + "source": "pages_a09_security_a09_frontend_a09_security_frontend", + "target": "pages_a09_security_a09_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L64", + "weight": 1.0, + "source": "pages_a09_security_a09_frontend_a09_security_frontend", + "target": "pages_a09_security_a09_frontend_\uc2a4\ud0c0\uc77c_css", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L31", + "weight": 1.0, + "source": "pages_a09_security_a09_frontend_a09_security_frontend", + "target": "pages_a09_security_a09_frontend_\uc57d\uad00_\ub370\uc774\ud130_a09_security_terms_ts", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L69", + "weight": 1.0, + "source": "pages_a09_security_a09_frontend_a09_security_frontend", + "target": "pages_a09_security_a09_frontend_\uc57d\uad00_\ud14d\uc2a4\ud2b8\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L75", + "weight": 1.0, + "source": "pages_a09_security_a09_frontend_a09_security_frontend", + "target": "pages_a09_security_a09_frontend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L25", + "weight": 1.0, + "source": "pages_a09_security_a09_frontend_a09_security_frontend", + "target": "pages_a09_security_a09_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/A09_Security/A09_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_a09_security_a09_frontend_a09_security_frontend", + "target": "pages_a09_security_a09_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_api", + "target": "pages_b01_dashboard_b01_api_b01_dashboard_api", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L14", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_api_b01_dashboard_api", + "target": "pages_b01_dashboard_b01_api_\uc0ac\uc6a9\uc790_\ud68c\uc0ac", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L46", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_api_b01_dashboard_api", + "target": "pages_b01_dashboard_b01_api_\uc2dc\uc2a4\ud15c_\uad00\ub9ac\uc790", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L35", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_api_b01_dashboard_api", + "target": "pages_b01_dashboard_b01_api_\ud504\ub85c\uc81d\ud2b8_\uc790\ub3d9\ud654", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_api.md", + "source_location": "L25", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_api_b01_dashboard_api", + "target": "pages_b01_dashboard_b01_api_\ud68c\uc0ac_\uad00\ub9ac\uc790", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_backend", + "target": "pages_b01_dashboard_b01_backend_b01_dashboard_backend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L54", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_backend_b01_dashboard_backend", + "target": "pages_b01_dashboard_b01_backend_\uae30\uc220\ubd80\ucc44", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_backend_b01_dashboard_backend", + "target": "pages_b01_dashboard_b01_backend_\ub77c\uc6b0\ud130_\uad8c\ud55c_\ud5ec\ud37c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L44", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_backend_b01_dashboard_backend", + "target": "pages_b01_dashboard_b01_backend_\uc694\uccad_\uc2a4\ud0a4\ub9c8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_backend.md", + "source_location": "L24", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_backend_b01_dashboard_backend", + "target": "pages_b01_dashboard_b01_backend_\uc800\uc7a5\uc18c_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_db.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_db", + "target": "pages_b01_dashboard_b01_db_b01_dashboard_db_\uc0ac\uc6a9_\uad00\uacc4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_db.md", + "source_location": "L25", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_db_b01_dashboard_db_\uc0ac\uc6a9_\uad00\uacc4", + "target": "pages_b01_dashboard_b01_db_\ud2b8\ub79c\uc7ad\uc158_\uacbd\uacc4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_dependencies.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_dependencies", + "target": "pages_b01_dashboard_b01_dependencies_b01_dashboard_dependencies", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_dependencies.md", + "source_location": "L23", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_dependencies_b01_dashboard_dependencies", + "target": "pages_b01_dashboard_b01_dependencies_\ud504\ub85c\uc81d\ud2b8_\uacf5\ud1b5_\ubaa8\ub4c8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_frontend", + "target": "pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L20", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", + "target": "pages_b01_dashboard_b01_frontend_ui_\uad8c\ud55c_\ud5ec\ud37c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L45", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", + "target": "pages_b01_dashboard_b01_frontend_\uacf5\uc720_\uc790\uc6d0_\uc5f0\uacb0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L52", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", + "target": "pages_b01_dashboard_b01_frontend_\uae30\uc220\ubd80\ucc44", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L32", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", + "target": "pages_b01_dashboard_b01_frontend_\ubaa8\ub2ec", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B01_Dashboard/B01_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b01_dashboard_b01_frontend_b01_dashboard_frontend", + "target": "pages_b01_dashboard_b01_frontend_\ud30c\uc77c\uacfc_\uc9c4\uc785\uc810", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_b02_projregister_b02_backend", + "target": "pages_b02_projregister_b02_backend_b02_projregister_backend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L22", + "weight": 1.0, + "source": "pages_b02_projregister_b02_backend_b02_projregister_backend", + "target": "pages_b02_projregister_b02_backend_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L56", + "weight": 1.0, + "source": "pages_b02_projregister_b02_backend_b02_projregister_backend", + "target": "pages_b02_projregister_b02_backend_db_\uc800\uc7a5_\uceec\ub7fc_projects_insert", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L45", + "weight": 1.0, + "source": "pages_b02_projregister_b02_backend_b02_projregister_backend", + "target": "pages_b02_projregister_b02_backend_\uc0dd\uc131_\ub85c\uc9c1_create_project_\ud2b8\ub79c\uc7ad\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L38", + "weight": 1.0, + "source": "pages_b02_projregister_b02_backend_b02_projregister_backend", + "target": "pages_b02_projregister_b02_backend_\uc694\uccad_\uc751\ub2f5_\uc2a4\ud0a4\ub9c8_pydantic", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L61", + "weight": 1.0, + "source": "pages_b02_projregister_b02_backend_b02_projregister_backend", + "target": "pages_b02_projregister_b02_backend_\uc758\uc874\uc131_\uacf5\ud1b5_\uc720\ud2f8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L69", + "weight": 1.0, + "source": "pages_b02_projregister_b02_backend_b02_projregister_backend", + "target": "pages_b02_projregister_b02_backend_\ucc38\uace0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L14", + "weight": 1.0, + "source": "pages_b02_projregister_b02_backend_b02_projregister_backend", + "target": "pages_b02_projregister_b02_backend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_backend.md", + "source_location": "L28", + "weight": 1.0, + "source": "pages_b02_projregister_b02_backend_b02_projregister_backend", + "target": "pages_b02_projregister_b02_backend_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_db.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_b02_projregister_b02_db", + "target": "pages_b02_projregister_b02_db_b02_projregister_db", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_db.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b02_projregister_b02_db_b02_projregister_db", + "target": "pages_b02_projregister_b02_db_\uc4f0\ub294_\ud14c\uc774\ube14", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_db.md", + "source_location": "L20", + "weight": 1.0, + "source": "pages_b02_projregister_b02_db_b02_projregister_db", + "target": "pages_b02_projregister_b02_db_\uc800\uc7a5\uc18c_\ud30c\uc77c\uc2dc\uc2a4\ud15c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_db.md", + "source_location": "L26", + "weight": 1.0, + "source": "pages_b02_projregister_b02_db_b02_projregister_db", + "target": "pages_b02_projregister_b02_db_\ucc38\uace0_\uacc4\ud68d_\ub2f9\uc2dc_\uc758\ub3c4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_b02_projregister_b02_frontend", + "target": "pages_b02_projregister_b02_frontend_b02_projregister_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L45", + "weight": 1.0, + "source": "pages_b02_projregister_b02_frontend_b02_projregister_frontend", + "target": "pages_b02_projregister_b02_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L57", + "weight": 1.0, + "source": "pages_b02_projregister_b02_frontend_b02_projregister_frontend", + "target": "pages_b02_projregister_b02_frontend_\uc2a4\ud0c0\uc77c_css", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L72", + "weight": 1.0, + "source": "pages_b02_projregister_b02_frontend_b02_projregister_frontend", + "target": "pages_b02_projregister_b02_frontend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L66", + "weight": 1.0, + "source": "pages_b02_projregister_b02_frontend_b02_projregister_frontend", + "target": "pages_b02_projregister_b02_frontend_\uc774\ubca4\ud2b8_\ud578\ub4e4\ub7ec", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L26", + "weight": 1.0, + "source": "pages_b02_projregister_b02_frontend_b02_projregister_frontend", + "target": "pages_b02_projregister_b02_frontend_\uc785\ub825_\ud544\ub4dc", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L37", + "weight": 1.0, + "source": "pages_b02_projregister_b02_frontend_b02_projregister_frontend", + "target": "pages_b02_projregister_b02_frontend_\uc81c\ucd9c_\ub85c\uc9c1", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L80", + "weight": 1.0, + "source": "pages_b02_projregister_b02_frontend_b02_projregister_frontend", + "target": "pages_b02_projregister_b02_frontend_\ucc38\uace0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_b02_projregister_b02_frontend_b02_projregister_frontend", + "target": "pages_b02_projregister_b02_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B02_ProjRegister/B02_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b02_projregister_b02_frontend_b02_projregister_frontend", + "target": "pages_b02_projregister_b02_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_api", + "target": "pages_b03_fileinput_b03_api_b03_fileinput_api", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L27", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_api_b03_fileinput_api", + "target": "pages_b03_fileinput_b03_api_workflow_\uc870\ud68c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L14", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_api_b03_fileinput_api", + "target": "pages_b03_fileinput_b03_api_\uc77c\ubc18_\uc5c5\ub85c\ub4dc", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_api.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_api_b03_fileinput_api", + "target": "pages_b03_fileinput_b03_api_\uccad\ud06c_\uc5c5\ub85c\ub4dc", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_backend", + "target": "pages_b03_fileinput_b03_backend_b03_fileinput_backend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L40", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_backend_b03_fileinput_backend", + "target": "pages_b03_fileinput_b03_backend_workflow_\uc54c\ub9bc", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L22", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_backend_b03_fileinput_backend", + "target": "pages_b03_fileinput_b03_backend_\uba54\ud0c0\ub370\uc774\ud130_\ubd84\uc11d", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_backend_b03_fileinput_backend", + "target": "pages_b03_fileinput_b03_backend_\uc785\ub825_\uac80\uc99d_\ud30c\uc77c_\ucc98\ub9ac", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_backend.md", + "source_location": "L31", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_backend_b03_fileinput_backend", + "target": "pages_b03_fileinput_b03_backend_\uc800\uc7a5\uc18c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_db.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_db", + "target": "pages_b03_fileinput_b03_db_b03_fileinput_db_\uc0ac\uc6a9_\uad00\uacc4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_db.md", + "source_location": "L22", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_db_b03_fileinput_db_\uc0ac\uc6a9_\uad00\uacc4", + "target": "pages_b03_fileinput_b03_db_\ud30c\uc77c_\uacbd\ub85c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_dependencies.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_dependencies", + "target": "pages_b03_fileinput_b03_dependencies_b03_fileinput_dependencies", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_dependencies.md", + "source_location": "L24", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_dependencies_b03_fileinput_dependencies", + "target": "pages_b03_fileinput_b03_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_frontend", + "target": "pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L21", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", + "target": "pages_b03_fileinput_b03_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L42", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", + "target": "pages_b03_fileinput_b03_frontend_\uae30\uc220\ubd80\ucc44", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L31", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", + "target": "pages_b03_fileinput_b03_frontend_\ube0c\ub77c\uc6b0\uc800_\uc0c1\ud0dc_\uc624\ud504\ub77c\uc778_\ubcf4\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B03_FileInput/B03_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b03_fileinput_b03_frontend_b03_fileinput_frontend", + "target": "pages_b03_fileinput_b03_frontend_\ud398\uc774\uc9c0_\uc5c5\ub85c\ub4dc_\ud750\ub984", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_api.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_api", + "target": "pages_b04_wf1_surface_b04_api_b04_wf1_surface_api", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_api.md", + "source_location": "L15", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_api_b04_wf1_surface_api", + "target": "pages_b04_wf1_surface_b04_api_\uc5d4\ub4dc\ud3ec\uc778\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_api.md", + "source_location": "L31", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_api_b04_wf1_surface_api", + "target": "pages_b04_wf1_surface_b04_api_\uc694\uccad_\uc751\ub2f5_\uc2a4\ud0a4\ub9c8_pydantic", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_backend", + "target": "pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L53", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", + "target": "pages_b04_wf1_surface_b04_backend_\ub808\uac70\uc2dc_\ud3f4\ubc31_416_420\uc904", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L21", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", + "target": "pages_b04_wf1_surface_b04_backend_\uc5d4\uc9c4_\uc11c\ube0c\ubaa8\ub4c8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L44", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", + "target": "pages_b04_wf1_surface_b04_backend_\uc6cc\ud06c\ud50c\ub85c\uc6b0_\uc0c1\ud0dc_\uc804\uc774", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L66", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", + "target": "pages_b04_wf1_surface_b04_backend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L35", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", + "target": "pages_b04_wf1_surface_b04_backend_\uc8fc\uc694_\ud568\uc218_router", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L62", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", + "target": "pages_b04_wf1_surface_b04_backend_\ucc45\uc784", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_backend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_backend_b04_wf1_surface_backend", + "target": "pages_b04_wf1_surface_b04_backend_\ud30c\uc77c_\uad6c\uc131_\uc624\ucf00\uc2a4\ud2b8\ub808\uc774\ud130_\uc800\uc7a5\uc18c_\ub77c\uc6b0\ud130", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_db.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_db", + "target": "pages_b04_wf1_surface_b04_db_b04_wf1_surface_db", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_db.md", + "source_location": "L23", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_db_b04_wf1_surface_db", + "target": "pages_b04_wf1_surface_b04_db_repository_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_db.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_db_b04_wf1_surface_db", + "target": "pages_b04_wf1_surface_b04_db_\uc4f0\ub294_\ud14c\uc774\ube14", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_db.md", + "source_location": "L31", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_db_b04_wf1_surface_db", + "target": "pages_b04_wf1_surface_b04_db_\ucc38\uace0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_dependencies", + "target": "pages_b04_wf1_surface_b04_dependencies_b04_wf1_surface_dependencies", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", + "source_location": "L30", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_dependencies_b04_wf1_surface_dependencies", + "target": "pages_b04_wf1_surface_b04_dependencies_dependencies_concept_\uc815\uc815_\ud544\uc694", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_dependencies_b04_wf1_surface_dependencies", + "target": "pages_b04_wf1_surface_b04_dependencies_\ubc31\uc5d4\ub4dc_python", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_dependencies.md", + "source_location": "L24", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_dependencies_b04_wf1_surface_dependencies", + "target": "pages_b04_wf1_surface_b04_dependencies_\ud504\ub860\ud2b8\uc5d4\ub4dc_typescript", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_frontend", + "target": "pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L40", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", + "target": "pages_b04_wf1_surface_b04_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L22", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", + "target": "pages_b04_wf1_surface_b04_frontend_\uacc4\ud68d\uc11c\uc640_\uc2e4_\ucf54\ub4dc_\ubd88\uc77c\uce58_3d_\ubdf0\uc5b4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L60", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", + "target": "pages_b04_wf1_surface_b04_frontend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L53", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", + "target": "pages_b04_wf1_surface_b04_frontend_\ucc98\ub9ac_\ud750\ub984", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L32", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", + "target": "pages_b04_wf1_surface_b04_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B04_wf1_Surface/B04_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b04_wf1_surface_b04_frontend_b04_wf1_surface_frontend", + "target": "pages_b04_wf1_surface_b04_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_api.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_api", + "target": "pages_b05_wf2_route_b05_api_b05_wf2_route_api", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_api.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_api_b05_wf2_route_api", + "target": "pages_b05_wf2_route_b05_api_solve_\ucc98\ub9ac_\uacb0\uacfc", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_backend", + "target": "pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L20", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", + "target": "pages_b05_wf2_route_b05_backend_\uacbd\ub85c_\uacc4\uc0b0_\uc5d4\uc9c4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L46", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", + "target": "pages_b05_wf2_route_b05_backend_\uae30\uc220\ubd80\ucc44", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L31", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", + "target": "pages_b05_wf2_route_b05_backend_\uae30\ud558_\uacb0\uacfc_\ubcc0\ud658", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L39", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", + "target": "pages_b05_wf2_route_b05_backend_\ub77c\uc6b0\ud130_workflow", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_backend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_backend_b05_wf2_route_backend", + "target": "pages_b05_wf2_route_b05_backend_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_db.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_db", + "target": "pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_db.md", + "source_location": "L20", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", + "target": "pages_b05_wf2_route_b05_db_repository_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_db.md", + "source_location": "L30", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", + "target": "pages_b05_wf2_route_b05_db_\uc800\uc7a5_\uacbd\ub85c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_dependencies.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_dependencies", + "target": "pages_b05_wf2_route_b05_dependencies_b05_wf2_route_dependencies", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_dependencies.md", + "source_location": "L23", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_dependencies_b05_wf2_route_dependencies", + "target": "pages_b05_wf2_route_b05_dependencies_\ud398\uc774\uc9c0_\ud30c\uc77c\ubcc4_\uc5f0\uacb0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_frontend.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_frontend", + "target": "pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_frontend.md", + "source_location": "L21", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", + "target": "pages_b05_wf2_route_b05_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_frontend.md", + "source_location": "L40", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", + "target": "pages_b05_wf2_route_b05_frontend_\uae30\uc220\ubd80\ucc44", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_frontend.md", + "source_location": "L29", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", + "target": "pages_b05_wf2_route_b05_frontend_\uc785\ub825_\uadf8\ub8f9", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B05_wf2_Route/B05_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b05_wf2_route_b05_frontend_b05_wf2_route_frontend", + "target": "pages_b05_wf2_route_b05_frontend_\ud654\uba74\uacfc_\uc0c1\ud638\uc791\uc6a9", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_api", + "target": "pages_b06_wf3_profilecross_b06_api_b06_wf3_profilecross_api", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", + "source_location": "L20", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_api_b06_wf3_profilecross_api", + "target": "pages_b06_wf3_profilecross_b06_api_\uc0dd\uc131_\uc751\ub2f5", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_backend", + "target": "pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L31", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", + "target": "pages_b06_wf3_profilecross_b06_backend_\ub77c\uc6b0\ud130_workflow", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L20", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", + "target": "pages_b06_wf3_profilecross_b06_backend_\uc0dd\uc131_\uc5d4\uc9c4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", + "target": "pages_b06_wf3_profilecross_b06_backend_\uc694\uccad_\uc751\ub2f5_\ubaa8\ub378", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_backend.md", + "source_location": "L39", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_backend_b06_wf3_profilecross_backend", + "target": "pages_b06_wf3_profilecross_b06_backend_\uc7ac\uc2e4\ud589", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_db", + "target": "pages_b06_wf3_profilecross_b06_db_b06_wf3_profilecross_db_\uc0ac\uc6a9_\uad00\uacc4", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_db_b06_wf3_profilecross_db_\uc0ac\uc6a9_\uad00\uacc4", + "target": "pages_b06_wf3_profilecross_b06_db_repository_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_db.md", + "source_location": "L29", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_db_b06_wf3_profilecross_db_\uc0ac\uc6a9_\uad00\uacc4", + "target": "pages_b06_wf3_profilecross_b06_db_\ud30c\uc77c_\uacbd\ub85c", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_dependencies", + "target": "pages_b06_wf3_profilecross_b06_dependencies_b06_wf3_profilecross_dependencies", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", + "source_location": "L22", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_dependencies_b06_wf3_profilecross_dependencies", + "target": "pages_b06_wf3_profilecross_b06_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_frontend", + "target": "pages_b06_wf3_profilecross_b06_frontend_b06_wf3_profilecross_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", + "source_location": "L21", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_frontend_b06_wf3_profilecross_frontend", + "target": "pages_b06_wf3_profilecross_b06_frontend_api_\ud074\ub77c\uc774\uc5b8\ud2b8", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", + "source_location": "L30", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_frontend_b06_wf3_profilecross_frontend", + "target": "pages_b06_wf3_profilecross_b06_frontend_\uc785\ub825_\uc635\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B06_wf3_ProfileCross/B06_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b06_wf3_profilecross_b06_frontend_b06_wf3_profilecross_frontend", + "target": "pages_b06_wf3_profilecross_b06_frontend_\ud654\uba74_workflow", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_b07_wf4_designdetail_b07_frontend", + "target": "pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L24", + "weight": 1.0, + "source": "pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", + "target": "pages_b07_wf4_designdetail_b07_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L35", + "weight": 1.0, + "source": "pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", + "target": "pages_b07_wf4_designdetail_b07_frontend_\ubc31\uc5d4\ub4dc_db_\ubbf8\ucc29\uc218_\uacc4\ud68d\uc801_\ubc94\uc704_\uc81c\uc678", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L30", + "weight": 1.0, + "source": "pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", + "target": "pages_b07_wf4_designdetail_b07_frontend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L42", + "weight": 1.0, + "source": "pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", + "target": "pages_b07_wf4_designdetail_b07_frontend_\ucc38\uace0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L18", + "weight": 1.0, + "source": "pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", + "target": "pages_b07_wf4_designdetail_b07_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B07_wf4_DesignDetail/B07_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b07_wf4_designdetail_b07_frontend_b07_wf4_designdetail_frontend", + "target": "pages_b07_wf4_designdetail_b07_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B08_wf5_Quantity/B08_db.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b08_wf5_quantity_b08_db", + "target": "pages_b08_wf5_quantity_b08_db_b08_wf5_quantity_db", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B08_wf5_Quantity/B08_db.md", + "source_location": "L19", + "weight": 1.0, + "source": "pages_b08_wf5_quantity_b08_db_b08_wf5_quantity_db", + "target": "pages_b08_wf5_quantity_b08_db_\uad6c\ud604_\ub300\uae30_\ud56d\ubaa9", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L10", + "weight": 1.0, + "source": "pages_b08_wf5_quantity_b08_frontend", + "target": "pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L30", + "weight": 1.0, + "source": "pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", + "target": "pages_b08_wf5_quantity_b08_frontend_\uacc4\ud68d_\ucc45\uc784", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L39", + "weight": 1.0, + "source": "pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", + "target": "pages_b08_wf5_quantity_b08_frontend_\uae30\uc220\ubd80\ucc44", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", + "target": "pages_b08_wf5_quantity_b08_frontend_\ud604\uc7ac_\uad6c\ud604", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B08_wf5_Quantity/B08_frontend.md", + "source_location": "L20", + "weight": 1.0, + "source": "pages_b08_wf5_quantity_b08_frontend_b08_wf5_quantity_frontend", + "target": "pages_b08_wf5_quantity_b08_frontend_\ud654\uba74_\uc0c1\ud0dc", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L8", + "weight": 1.0, + "source": "pages_b09_wf6_estimation_b09_frontend", + "target": "pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L24", + "weight": 1.0, + "source": "pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", + "target": "pages_b09_wf6_estimation_b09_frontend_\ub85c\uceec\ub77c\uc774\uc81c\uc774\uc158", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L35", + "weight": 1.0, + "source": "pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", + "target": "pages_b09_wf6_estimation_b09_frontend_\ubc31\uc5d4\ub4dc_db_\ubbf8\ucc29\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L30", + "weight": 1.0, + "source": "pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", + "target": "pages_b09_wf6_estimation_b09_frontend_\uc758\uc874\uc131", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L42", + "weight": 1.0, + "source": "pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", + "target": "pages_b09_wf6_estimation_b09_frontend_\ucc38\uace0", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L18", + "weight": 1.0, + "source": "pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", + "target": "pages_b09_wf6_estimation_b09_frontend_\ucef4\ud3ec\ub10c\ud2b8_\ud568\uc218", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "pages/B09_wf6_Estimation/B09_frontend.md", + "source_location": "L12", + "weight": 1.0, + "source": "pages_b09_wf6_estimation_b09_frontend_b09_wf6_estimation_frontend", + "target": "pages_b09_wf6_estimation_b09_frontend_\ud30c\uc77c_\uad6c\uc870", + "confidence_score": 1.0 + } + ], + "hyperedges": [], + "built_at_commit": "35c65c9220e42fb3b6537d60008296c5cbbbd08e" +} \ No newline at end of file diff --git a/docs/wiki/graphify-out/manifest.json b/docs/wiki/graphify-out/manifest.json new file mode 100644 index 0000000..5f7c273 --- /dev/null +++ b/docs/wiki/graphify-out/manifest.json @@ -0,0 +1,347 @@ +{ + "AGENTS.md": { + "mtime": 1783834983.0604684, + "ast_hash": "74d04caee1f70d588da20af0f2224049", + "semantic_hash": "" + }, + "CLAUDE.md": { + "mtime": 1783834983.0604684, + "ast_hash": "74d04caee1f70d588da20af0f2224049", + "semantic_hash": "" + }, + "concepts/a00_app_shell_framework.md": { + "mtime": 1783850530.4141161, + "ast_hash": "2b483a655d0638849d9dc1ffaa38a503", + "semantic_hash": "" + }, + "concepts/a00_app_shell_framework_scaffold.md": { + "mtime": 1783844389.0126913, + "ast_hash": "b08d53673fa62ab2ae17105341f6beda", + "semantic_hash": "" + }, + "concepts/api_common.md": { + "mtime": 1783849575.5855756, + "ast_hash": "aa36d7b826c4ac0349cd64a64cde5fe4", + "semantic_hash": "" + }, + "concepts/auth_rbac.md": { + "mtime": 1783849578.4673145, + "ast_hash": "983376ddb2dcd996849889557b1e5227", + "semantic_hash": "" + }, + "concepts/common_util.md": { + "mtime": 1783849579.2001753, + "ast_hash": "adb12874ce5f40560652367b5f7a4bca", + "semantic_hash": "" + }, + "concepts/db_schema/files_surface.md": { + "mtime": 1783850268.5917373, + "ast_hash": "37c2c7e2ce683232b6282ad89e7508a1", + "semantic_hash": "" + }, + "concepts/db_schema/logs_monitoring.md": { + "mtime": 1783850257.6422136, + "ast_hash": "6eb1d0c95d17cd7309774022f623f0d6", + "semantic_hash": "" + }, + "concepts/db_schema/overview.md": { + "mtime": 1783850340.5808604, + "ast_hash": "86819ed4c2c6a755995116d5ebf1060a", + "semantic_hash": "" + }, + "concepts/db_schema/projects.md": { + "mtime": 1783850262.5202365, + "ast_hash": "dc10c1ca8cc8f763ac27fe02f4976b2b", + "semantic_hash": "" + }, + "concepts/db_schema/route_profile.md": { + "mtime": 1783850288.182818, + "ast_hash": "f41fdfb63f39e23eb591fc1939be6c65", + "semantic_hash": "" + }, + "concepts/db_schema/structure_output.md": { + "mtime": 1783850297.4292428, + "ast_hash": "ada0d9e74f91349f05a8ab1ac3231c47", + "semantic_hash": "" + }, + "concepts/db_schema/unconfirmed/README.md": { + "mtime": 1783850335.0813339, + "ast_hash": "70f32d481aeff62e260e1da78aae10bd", + "semantic_hash": "" + }, + "concepts/db_schema/users_auth.md": { + "mtime": 1783850220.2711427, + "ast_hash": "b39a4cae8f120944d31fb846b9c5168e", + "semantic_hash": "" + }, + "concepts/dependencies.md": { + "mtime": 1783850549.5115643, + "ast_hash": "93732554454116e3543ac2269b9d1f0d", + "semantic_hash": "" + }, + "concepts/schema_common.md": { + "mtime": 1783844389.0166397, + "ast_hash": "ebde162a912c33c17bd42e3edb469bc6", + "semantic_hash": "" + }, + "concepts/storage_paths.md": { + "mtime": 1783850555.214286, + "ast_hash": "2cf2c535406b15d5f2d7d5cde19fd4d2", + "semantic_hash": "" + }, + "concepts/ui_templates.md": { + "mtime": 1783850532.4820366, + "ast_hash": "29502f868494fc7a1e939c10bdd4f3e7", + "semantic_hash": "" + }, + "concepts/workflow_state.md": { + "mtime": 1783850560.3326466, + "ast_hash": "9a9e0acbd12fe065527f14205b576e71", + "semantic_hash": "" + }, + "index.md": { + "mtime": 1783850468.5420854, + "ast_hash": "171ed6c7eb37313803b566c33219e3b5", + "semantic_hash": "" + }, + "log.md": { + "mtime": 1783850724.1888082, + "ast_hash": "da1581ecf1d8cfed560bf8222b53aac7", + "semantic_hash": "" + }, + "pages/A01_Home/A01_components.md": { + "mtime": 1783849656.6167772, + "ast_hash": "af5724435a2da0845f42aed322971f7a", + "semantic_hash": "" + }, + "pages/A01_Home/A01_frontend.md": { + "mtime": 1783849659.8280177, + "ast_hash": "59d5bcdf4d88a0e576c55c5752579a23", + "semantic_hash": "" + }, + "pages/A02_ProgDetail/A02_components.md": { + "mtime": 1783849775.26568, + "ast_hash": "d663c36e0202f099a2602d631c2f962d", + "semantic_hash": "" + }, + "pages/A02_ProgDetail/A02_frontend.md": { + "mtime": 1783849775.2666833, + "ast_hash": "b590aa6c5a13b2478592e23803f5398d", + "semantic_hash": "" + }, + "pages/A03_CompDetail/A03_frontend.md": { + "mtime": 1783844088.3028529, + "ast_hash": "833dd9355fb96b46b0f94271a642c216", + "semantic_hash": "" + }, + "pages/A04_NewsHistory/A04_frontend.md": { + "mtime": 1783844098.3258784, + "ast_hash": "5bb83dca8f9f11f0122f5911b295e279", + "semantic_hash": "" + }, + "pages/A05_EduDetail/A05_frontend.md": { + "mtime": 1783844108.812845, + "ast_hash": "fadf785b9ebad689862cb8cfa9827fbd", + "semantic_hash": "" + }, + "pages/A06_Login/A06_backend.md": { + "mtime": 1783849775.2687664, + "ast_hash": "6de8c206c28526ccc8bbb8eff5654919", + "semantic_hash": "" + }, + "pages/A06_Login/A06_frontend.md": { + "mtime": 1783849775.2687664, + "ast_hash": "5d0213c68346d896fe9d11cd841331ad", + "semantic_hash": "" + }, + "pages/A07_Register/A07_backend.md": { + "mtime": 1783849775.2697725, + "ast_hash": "66f37d5bece9abdffd3149441e9b0b0d", + "semantic_hash": "" + }, + "pages/A07_Register/A07_frontend.md": { + "mtime": 1783849775.2707722, + "ast_hash": "0c30b980601414cefa02c05ba50a9008", + "semantic_hash": "" + }, + "pages/A08_Support/A08_backend.md": { + "mtime": 1783849900.5895991, + "ast_hash": "d2dd1028a837d8c17429179c4ffd7135", + "semantic_hash": "" + }, + "pages/A08_Support/A08_frontend.md": { + "mtime": 1783849775.2730606, + "ast_hash": "f2ebae60bb02320db4ac39e0a66b9d69", + "semantic_hash": "" + }, + "pages/A09_Security/A09_backend.md": { + "mtime": 1783849775.2740672, + "ast_hash": "f96ba36247f269672317bc352c705a7c", + "semantic_hash": "" + }, + "pages/A09_Security/A09_frontend.md": { + "mtime": 1783849775.2750769, + "ast_hash": "d90b0617abec1376bd32e140b0eb1f63", + "semantic_hash": "" + }, + "pages/B01_Dashboard/B01_api.md": { + "mtime": 1783849775.2770772, + "ast_hash": "c85334659f25daeed71aefa2f2be9ad0", + "semantic_hash": "" + }, + "pages/B01_Dashboard/B01_backend.md": { + "mtime": 1783849775.278077, + "ast_hash": "631e1b564272bebd703c0e66f4fc7128", + "semantic_hash": "" + }, + "pages/B01_Dashboard/B01_db.md": { + "mtime": 1783850631.766598, + "ast_hash": "e7467e7ab25de8a576244c8595fefca4", + "semantic_hash": "" + }, + "pages/B01_Dashboard/B01_dependencies.md": { + "mtime": 1783849775.2801342, + "ast_hash": "0879a678987bb76f3fbe44e55ee8758d", + "semantic_hash": "" + }, + "pages/B01_Dashboard/B01_frontend.md": { + "mtime": 1783849775.2801342, + "ast_hash": "4fe7a90bb05a32a5103cf66156a9c061", + "semantic_hash": "" + }, + "pages/B02_ProjRegister/B02_backend.md": { + "mtime": 1783849775.282399, + "ast_hash": "304aee3205bcef9a2314c7d882bd84ea", + "semantic_hash": "" + }, + "pages/B02_ProjRegister/B02_db.md": { + "mtime": 1783849775.282399, + "ast_hash": "ca17bc76462201e2ce50e754fbe7c816", + "semantic_hash": "" + }, + "pages/B02_ProjRegister/B02_frontend.md": { + "mtime": 1783849775.2833989, + "ast_hash": "407638de4f1ed56a3ba72c5c244d8ebd", + "semantic_hash": "" + }, + "pages/B03_FileInput/B03_api.md": { + "mtime": 1783849775.2843988, + "ast_hash": "eac552bd29adfc99ec5d2f0537d04d7e", + "semantic_hash": "" + }, + "pages/B03_FileInput/B03_backend.md": { + "mtime": 1783849775.285399, + "ast_hash": "176914d9912ba95b21320010552cd774", + "semantic_hash": "" + }, + "pages/B03_FileInput/B03_db.md": { + "mtime": 1783850637.4484162, + "ast_hash": "229bc7bb89bc7fb3a745fa7a1eb56640", + "semantic_hash": "" + }, + "pages/B03_FileInput/B03_dependencies.md": { + "mtime": 1783849775.2873988, + "ast_hash": "c3ce15681add07e1475a7e7743daf4e5", + "semantic_hash": "" + }, + "pages/B03_FileInput/B03_frontend.md": { + "mtime": 1783849775.2873988, + "ast_hash": "73828382a294172dadee59925d56414e", + "semantic_hash": "" + }, + "pages/B04_wf1_Surface/B04_api.md": { + "mtime": 1783849775.2910345, + "ast_hash": "98dc9571c054a9cc67f41e34c924afc4", + "semantic_hash": "" + }, + "pages/B04_wf1_Surface/B04_backend.md": { + "mtime": 1783849775.2921586, + "ast_hash": "0c5544f6648212b90660aa84f35982ba", + "semantic_hash": "" + }, + "pages/B04_wf1_Surface/B04_db.md": { + "mtime": 1783849775.292957, + "ast_hash": "7cb52c0844a907b14cfbd5230988c56f", + "semantic_hash": "" + }, + "pages/B04_wf1_Surface/B04_dependencies.md": { + "mtime": 1783849775.292957, + "ast_hash": "15bd0faa0411264c14b0bbd89f7afd46", + "semantic_hash": "" + }, + "pages/B04_wf1_Surface/B04_frontend.md": { + "mtime": 1783849775.2939596, + "ast_hash": "5735fc2ab57c3965dcf50149b078fc93", + "semantic_hash": "" + }, + "pages/B05_wf2_Route/B05_api.md": { + "mtime": 1783849775.2954652, + "ast_hash": "cc425874ae9a2ba7b8662af87848fa0d", + "semantic_hash": "" + }, + "pages/B05_wf2_Route/B05_backend.md": { + "mtime": 1783849775.2954652, + "ast_hash": "479b21cd1dc68e2ac4d6435b1007b3e8", + "semantic_hash": "" + }, + "pages/B05_wf2_Route/B05_db.md": { + "mtime": 1783850658.4844005, + "ast_hash": "c45788b5db47a7a4f246b0714a2c11e3", + "semantic_hash": "" + }, + "pages/B05_wf2_Route/B05_dependencies.md": { + "mtime": 1783849775.2981665, + "ast_hash": "d3295d11d6138324e91df459abda944a", + "semantic_hash": "" + }, + "pages/B05_wf2_Route/B05_frontend.md": { + "mtime": 1783849775.2981665, + "ast_hash": "3a5bba842808d5a7a935882514495311", + "semantic_hash": "" + }, + "pages/B06_wf3_ProfileCross/B06_api.md": { + "mtime": 1783849775.2991662, + "ast_hash": "00f3238df70ac4098b1a62d7a175e676", + "semantic_hash": "" + }, + "pages/B06_wf3_ProfileCross/B06_backend.md": { + "mtime": 1783849775.3001661, + "ast_hash": "715cfd2ee8f7384c849e23331d9d5ae6", + "semantic_hash": "" + }, + "pages/B06_wf3_ProfileCross/B06_db.md": { + "mtime": 1783850703.1234853, + "ast_hash": "63b1c8f0287b4b277633da8c4617b03f", + "semantic_hash": "" + }, + "pages/B06_wf3_ProfileCross/B06_dependencies.md": { + "mtime": 1783849775.301572, + "ast_hash": "cee07700e4614c067726375a385800c3", + "semantic_hash": "" + }, + "pages/B06_wf3_ProfileCross/B06_frontend.md": { + "mtime": 1783849775.3020935, + "ast_hash": "98cdce5d523d5750350c1c8eeb41ae8e", + "semantic_hash": "" + }, + "pages/B07_wf4_DesignDetail/B07_frontend.md": { + "mtime": 1783844389.053691, + "ast_hash": "d4bd4b2f000f33a76bfd5d2f9b1a2850", + "semantic_hash": "" + }, + "pages/B08_wf5_Quantity/B08_db.md": { + "mtime": 1783850708.284249, + "ast_hash": "00ca815731f29da6f062f6e5884430de", + "semantic_hash": "" + }, + "pages/B08_wf5_Quantity/B08_frontend.md": { + "mtime": 1783849775.303746, + "ast_hash": "4d4395611445c4e93de165cc343df7af", + "semantic_hash": "" + }, + "pages/B09_wf6_Estimation/B09_frontend.md": { + "mtime": 1783844389.0574813, + "ast_hash": "c17bf17a317f2190131be87d2e23e9bb", + "semantic_hash": "" + } +} \ No newline at end of file diff --git a/docs/wiki/index.md b/docs/wiki/index.md new file mode 100644 index 0000000..a0af705 --- /dev/null +++ b/docs/wiki/index.md @@ -0,0 +1,119 @@ +--- +type: index +last_updated: 2026-07-12 +--- + +# Wiki Index + +> 질의 시 항상 이 파일을 먼저 확인한다. 카테고리별로 페이지를 한 줄 요약과 함께 나열한다 (120자 이내). + +## 페이지 — 로그인 후 워크플로우 (B01~B09) + +### [[B01_Dashboard/B01_backend|B01_Dashboard]] +역할별 프로젝트·회사·사용자·가입·자동화 관리와 workflow 배치조회, 시스템 리소스·감사 로그. draft. + +### [[B02_ProjRegister/B02_backend|B02_ProjRegister]] +프로젝트 생성 `POST /api/b02/project`. 트랜잭션: projects INSERT+워크플로우 7단계 시드+감사로그+저장소 초기화. stable. + +### [[B03_FileInput/B03_backend|B03_FileInput]] +일반·청크 업로드, 메타데이터 분석, WF0/WF1 상태 전이, 이메일 알림과 workflow 조회. draft. + +### [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]] +지표면 분석 `/api/projects` 12개 API. LAS→필터4종→모델5종→등고선. three.js 3D 뷰어 구현됨. WF1 stage 전이. stable. + +### [[B05_wf2_Route/B05_backend|B05_wf2_Route]] +Dijkstra·ridge-valley 경로 계산, 비용면·skeleton·통계 저장과 route 확정 API. WebCAD 뷰어 미구현. draft. + +### [[B06_wf3_ProfileCross/B06_backend|B06_wf3_ProfileCross]] +확정 경로 기반 종단·횡단 생성, 표고 sampler·측점 샘플링·결과 확정 API. WebCAD 프로필 뷰어 미구현. draft. + +### [[B07_wf4_DesignDetail/B07_frontend|B07_wf4_DesignDetail]] +구조물 배치 — 워크플로우 셸만 존재(26줄), 본문 미구현. migration_plan.md에 범위제외 명시(계획적 미착수). stable. + +### [[B08_wf5_Quantity/B08_frontend|B08_wf5_Quantity]] +WF5 workflow 셸만 구현. 수량 계산 본문·Repository·Router/API 미구현. draft. + +### [[B09_wf6_Estimation/B09_frontend|B09_wf6_Estimation]] +견적·문서(Excel/PDF/DXF) 산출 — 워크플로우 셸만 존재(26줄), 본문 미구현. outputs/output_files 테이블 예정. stable. + +## 페이지 — 로그인 전 (A01~A09) + +### [[A01_Home/A01_frontend|A01_Home]] +히어로 + 최신 소식 + 주요 기능 showcase. 정적 페이지. MOCK_NEWS 하드코딩(GET /api/a01/news 미구현). stable. + +### [[A02_ProgDetail/A02_frontend|A02_ProgDetail]] +6단계 워크플로우 시각화 + 핵심 기술 소개. Hero + 배지번호 리스트 + 카드그리드. stable. + +### [[A03_CompDetail/A03_frontend|A03_CompDetail]] +회사 미션·핵심가치·연락처. Hero + 본문 + 3개 가치 카드그리드 + 이메일. stable. + +### [[A04_NewsHistory/A04_frontend|A04_NewsHistory]] +최신소식 및 개선이력 타임라인. Hero + 태그+제목+날짜 행들. MOCK_HISTORY 데이터, 백엔드 미구현. stable. + +### [[A05_EduDetail/A05_frontend|A05_EduDetail]] +교육 과정 소개 + 문의 CTA. Hero + 3개 과정 카드그리드 + 문의 버튼. stable. + +### [[A06_Login/A06_backend|A06_Login]] +세션쿠키 로그인 + 신규브라우저/주기 OTP 재인증. `/api/auth` 5개 엔드포인트. backend·frontend 상세. stable. + +### [[A07_Register/A07_backend|A07_Register]] +회원가입 2단계(요청→OTP)+회사검색. 약관 아코디언, NO_COMPANY로 완료. ⚠️UI_Page.ts 구버전 잔재. stable. + +### [[A08_Support/A08_backend|A08_Support]] +기술지원 문의(비로그인 가능). `support_requests` 저장+관리자 메일. ⚠️DB 컬럼 계획서와 불일치. stable. + +### [[A09_Security/A09_backend|A09_Security]] +백엔드: 마스터/시스템관리자 조직·회원·가입승인·활동로그 API(`/api/security`). 프론트: 약관 열람만. ⚠️API 클라이언트 미연동. stable. + +## 개념 (Concepts) + +### [[a00_app_shell_framework]] +모든 페이지의 공통 스켈레톤. 헤더(로고/네비/언어·테마/인증), 아울렛, 푸터 + 라우터 + B그룹 스캐폴드. + +### [[a00_app_shell_framework_scaffold]] +App Shell Framework의 세부 스캐폴드, CSS 인젝션 구조, 외부 라이브러리 및 사용처 매핑. + +### [[ui_templates]] +다국어 관리(i18n [한국어, 영어]), 공통 컴포넌트(버튼/카드/태그/워크플로우셸), theme.css 변수. + +### DB 스키마 +- [[db_schema/overview]] — 34개 테이블 확정; workflow 상태 및 system_admin_logs 용도 분석 완료. +- [[db_schema/users_auth]] — users/companies/sessions/email_otps/trusted_devices/join_requests/user_consents +- [[db_schema/logs_monitoring]] — login_logs/activity_logs/audit_logs/system_audit_logs/system_admin_logs/system_resources/support_requests/change_logs +- [[db_schema/projects]] — projects/project_versions/project_automations +- [[db_schema/files_surface]] — upload_sessions/upload_chunks/input_files/processed_point_cloud/surface_models/terrain_layers +- [[db_schema/route_profile]] — routes/route_points/route_statistics/longitudinal_sections/cross_sections +- [[db_schema/structure_output]] — structures/quantity_items/outputs/output_files +- [[db_schema/unconfirmed/README]] — 미확정/미연동 테이블 격리 및 임시 분석 보관소 + +### [[auth_rbac]] +세션쿠키 인증, OTP, 3역할 RBAC 접근표, 권한헬퍼 5종, 사용자 상태 생명주기. + +### [[storage_paths]] +B03~B09 워크플로우 기반 storage/ 경로 패턴, DB 경로컬럼 매핑, 경로 생성 책임 분리 원칙. + +### [[common_util]] +common_util_* 11개 파일 목록과 역할 (auth/storage/email/resource_monitor/**workflow_state** 등). + +### API 공통 (여러 페이지가 공유하는 엔드포인트) +- [[api_common]] — 공통 오류포맷, workflow-state API(✅구현·실사용 확인) + +### 의존성 (여러 페이지가 공유하는 외부 라이브러리) +- [[dependencies]] — Trimesh/Whitebox/Geopandas/Shapely/Rasterio/Laspy/aiomysql 사용처 매핑 + +### 공통 스키마 (Pydantic 요청/응답 모델) +- [[schema_common]] — 공통 에러 포맷 `{"status":"error","message":...}`. 페이지 간 공유 모델은 미발견. + +### Workflow 상태 관리 +- [[workflow_state]] — B01~B06 연동 확인, `project_workflow_stages` SSOT·stale 전파. B04 폴백은 레거시 안전장치. + +## ⚠️ 미해결 항목 +- `raw/guidelines/design.md`는 "Wiza"(보라색 SaaS 프로덕트) 스타일 가이드로 Aislo와 무관해 보여 **ingest하지 않음** — 잘못 들어온 파일인지 확인 필요 +- `B04_wf1_Surface_Router.py:412-427` — `projects.status` 문자열 비교(416 WF1_COMPLETE, 420 WF1_ANALYZING)는 **구형 잔재가 아니라 project_workflow_stages 부재 시 레거시 폴백**(백필 안전장치). SSOT 안정화 후 제거 가능 → [[B04_wf1_Surface/B04_backend]] +- `B04_wf1_Surface_Router.py:76` `update_project_status()` — 정의만, 호출처 없음(죽은 코드) → 정리 권장 +- B07~B09는 실 코드 상 아직 미착수 또는 셸만 존재 (B02는 backend 확인·반영 완료, B04도 이번에 5분할 상세화 완료) + +### A그룹 인제스트 이슈 +- 세션·OTP 정책 불일치, support_requests 컬럼 불일치, A07/A09 구버전 코드가 발견됨. 상세는 각 페이지와 [[auth_rbac]] 참조. +- **support_requests 컬럼 불일치**: [[db_schema/logs_monitoring]] 계획서(user_id/title/priority/status) vs 실 코드([[A08_Support/A08_backend]] INSERT: company_id/company_name/user_name/user_email/user_phone/subject/message). → 실 DB 대조 필요 +- **미사용/구버전 코드 2건**: `A07_Register_UI_Page.ts`(구버전 잔재, 라우터는 UI_Auth_Page 사용), `A09_Security_Api_Fetch.ts`(마스터/관리자 8함수 정의만, 미연동) — 정리 권장 diff --git a/docs/wiki/log.md b/docs/wiki/log.md new file mode 100644 index 0000000..bbb9b92 --- /dev/null +++ b/docs/wiki/log.md @@ -0,0 +1,330 @@ +# Wiki Log + +> append-only. 형식: `## [YYYY-MM-DD] 오퍼레이션 | 제목` — 오퍼레이션은 ingest / query / lint 중 하나. +> 최근 항목 확인: `grep "^## \[" log.md | tail -5` + +## [2026-07-12] lint | 구형 상위 폴더 탈출 링크(../../concepts/) 전수 정밀 교정 +- **Lint**: 위키 페이지들 간의 연결성을 정밀 분석한 결과, 병행 작업자가 작성해둔 구버전 db.md 파일들(`B01_db`, `B03_db`, `B05_db`, `B06_db`, `B08_db`)에서 개념 문서(db_schema, storage_paths 등)를 참조할 때 Obsidian 호환성을 저해하는 부적절한 상위 폴더 탈출 표기법 (`[[../../concepts/...]]`)을 무작위로 혼용하고 있음을 적발함. +- **조치 및 개선**: 검출된 9건의 부적절한 상대 링크들을 공식 표준 규격인 `[[db_schema/...]]` 및 `[[storage_paths]]` 등의 깔끔한 볼트 루트 기준 상대경로로 일제히 교정 완료함. + +## [2026-07-12] lint | 5회 반복 린트-개선 사이클 수행 및 위키 메타 정보 정밀 보완 +- **Lint & 개선 1차**: `concepts/a00_app_shell_framework.md` 및 `concepts/ui_templates.md`에 `source` 메타데이터 필드가 누락되어 있음을 식별, 각각 `source: A00_Common 공유 프레임워크 소스 코드` 및 `source: ui_template/ 공통 UI 소스 코드 및 스타일시트`를 추가 정비함. +- **Lint 2차**: 개별 페이지 `pages/` 하위 마크다운 파일들의 `page_id` 메타데이터 누락 여부를 전수 린트한 결과, 100% 정상 준수하고 있음을 교차 확인. (조치 사항 없음) +- **Lint & 개선 3차**: `concepts/dependencies.md`에 외부 라이브러리 `NumPy`가 중복으로 기재되어 있음을 발견, 하나의 통합된 행으로 병합 및 사용처(`B03`, `B05`) 역참조를 단일 셀로 통합 완료. +- **Lint & 개선 4차**: `concepts/storage_paths.md`의 `related_pages` 속성에 신규 프로젝트 생성 및 스키마 시드를 책임지는 `[[B02_ProjRegister/B02_backend]]` 링크가 빠져 있음을 감지하여 추가 정비함. +- **Lint & 개선 5차**: `concepts/workflow_state.md`의 `related_pages`에 워크플로우 진행 상태에 연관된 B07~B09 단계 파일 링크가 누락된 것을 감지, `[[B07_wf4_DesignDetail/B07_frontend]]`, `[[B08_wf5_Quantity/B08_frontend]]`, `[[B09_wf6_Estimation/B09_frontend]]`를 추가 보완함. + +## [2026-07-12] ingest | DB 34개 테이블 전수 컬럼 실측 및 위키 최신화 +- **DB 스키마 정밀 추출**: PyMySQL을 사용하는 파이썬 스크립트를 작성하여 로컬 `.env` 환경 정보를 바탕으로 `aislo_db` 내 실제 존재하는 34개 테이블의 모든 컬럼 정보(Field, Type, Null, Key, Default, Extra)를 알파벳 순으로 전수 정밀 추출 완료. +- **위키 최신화**: + - `db_schema/users_auth.md` (7개 테이블), `db_schema/logs_monitoring.md` (8개 테이블), `db_schema/projects.md` (3개 테이블), `db_schema/files_surface.md` (6개 테이블), `db_schema/route_profile.md` (5개 테이블), `db_schema/structure_output.md` (4개 테이블) 총 6개 위키 문서에 누락 및 생략되어 있던 실제 DB 컬럼들의 세부 스펙을 100% 매핑하여 최신화 완료. + - 100줄 제한 규칙(규칙 14)을 준수하기 위해 표 및 설명 문구들을 조밀하게 압축하고 정리함. +- **미해결 부채 청산**: + - `system_admin_logs` 테이블의 용도 분석을 통해 SYSTEM_ADMIN의 회원/조직 상태 변경 감사 이력 Write-Only용임을 확인 및 명세화. + - `db_schema/overview.md` 및 `index.md` 내에 기재된 `system_admin_logs 용도 미상` 경고 bullet 및 미해결 항목을 해결됨 상태로 최종 정정 완료. +- **미확정/연결 대기 테이블 관리 규칙 도입**: + - 향후 신규 추가되거나 프로젝트 비즈니스 로직(사용처)이 불명확한 테이블을 안전하게 격리하고 관리할 수 있도록 `db_schema/unconfirmed/` 디렉토리를 신설하고 [README.md](file:///C:/Program_coding/임도설계 및 견적자동화 프로그램 개발/docs/wiki/concepts/db_schema/unconfirmed/README.md)에 운영 가이드라인을 정의함. + - `db_schema/overview.md`에 미확정 그룹 앵커 링크(`[[unconfirmed/README]]`) 및 격리 관리 원칙을 명문화하여 지식 시스템을 완성함. +- **Lint 조치**: 신설된 `unconfirmed/README.md`가 위키 규칙 2번(페이지 생성 시 index.md 반영)을 충족하도록 [index.md](file:///C:/Program_coding/임도설계 및 견적자동화 프로그램 개발/docs/wiki/index.md)에 링크 및 한 줄 명세를 연동 보완함. + +## [2026-07-12] ingest+lint | 3회 반복 린트-개선 사이클 수행 및 위키 무결성 확보 +- **Ingest**: `docs/raw/plans/2026-07-12_plan_add_phase4_role.md` 및 `docs/raw/verification/2026-07-12_verify_add_phase4_role.md`를 기반으로, 루트 폴더의 `AGENTS.md`에 `#### 역할 4: 기타 작업자 (위키 관리 / 작업 보조)`가 정상 추가 및 검증 완료되었음을 확인 및 반영. +- **Lint & 개선 1차**: `concepts/ui_templates.md` 전수 점검. 규칙 13(공유 자원 표 형식 준수)에 위배되는 서술식 다국어 텍스트 기능 설명 및 `theme.css` 색상/마진 변수 나열 항목을 색출하여 `항목 | 위치 | 역할` 형태의 표 포맷으로 전면 개선 완료. +- **Lint & 개선 2차**: `A08_Support/A08_backend.md`에서 `db_schema/logs_monitoring.md` 내에 실존하지 않는 `#support_requests` 세부 앵커를 가리키는 깨진 앵커 링크 2건을 색출하여 `[[db_schema/logs_monitoring]]`으로 개선(단순화) 완료. +- **Lint & 개선 3차**: `storage_paths.md`에 기술된 물리 저장소 경로 패턴 및 세션/이메일 세부 규칙을 백엔드 설정 코드(`config_system.py`, `common_util_storage.py`)와 전수 교차 대조하여, 수치(유효시간 12h/4h, OTP 5분, 재인증 90일, 재시도 3회) 및 폴더 레이아웃이 100% 정합함을 확인. 추가 수정 없음. + +## [2026-07-12] ingest | B09_wf6_Estimation (실 코드 대조, 미착수 확인) +- 대상: B09_wf6_Estimation_UI_Page.ts(27줄, 유일한 소스 파일) +- **기존 파일 정리**: 구 파일명 frontend.md(draft) 삭제 → B09_frontend.md 재작성(stable) +- **실 코드 대조 결과**: 기존 wiki 내용이 이미 정확함 — B07/B08과 동일 패턴, `renderPendingWorkflow()`만 호출, 백엔드 파일 없음 +- **raw 근거 재확인**: `structure.md:177-178`도 B09를 "워크플로우 셸"로만 기술 — 실 코드와 일치, 모순 없음 +- **로케일 키 검증**: B09_Estimation_Title(714) 실 파일 등록 확인 +- storage_paths.md에 B09 이미 related_pages 등록 확인(v1/v2 버전 관리는 이 단계에서만, 20줄), structure_output.md에도 outputs/output_files 사용처 등록 확인 — 둘 다 수정 불필요 +- index.md B09 링크 `[[B09_wf6_Estimation/frontend]]` → `[[B09_wf6_Estimation/B09_frontend]]` 갱신 +- 결론: B07/B08/B09 workflow 셸 3종 전부 wiki 반영 완료. B01/B03/B05/B06(병행 작업자)까지 포함하면 B01~B09 전 페이지 wiki 존재 확인 +- 주: B01/B03/B05/B06/B08은 병행 작업자가 진행/완료해 건드리지 않음 + +## [2026-07-12] ingest | B07_wf4_DesignDetail (실 코드 대조, 미착수 확인) +- 대상: B07_wf4_DesignDetail_UI_Page.ts(27줄, 유일한 소스 파일) +- **기존 파일 정리**: 구 파일명 frontend.md(draft) 삭제 → B07_frontend.md 재작성(stable) +- **실 코드 대조 결과**: 기존 wiki 내용이 이미 정확함 — `renderPendingWorkflow()`만 호출하는 셸, 백엔드 파일 자체 없음 +- **raw 근거 재확인**: `migration_plan.md:271` "B07 이후 기능은 이번 마이그레이션 범위에서 제외한다" — 계획 단계에서 명시적 제외, structure.md:173-174도 셸로만 기술. 실 코드·raw 문서·기존 wiki 3자 일치(모순 없음) +- **로케일 키 검증**: B07_Design_Title(708) 실 파일 등록 확인 +- structure_output.md에 B07 이미 related_pages·사용처 등록 확인(structures 테이블, 수정 불필요) +- index.md B07 링크 `[[B07_wf4_DesignDetail/frontend]]` → `[[B07_wf4_DesignDetail/B07_frontend]]` 갱신, "계획적 미착수" 근거 명시 +- 주: B01/B03/B05/B06은 병행 작업자가 계속 진행 중이라 건드리지 않음 + +## [2026-07-12] ingest | B04_wf1_Surface (실 코드 대조·5분할 상세화) +- 대상: Router(739줄), Schema(113줄), Repository(236줄), Engine(161줄)+엔진 서브모듈 14개, UI_Page(377줄), UI_Viewer(567줄), UI_TerrainViewer(637줄), Api_Fetch(174줄) 등 23개 파일 +- **기존 파일 정리**: 구 파일명 계획서기반 4개(backend/frontend/db/api, api·db·frontend는 draft·"추정 경로") 삭제 → B04_backend/B04_frontend/B04_api/B04_db/B04_dependencies.md 5분할 상세 재작성(전부 stable) +- **⚠️ 중요 정정 3건 (계획서 → 실 코드)**: + 1. **API**: api.md는 "추정 경로 2개(surface/analyze·models)"였으나 실제 `/api/projects` prefix 12개 엔드포인트. 전부 실 위치 표로 기록 + 2. **3D 뷰어**: 계획서·dependencies "WebCAD 3D 뷰어 미구현"이었으나 실 코드에 **three.js(WebGL) 뷰어 구현됨** — UI_Viewer(포인트클라우드)+UI_TerrainViewer(지형 메시), UI_Page에서 import·사용 확인. dependencies.md에 three.js 추가+"미구현" 정정 + 3. **416/420줄 "구형 잔재"**: 잔재가 아니라 **레거시 폴백**(project_workflow_stages SSOT 우선, 부재 시에만 projects.status 비교, `:412-427`). index.md·workflow_state.md 정정 +- **추가 발견**: `update_project_status()`(`:76`) 정의만·호출처 없음(죽은 코드, grep 확인) → 미해결 항목 추가 +- **워크플로우 전이**: analyze에서 start_stage(168)/complete_stage(209)/fail_stage(227,233) stage 1 +- **역참조**: files_surface B04 이미 등록(구 링크 정정), dependencies·workflow_state 갱신 +- index.md B04 링크 갱신, 미해결 항목 정정. 엔진 서브모듈 15개는 backend.md에 표로 요약(과분할 방지) + +## [2026-07-12] ingest | B02_ProjRegister (backend + frontend + db 상세화) +- 대상: B02_ProjRegister_Router.py(44줄), B02_ProjRegister_Schema.py(30줄), B02_ProjRegister_Repository.py(136줄), B02_ProjRegister_UI_Page.ts(179줄), B02_ProjRegister_UI_Style.css(66줄) +- **기존 파일 정리**: 구 파일명 스텁 backend.md/db.md/frontend.md(요약 수준, 비표준 frontmatter, frontend/db는 draft) 삭제 → B02_backend/B02_frontend/B02_db.md 상세 재작성(전부 stable) +- 출력: + - `B02_backend.md` — `POST /api/b02/project`, create_project 트랜잭션(projects INSERT+initialize_project_stages 7단계 시드+system_audit_logs PROJECT_CREATE+저장소 초기화), Pydantic 2종, 저장소 경로 이탈 방지 + - `B02_frontend.md` — 등록 폼(2열 그리드, road_type select 4종), fetch 직접 호출, 성공 시 CURRENT_PROJECT_ID_KEY 저장 후 B03 이동 + - `B02_db.md` — 쓰는 테이블 3종(projects/project_workflow_stages/system_audit_logs) 용도+링크만(규칙11), 저장소 규칙 +- **로케일 키 검증**: B02_Proj_Title(487), B02_Proj_Field_RoadType(499), B02_Proj_RoadType_Stream(503), B02_Proj_Success(510) 등 실 파일 등록 확인 +- **역참조 갱신(규칙12)**: logs_monitoring.md system_audit_logs 섹션 제목 "B01 사용"→"사용처(B01,B02)"로 일반화 + B02 PROJECT_CREATE 행 추가. projects.md/workflow_state.md엔 B02 이미 등록됨 +- **발견 사항**: + - 계획서엔 "7단계 시드가 마이그레이션 Phase1 과제"였으나 실 코드에 이미 구현됨(규칙6 실코드 채택) + - projects INSERT 시 status 'NEW', crs_epsg 5178 고정 + - 프론트가 fetch 직접 호출(A08처럼 별도 API 클라이언트 없음) +- index.md B02 링크 `[[B02_ProjRegister/backend]]` → `[[B02_ProjRegister/B02_backend]]` 갱신 +- 주: B01은 병행 작업자가 진행 중이라 건드리지 않음(A07_backend 링크 등 B01발 자동 갱신은 반영됨) + +## [2026-07-12] query | B01_Dashboard 실 코드 기준 최신화 +- 상위 프로젝트 `B01_Dashboard/` 코드 9개를 읽기 전용으로 대조했다. +- 기존 `frontend.md`, `backend.md`를 규칙에 맞는 `B01_frontend.md`, `B01_backend.md`로 교체했다. +- API·DB·의존성을 `B01_api.md`, `B01_db.md`, `B01_dependencies.md`로 분리하고 코드 위치를 표로 기록했다. +- 실제 감사 테이블이 `system_audit_logs`임을 반영하고 workflow 조회의 미구현 표기를 바로잡았다. +- 관련 concepts와 `index.md`를 갱신했으며, 검증보고서가 없어 B01 상태는 `draft`로 유지했다. +- 기술부채로 UI Page 739줄과 Repository 790줄을 기록했다. + +## [2026-07-12] query | B03_FileInput 실 코드 기준 최신화 +- 상위 프로젝트 `B03_FileInput/` 코드 11개를 읽기 전용으로 대조했다. +- 기존 frontend/backend 문서를 `B03_frontend.md`, `B03_backend.md`로 교체했다. +- API·DB·의존성을 `B03_api.md`, `B03_db.md`, `B03_dependencies.md`로 분리했다. +- 일반·청크 업로드, LAS/TIF/PRJ/TFW 메타데이터 분석, WF0/WF1 상태 전이, 이메일 알림을 기록했다. +- `dependencies`, `db_schema/files_surface`, `index.md`를 실제 코드 기준으로 갱신했다. +- 검증보고서가 없어 B03 페이지 상태는 `draft`로 유지했다. +- 기술부채로 UI Page 695줄과 UI Style 376줄을 기록했다. + +## [2026-07-12] query | B05_wf2_Route 실 코드 기준 최신화 +- 상위 프로젝트 `B05_wf2_Route/` 코드 11개를 읽기 전용으로 대조했다. +- 기존 API/backend/db/frontend 문서를 `B05_api.md`, `B05_backend.md`, `B05_db.md`, `B05_frontend.md`로 교체했다. +- `B05_dependencies.md`를 추가해 Dijkstra·ridge-valley·skeleton·비용면 엔진과 의존성을 기록했다. +- 실제 API 경로와 RouteSolve 스키마, routes·route_points·route_statistics 저장 관계를 반영했다. +- `dependencies`, `index.md`를 실제 코드 기준으로 갱신했다. +- 검증보고서가 없어 B05 페이지 상태는 `draft`로 유지했다. +- 기술부채로 RidgeValley 781줄, Solver 654줄, WebCAD 뷰어 미구현을 기록했다. + +## [2026-07-12] query | B06_wf3_ProfileCross 실 코드 기준 최신화 +- 상위 프로젝트 `B06_wf3_ProfileCross/` 코드 9개를 읽기 전용으로 대조했다. +- 기존 backend/db/frontend 문서를 `B06_backend.md`, `B06_db.md`, `B06_frontend.md`로 교체했다. +- API·의존성을 `B06_api.md`, `B06_dependencies.md`로 분리했다. +- 확정 B05 경로 기반 종단·횡단 생성, DTM·보간 sampler, 측점·단면 샘플링, 재생성 삭제·저장·확정 흐름을 기록했다. +- 검증보고서가 없어 B06 페이지 상태는 `draft`로 유지했다. +- WebCAD 종단도·횡단 프로필 뷰어 미구현 상태를 기록했다. + +## [2026-07-12] query | B08_wf5_Quantity 실 코드 기준 최신화 +- 상위 프로젝트 `B08_wf5_Quantity/`에는 UI 파일 1개(25줄)만 존재함을 확인했다. +- 기존 `frontend.md`를 `B08_frontend.md`로 교체하고 workflow 셸의 실제 함수·locale·활성 단계 위치를 기록했다. +- 수량 계산 본문·Repository·Router/API·Pydantic 스키마가 아직 없음을 명시했다. +- 예정 DB 자원 `quantity_items`와 `quantity_data_path`를 `B08_db.md` 및 concepts 링크로 연결했다. +- `index.md`를 실제 구현 상태에 맞게 갱신했다. + +## [2026-07-12] lint | 전체 위키 구조·상태·공유 개념 정리 +- A/B 페이지의 누락된 `related_pages`를 보완하고 concepts의 관련 페이지 역참조를 추가했다. +- 검증보고서가 없는 stable 페이지를 draft로 조정해 status 규칙을 일관화했다. +- B05/B06 뷰어 상태, B03 구현 상태, workflow-state 실제 경로, legacy polling 문구를 갱신했다. +- 100줄 초과 문서인 A01과 A00 공통 개념을 하위 문서로 분리했다. +- index의 페이지 상태 표기를 페이지 frontmatter와 일치시켰다. +- 코드 파일은 수정하지 않았으며 `raw/`는 변경하지 않았다. + +## [2026-07-12] lint | 전체 위키 구조·상태·공유 개념 정리 +- A/B 페이지의 누락된 `related_pages`를 보완하고 concepts의 관련 페이지 역참조를 추가했다. +- 검증보고서가 없는 stable 페이지를 draft로 조정해 status 규칙을 일관화했다. +- B05/B06 뷰어 상태, B03 구현 상태, workflow-state 실제 경로, legacy polling 문구를 갱신했다. +- index의 페이지 상태 표기를 페이지 frontmatter와 일치시켰다. +- 코드 파일은 수정하지 않았으며 `raw/`는 변경하지 않았다. + +## [2026-07-12] lint | 위키 시스템 초기 세팅 +- raw/, wiki/, output/ 폴더 구조 생성 +- docs/CLAUDE.md에 Wiki Schema(위키 운영 규칙) 추가 +- 하위 CLAUDE.md 3개 생성 (raw/, wiki/, output/) +- wiki/index.md, wiki/log.md 초기화 (콘텐츠 없음, 카테고리 헤더만) +- 아직 raw/에 원본 없음 → 다음 단계는 첫 ingest 대기 + +## [2026-07-12] ingest | guidelines/plans 7건 일괄 반영 +- 대상: raw/guidelines/{structure,db_schema,backend,frontend,agent,migration_plan}.md, raw/plans/plan_workflow_state_management.md (7건). raw/guidelines/design.md는 Aislo와 무관한 "Wiza" 스타일가이드로 판단해 **ingest 제외**. +- concepts 신규 8건: db_schema/{overview,users_auth,logs_monitoring,projects,files_surface,route_profile,structure_output}, storage_paths, auth_rbac, common_util, dependencies, api_common, schema_common, workflow_state (총 14파일, db_schema는 34개 테이블을 9그룹→7파일+개요로 분할, 전부 100줄 이내) +- pages 신규: B01(backend/frontend), B02(frontend/db), B03(backend/frontend/db), B04(backend/frontend/db/api), B05(backend/frontend/db/api), B06(backend/frontend/db), B07~B09(frontend만, 셸 상태) +- 전부 status: stable (검증보고서 없음, 계획서·행동지침만 반영됨) +- 발견한 모순: 테이블 총 개수(db_schema.md 34 vs agent.md 18/23) — 미해결, [[db_schema/overview]]에 기록 +- 발견한 이슈: B03/B04 WF1 상태 이중 세팅, projects.status 단일문자열 한계 → [[workflow_state]]로 별도 정리 +- index.md 전체 갱신 (카테고리별 요약 + 미해결 항목 섹션 추가) + +## [2026-07-12] query+lint | 실 DB/실 코드 대조 검증 (읽기 전용) +- `.env` 자격증명으로 aislo_db에 read-only 접속(`SHOW TABLES`, `DESCRIBE`) — DB는 수정하지 않음 +- 테이블 개수 모순 해결: 실측 34개 = db_schema.md와 일치. agent.md(18/23)는 오기로 확정 → [[../concepts/db_schema/overview]] +- raw에 없던 실 테이블 2개 발견: `project_workflow_stages`(구현완료 확인) / `system_admin_logs`(용도 미상, 임의 해석 보류 — 사용자 확인 대기) +- `common_util_workflow_state.py`, B01~B06 라우터/리포지토리 실 코드 확인 → [[../concepts/workflow_state]] status: stable→**stable**로 갱신 (계획서 설계가 이미 전면 구현됨을 확인) +- B02_ProjRegister 백엔드(raw엔 없었음) 실 코드 확인 후 backend.md 신규 작성, status stable +- A01~A09(로그인 전 페이지) 카테고리 신규 추가, 실 코드 기반 15개 파일 작성 (전부 status stable, raw 문서 근거 부족은 각주로 표시) +- B04_wf1_Surface_Router.py:416,420에 구형 상태비교 잔재 발견, 미정리 항목으로 기록 +- index.md 전체 재구성 (A/B 페이지 분리, 미해결 항목 갱신) + +## [2026-07-12] lint | page_id frontmatter 필드 도입 +- 문제: `frontend.md`/`backend.md` 등은 파일명만으로 소속 페이지를 알 수 없음(폴더 밖에서 볼 때 구분 불가) +- docs/CLAUDE.md 위키 규칙 5번, wiki/CLAUDE.md에 `page_id: B0x_이름`/`A0x_이름` frontmatter 필수화 규칙 추가 (concepts 파일은 제외 — 페이지 단위가 아니므로) +- 기존 wiki/pages/ 하위 34개 파일 전체에 `page_id` 소급 추가 (status 라인 바로 아래) +- 향후 ingest 시 페이지 파일 생성할 때마다 이 필드 포함 필수 + +## [2026-07-12] ingest | A01_Home 실 코드 반영 +- 대상: A01_Home_UI_Page.ts (157줄), A01_Home_UI_Style.css (113줄) +- 출력: wiki/pages/A01_Home/frontend.md 상세 업데이트 (79줄 → 개념 설명 + 컴포넌트 분석 + 로케일 키 매핑 + CSS 클래스 구조 추가) +- 발견 사항: MOCK_NEWS 데이터 하드코딩(백엔드 미연결), 3개 공통 컴포넌트(createButton/createCard/createTag) 사용, theme.css 변수 엄격 준수, 반응형 900px 기준 +- 미해결: /api/a01/news 백엔드 미구현 +- 기존 내용 유지: status stable 유지, related_pages 확장 + +## [2026-07-12] refactor | 파일명 규칙 도입 및 링크 수정 +- **파일명 규칙 변경:** `frontend.md` → `A01_frontend.md` (page_id prefix 추가) +- **이유:** 그래픽 뷰에서 `frontend.md`, `backend.md` 등 기능명이 겹칠 때 page_id로 즉시 식별 가능하게 함 +- **적용 범위:** wiki/pages/A0x_이름/, wiki/pages/B0x_이름/ 하위 파일 모두 (신규 + 기존) +- **수정 파일:** `wiki/pages/A01_Home/frontend.md` → `A01_frontend.md`, index.md 링크 `[[A01_Home/frontend]]` → `[[A01_Home/A01_frontend]]` +- **docs/CLAUDE.md 규칙 5번, wiki/CLAUDE.md 작성규칙 수정** — 파일명 규칙 명시 +- 향후 ingest 시 신규 파일 생성할 때마다 page_id prefix 붙임 + +## [2026-07-12] lint | A그룹(A01~A09) 전체 검증 및 정합성 점검 +- 범위: A01~A09 wiki 페이지 13개 + 참조 concept(ui_templates/a00_app_shell_framework/auth_rbac/common_util/logs_monitoring 등) + index.md +- **검증 통과 항목**: + - 파일 100줄 제한: 전 파일 통과(최대 A01 76줄), 파일명 규칙(page_id prefix) 전부 준수 + - 위키링크 유효성: A그룹이 거는 링크 대상 전부 실존 확인(깨진 링크 0) + - 소스 커버리지: A01~A09 실 소스 파일 전부 wiki 반영 확인(A02~A05 frontend-only는 백엔드 소스 없어 정당) +- **발견·수정한 문제**: + 1. A02_frontend.md frontmatter에 비표준 `related_pages: []` 잔재 → 제거(A01 린트 때와 동일 유형) + 2. index.md 미해결 항목 섹션에 A그룹 발견 불일치 3건 누락 → "A그룹 인제스트 중 발견" 소섹션 추가(세션정책/support_requests컬럼/미사용코드) + 3. auth_rbac.md 역참조 누락(B01만 있고 A06/A07/A09 없음) → 사용처 섹션 + 계획서-실코드 불일치 소섹션 추가(규칙12) + 4. index.md A01 요약 톤 정리(다른 A페이지와 일관성, stable 명시) +- **기록만(수정 안 함)**: + - `[[B01_Dashboard/backend]]` 링크는 구 파일명(backend.md) 참조하나 파일 실존→깨진 링크 아님. B01 파일명 규칙 마이그레이션은 B그룹 작업 시 처리 + - common_util.md 사용처 "전 페이지/인증 관련"로 A그룹 포괄됨(세부 명시는 선택사항, 링크 유효) +- 결론: A그룹 인제스트 정합성 확보. 누적 불일치 3건은 index.md 미해결 항목에 집약(코드 수정은 사용자가 나중에) + +## [2026-07-12] ingest | A09_Security (backend + frontend 상세화) +- 대상: A09_Security_Router.py(123줄), A09_Security_Schema.py(25줄), A09_Security_UI_Page.ts(30줄), A09_Security_Terms.ts(16줄), A09_Security_Api_Fetch.ts(61줄), A09_Security_UI_Style.css(14줄) +- **기존 파일 정리**: 얕은 스텁 backend.md/frontend.md 삭제 → A09_backend.md/A09_frontend.md 상세 재작성 +- 출력: + - `A09_backend.md`(stable) — `/api/security` 9개 엔드포인트(마스터 5종 require_master, 시스템관리자 3종 require_system_admin, 활동로그 1종 verify_session), Pydantic 3종, psutil 리소스 계측 + - `A09_frontend.md`(stable) — 약관 열람 페이지(3섹션), Terms 데이터 표, 미사용 API 클라이언트 8함수 표 +- **로케일 키 검증**: A09_Security_Title(375), A09_Security_Version(376), A09_Security_Policy(379) 실 파일 등록 확인 +- **⚠️ 중요 발견 1 (프론트/백엔드 기능 불일치)**: UI_Page.ts는 약관 텍스트 열람만, Api_Fetch.ts(마스터/관리자 8함수)는 어디서도 import 안 됨(grep 확인). 백엔드 API는 완비, 프론트 연동 미완 → 양쪽 파일에 명시 +- **⚠️ 중요 발견 2 (약관-실코드 불일치)**: Terms.ts security 텍스트 "세션 12h/4h 만료"는 auth_rbac 계획서 기준, A06 실코드(auth_expires_at 3개월)와 다름. A06 불일치와 동일 뿌리 → 코드수정은 나중에(사용자 지시) +- **발견 사항**: + - 스텁엔 프론트가 "약관 동의 페이지"로 기술됐으나 실제론 동의 체크 없는 단순 열람(동의 흐름은 A07 회원가입에 있음) + - 백엔드는 B01_Dashboard 관리자 기능과 역할 중복 가능성 + - activity_logs INSERT: user_id/action_type/resource_id/status/details +- index.md A09 링크 `[[A09_Security/backend]]` → `[[A09_Security/A09_backend]]` 갱신 + +## [2026-07-12] ingest | A08_Support (backend + frontend 상세화) +- 대상: A08_Support_Router.py(68줄), A08_Support_Schema.py(13줄), A08_Support_UI_Page.ts(217줄), A08_Support_UI_Style.css(64줄) +- **기존 파일 정리**: 얕은 스텁 backend.md/frontend.md 삭제 → A08_backend.md/A08_frontend.md 상세 재작성 +- 출력: + - `A08_backend.md`(stable) — `POST /api/a08/support` 단일 엔드포인트, get_optional_session(비로그인 허용), support_requests INSERT + 관리자 알림 메일 + - `A08_frontend.md`(stable) — 문의 폼(textarea 자체 구현 createTextAreaField), 세션 자동 채움(fetchSessionUser), fetch 직접 호출(Api_Fetch 파일 없음) +- **로케일 키 검증**: A08_Support_Title(348), A08_Support_Field_Phone(357), A08_Support_Field_Message(361), A08_Support_Success(367) 실 파일 등록 확인 +- **⚠️ DB 스키마 불일치 발견**: `db_schema/logs_monitoring`의 support_requests 컬럼은 계획서 기준(user_id/title/priority/status)인데 실 코드 INSERT는 company_id/company_name/user_name/user_email/user_phone/subject/message → 컬럼명 다름. logs_monitoring.md에 양쪽 병기 + 사용처에 A08 추가, 실 DB 대조 필요(규칙6)로 표시 +- **발견 사항**: + - 비로그인도 문의 가능(get_optional_session), 로그인 시 회사 정보 자동 연결 + - textarea는 공통 컴포넌트에 없어 자체 구현 + - 프론트가 fetch를 직접 호출(별도 API 클라이언트 파일 없음) +- index.md A08 링크 `[[A08_Support/backend]]` → `[[A08_Support/A08_backend]]` 갱신 + +## [2026-07-12] ingest | A07_Register (backend + frontend 상세화) +- 대상: A07_Register_Router.py(76줄), A07_Register_Schema.py(30줄), A07_Register_UI_Auth_Page.ts(208줄), A07_Register_UI_Page.ts(142줄), A07_Register_Api_Fetch.ts(47줄), A07_Register_UI_Style.css(103줄) +- **기존 파일 정리**: A06와 동일하게 얕은 스텁 backend.md/frontend.md 삭제 → A07_backend.md/A07_frontend.md 상세 재작성 +- 출력: + - `A07_backend.md`(stable) — `/api/auth` 3종(companies·register/request·verify), Pydantic 2종, 2단계 가입 흐름(PENDING_EMAIL→NO_COMPANY) + - `A07_frontend.md`(stable) — 약관 아코디언, 2단계 폼(정보입력→OTP), API 클라이언트 3함수 +- **로케일 키 검증**: A07_Register_Field_Otp(340), A07_Register_Verify(341), A07_Register_OtpSent(342), A07_Register_Marketing(336) 실 파일 등록 확인 +- **⚠️ 중요 발견**: A07에 UI 파일이 2개 — `A07_Register_UI_Auth_Page.ts`(실사용, router.ts:30이 import)와 `A07_Register_UI_Page.ts`(백엔드 미연동 TODO, 단순 폼). 후자는 **구버전 잔재**로 판단, 두 파일 모두 `renderA07Register` export하나 라우터는 Auth_Page만 사용 → frontend.md에 명시하고 정리 권장 +- **발견 사항**: + - 가입은 회사 없이 완료(NO_COMPANY), 회사 생성/연결은 로그인 후 B01_Dashboard에서 진행 + - 회사검색 API(searchCompanies)는 자동완성용 + - 약관 본문은 resources/legal/*.txt에서 fetch + - terms_version "1.0" 프론트 하드코딩 +- index.md A07 링크 `[[A07_Register/backend]]` → `[[A07_Register/A07_backend]]` 갱신 + +## [2026-07-12] ingest | A06_Login (backend + frontend 상세화) +- 대상: A06_Login_Router.py(179줄), A06_Login_Schema.py(20줄), A06_Login_UI_Auth_Page.ts(80줄), A06_Login_Api_Fetch.ts(57줄), A06_Login_UI_Style.css(52줄) +- **기존 파일 정리**: `backend.md`/`frontend.md`(초기 세팅 시 얕은 스텁, 비표준 frontmatter `type`/`source`/`related_pages` 포함) → 삭제하고 규칙에 맞는 `A06_backend.md`/`A06_frontend.md`로 상세 재작성 +- 출력: + - `A06_backend.md`(stable) — `/api/auth` 엔드포인트 5종 표(login/request·verify·session·logout·password), 내부헬퍼 3종, Pydantic 3종, 로그인 흐름, 보안정책 + - `A06_frontend.md`(stable) — 2단계 폼(비번→OTP 전환), API 클라이언트 5함수, 로케일 키, 이벤트 핸들러 +- **로케일 키 검증**: A06_Login_Title(124), A06_Login_Field_Otp(288), A06_Login_Verify(290), A06_Login_OtpSent(291) 등 실 파일 등록 확인 +- **발견 사항**: + - OTP는 "신규 브라우저 OR 주기적 재인증(EMAIL_REVERIFY_DAYS 경과)" 조건에서만 요구 (매 로그인 아님) + - `_finish_login`에서 `auth_expires_at = NOW() + 3개월` 갱신, 브라우저 신뢰 등록 + - 5회 연속 실패 시 ADMIN_EMAIL로 보안 경고 메일 + - `fetchSession`/`fetchSessionUser`/`logout`은 app_shell과 공유 +- **⚠️ 불일치 기록**: [[auth_rbac]]는 계획서 기준(OTP 5분·재시도 3회·세션 4h/12h·15분 잠금)인데 실 코드와 다름 → 규칙6에 따라 auth_rbac 갱신 대상으로 A06_backend.md에 명시(별도 처리 필요) +- index.md A06 링크 `[[A06_Login/backend]]` → `[[A06_Login/A06_backend]]` 갱신 + +## [2026-07-12] lint | A03~A05 인제스트 재점검 +- 대상: A03/A04/A05 frontend.md + concepts/ui_templates.md +- **줄번호 대조**: 실 코드와 전부 일치 확인 (A03 buildHero 23-41 등, A04 buildTimeline 70-106, A05 onClick 26-28 등) +- **로케일 키 검증**: A03_CompDetail_Contact_Email(238), A04_NewsHistory_Empty(249), A05_EduDetail_Cta(273) 등 실 파일에 등록 확인 +- **발견/수정한 문제**: + 1. 규칙13 위반: A03~A05 컴포넌트 섹션이 서술식 불릿 → 표 형식(함수|위치|역할)으로 전환, renderAxx 진입점 함수 누락분 추가 + 2. ui_templates.md 컴포넌트 목록 부정확: createButton variant 3종→4종(danger 추가), createTag variant 5종·기본값 neutral 명시, 누락 컴포넌트 6종(createInputField/createSelectField/showLoadingOverlay/hideLoadingOverlay/showToast/createLineChart/injectBaseStyles) 표로 보완 + 3. 깨진 위키링크 `[[A00_Common/app_shell_framework]]` → `[[a00_app_shell_framework]]`로 수정(ui_templates.md 2곳) + 4. ui_templates.md 사용처 역참조에 A03/A04/A05 추가 +- ui_templates.md 91줄(100줄 제한 이내 유지) + +## [2026-07-12] ingest | A05_EduDetail +- 대상: A05_EduDetail_UI_Page.ts (106줄), A05_EduDetail_UI_Style.css (87줄) +- 출력: `wiki/pages/A05_EduDetail/A05_frontend.md` (stable) +- 발견 사항: + - Hero + 3개 교육 과정 카드그리드 + CTA 버튼 레이아웃 + - createButton, createCard 공통 컴포넌트 사용 + - `onA05_EduDetail_Inquiry_Click()` → A08_SUPPORT 라우트로 이동 + - theme.css 변수 엄격 준수 +- index.md 업데이트 (A05 분리) + +## [2026-07-12] ingest | A04_NewsHistory +- 대상: A04_NewsHistory_UI_Page.ts (117줄), A04_NewsHistory_UI_Style.css (87줄) +- 출력: `wiki/pages/A04_NewsHistory/A04_frontend.md` (stable) +- 발견 사항: + - MOCK_HISTORY 데이터: feature/fix/notice 3종 태그 + 날짜 + - KIND_META 맵핑으로 variant 자동 결정 + - createTag 공통 컴포넌트 사용 + - 빈 상태(empty) 처리 구현 + - 백엔드 API 미구현: GET /api/a04/history (코드 주석에 언급) +- index.md 업데이트 (A04 분리) + +## [2026-07-12] ingest | A03_CompDetail +- 대상: A03_CompDetail_UI_Page.ts (114줄), A03_CompDetail_UI_Style.css (100줄) +- 출력: `wiki/pages/A03_CompDetail/A03_frontend.md` (stable) +- 발견 사항: + - A02와 동일 패턴(Hero + 섹션 + 3열 카드그리드) + - createCard 공통 컴포넌트 사용 + - 3개 가치 카드 (Value1~3) + 연락처 이메일 + - theme.css 변수 엄격 준수 +- index.md 업데이트 (A03 분리) + +## [2026-07-12] lint | A01_Home 페이지 검사 및 수정 +- 대상: `wiki/pages/A01_Home/A01_frontend.md` +- 발견 사항: + - frontmatter에 비표준 필드 `type: page-frontend` 존재 → 제거 (규칙에는 status/page_id/last_updated만) + - related_pages 배열 형식 오류 → 제거 (위키링크는 본문에만 사용) + - 의존성 링크 `[[ui_template_locale]]`, `[[ui_template_elements]]` 오류 → concepts 페이지 부재 +- 해결: + - frontmatter 정제 (status/page_id/last_updated만 유지) + - 새 concepts 페이지 `ui_templates.md` 신규 생성 (locale + elements + theme 통합, 사용처 역참조 포함) + - 의존성 섹션 링크 수정: [[ui_templates]]로 통합 + - index.md에 ui_templates 추가 +- status: stable 유지 (실 코드 반영 완료) + +## [2026-07-12] ingest | A02_ProgDetail + A00_Common Framework +- 대상: A02_ProgDetail_UI_Page.ts (146줄), A02_ProgDetail_UI_Style.css (127줄) + A00_Common (app_shell.ts 284줄, b_page_scaffold.ts 163줄, router.ts 158줄) +- 출력: + - `wiki/pages/A02_ProgDetail/A02_frontend.md` (신규) — 컴포넌트 분석 + 로케일 키 + CSS 클래스 + 이벤트 + - `wiki/concepts/a00_app_shell_framework.md` (신규) — 공유 프레임워크(전체 페이지의 헤더·라우터·가드) +- 발견 사항: + - A02는 단순 정적 페이지(Hero + Workflow 배지 + Tech 카드) + - A00_Common는 전체 앱의 스켈레톤—모든 페이지가 의존하는 공유 레이어 + - `renderShell()` + `injectShellStyles()` 로직으로 헤더/아울렛/푸터 통합 관리 + - 라우터 테이블에 A01~A09, B01~B11 (22개 라우트) 모두 등록됨 (B10_Payment, B11_Status 신규 발견) + - 워크플로우 라우트(B02~B11)에 대한 추가 인증 가드 구현 (company_id 검증) +- index.md 업데이트 (A02 분리, concepts에 a00_app_shell_framework 추가) +- status: both stable (실 코드 구현 완료 확인) diff --git a/docs/wiki/pages/A01_Home/A01_components.md b/docs/wiki/pages/A01_Home/A01_components.md new file mode 100644 index 0000000..38bd88f --- /dev/null +++ b/docs/wiki/pages/A01_Home/A01_components.md @@ -0,0 +1,37 @@ +--- +type: page-frontend-detail +status: stable +page_id: A01_Home +related_pages: ["[[A01_Home/A01_frontend]]", "[[ui_templates]]", "[[a00_app_shell_framework]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 A01_Home 코드 인제스트 보완 (2026-07-12) +--- + +# A01_Home — 세부 구현 + +## 스타일 +| 항목 | 역할 | +|---|---| +| `.a01-home`, `.a01-hero` | 페이지 래퍼·히어로 배경 | +| `.a01-news-list`, `.a01-news-row` | 뉴스 목록과 행 레이아웃 | +| `.a01-feature-grid`, `.a01-feature-card` | 3열 기능 카드 그리드 | +| 900px 이하 | 기능 그리드 1열·히어로 제목 축소 | + +## 의존성 +| 항목 | 역할 | +|---|---| +| [[a00_app_shell_framework]] | `navigateTo()` 라우팅 | +| `config_frontend.ts` | `ROUTES` 상수 | +| [[ui_templates]] | 공통 버튼·카드·태그·다국어 | + +## 데이터 흐름 +| 단계 | 흐름 | +|---|---| +| 1 | `renderA01Home(root)` → `buildHero()`·`buildNews()`·`buildFeatures()` | +| 2 | `buildNews()`는 현재 `MOCK_NEWS` 사용 | +| 3 | CTA 클릭 → A07_Register 또는 A02_ProgDetail 이동 | + +## 미해결 +| 항목 | 상태 | +|---|---| +| `GET /api/a01/news` | 백엔드 미구현; 현재 뉴스는 하드코딩 | diff --git a/docs/wiki/pages/A01_Home/A01_frontend.md b/docs/wiki/pages/A01_Home/A01_frontend.md new file mode 100644 index 0000000..56558e1 --- /dev/null +++ b/docs/wiki/pages/A01_Home/A01_frontend.md @@ -0,0 +1,60 @@ +--- +status: stable +page_id: A01_Home +related_pages: ["[[A02_ProgDetail/A02_frontend]]", "[[A04_NewsHistory/A04_frontend]]", "[[a00_app_shell_framework]]", "[[ui_templates]]"] +last_updated: 2026-07-12 +--- + +# A01_Home — Frontend + +로그인 전 01: 홈 페이지. 소개 히어로 + 최신 소식 + 주요 기능 3가지를 showcase하는 정적 소개 페이지. 백엔드 없음. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A01_Home_UI_Page.ts` | `A01_Home/A01_Home_UI_Page.ts:1-157` | 페이지 렌더링 로직 | +| `A01_Home_UI_Style.css` | `A01_Home/A01_Home_UI_Style.css:1-113` | 스타일 (theme.css 변수만 사용) | + +## 컴포넌트 + +### Hero 섹션 +- **함수:** `buildHero()` (A01_Home_UI_Page.ts:52-85) +- **구성:** 제목 + 부제목 + 2개 CTA 버튼 (회원가입/프로그램 상세) +- **색상:** 라벤더 그라디언트 배경 (`--color-mist-violet` → `--color-canvas`) + +### 최신 소식 섹션 +- **함수:** `buildNews()` (A01_Home_UI_Page.ts:87-116) +- **데이터:** MOCK_NEWS 배열 (A01_Home_UI_Page.ts:32-36, 백엔드 연결 전) +- **각 항목:** 태그 + 뉴스 제목 + 날짜 + +### 주요 기능 섹션 +- **함수:** `buildFeatures()` (A01_Home_UI_Page.ts:118-146) +- **레이아웃:** 3열 그리드 (반응형: 900px 이하 1열) +- **카드:** createCard 공통 컴포넌트 사용 + +## 이벤트 핸들러 + +| 함수 | 위치 | 동작 | +|---|---|---| +| `onA01_Home_GetStarted_Click()` | A01_Home_UI_Page.ts:41-43 | 회원가입(A07_REGISTER) 이동 | +| `onA01_Home_Explore_Click()` | A01_Home_UI_Page.ts:45-47 | 프로그램 상세(A02_PROG_DETAIL) 이동 | + +## 로컬라이제이션 + +모든 텍스트는 `ui_locales[key][currentLanguageIndex]` 형식으로 [[ui_templates]] 에서 로드. +하드코딩 금지. + +| UI 요소 | 로케일 키 | +|---|---| +| 제목 | `A01_Home_Title` | +| 히어로 부제목 | `A01_Home_Hero_Subtitle` | +| CTA 버튼 (Primary/Secondary) | `A01_Home_Hero_CtaPrimary`, `A01_Home_Hero_CtaSecondary` | +| 소식 섹션 제목 | `A01_Home_News_SectionTitle` | +| 소식 태그 | `A01_Home_News_Tag` | +| 기능 섹션 제목 | `A01_Home_Features_SectionTitle` | +| 기능 카드 1~3 | `A01_Home_Feature{1..3}_Title`, `A01_Home_Feature{1..3}_Desc` | + +## 세부 구현 + +스타일 구조·의존성·데이터 흐름·미해결 사항은 [[A01_Home/A01_components]]에 분리했다. diff --git a/docs/wiki/pages/A02_ProgDetail/A02_components.md b/docs/wiki/pages/A02_ProgDetail/A02_components.md new file mode 100644 index 0000000..6895d8e --- /dev/null +++ b/docs/wiki/pages/A02_ProgDetail/A02_components.md @@ -0,0 +1,38 @@ +--- +type: page-frontend-detail +status: stable +page_id: A02_ProgDetail +related_pages: ["[[A02_ProgDetail/A02_frontend]]", "[[ui_templates]]", "[[a00_app_shell_framework]]"] +last_updated: 2026-07-12 +source: A02_ProgDetail 코드 인제스트 보완 및 구조화 일관성 적용 +--- + +# A02_ProgDetail — 세부 구현 + +## 스타일 (CSS) +| 항목 | 역할 | +|---|---| +| `.a02-prog-detail` | 페이지 루트 컨테이너 (gap: section-gap, padding-bottom: spacing-64) | +| `.a02-hero`, `.a02-hero__inner` | 히어로 영역 배경(라벤더 그라디언트) 및 콘텐츠 중앙 정렬 | +| `.a02-workflow-list`, `.a02-workflow-row` | 6단계 워크플로우 리스트(flex 열) 및 배지+텍스트 행 레이아웃 | +| `.a02-workflow-row__badge` | 40×40px 원형 배지 (primary 배경) | +| `.a02-tech-grid`, `.a02-tech-card` | 핵심 기술 소개 3열 카드 그리드 (900px 이하 대응) | + +## 의존성 +| 항목 | 역할 | +|---|---| +| [[a00_app_shell_framework]] | `navigateTo()` 라우팅 기능 활용 | +| `config_frontend.ts` | `ROUTES` 경로 상수 참조 | +| [[ui_templates]] | 공통 버튼(`createButton`) 및 카드(`createCard`) 엘리먼트 활용 | +| `ui_template_locale.ts` | 다국어 문구(`ui_locales`) 적용 | + +## 데이터 흐름 +| 단계 | 흐름 | +|---|---| +| 1 | `renderA02ProgDetail(root)` ➡️ `buildHero()` ➡️ `buildWorkflow()` ➡️ `buildTech()` 순서로 구성 요소를 렌더링하고 `root`에 추가 | +| 2 | 사용자가 히어로의 CTA 버튼 클릭 시 `onA02_ProgDetail_Start_Click()` 핸들러가 작동하여 `navigateTo(ROUTES.A07_REGISTER)` 호출 | + +## 미해결 / 특이사항 +| 항목 | 상태 | +|---|---| +| 정적 페이지 | 백엔드 API와의 연동이 필요 없는 완전한 정적 소개 페이지임 | diff --git a/docs/wiki/pages/A02_ProgDetail/A02_frontend.md b/docs/wiki/pages/A02_ProgDetail/A02_frontend.md new file mode 100644 index 0000000..77b0c21 --- /dev/null +++ b/docs/wiki/pages/A02_ProgDetail/A02_frontend.md @@ -0,0 +1,33 @@ +--- +status: stable +page_id: A02_ProgDetail +related_pages: ["[[A01_Home/A01_frontend]]", "[[a00_app_shell_framework]]", "[[ui_templates]]", "[[A02_ProgDetail/A02_components]]"] +last_updated: 2026-07-12 +--- + +# A02_ProgDetail — Frontend + +로그인 전 프로그램 상세 페이지. 6단계 워크플로우 시각화 + 핵심 기술 소개. + +## 구조 +- **경로**: `A02_ProgDetail/A02_ProgDetail_UI_Page.ts` (146줄) +- **스타일**: `A02_ProgDetail/A02_ProgDetail_UI_Style.css` (127줄) + +## 컴포넌트 분석 + +| 컴포넌트 | 역할 | 로케일 키 | +|---|---|---| +| `buildHero()` | 히어로 섹션(제목+부제+CTA) | `A02_ProgDetail_Title`, `A02_ProgDetail_Hero_Subtitle`, `A02_ProgDetail_Hero_Cta` | +| `buildWorkflow()` | 6단계 워크플로우 리스트(배지+텍스트) | `A02_ProgDetail_Workflow_SectionTitle`, `A02_ProgDetail_Step[1-6]_Title`, `A02_ProgDetail_Step[1-6]_Desc` | +| `buildTech()` | 기술 3종 카드 그리드 | `A02_ProgDetail_Tech_SectionTitle`, `A02_ProgDetail_Tech[1-3]_Title`, `A02_ProgDetail_Tech[1-3]_Desc` | + +## 제약 준수 + +- ✅ 모든 문구 `ui_template_locale.ts` 참조 +- ✅ 색상/간격 `theme.css` 변수만 사용 +- ✅ 공통 컴포넌트 `createButton`/`createCard` 사용 +- ✅ 이벤트 핸들러 명명 `on[페이지]_[기능]_[액션]` + +## 세부 구현 + +스타일 구조·의존성·데이터 흐름·특이사항은 [[A02_ProgDetail/A02_components]]에 분리했다. diff --git a/docs/wiki/pages/A03_CompDetail/A03_frontend.md b/docs/wiki/pages/A03_CompDetail/A03_frontend.md new file mode 100644 index 0000000..9028d0b --- /dev/null +++ b/docs/wiki/pages/A03_CompDetail/A03_frontend.md @@ -0,0 +1,67 @@ +--- +status: stable +page_id: A03_CompDetail +related_pages: ["[[a00_app_shell_framework]]", "[[ui_templates]]"] +last_updated: 2026-07-12 +--- + +# A03_CompDetail — Frontend + +로그인 전 회사 상세 페이지. 미션 + 핵심 가치 + 연락처. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A03_CompDetail_UI_Page.ts` | `A03_CompDetail/A03_CompDetail_UI_Page.ts:1-114` | 페이지 렌더링 로직 | +| `A03_CompDetail_UI_Style.css` | `A03_CompDetail/A03_CompDetail_UI_Style.css:1-100` | 스타일 (theme.css 변수만 사용) | + +## 컴포넌트 (섹션 빌더) + +| 함수 | 위치 | 역할 | +|---|---|---| +| `buildHero()` | `A03_CompDetail/A03_CompDetail_UI_Page.ts:23-41` | Hero(제목+부제목), mist-violet→canvas 그라디언트 | +| `buildMission()` | `A03_CompDetail/A03_CompDetail_UI_Page.ts:43-57` | 미션 섹션 제목+본문(중앙정렬, max 60자) | +| `buildValues()` | `A03_CompDetail/A03_CompDetail_UI_Page.ts:59-87` | 핵심가치 3열 카드그리드(createCard 3개) | +| `buildContact()` | `A03_CompDetail/A03_CompDetail_UI_Page.ts:89-103` | 연락처 섹션 제목+이메일 | +| `renderA03CompDetail()` | `A03_CompDetail/A03_CompDetail_UI_Page.ts:108-113` | 페이지 진입점(4개 섹션 조립) | + +## 로컬라이제이션 + +모든 텍스트는 `ui_locales[key][currentLanguageIndex]` 형식으로 [[ui_templates]]에서 로드. +하드코딩 금지. + +| UI 요소 | 로케일 키 | +|---|---| +| 제목 | `A03_CompDetail_Title` | +| 히어로 부제목 | `A03_CompDetail_Hero_Subtitle` | +| 미션 섹션 제목 | `A03_CompDetail_Mission_SectionTitle` | +| 미션 본문 | `A03_CompDetail_Mission_Body` | +| 가치 섹션 제목 | `A03_CompDetail_Value_SectionTitle` | +| 가치 1~3 | `A03_CompDetail_Value{1..3}_Title`, `A03_CompDetail_Value{1..3}_Desc` | +| 연락처 섹션 제목 | `A03_CompDetail_Contact_SectionTitle` | +| 연락처 이메일 | `A03_CompDetail_Contact_Email` | + +## 스타일 (CSS) + +### CSS 클래스 구조 +- `.a03-comp-detail` — 페이지 래퍼 (flex column, gap: section-gap) +- `.a03-hero` — 그래디언트 배경 +- `.a03-hero__inner` — 중앙 정렬 컨테이너 +- `.a03-hero__title` — heading-lg, deep-iris, max 18자 +- `.a03-hero__subtitle` — body 텍스트, slate, max 56자 +- `.a03-section` — 공통 섹션 (max-width: page-max-width, padding: spacing-32) +- `.a03-section__title` — heading-sm, deep-iris, 중앙 정렬 +- `.a03-mission__body` — body, slate, 중앙 정렬, max 60자 +- `.a03-value-grid` — 3열 그리드 (gap: spacing-24) +- `.a03-value-card` — 카드 (min-height: 140px) +- `.a03-value__desc` — body-sm, slate +- `.a03-contact__email` — body, charcoal, 중앙 정렬 + +### 반응형 +- **900px 이하:** 가치 그리드 1열, 히어로 제목 폰트 축소 + +## 의존성 + +- [[a00_app_shell_framework]] — 공통 헤더·푸터 +- [[ui_templates]] — `createCard()` 공통 컴포넌트 + 다국어 diff --git a/docs/wiki/pages/A04_NewsHistory/A04_frontend.md b/docs/wiki/pages/A04_NewsHistory/A04_frontend.md new file mode 100644 index 0000000..4927c99 --- /dev/null +++ b/docs/wiki/pages/A04_NewsHistory/A04_frontend.md @@ -0,0 +1,86 @@ +--- +status: stable +page_id: A04_NewsHistory +related_pages: ["[[A01_Home/A01_frontend]]", "[[a00_app_shell_framework]]", "[[ui_templates]]"] +last_updated: 2026-07-12 +--- + +# A04_NewsHistory — Frontend + +로그인 전 최신 소식 및 개선 이력 페이지. 타임라인 목록 형태. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A04_NewsHistory_UI_Page.ts` | `A04_NewsHistory/A04_NewsHistory_UI_Page.ts:1-117` | 페이지 렌더링 로직 + Mock 데이터 | +| `A04_NewsHistory_UI_Style.css` | `A04_NewsHistory/A04_NewsHistory_UI_Style.css:1-87` | 스타일 (theme.css 변수만 사용) | + +## 컴포넌트 (섹션 빌더) + +| 함수 | 위치 | 역할 | +|---|---|---| +| `buildHero()` | `A04_NewsHistory/A04_NewsHistory_UI_Page.ts:50-68` | Hero(제목+부제목), mist-violet→canvas 그라디언트 | +| `buildTimeline()` | `A04_NewsHistory/A04_NewsHistory_UI_Page.ts:70-106` | 타임라인(태그+제목+날짜 행), 빈 상태 처리 | +| `renderA04NewsHistory()` | `A04_NewsHistory/A04_NewsHistory_UI_Page.ts:111-116` | 페이지 진입점(Hero+타임라인 조립) | + +- **데이터:** MOCK_HISTORY 배열 (A04_NewsHistory_UI_Page.ts:33-38, 백엔드 연결 전) — 추후 `GET /api/a04/history`로 교체 예정 +- **빈 상태:** MOCK_HISTORY.length === 0이면 `A04_NewsHistory_Empty` 로케일 키 표시 + +## Mock 데이터 구조 + +**타입:** +```typescript +type HistoryKind = "feature" | "fix" | "notice"; +interface HistoryItem { + id: number; + kind: HistoryKind; + title: string; + date: string; +} +``` + +**태그 변형 매핑** (KIND_META): +- `"feature"` → variant: "accent" → `A04_NewsHistory_Tag_Feature` +- `"fix"` → variant: "success" → `A04_NewsHistory_Tag_Fix` +- `"notice"` → variant: "neutral" → `A04_NewsHistory_Tag_Notice` + +## 로컬라이제이션 + +모든 텍스트는 `ui_locales[key][currentLanguageIndex]` 형식으로 [[ui_templates]]에서 로드. +하드코딩 금지. + +| UI 요소 | 로케일 키 | +|---|---| +| 제목 | `A04_NewsHistory_Title` | +| 히어로 부제목 | `A04_NewsHistory_Hero_Subtitle` | +| 태그 라벨 (feature/fix/notice) | `A04_NewsHistory_Tag_Feature`, `A04_NewsHistory_Tag_Fix`, `A04_NewsHistory_Tag_Notice` | +| 빈 상태 메시지 | `A04_NewsHistory_Empty` | + +## 스타일 (CSS) + +### CSS 클래스 구조 +- `.a04-news-history` — 페이지 래퍼 (flex column, gap: section-gap) +- `.a04-hero` — 그래디언트 배경 +- `.a04-hero__inner` — 중앙 정렬 컨테이너 +- `.a04-hero__title` — heading-lg, deep-iris, max 18자 +- `.a04-hero__subtitle` — body 텍스트, slate, max 56자 +- `.a04-section` — 공통 섹션 (max-width: page-max-width, padding: spacing-32) +- `.a04-timeline` — flex 열 (gap: spacing-8) +- `.a04-timeline-row` — flex row, 태그+제목+날짜 (gap: spacing-16, padding: spacing-16 spacing-24) +- `.a04-timeline-row__title` — flex: 1, body-sm, charcoal +- `.a04-timeline-row__date` — caption, ash +- `.a04-timeline__empty` — 중앙 정렬, slate, body + +### 반응형 +- **900px 이하:** 히어로 제목 폰트 축소 + +## 의존성 + +- [[a00_app_shell_framework]] — 공통 헤더·푸터 +- [[ui_templates]] — `createTag()` 공통 컴포넌트 + 다국어 + +## 미해결 사항 + +- MOCK_HISTORY 데이터: 현재 하드코딩 (4개 항목) +- 백엔드 API 미구현: `GET /api/a04/history` 코드 주석에 언급됨 diff --git a/docs/wiki/pages/A05_EduDetail/A05_frontend.md b/docs/wiki/pages/A05_EduDetail/A05_frontend.md new file mode 100644 index 0000000..cb4f55a --- /dev/null +++ b/docs/wiki/pages/A05_EduDetail/A05_frontend.md @@ -0,0 +1,69 @@ +--- +status: stable +page_id: A05_EduDetail +related_pages: ["[[a00_app_shell_framework]]", "[[ui_templates]]"] +last_updated: 2026-07-12 +--- + +# A05_EduDetail — Frontend + +로그인 전 교육 상세 페이지. 교육 과정 소개 + 문의 CTA. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A05_EduDetail_UI_Page.ts` | `A05_EduDetail/A05_EduDetail_UI_Page.ts:1-106` | 페이지 렌더링 로직 | +| `A05_EduDetail_UI_Style.css` | `A05_EduDetail/A05_EduDetail_UI_Style.css:1-87` | 스타일 (theme.css 변수만 사용) | + +## 컴포넌트 (섹션 빌더) + +| 함수 | 위치 | 역할 | +|---|---|---| +| `buildHero()` | `A05_EduDetail/A05_EduDetail_UI_Page.ts:33-51` | Hero(제목+부제목), mist-violet→canvas 그라디언트 | +| `buildCourses()` | `A05_EduDetail/A05_EduDetail_UI_Page.ts:53-81` | 교육과정 3열 카드그리드(createCard 3개) | +| `buildCta()` | `A05_EduDetail/A05_EduDetail_UI_Page.ts:83-95` | 문의 CTA 버튼(variant: filled) | +| `renderA05EduDetail()` | `A05_EduDetail/A05_EduDetail_UI_Page.ts:100-105` | 페이지 진입점(3개 섹션 조립) | + +## 로컬라이제이션 + +모든 텍스트는 `ui_locales[key][currentLanguageIndex]` 형식으로 [[ui_templates]]에서 로드. +하드코딩 금지. + +| UI 요소 | 로케일 키 | +|---|---| +| 제목 | `A05_EduDetail_Title` | +| 히어로 부제목 | `A05_EduDetail_Hero_Subtitle` | +| 과정 섹션 제목 | `A05_EduDetail_Course_SectionTitle` | +| 과정 1~3 | `A05_EduDetail_Course{1..3}_Title`, `A05_EduDetail_Course{1..3}_Desc` | +| CTA 버튼 라벨 | `A05_EduDetail_Cta` | + +## 스타일 (CSS) + +### CSS 클래스 구조 +- `.a05-edu-detail` — 페이지 래퍼 (flex column, gap: section-gap) +- `.a05-hero` — 그래디언트 배경 +- `.a05-hero__inner` — 중앙 정렬 컨테이너 +- `.a05-hero__title` — heading-lg, deep-iris, max 18자 +- `.a05-hero__subtitle` — body 텍스트, slate, max 56자 +- `.a05-section` — 공통 섹션 (max-width: page-max-width, padding: spacing-32) +- `.a05-section__title` — heading-sm, deep-iris, 중앙 정렬 +- `.a05-course-grid` — 3열 그리드 (gap: spacing-24) +- `.a05-course-card` — 카드 (min-height: 140px) +- `.a05-course__desc` — body-sm, slate +- `.a05-cta` — align-items: center (버튼 중앙 정렬) + +### 반응형 +- **900px 이하:** 과정 그리드 1열, 히어로 제목 폰트 축소 + +## 이벤트 핸들러 + +| 함수 | 위치 | 동작 | +|---|---|---| +| `onA05_EduDetail_Inquiry_Click()` | A05_EduDetail_UI_Page.ts:26-28 | A08_SUPPORT로 이동 | + +## 의존성 + +- [[a00_app_shell_framework]] — `navigateTo()` 라우팅 +- `config_frontend.ts` — `ROUTES` 상수 (A08_SUPPORT) +- [[ui_templates]] — `createButton()`, `createCard()` 공통 컴포넌트 + 다국어 diff --git a/docs/wiki/pages/A06_Login/A06_backend.md b/docs/wiki/pages/A06_Login/A06_backend.md new file mode 100644 index 0000000..9f43254 --- /dev/null +++ b/docs/wiki/pages/A06_Login/A06_backend.md @@ -0,0 +1,70 @@ +--- +status: stable +page_id: A06_Login +related_pages: ["[[A06_Login/A06_frontend]]", "[[A07_Register/A07_backend]]", "[[A09_Security/A09_backend]]", "[[auth_rbac]]"] +last_updated: 2026-07-12 +--- + +# A06_Login — Backend + +세션 쿠키 기반 로그인 + OTP 재인증 + 세션/비밀번호 관리 API. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A06_Login_Router.py` | `A06_Login/A06_Login_Router.py:1-179` | 인증 API 라우터 (prefix `/api/auth`) | +| `A06_Login_Schema.py` | `A06_Login/A06_Login_Schema.py:1-20` | 요청 검증 Pydantic 모델 3종 | + +## API 엔드포인트 + +| 엔드포인트 | 위치 | 역할 | +|---|---|---| +| `POST /api/auth/login/request` | `A06_Login/A06_Login_Router.py:51` | 1차 로그인(이메일+비번). 신규 브라우저/주기 재인증 시 `otp_required` 반환 | +| `POST /api/auth/login/verify` | `A06_Login/A06_Login_Router.py:113` | OTP 검증 후 세션 발급 | +| `GET /api/auth/session` | `A06_Login/A06_Login_Router.py:145` | 현재 세션 사용자 조회 (id/email/name/role/company_id/is_master) | +| `POST /api/auth/logout` | `A06_Login/A06_Login_Router.py:160` | 세션 삭제 + 쿠키 제거 | +| `POST /api/auth/password` | `A06_Login/A06_Login_Router.py:170` | 비밀번호 변경 (현재 비번 검증, 재인증 필요 반환) | + +## 내부 헬퍼 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `_user_agent(request)` | `A06_Login/A06_Login_Router.py:40` | User-Agent 헤더 추출(최대 1000자) | +| `_send_otp(user, purpose, label)` | `A06_Login/A06_Login_Router.py:44` | OTP 생성·해시 저장·메일 발송 | +| `_finish_login(user, agent)` | `A06_Login/A06_Login_Router.py:87` | 세션 생성·쿠키 설정·last_login 갱신·로그인 기록 | + +## 요청 스키마 (Pydantic) + +| 모델 | 위치 | 필드 | +|---|---|---| +| `LoginRequest` | `A06_Login/A06_Login_Schema.py:6` | email(EmailStr), password(8~128자) | +| `OtpVerifyRequest` | `A06_Login/A06_Login_Schema.py:11` | email(EmailStr), otp_code(정규식 `^\d{6}$`) | +| `PasswordChangeRequest` | `A06_Login/A06_Login_Schema.py:16` | current_password, new_password(8~128자), logout_all(기본 True) | + +## 로그인 로직 흐름 + +1. `login/request`: 이메일 조회 → 계정 잠금 확인 → 비밀번호 검증 → 계정 상태 확인(`ACTIVE`/`NO_COMPANY`/`PENDING`만 허용) +2. **OTP 트리거 조건** (둘 중 하나면 OTP 요구): + - 주기적 재인증: `last_email_verified_at`이 `EMAIL_REVERIFY_DAYS` 이전 + - 신규 브라우저: `has_known_browser()` 미확인 +3. `login/verify`: OTP 검증 → 소비 → `last_email_verified_at` 갱신 → `_finish_login` +4. `_finish_login`: 로그인 실패 초기화 → 브라우저 신뢰 등록 → `auth_expires_at = NOW() + 3개월` → 세션 생성 + +## 보안 정책 (실 코드 기준) + +- **비밀번호 실패**: `record_failed_login()` 누적, 5회 이상 & ADMIN_EMAIL 설정 시 보안 경고 메일 발송 +- **계정 잠금**: `account_locked_until`이 미래면 423 반환 +- **로그인 기록**: 모든 시도를 `record_login()`으로 기록(성공/실패 사유 포함) + +## 의존성 (공통 유틸) + +- [[common_util]] — `common_util_auth`(세션/OTP/해시), `common_util_auth_repository`(DB 조회), `common_util_email`(메일 발송) +- 인증/세션/OTP 정책 상세 → [[auth_rbac]] +- `config_system` — `ADMIN_EMAIL`, `EMAIL_REVERIFY_DAYS` + +## ⚠️ 계획서와 실 코드 불일치 + +[[auth_rbac]]는 계획서 기준(OTP 5분·재시도 3회, 세션 4h/12h, 5회 실패 15분 잠금)으로 기술돼 있으나, +실 코드는 `auth_expires_at = NOW() + 3개월` 갱신·브라우저 신뢰 기반 OTP·5회 실패 시 관리자 알림 메일 방식. +정책 상세 검증 필요 — 규칙 6(실 코드 우선)에 따라 auth_rbac 갱신 대상. diff --git a/docs/wiki/pages/A06_Login/A06_frontend.md b/docs/wiki/pages/A06_Login/A06_frontend.md new file mode 100644 index 0000000..67073ed --- /dev/null +++ b/docs/wiki/pages/A06_Login/A06_frontend.md @@ -0,0 +1,85 @@ +--- +status: stable +page_id: A06_Login +related_pages: ["[[A06_Login/A06_backend]]", "[[A07_Register/A07_frontend]]", "[[auth_rbac]]"] +last_updated: 2026-07-12 +--- + +# A06_Login — Frontend + +로그인 화면. 이메일+비밀번호 1차 → 필요 시 OTP 입력으로 전환하는 단일 폼. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A06_Login_UI_Auth_Page.ts` | `A06_Login/A06_Login_UI_Auth_Page.ts:1-80` | 로그인 폼 렌더링 + 제출 로직 | +| `A06_Login_UI_Style.css` | `A06_Login/A06_Login_UI_Style.css:1-52` | 스타일 (theme.css 변수만 사용) | +| `A06_Login_Api_Fetch.ts` | `A06_Login/A06_Login_Api_Fetch.ts:1-57` | 인증 API 클라이언트 (`credentials: "include"`) | + +## 컴포넌트 / 함수 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `renderA06Login(root)` | `A06_Login/A06_Login_UI_Auth_Page.ts:17` | 카드+폼(email/password/otp/submit) 조립 | +| `onA06_Login_Submit_Click(event)` | `A06_Login/A06_Login_UI_Auth_Page.ts:34` | 폼 제출 핸들러(검증→요청→OTP 전환/성공) | + +## API 클라이언트 함수 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `requestLogin(email, password)` | `A06_Login/A06_Login_Api_Fetch.ts:30` | `POST /auth/login/request` | +| `verifyLogin(email, otpCode)` | `A06_Login/A06_Login_Api_Fetch.ts:34` | `POST /auth/login/verify` | +| `fetchSession()` | `A06_Login/A06_Login_Api_Fetch.ts:38` | `GET /auth/session` → boolean(로그인 여부) | +| `fetchSessionUser()` | `A06_Login/A06_Login_Api_Fetch.ts:43` | `GET /auth/session` → SessionUser 객체 | +| `logout()` | `A06_Login/A06_Login_Api_Fetch.ts:54` | `POST /auth/logout` | + +- `SessionUser` 타입: id, email, name?, role?, company_id?, is_master? +- `fetchSession`/`fetchSessionUser`/`logout`은 [[a00_app_shell_framework]]에서도 사용 (공유 자원) + +## 제출 로직 (2단계 폼 전환) + +1. 이메일 유효성 검사 (isBlank/isValidEmail) → 실패 시 필드 에러 +2. OTP 미요구 상태면 비밀번호 필수, OTP 요구 상태면 6자리 숫자 검증 +3. `otpRequired` false → `requestLogin`, true → `verifyLogin` +4. 응답 `status === "otp_required"`: + - otp 필드 노출, password 필드 숨김 + - 제출 버튼 라벨 → `A06_Login_Verify` + - 토스트 안내(`A06_Login_OtpSent`) +5. 로그인 성공 → 토스트 후 `navigateTo(ROUTES.B01_ACCOUNT)` + +## 로컬라이제이션 + +모든 텍스트는 [[ui_templates]]에서 로드. 하드코딩 금지. + +| UI 요소 | 로케일 키 | +|---|---| +| 제목 | `A06_Login_Title` | +| 이메일/비번/OTP 필드 | `A06_Login_Field_Email`, `A06_Login_Field_Password`, `A06_Login_Field_Otp` | +| 제출/인증 버튼 | `A06_Login_Submit`, `A06_Login_Verify` | +| 회원가입 이동 | `A06_Login_ToRegister` | +| 안내/성공 | `A06_Login_OtpSent`, `A06_Login_Success` | +| 오류 | `A06_Login_Error_Email`, `A06_Login_Error_Required`, `A06_Login_Error_Request` | + +## 스타일 (CSS) + +- `.a06-login` — 페이지 래퍼 (중앙 정렬, 상단 정렬) +- `.a06-login__card` — 로그인 카드 (max-width: 400px, surface 배경, border) +- `.a06-login__title` — heading-sm, deep-iris, 중앙 정렬 +- `.a06-login__form` — flex 열 (gap: spacing-16) +- `.a06-login__submit` / `.a06-login__link` — 전체 너비 버튼 + +## 이벤트 핸들러 + +| 함수 | 위치 | 동작 | +|---|---|---| +| `onA06_Login_Submit_Click()` | `A06_Login/A06_Login_UI_Auth_Page.ts:34` | 로그인/OTP 제출 | +| (인라인) 회원가입 버튼 | `A06_Login/A06_Login_UI_Auth_Page.ts:75` | A07_REGISTER로 이동 | + +## 의존성 + +- [[a00_app_shell_framework]] — `navigateTo()` 라우팅 +- `config_frontend.ts` — `ROUTES`, `API_BASE_URL` +- `common_util_validate` — `isBlank`, `isValidEmail` +- [[ui_templates]] — `createButton`, `createInputField`, `showLoadingOverlay`/`hideLoadingOverlay`, `showToast` +- 백엔드 API → [[A06_Login/A06_backend]] diff --git a/docs/wiki/pages/A07_Register/A07_backend.md b/docs/wiki/pages/A07_Register/A07_backend.md new file mode 100644 index 0000000..601045e --- /dev/null +++ b/docs/wiki/pages/A07_Register/A07_backend.md @@ -0,0 +1,57 @@ +--- +status: stable +page_id: A07_Register +related_pages: ["[[A07_Register/A07_frontend]]", "[[A06_Login/A06_backend]]", "[[auth_rbac]]"] +last_updated: 2026-07-12 +--- + +# A07_Register — Backend + +회원가입(2단계: 요청 → OTP 검증) + 회사 검색 API. prefix `/api/auth` ([[A06_Login/A06_backend]]와 공유). + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A07_Register_Router.py` | `A07_Register/A07_Register_Router.py:1-76` | 회원가입/회사검색 API 라우터 | +| `A07_Register_Schema.py` | `A07_Register/A07_Register_Schema.py:1-30` | 요청 검증 Pydantic 모델 2종 | + +## API 엔드포인트 + +| 엔드포인트 | 위치 | 역할 | +|---|---|---| +| `GET /api/auth/companies?q=` | `A07_Register/A07_Register_Router.py:26` | 회사명 검색(1~100자) → id/name 목록 | +| `POST /api/auth/register/request` | `A07_Register/A07_Register_Router.py:31` | 1차 가입 요청(202). OTP 메일 발송, PENDING_EMAIL 계정 생성 | +| `POST /api/auth/register/verify` | `A07_Register/A07_Register_Router.py:56` | OTP 검증 → 가입 완료(NO_COMPANY 상태) | + +## 요청 스키마 (Pydantic) + +| 모델 | 위치 | 필드 | +|---|---|---| +| `RegisterRequest` | `A07_Register/A07_Register_Schema.py:6` | email, password/password_confirm(8~128), name, position?, phone?, terms_version, terms_agreed, privacy_agreed, marketing_agreed | +| `RegisterVerifyRequest` | `A07_Register/A07_Register_Schema.py:27` | email(EmailStr), otp_code(정규식 `^\d{6}$`) | + +- `RegisterRequest.validate_registration` (model_validator): 필수 약관 동의 확인 + 비밀번호 일치 확인 + +## 가입 로직 흐름 + +1. `register/request`: + - 기존 이메일 조회 → `PENDING_EMAIL`이 아니면 409(이미 등록됨) + - `PENDING_EMAIL`(미인증)이면 `refresh_pending_registration()`으로 갱신 + - 신규면 `create_registration()`으로 생성 + - OTP 생성·해시 저장·메일 발송 +2. `register/verify`: + - `PENDING_EMAIL` 상태 확인 → OTP 검증(만료/해시) → 소비 + - `complete_registration()` → 상태 `NO_COMPANY`로 전환 + - **회사 생성/연결은 로그인 후 B01_Dashboard에서 진행** (가입 시점엔 회사 없음) + +## 의존성 (공통 유틸) + +- [[common_util]] — `common_util_auth`(OTP/해시), `common_util_auth_repository`(가입/회사검색 DB), `common_util_email`(메일) +- 사용자 상태 생명주기(PENDING_EMAIL → NO_COMPANY) → [[auth_rbac]] +- 회원 테이블 → [[db_schema/users_auth]] + +## 참고 + +- 회원가입은 회사 없이 완료됨(NO_COMPANY). 회사 검색 API는 프론트 자동완성용이나, + 실제 회사 연결은 B01_Dashboard에서 처리 → [[B01_Dashboard/B01_backend]] diff --git a/docs/wiki/pages/A07_Register/A07_frontend.md b/docs/wiki/pages/A07_Register/A07_frontend.md new file mode 100644 index 0000000..afb5466 --- /dev/null +++ b/docs/wiki/pages/A07_Register/A07_frontend.md @@ -0,0 +1,91 @@ +--- +status: stable +page_id: A07_Register +related_pages: ["[[A07_Register/A07_backend]]", "[[A06_Login/A06_frontend]]", "[[auth_rbac]]"] +last_updated: 2026-07-12 +--- + +# A07_Register — Frontend + +회원가입 화면. 정보 입력 + 약관 아코디언 동의 → OTP 입력으로 전환하는 2단계 폼. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A07_Register_UI_Auth_Page.ts` | `A07_Register/A07_Register_UI_Auth_Page.ts:1-208` | **실사용** 회원가입 UI (약관·OTP·실 API) | +| `A07_Register_UI_Page.ts` | `A07_Register/A07_Register_UI_Page.ts:1-142` | ⚠️ 구버전 잔재 (미사용, 아래 참고) | +| `A07_Register_UI_Style.css` | `A07_Register/A07_Register_UI_Style.css:1-103` | 스타일 (theme.css 변수만 사용) | +| `A07_Register_Api_Fetch.ts` | `A07_Register/A07_Register_Api_Fetch.ts:1-47` | 회원가입/회사검색 API 클라이언트 | + +> ⚠️ **라우터는 `A07_Register_UI_Auth_Page`만 사용** (router.ts:30 확인). `A07_Register_UI_Page.ts`는 +> 회사명+이름+이메일+비번만 받는 단순 폼이며 백엔드 미연동(TODO 주석, `navigateTo`만) — 구버전 잔재로 판단. 정리 권장. + +## 컴포넌트 / 함수 (UI_Auth_Page — 실사용) + +| 함수 | 위치 | 역할 | +|---|---|---| +| `renderA07Register(root)` | `A07_Register/A07_Register_UI_Auth_Page.ts:68` | 카드+폼 조립, 약관 텍스트 비동기 로드 후 렌더 | +| `onA07_Register_Submit_Click(event)` | `A07_Register/A07_Register_UI_Auth_Page.ts:146` | 제출 핸들러(검증→가입요청→OTP 전환→검증) | +| `checkboxWithAccordion(label, text)` | `A07_Register/A07_Register_UI_Auth_Page.ts:22` | 체크박스+펼침 상세(약관 본문) 컴포넌트 | +| `loadAgreementText(filename)` | `A07_Register/A07_Register_UI_Auth_Page.ts:58` | `resources/legal/*.txt` 약관 파일 fetch | + +## API 클라이언트 함수 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `requestRegistration(payload)` | `A07_Register/A07_Register_Api_Fetch.ts:28` | `POST /auth/register/request` | +| `verifyRegistration(email, otpCode)` | `A07_Register/A07_Register_Api_Fetch.ts:32` | `POST /auth/register/verify` | +| `searchCompanies(query)` | `A07_Register/A07_Register_Api_Fetch.ts:39` | `GET /auth/companies?q=` → id/name 목록 | + +- `RegisterPayload` 타입: email, password, password_confirm, name, position, phone, terms_version, terms_agreed, privacy_agreed, marketing_agreed + +## 제출 로직 (2단계 폼 전환) + +1. **입력 검증**: 이름/이메일/비번/비번확인 필수, 이메일 형식, 비번 8자 이상, 비번 일치, 필수 약관(terms/privacy) 체크 +2. `requestRegistration()` 호출 (`terms_version: "1.0"` 고정, terms_agreed/privacy_agreed true) +3. 성공 시 `verifyStep = true`: 입력 필드 숨기고 OTP 필드 노출, 버튼 라벨 → `A07_Register_Verify` +4. OTP 제출 → `verifyRegistration()` → 성공 토스트 → `navigateTo(ROUTES.A06_LOGIN)` + +## 약관 동의 (아코디언) + +- `checkboxWithAccordion`으로 이용약관/개인정보/마케팅 3종 생성 +- 약관 본문은 `resources/legal/{terms_of_service,privacy_policy,marketing_consent}.txt`에서 fetch +- 마케팅은 선택(marketing_agreed), 이용약관·개인정보는 필수 + +## 로컬라이제이션 + +모든 텍스트는 [[ui_templates]]에서 로드. 하드코딩 금지. + +| UI 요소 | 로케일 키 | +|---|---| +| 제목 | `A07_Register_Title` | +| 필드 | `A07_Register_Field_Name`, `_Position`, `_Email`, `_Phone`, `_Password`, `_PasswordConfirm`, `_Otp` | +| 약관 | `A07_Register_Terms`, `_Privacy`, `_Marketing` | +| 제출/인증 | `A07_Register_Submit`, `A07_Register_Verify` | +| 안내/성공 | `A07_Register_OtpSent`, `A07_Register_Success` | +| 오류 | `A07_Register_Error_Required`, `_Email`, `_Password`, `_PasswordMismatch`, `_Terms`, `_Request` | +| 로그인 이동 | `A07_Register_ToLogin` | + +## 스타일 (CSS) + +- `.a07-register__card` — 카드 (max-width: 420px) +- `.a07-register__agreement` — 약관 컨테이너(border, overflow hidden) +- `.a07-register__agreement-summary` — 체크박스+라벨 헤더(클릭 시 상세 토글) +- `.a07-register__agreement-details` / `-content` — 펼침 약관 본문(max-height 200px, pre-wrap) + +## 이벤트 핸들러 + +| 함수 | 위치 | 동작 | +|---|---|---| +| `onA07_Register_Submit_Click()` | `A07_Register/A07_Register_UI_Auth_Page.ts:146` | 가입/OTP 제출 | +| (인라인) 로그인 버튼 | `A07_Register/A07_Register_UI_Auth_Page.ts:201` | A06_LOGIN으로 이동 | +| (인라인) 약관 요약 클릭 | `A07_Register/A07_Register_UI_Auth_Page.ts:47` | 상세 아코디언 토글 | + +## 의존성 + +- [[a00_app_shell_framework]] — `navigateTo()` 라우팅 +- `config_frontend.ts` — `ROUTES`, `API_BASE_URL` +- `common_util_validate` — `isBlank`, `isValidEmail`, `hasMinLength` +- [[ui_templates]] — `createButton`, `createInputField`, `showLoadingOverlay`/`hideLoadingOverlay`, `showToast` +- 백엔드 API → [[A07_Register/A07_backend]] diff --git a/docs/wiki/pages/A08_Support/A08_backend.md b/docs/wiki/pages/A08_Support/A08_backend.md new file mode 100644 index 0000000..762fb76 --- /dev/null +++ b/docs/wiki/pages/A08_Support/A08_backend.md @@ -0,0 +1,67 @@ +--- +status: stable +page_id: A08_Support +related_pages: ["[[A08_Support/A08_frontend]]", "[[A06_Login/A06_backend]]", "[[db_schema/logs_monitoring]]"] +last_updated: 2026-07-12 +--- + +# A08_Support — Backend + +기술지원 문의 접수 API. `support_requests` 테이블 저장 + 관리자 알림 메일. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A08_Support_Router.py` | `A08_Support/A08_Support_Router.py:1-68` | 문의 접수 API (prefix `/api/a08`) | +| `A08_Support_Schema.py` | `A08_Support/A08_Support_Schema.py:1-13` | 문의 요청 검증 Pydantic 모델 | + +## API 엔드포인트 + +| 엔드포인트 | 위치 | 역할 | +|---|---|---| +| `POST /api/a08/support` | `A08_Support/A08_Support_Router.py:27` | 문의 접수. DB 저장 + ADMIN_EMAIL로 알림 메일 | + +## 내부 헬퍼 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `_get_company_name(company_id)` | `A08_Support/A08_Support_Router.py:16` | company_id로 회사명 조회 (없으면 None) | + +## 요청 스키마 (Pydantic) + +| 모델 | 위치 | 필드 | +|---|---|---| +| `SupportRequestPayload` | `A08_Support/A08_Support_Schema.py:6` | name(1~255), email(EmailStr), phone?(≤30), subject(1~255), message(1~5000) | + +## 접수 로직 + +1. `get_optional_session()`으로 로그인 여부 확인 (비로그인 허용) +2. 로그인 상태면 세션의 `company_id` → `_get_company_name()`으로 회사명 조회, 비로그인이면 None +3. `support_requests` INSERT (아래 컬럼) +4. ADMIN_EMAIL 설정 시 관리자에게 문의 알림 메일 발송 + +## DB 저장 컬럼 (실 코드 INSERT 기준) + +`support_requests`에 INSERT하는 컬럼: +`company_id, company_name, user_name, user_email, user_phone, subject, message` + +→ 테이블 정의 → [[db_schema/logs_monitoring]] + +## 특징 + +- **비로그인도 문의 가능** (`get_optional_session`): 세션 없으면 회사 정보만 None으로 저장 +- 로그인 상태면 회사 정보 자동 연결 + +## 의존성 (공통 유틸) + +- [[common_util]] — `common_util_auth`(`get_optional_session`), `common_util_email`(`send_email_background`), `common_util_email_templates`(`support_request_email`) +- `config_system` — `ADMIN_EMAIL` +- DB → [[db_schema/logs_monitoring]] + +## ⚠️ DB 스키마 불일치 (확인 필요) + +[[db_schema/logs_monitoring]]의 `support_requests` 컬럼은 계획서 기준 +(`user_id, title, priority, status`)인데, 실 코드 INSERT는 +`company_id, company_name, user_name, user_email, user_phone, subject, message`. +컬럼명이 다름 — 실 DB 스키마 대조 필요 (규칙6: 실 코드 우선). logs_monitoring 갱신 대상. diff --git a/docs/wiki/pages/A08_Support/A08_frontend.md b/docs/wiki/pages/A08_Support/A08_frontend.md new file mode 100644 index 0000000..72f3493 --- /dev/null +++ b/docs/wiki/pages/A08_Support/A08_frontend.md @@ -0,0 +1,76 @@ +--- +status: stable +page_id: A08_Support +related_pages: ["[[A08_Support/A08_backend]]", "[[a00_app_shell_framework]]", "[[ui_templates]]"] +last_updated: 2026-07-12 +--- + +# A08_Support — Frontend + +기술지원 문의 폼. 이름·이메일·연락처·제목·문의내용(textarea) 입력 후 제출. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A08_Support_UI_Page.ts` | `A08_Support/A08_Support_UI_Page.ts:1-217` | 문의 폼 렌더링 + 제출 로직 | +| `A08_Support_UI_Style.css` | `A08_Support/A08_Support_UI_Style.css:1-64` | 스타일 (theme.css 변수만 사용) | + +## 컴포넌트 / 함수 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `renderA08Support(root)` | `A08_Support/A08_Support_UI_Page.ts:69` | 카드+폼 조립, 세션 정보 자동 채움 | +| `onA08_Support_Submit_Click(event)` | `A08_Support/A08_Support_UI_Page.ts:133` | 제출 핸들러(검증→fetch POST) | +| `createTextAreaField(label, placeholder)` | `A08_Support/A08_Support_UI_Page.ts:32` | 여러 줄 textarea 필드(에러 슬롯 포함) 생성 | + +## 제출 로직 + +1. 필수값 검사(name/email/subject/message), 이메일 형식 검사 +2. `fetch("/api/a08/support", POST)` 직접 호출 (별도 Api_Fetch 파일 없음) +3. 성공: 폼 리셋 + 성공 메시지(`A08_Support_Success`) 표시 +4. 실패: nameField에 오류 메시지 표시 + +## 세션 자동 채움 + +- 렌더 후 백그라운드에서 `fetchSessionUser()`([[A06_Login/A06_frontend]]) 호출 +- 로그인 상태면 name/email 필드 자동 입력 (렌더링 지연 없음) + +## 로컬라이제이션 + +모든 텍스트는 [[ui_templates]]에서 로드. 하드코딩 금지. + +| UI 요소 | 로케일 키 | +|---|---| +| 제목/부제 | `A08_Support_Title`, `A08_Support_Subtitle` | +| 필드 | `A08_Support_Field_Name`, `_Email`, `_Phone`, `_Subject`, `_Message` (+각 Placeholder) | +| 제출 | `A08_Support_Submit` | +| 성공 | `A08_Support_Success` | +| 오류 | `A08_Support_Error_Required`, `A08_Support_Error_Email` | + +## 스타일 (CSS) + +- `.a08-support__card` — 카드 (max-width: 520px) +- `.a08-support__success` — 성공 메시지(success 색, mist-violet 배경), 기본 hidden +- `.a08-support__form` — flex 열 (gap: spacing-16) +- `.a08-support__textarea` — resize vertical, min-height 120px +- `.a08-support__submit` — 전체 너비 버튼 + +## 이벤트 핸들러 + +| 함수 | 위치 | 동작 | +|---|---|---| +| `onA08_Support_Submit_Click()` | `A08_Support/A08_Support_UI_Page.ts:133` | 문의 검증·제출 | + +## 의존성 + +- `config_frontend.ts` — (직접 `/api/a08/support` 상대경로 fetch) +- `common_util_validate` — `isBlank`, `isValidEmail` +- [[A06_Login/A06_frontend]] — `fetchSessionUser` (세션 자동 채움) +- [[ui_templates]] — `createButton`, `createInputField` (textarea는 자체 구현) +- 백엔드 API → [[A08_Support/A08_backend]] + +## 참고 + +- 문의 폼은 로그인/비로그인 모두 사용 가능 (세션 있으면 name/email 자동 입력) +- textarea는 공통 컴포넌트에 없어 `createTextAreaField`로 자체 구현 (`.ui-field`/`.ui-input` 스타일 상속) diff --git a/docs/wiki/pages/A09_Security/A09_backend.md b/docs/wiki/pages/A09_Security/A09_backend.md new file mode 100644 index 0000000..5fc36c7 --- /dev/null +++ b/docs/wiki/pages/A09_Security/A09_backend.md @@ -0,0 +1,77 @@ +--- +status: stable +page_id: A09_Security +related_pages: ["[[A09_Security/A09_frontend]]", "[[A06_Login/A06_backend]]", "[[A07_Register/A07_backend]]", "[[auth_rbac]]"] +last_updated: 2026-07-12 +--- + +# A09_Security — Backend + +마스터(회사관리자)·시스템관리자 보안/조직 관리 API + 활동 로그 기록. prefix `/api/security`. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A09_Security_Router.py` | `A09_Security/A09_Security_Router.py:1-123` | 마스터/시스템관리자/활동로그 API | +| `A09_Security_Schema.py` | `A09_Security/A09_Security_Schema.py:1-25` | 요청 검증 Pydantic 모델 3종 | + +## API 엔드포인트 + +### 마스터(회사 관리자) 전용 — `require_master` + +| 엔드포인트 | 위치 | 역할 | +|---|---|---| +| `GET /api/security/master/dashboard` | `A09_Security/A09_Security_Router.py:28` | 마스터 대시보드(회사 기준) | +| `GET /api/security/master/members` | `A09_Security/A09_Security_Router.py:33` | 회사 팀원 목록 | +| `GET /api/security/master/join-requests` | `A09_Security/A09_Security_Router.py:38` | 가입 요청 목록 | +| `POST /api/security/master/join-requests/{id}/decision` | `A09_Security/A09_Security_Router.py:43` | 가입 승인/거부 + 결과 메일 발송 | +| `POST /api/security/master/members/{id}/remove` | `A09_Security/A09_Security_Router.py:59` | 팀원 비활성화(내보내기) | + +### 시스템 관리자 전용 — `require_system_admin` + +| 엔드포인트 | 위치 | 역할 | +|---|---|---| +| `GET /api/security/admin/dashboard` | `A09_Security/A09_Security_Router.py:86` | 시스템 대시보드 + psutil 리소스(cpu/memory/disk/process) | +| `GET /api/security/admin/{collection}` | `A09_Security/A09_Security_Router.py:101` | 컬렉션 목록(companies/users/support) | +| `PATCH /api/security/admin/{entity}/{id}/status` | `A09_Security/A09_Security_Router.py:110` | 엔티티 상태 변경(company/user/support) | + +### 인증 사용자 공통 — `verify_session` + +| 엔드포인트 | 위치 | 역할 | +|---|---|---| +| `POST /api/security/activity` | `A09_Security/A09_Security_Router.py:66` | 활동 로그 기록(202), `activity_logs` INSERT | + +## 요청 스키마 (Pydantic) + +| 모델 | 위치 | 필드 | +|---|---|---| +| `JoinDecisionRequest` | `A09_Security/A09_Security_Schema.py:8` | approved(bool), comment?(≤1000) | +| `AdminStatusRequest` | `A09_Security/A09_Security_Schema.py:13` | status(3~20), reason(1~500) | +| `ActivityLogRequest` | `A09_Security/A09_Security_Schema.py:18` | action_type(Literal 5종), resource_id?, status(SUCCESS/FAILURE), details(dict) | + +- `action_type` Literal: FILE_UPLOAD, FILE_DOWNLOAD, PROJECT_SAVE, DATA_PROCESS, PAGE_VIEW + +## DB 저장 (activity_logs) + +`POST /activity`가 INSERT하는 컬럼: `user_id, action_type, resource_id, status, details(JSON)` +→ 테이블 정의 → [[db_schema/logs_monitoring]] + +## 권한 헬퍼 + +- `require_master` — 회사 마스터(is_master) 권한 +- `require_system_admin` — SYSTEM_ADMIN 역할 +- `verify_session` — 로그인 세션 +- 권한 체계 상세 → [[auth_rbac]] + +## 의존성 (공통 유틸) + +- [[common_util]] — `common_util_auth`(권한 데코레이터), `common_util_auth_repository`(마스터/관리자 조회·처리), `common_util_email`(가입 결과 메일) +- 외부 라이브러리: `psutil`(관리자 대시보드 리소스 계측) → [[dependencies]] +- DB → [[db_schema/logs_monitoring]](activity_logs), [[db_schema/users_auth]](join_requests/companies) + +## 참고 + +- 이 백엔드 API는 마스터/시스템관리자용이나, **프론트(`A09_Security_UI_Page.ts`)는 약관 열람만 하고 이 API를 사용하지 않음**. + API 클라이언트(`A09_Security_Api_Fetch.ts`)는 정의만 되고 미연동 상태 → [[A09_Security/A09_frontend]] 참고 +- B01_Dashboard의 관리자 기능과 역할이 겹칠 수 있음 (마스터 대시보드/멤버관리) — 향후 연동처 확인 필요 diff --git a/docs/wiki/pages/A09_Security/A09_frontend.md b/docs/wiki/pages/A09_Security/A09_frontend.md new file mode 100644 index 0000000..80f20f1 --- /dev/null +++ b/docs/wiki/pages/A09_Security/A09_frontend.md @@ -0,0 +1,78 @@ +--- +status: stable +page_id: A09_Security +related_pages: ["[[A09_Security/A09_backend]]", "[[A06_Login/A06_frontend]]", "[[auth_rbac]]"] +last_updated: 2026-07-12 +--- + +# A09_Security — Frontend + +보안·약관 열람 페이지. 이용약관/개인정보/세션 보안정책 텍스트를 버전과 함께 표시. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `A09_Security_UI_Page.ts` | `A09_Security/A09_Security_UI_Page.ts:1-30` | **실사용** 약관 열람 페이지 렌더링 | +| `A09_Security_Terms.ts` | `A09_Security/A09_Security_Terms.ts:1-16` | 약관 텍스트 데이터(한/영), 버전 상수 | +| `A09_Security_UI_Style.css` | `A09_Security/A09_Security_UI_Style.css:1-14` | 스타일 (theme.css 변수만 사용) | +| `A09_Security_Api_Fetch.ts` | `A09_Security/A09_Security_Api_Fetch.ts:1-61` | ⚠️ API 클라이언트 (정의만, **미사용** — 아래 참고) | + +> ⚠️ **프론트/백엔드 기능 불일치**: `A09_Security_UI_Page.ts`는 약관 텍스트 열람만 하며 +> `A09_Security_Api_Fetch.ts`를 import하지 않는다. API 클라이언트(마스터/관리자 8함수)는 정의만 되고 +> 어디서도 사용되지 않음(grep 확인). 백엔드 API(`/api/security`)는 완비돼 있으나 프론트 연동 미완. + +## 컴포넌트 / 함수 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `renderA09Security(root)` | `A09_Security/A09_Security_UI_Page.ts:7` | 제목+버전+3개 약관 섹션 렌더 | + +## 약관 데이터 (A09_Security_Terms.ts) + +| 항목 | 위치 | 내용 | +|---|---|---| +| `SECURITY_TERMS_VERSION` | `A09_Security/A09_Security_Terms.ts:1` | 약관 버전 상수 `"1.0"` | +| `securityTerms.terms` | `A09_Security/A09_Security_Terms.ts:4` | 이용약관(한/영) | +| `securityTerms.privacy` | `A09_Security/A09_Security_Terms.ts:8` | 개인정보(한/영, "IP 미수집" 명시) | +| `securityTerms.security` | `A09_Security/A09_Security_Terms.ts:12` | 세션 보안정책(한/영) | + +## API 클라이언트 함수 (⚠️ 미사용, 정의만) + +| 함수 | 위치 | 대응 API | +|---|---|---| +| `getMasterDashboard()` | `A09_Security/A09_Security_Api_Fetch.ts:14` | `GET /security/master/dashboard` | +| `getMembers()` | `A09_Security/A09_Security_Api_Fetch.ts:18` | `GET /security/master/members` | +| `getJoinRequests()` | `A09_Security/A09_Security_Api_Fetch.ts:22` | `GET /security/master/join-requests` | +| `decideJoinRequest(id, approved, comment?)` | `A09_Security/A09_Security_Api_Fetch.ts:26` | `POST .../join-requests/{id}/decision` | +| `removeMember(userId)` | `A09_Security/A09_Security_Api_Fetch.ts:37` | `POST .../members/{id}/remove` | +| `getAdminDashboard()` | `A09_Security/A09_Security_Api_Fetch.ts:41` | `GET /security/admin/dashboard` | +| `getAdminCollection(collection)` | `A09_Security/A09_Security_Api_Fetch.ts:45` | `GET /security/admin/{collection}` | +| `updateAdminStatus(entity, id, status, reason)` | `A09_Security/A09_Security_Api_Fetch.ts:51` | `PATCH /security/admin/{entity}/{id}/status` | + +## 로컬라이제이션 + +모든 텍스트는 [[ui_templates]]에서 로드. 하드코딩 금지. + +| UI 요소 | 로케일 키 | +|---|---| +| 제목/버전 | `A09_Security_Title`, `A09_Security_Version` | +| 섹션 제목 | `A09_Security_Terms`, `A09_Security_Privacy`, `A09_Security_Policy` | + +- 약관 본문은 로케일이 아닌 `A09_Security_Terms.ts`에 한/영 배열로 별도 관리(`[currentLanguageIndex]`로 선택) + +## 스타일 (CSS) + +- `.a09-security` — 문서 컨테이너(max-width 800px, surface 배경, border) +- `.a09-security section` — 섹션 간격(margin-top: spacing-32) + +## ⚠️ 약관 텍스트와 실 코드 불일치 + +`securityTerms.security`는 "세션 12시간 또는 4시간 비활동 후 만료"로 안내하나, +A06 실 코드는 `auth_expires_at = NOW() + 3개월` 방식 → [[A06_Login/A06_backend]] 참고. +약관 텍스트도 [[auth_rbac]] 계획서 기준으로 작성됨 (실 정책 검증 후 갱신 필요). + +## 의존성 + +- [[ui_templates]] — `ui_locales`, `currentLanguageIndex` (다국어) +- 백엔드 API(미연동) → [[A09_Security/A09_backend]] diff --git a/docs/wiki/pages/B01_Dashboard/B01_api.md b/docs/wiki/pages/B01_Dashboard/B01_api.md new file mode 100644 index 0000000..ba44775 --- /dev/null +++ b/docs/wiki/pages/B01_Dashboard/B01_api.md @@ -0,0 +1,59 @@ +--- +type: page-api +status: stable +page_id: B01_Dashboard +related_pages: ["[[B01_Dashboard/B01_frontend]]", "[[B01_Dashboard/B01_backend]]", "[[B01_Dashboard/B01_db]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B01_Dashboard_Router.py 실 코드 직접 확인 (2026-07-12) +--- + +# B01_Dashboard — API + +기본 prefix: `/api/dashboard` (`B01_Dashboard_Router.py:57`). 공통 인증·오류 형식은 [[../../concepts/auth_rbac]], [[../../concepts/api_common]] 참조. + +## 사용자·회사 +| 항목 | 위치 | 역할 | +|---|---|---| +| `GET /me` | `B01_Dashboard_Router.py:101` | 로그인 사용자 대시보드 정보 조회 | +| `PATCH /me` | `B01_Dashboard_Router.py:109` | 내 기본정보 수정 | +| `GET /user/projects` | `B01_Dashboard_Router.py:118` | 내 프로젝트와 workflow 상태 조회 | +| `GET /user/company` | `B01_Dashboard_Router.py:123` | 소속 회사 조회 | +| `GET /user/companies` | `B01_Dashboard_Router.py:128` | 가입 대상 회사 검색 | +| `POST /user/company/create` | `B01_Dashboard_Router.py:137` | 회사 생성 후 생성자 연결 | +| `POST /user/company/join` | `B01_Dashboard_Router.py:146` | 회사 가입 신청 | + +## 회사 관리자 +| 항목 | 위치 | 역할 | +|---|---|---| +| `GET /admin/members` | `B01_Dashboard_Router.py:155` | 회사 팀원 목록 | +| `POST /admin/members` | `B01_Dashboard_Router.py:163` | 이메일로 팀원 추가 | +| `DELETE /admin/members/{user_id}` | `B01_Dashboard_Router.py:174` | 팀원 회사 연결 해제 | +| `GET /admin/join-requests` | `B01_Dashboard_Router.py:183` | 회사 가입 신청 목록 | +| `PATCH /admin/join-requests/{request_id}` | `B01_Dashboard_Router.py:188` | 가입 신청 승인·거절 | +| `GET /admin/projects` | `B01_Dashboard_Router.py:206` | 회사 프로젝트 목록 | + +## 프로젝트·자동화 +| 항목 | 위치 | 역할 | +|---|---|---| +| `PUT /projects/{project_id}` | `B01_Dashboard_Router.py:214` | 프로젝트 기본정보 수정 | +| `DELETE /projects/{project_id}` | `B01_Dashboard_Router.py:230` | SYSTEM_ADMIN 프로젝트 소프트 삭제 | +| `GET /projects/{project_id}/automations` | `B01_Dashboard_Router.py:366` | 자동화 목록; USER 차단 | +| `POST /projects/{project_id}/automations` | `B01_Dashboard_Router.py:379` | 자동화 생성 | +| `PUT /automations/{automation_id}` | `B01_Dashboard_Router.py:396` | 자동화 수정 | +| `DELETE /automations/{automation_id}` | `B01_Dashboard_Router.py:414` | 자동화 삭제 | +| `POST /automations/{automation_id}/execute` | `B01_Dashboard_Router.py:429` | 자동화 실행시각 기록 | + +## 시스템 관리자 +| 항목 | 위치 | 역할 | +|---|---|---| +| `GET /admin/companies` | `B01_Dashboard_Router.py:255` | 전체 회사 조회 | +| `POST /admin/companies` | `B01_Dashboard_Router.py:261` | 시스템 관리자 회사 생성 | +| `GET /admin/users` | `B01_Dashboard_Router.py:270` | 전체 사용자 조회 | +| `PATCH /admin/users/{user_id}/role` | `B01_Dashboard_Router.py:276` | 역할 변경과 마지막 ADMIN 보호 | +| `PUT /admin/users/{user_id}` | `B01_Dashboard_Router.py:294` | 사용자 관리정보 수정 | +| `PATCH /admin/users/{user_id}/company` | `B01_Dashboard_Router.py:313` | 사용자 회사 배정·해제 | +| `GET /admin/join-requests-all` | `B01_Dashboard_Router.py:325` | 전체 가입 신청 조회 | +| `PATCH /admin/join-requests/{request_id}/approve` | `B01_Dashboard_Router.py:331` | 시스템 관리자 가입 승인 | +| `GET /admin/audit-logs` | `B01_Dashboard_Router.py:341` | 시스템 감사 로그 페이지 조회 | +| `GET /admin/resources` | `B01_Dashboard_Router.py:351` | 1~90일 리소스 통계 조회 | +| `GET /admin/projects-all` | `B01_Dashboard_Router.py:360` | 전체 프로젝트 조회 | diff --git a/docs/wiki/pages/B01_Dashboard/B01_backend.md b/docs/wiki/pages/B01_Dashboard/B01_backend.md new file mode 100644 index 0000000..11ea4d5 --- /dev/null +++ b/docs/wiki/pages/B01_Dashboard/B01_backend.md @@ -0,0 +1,58 @@ +--- +type: page-backend +status: stable +page_id: B01_Dashboard +related_pages: ["[[B01_Dashboard/B01_frontend]]", "[[B01_Dashboard/B01_api]]", "[[B01_Dashboard/B01_db]]", "[[B01_Dashboard/B01_dependencies]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B01_Dashboard 실 코드 직접 확인 (2026-07-12) +--- + +# B01_Dashboard — Backend + +## 라우터 권한 헬퍼 +| 항목 | 위치 | 역할 | +|---|---|---| +| `require_company_admin()` | `B01_Dashboard_Router.py:60` | ADMIN 또는 SYSTEM_ADMIN 의존성 검사 | +| `_require_company_id()` | `B01_Dashboard_Router.py:68` | 세션 회사 ID 필수 검사 | +| `_same_company()` | `B01_Dashboard_Router.py:75` | 요청자와 대상의 회사 일치 검사 | +| `_can_edit_project()` | `B01_Dashboard_Router.py:79` | 역할·회사 기준 프로젝트 수정 검사 | +| `_can_manage_automation()` | `B01_Dashboard_Router.py:87` | 자동화 관리 권한 검사 | +| `_can_edit_user()` | `B01_Dashboard_Router.py:93` | 사용자 수정 범위 검사 | + +상세 권한 규칙은 [[../../concepts/auth_rbac]]에서 1차 정의한다. + +## 저장소 함수 +| 항목 | 위치 | 역할 | +| ----------------------------------------------------------------------------- | ----------------------------------------- | -------------------------- | +| `get_dashboard_me()` / `update_user_profile()` | `B01_Dashboard_Repository.py:47,65` | 내 정보 조회·수정 | +| `get_workflow_states_for_projects()` | `B01_Dashboard_Repository.py:83` | 여러 프로젝트의 workflow 상태 배치 조회 | +| `list_user_projects()` / `list_company_projects()` / `list_all_projects()` | `B01_Dashboard_Repository.py:144,165,188` | 역할 범위별 프로젝트 목록 조회 | +| `get_project()` / `update_project()` / `soft_delete_project()` | `B01_Dashboard_Repository.py:210,222,253` | 프로젝트 조회·수정·소프트 삭제 | +| `get_user_company()` / `search_companies()` | `B01_Dashboard_Repository.py:273,293` | 소속 회사와 회사 검색 | +| `create_company()` / `create_system_company()` | `B01_Dashboard_Repository.py:307,347` | 사용자·시스템 관리자 회사 생성 | +| `join_company()` | `B01_Dashboard_Repository.py:378` | 회사 가입 신청과 사용자 상태 전이 | +| `list_company_members()` / `add_company_member()` / `remove_company_member()` | `B01_Dashboard_Repository.py:401,416,439` | 회사 팀원 관리 | +| `list_join_requests()` / `process_join_request()` | `B01_Dashboard_Repository.py:453,471` | 가입 신청 조회·승인·거절 | +| `list_all_companies()` / `list_all_users()` | `B01_Dashboard_Repository.py:507,522` | 시스템 관리자 전체 목록 | +| `change_user_role()` / `get_user_admin_target()` / `update_admin_user()` | `B01_Dashboard_Repository.py:538,547,562` | 사용자 역할·관리정보 변경 | +| `count_company_admins()` / `assign_user_company()` | `B01_Dashboard_Repository.py:584,596` | 마지막 관리자 보호와 회사 배정 | +| `list_audit_logs()` / `get_system_resources()` | `B01_Dashboard_Repository.py:609,624` | 감사 로그와 리소스 통계 조회 | +| `list_project_automations()` / `create_project_automation()` | `B01_Dashboard_Repository.py:682,696` | 자동화 목록·생성 | +| `get_project_automation()` / `update_project_automation()` | `B01_Dashboard_Repository.py:722,735` | 자동화 단건 조회·수정 | +| `delete_project_automation()` / `mark_project_automation_executed()` | `B01_Dashboard_Repository.py:758,779` | 자동화 삭제·실행시각 기록 | + +## 요청 스키마 +| 항목 | 위치 | 역할 | +|---|---|---| +| `UpdateUserRequest` | `B01_Dashboard_Schema.py:6` | 내 정보 수정 검증 | +| `CreateCompanyRequest` | `B01_Dashboard_Schema.py:13` | 회사 생성 검증 | +| `JoinCompanyRequest` / `AddMemberRequest` | `B01_Dashboard_Schema.py:20,24` | 회사 가입·팀원 추가 검증 | +| `ProcessJoinRequest` / `ChangeUserRoleRequest` | `B01_Dashboard_Schema.py:28,33` | 가입 처리·역할 변경 검증 | +| `AssignCompanyRequest` / `UpdateProjectRequest` | `B01_Dashboard_Schema.py:37,41` | 회사 배정·프로젝트 수정 검증 | +| `AdminUpdateUserRequest` / `AutomationRequest` | `B01_Dashboard_Schema.py:51,57` | 관리자 사용자 수정·자동화 검증 | + +## 기술부채 +| 항목 | 위치 | 역할 | +|---|---|---| +| 레거시 상태 추론 | `B01_Dashboard_Repository.py:20` | `_stage_from_status()`가 `project_workflow_stages` 미조회 시 보조값 생성 | +| 700줄 초과 | `B01_Dashboard_Repository.py:1` | 790줄로 프로젝트 단일 파일 제한 초과; 도메인별 저장소 분할 검토 필요 | diff --git a/docs/wiki/pages/B01_Dashboard/B01_db.md b/docs/wiki/pages/B01_Dashboard/B01_db.md new file mode 100644 index 0000000..017f832 --- /dev/null +++ b/docs/wiki/pages/B01_Dashboard/B01_db.md @@ -0,0 +1,32 @@ +--- +type: page-db +status: stable +page_id: B01_Dashboard +related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B01_Dashboard/B01_api]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B01_Dashboard_Repository.py 실 코드 직접 확인 (2026-07-12) +--- + +# B01_Dashboard — DB 사용 관계 + +공유 테이블의 정의는 concepts에만 둔다. 이 문서는 B01의 사용 목적과 실제 접근 위치만 기록한다. + +| 항목 | 위치 | 역할 | +|---|---|---| +| `users` | `B01_Dashboard_Repository.py:47` | 내 정보·팀원·전체 사용자·역할·회사 연결 관리 → [[db_schema/users_auth]] | +| `companies` | `B01_Dashboard_Repository.py:273` | 소속·검색·생성·전체 회사 조회 → [[db_schema/users_auth]] | +| `join_requests` | `B01_Dashboard_Repository.py:378` | 회사 가입 신청·승인·거절 → [[db_schema/users_auth]] | +| `projects` | `B01_Dashboard_Repository.py:144` | 역할 범위별 목록·수정·소프트 삭제 → [[db_schema/projects]] | +| `project_workflow_stages` | `B01_Dashboard_Repository.py:83` | 프로젝트 목록의 7단계 상태 배치 조회 → [[workflow_state]] | +| `project_automations` | `B01_Dashboard_Repository.py:682` | 자동화 CRUD와 실행시각 기록 → [[db_schema/projects]] | +| `system_audit_logs` | `B01_Dashboard_Repository.py:245` | 프로젝트·회사·자동화 관리 행위 기록·조회 → [[db_schema/logs_monitoring]] | +| `system_resources` | `B01_Dashboard_Repository.py:624` | 기간별 CPU·메모리·디스크 시계열 조회 → [[db_schema/logs_monitoring]] | + +## 트랜잭션 경계 +| 항목 | 위치 | 역할 | +|---|---|---| +| 회사 생성 | `B01_Dashboard_Repository.py:307` | 회사 INSERT, 사용자 연결, 감사 로그를 한 트랜잭션으로 처리 | +| 가입 신청 처리 | `B01_Dashboard_Repository.py:471` | `FOR UPDATE`로 신청 행 잠금 후 신청·사용자 상태 동시 변경 | +| 프로젝트 수정·삭제 | `B01_Dashboard_Repository.py:222,253` | 프로젝트 변경과 감사 로그를 같은 트랜잭션으로 처리 | + +> B01 코드가 직접 기록하는 감사 테이블은 `audit_logs`가 아니라 `system_audit_logs`다. diff --git a/docs/wiki/pages/B01_Dashboard/B01_dependencies.md b/docs/wiki/pages/B01_Dashboard/B01_dependencies.md new file mode 100644 index 0000000..d267309 --- /dev/null +++ b/docs/wiki/pages/B01_Dashboard/B01_dependencies.md @@ -0,0 +1,29 @@ +--- +type: page-dependencies +status: stable +page_id: B01_Dashboard +related_pages: ["[[B01_Dashboard/B01_frontend]]", "[[B01_Dashboard/B01_backend]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B01_Dashboard import 구문 직접 확인 (2026-07-12) +--- + +# B01_Dashboard — Dependencies + +외부 라이브러리의 1차 정의는 [[../../concepts/dependencies]]에 둔다. + +| 항목 | 위치 | 역할 | +|---|---|---| +| FastAPI | `B01_Dashboard_Router.py:5` | APIRouter·Depends·HTTPException 제공 | +| Pydantic | `B01_Dashboard_Schema.py:3` | 요청 모델 타입·범위 검증 | +| aiomysql | `B01_Dashboard_Repository.py:10` | MariaDB 비동기 Raw SQL 접근 | +| psutil | `B01_Dashboard_Repository.py:11` | 현재 CPU·메모리 사용률 측정 | +| `shutil` | `B01_Dashboard_Repository.py:6` | 저장소 디스크 사용량 측정 | +| TypeScript DOM | `B01_Dashboard_UI_Page.ts:81` | 역할별 대시보드와 이벤트 구성 | + +## 프로젝트 공통 모듈 +| 항목 | 위치 | 역할 | +|---|---|---| +| `common_util_auth` | `B01_Dashboard_Router.py:10` | 세션·SYSTEM_ADMIN 권한 의존성 → [[../../concepts/auth_rbac]] | +| `config_db.get_db_pool` | `B01_Dashboard_Repository.py:13` | MariaDB 커넥션 풀 획득 | +| `ui_template_elements` | `B01_Dashboard_UI_Resources.ts:2` | 공통 선형 차트 생성 → [[../../concepts/ui_templates]] | +| `ui_template_locale` | `B01_Dashboard_UI_Resources.ts:1` | 한·영 UI 문자열 선택 → [[../../concepts/ui_templates]] | diff --git a/docs/wiki/pages/B01_Dashboard/B01_frontend.md b/docs/wiki/pages/B01_Dashboard/B01_frontend.md new file mode 100644 index 0000000..70d9ff3 --- /dev/null +++ b/docs/wiki/pages/B01_Dashboard/B01_frontend.md @@ -0,0 +1,55 @@ +--- +type: page-frontend +status: stable +page_id: B01_Dashboard +related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B01_Dashboard/B01_api]]", "[[B01_Dashboard/B01_db]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B01_Dashboard 실 코드 직접 확인 (2026-07-12) +--- + +# B01_Dashboard — Frontend + +## 파일과 진입점 +| 항목 | 위치 | 역할 | +|---|---|---| +| `renderB01Dashboard()` | `B01_Dashboard_UI_Page.ts:81` | 사용자 역할과 회사 상태에 맞는 대시보드 렌더링 | +| `request()` | `B01_Dashboard_Api_Fetch.ts:171` | 쿠키 포함 요청과 공통 오류 처리 | +| `buildResourcePanel()` | `B01_Dashboard_UI_Resources.ts:13` | CPU·메모리·디스크 현황과 추이 차트 생성 | +| `B01_Dashboard_UI_Style.css` | `B01_Dashboard_UI_Style.css:1` | 대시보드·표·워크플로우·모달 스타일 | + +## UI 권한 헬퍼 +| 항목 | 위치 | 역할 | +|---|---|---| +| `canEditProject()` | `B01_Dashboard_UI_Helper.ts:3` | 프로젝트 수정 버튼 표시 판단 | +| `canDeleteProject()` | `B01_Dashboard_UI_Helper.ts:9` | SYSTEM_ADMIN 삭제 버튼 표시 판단 | +| `canAddUser()` | `B01_Dashboard_UI_Helper.ts:15` | ADMIN 이상 팀원 추가 표시 판단 | +| `canChangeRole()` | `B01_Dashboard_UI_Helper.ts:19` | SYSTEM_ADMIN 역할 변경 표시 판단 | +| `canDeleteUser()` | `B01_Dashboard_UI_Helper.ts:24` | 사용자 제거 표시 판단 | +| `canManageAutomation()` | `B01_Dashboard_UI_Helper.ts:30` | ADMIN 이상 자동화 관리 표시 판단 | + +> UI 헬퍼는 표시만 제어한다. 최종 권한 검증은 백엔드가 수행한다. 상세: [[../../concepts/auth_rbac]]. + +## 모달 +| 항목 | 위치 | 역할 | +|---|---|---| +| `openEditProjectModal()` | `B01_Dashboard_UI_Modals.ts:75` | 프로젝트 기본정보 수정 | +| `openDeleteProjectModal()` | `B01_Dashboard_UI_Modals.ts:127` | 프로젝트 삭제 확인 | +| `openEditUserModal()` | `B01_Dashboard_UI_Modals.ts:138` | 사용자 정보 수정 | +| `openChangeRoleModal()` | `B01_Dashboard_UI_Modals.ts:183` | 사용자 역할 변경 | +| `openDeleteUserModal()` | `B01_Dashboard_UI_Modals.ts:199` | 사용자 제거 확인 | +| `openCreateCompanyModal()` | `B01_Dashboard_UI_Modals.ts:210` | 회사 생성 | +| `openFindCompanyModal()` | `B01_Dashboard_UI_Modals.ts:235` | 회사 검색·가입 신청 | +| `openAddMemberModal()` | `B01_Dashboard_UI_Modals.ts:273` | 회사 팀원 추가 | +| `openAutomationModal()` | `B01_Dashboard_UI_Modals.ts:286` | 프로젝트 자동화 조회·관리 | + +## 공유 자원 연결 +| 항목 | 위치 | 역할 | +|---|---|---| +| 인증·역할 | `B01_Dashboard_UI_Page.ts:81` | 역할별 섹션 제어 → [[../../concepts/auth_rbac]] | +| workflow 상태 | `B01_Dashboard_Api_Fetch.ts:370` | 프로젝트 카드 단계 표시 → [[../../concepts/workflow_state]] | +| 공통 UI | `B01_Dashboard_UI_Resources.ts:2` | `createLineChart()` 사용 → [[../../concepts/ui_templates]] | + +## 기술부채 +| 항목 | 위치 | 역할 | +|---|---|---| +| 700줄 초과 | `B01_Dashboard_UI_Page.ts:1` | 739줄로 프로젝트 단일 파일 제한 초과; 기능별 분할 검토 필요 | diff --git a/docs/wiki/pages/B02_ProjRegister/B02_backend.md b/docs/wiki/pages/B02_ProjRegister/B02_backend.md new file mode 100644 index 0000000..b282cb7 --- /dev/null +++ b/docs/wiki/pages/B02_ProjRegister/B02_backend.md @@ -0,0 +1,72 @@ +--- +status: stable +page_id: B02_ProjRegister +related_pages: ["[[B02_ProjRegister/B02_frontend]]", "[[B02_ProjRegister/B02_db]]", "[[B01_Dashboard/B01_backend]]", "[[B03_FileInput/B03_backend]]", "[[workflow_state]]", "[[storage_paths]]"] +last_updated: 2026-07-12 +--- + +# B02_ProjRegister — Backend + +신규 임도 설계 프로젝트 생성. DB 저장 + 저장소 폴더 초기화 + 워크플로우 7단계 시드 + 감사 로그. + +> ⚠️ raw structure.md에는 B02가 프론트만 있는 것으로 기재됐으나, 실 코드에 백엔드가 이미 구현됨 (2026-07-12 확인). + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `B02_ProjRegister_Router.py` | `B02_ProjRegister/B02_ProjRegister_Router.py:1-44` | 프로젝트 생성 API (prefix `/api/b02`) | +| `B02_ProjRegister_Schema.py` | `B02_ProjRegister/B02_ProjRegister_Schema.py:1-30` | 요청/응답 Pydantic 모델 2종 | +| `B02_ProjRegister_Repository.py` | `B02_ProjRegister/B02_ProjRegister_Repository.py:1-136` | Raw SQL 저장소 + 저장소 초기화 | + +## API 엔드포인트 + +| 엔드포인트 | 위치 | 역할 | +|---|---|---| +| `POST /api/b02/project` | `B02_ProjRegister/B02_ProjRegister_Router.py:15` | 신규 프로젝트 생성. `require_company`로 회사 연결 확인 | + +## 함수 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `post_project()` | `B02_ProjRegister/B02_ProjRegister_Router.py:15` | 세션 company_id 검증 → create_project 호출, ValueError→400, 기타→500 | +| `create_project()` | `B02_ProjRegister/B02_ProjRegister_Repository.py:44` | 트랜잭션: projects INSERT + 워크플로우 시드 + 감사로그 + 저장소 초기화 | +| `get_project_by_id()` | `B02_ProjRegister/B02_ProjRegister_Repository.py:120` | 프로젝트 단건 조회(deleted_at IS NULL) | +| `_build_project_storage()` | `B02_ProjRegister/B02_ProjRegister_Repository.py:20` | 저장 경로 생성 + 저장소 루트 이탈 방지 검증 | +| `_initialize_project_storage()` | `B02_ProjRegister/B02_ProjRegister_Repository.py:29` | 단계별 폴더 생성 + workflow.json/project_manifest.json 원자적 기록 | + +## 요청/응답 스키마 (Pydantic) + +| 모델 | 위치 | 필드 | +|---|---|---| +| `CreateProjectRequest` | `B02_ProjRegister/B02_ProjRegister_Schema.py:6` | name(1~255), region(1~100), road_type(main/branch/fire/stream), project_year(2000~2100), estimated_length_m?(≥0), memo?(≤1000) | +| `CreateProjectResponse` | `B02_ProjRegister/B02_ProjRegister_Schema.py:17` | project_id, name, region, road_type, project_year, estimated_length_m, memo, status, storage_path, created_at | + +## 생성 로직 (create_project 트랜잭션) + +1. `project_id = uuid4()`, 저장 경로 생성·검증(`_build_project_storage`) +2. **트랜잭션 시작**: + - `projects` INSERT (status `'NEW'`, crs_epsg `5178` 고정) + - `initialize_project_stages(cursor, project_id)` — 워크플로우 7단계 시드 → [[workflow_state]] + - `system_audit_logs` INSERT (`PROJECT_CREATE`, resource_type `project`) + - `_initialize_project_storage()` — 저장소 폴더 + workflow.json + project_manifest.json + - commit (실패 시 rollback) +3. 생성된 프로젝트 재조회 후 반환 + +## DB 저장 컬럼 (projects INSERT) + +`id, user_id, company_id, name, region, road_type, project_year, estimated_length_m, memo, status('NEW'), crs_epsg(5178), storage_path, created_at, updated_at` +→ 테이블 정의 → [[db_schema/projects]] + +## 의존성 (공통 유틸) + +- [[common_util]] — `common_util_auth`(`require_company`), `common_util_json`(`atomic_write_json`), `common_util_storage`(`PROJECT_STORAGE_LAYOUT_V2`), `common_util_workflow`(`load_project_workflow`), `common_util_workflow_state`(`initialize_project_stages`) +- 워크플로우 시드 → [[workflow_state]] +- 저장소 경로 규칙 → [[storage_paths]] +- `config_system` — `STORAGE_BASE_DIR` +- DB → [[db_schema/projects]], `system_audit_logs` → [[db_schema/logs_monitoring]] + +## 참고 + +- 프로젝트 생성이 워크플로우 진입점: 생성 직후 프론트는 B03_FileInput으로 이동 +- `workflow.json`은 저장소에 기록되나 실제 단계 판정은 `project_workflow_stages`(DB)가 SSOT → [[workflow_state]] diff --git a/docs/wiki/pages/B02_ProjRegister/B02_db.md b/docs/wiki/pages/B02_ProjRegister/B02_db.md new file mode 100644 index 0000000..d0bf9f0 --- /dev/null +++ b/docs/wiki/pages/B02_ProjRegister/B02_db.md @@ -0,0 +1,30 @@ +--- +status: stable +page_id: B02_ProjRegister +related_pages: ["[[B02_ProjRegister/B02_backend]]", "[[B02_ProjRegister/B02_frontend]]", "[[db_schema/projects]]", "[[workflow_state]]"] +last_updated: 2026-07-12 +--- + +# B02_ProjRegister — DB + +이 페이지가 쓰는 테이블 (정의는 concepts에, 여기선 용도만). + +## 쓰는 테이블 + +| 테이블 | 이 페이지의 용도 | 정의 | +|---|---|---| +| `projects` | 신규 프로젝트 INSERT (status `'NEW'`, crs_epsg `5178`). 단건 조회 | [[db_schema/projects]] | +| `project_workflow_stages` | 생성 시 7단계 시드(`initialize_project_stages`) | [[workflow_state]] | +| `system_audit_logs` | `PROJECT_CREATE` 행위 기록 | [[db_schema/logs_monitoring]] | + +## 저장소(파일시스템) + +- `storage/{company_id}/{user_id}/{project_id}/` 생성 + `workflow.json`/`project_manifest.json` 원자적 기록 +- 경로 생성 책임·규칙 → [[storage_paths]] +- `PROJECT_STORAGE_LAYOUT_V2` 기준 단계별 폴더 + +## 참고 (계획 당시 의도) + +- 계획서(plan_workflow_state_management)에는 "생성 시 project_workflow_stages 7행 시드"가 마이그레이션 Phase 1 과제로 기재됐으나, + **실 코드에 이미 구현됨**(`B02_ProjRegister_Repository.py:90` `initialize_project_stages`). → 규칙6, 실 코드 채택 +- `workflow.json`도 저장소에 기록되나 단계 판정 SSOT는 `project_workflow_stages`(DB) → [[workflow_state]] diff --git a/docs/wiki/pages/B02_ProjRegister/B02_frontend.md b/docs/wiki/pages/B02_ProjRegister/B02_frontend.md new file mode 100644 index 0000000..cde0108 --- /dev/null +++ b/docs/wiki/pages/B02_ProjRegister/B02_frontend.md @@ -0,0 +1,83 @@ +--- +status: stable +page_id: B02_ProjRegister +related_pages: ["[[B02_ProjRegister/B02_backend]]", "[[B02_ProjRegister/B02_db]]", "[[ui_templates]]", "[[a00_app_shell_framework]]"] +last_updated: 2026-07-12 +--- + +# B02_ProjRegister — Frontend + +신규 임도 설계 프로젝트 등록 폼. 기본정보(이름·지역·임도종류·연도·연장·메모) 입력 → 생성 후 B03으로 이동. + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `B02_ProjRegister_UI_Page.ts` | `B02_ProjRegister/B02_ProjRegister_UI_Page.ts:1-179` | 등록 폼 렌더링 + 제출 로직 | +| `B02_ProjRegister_UI_Style.css` | `B02_ProjRegister/B02_ProjRegister_UI_Style.css:1-66` | 스타일 (theme.css 변수만 사용) | + +## 컴포넌트 / 함수 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `renderB02ProjRegister(root)` | `B02_ProjRegister/B02_ProjRegister_UI_Page.ts:35` | 헤더+카드(2열 그리드 폼) 조립 | +| `onB02_Proj_Submit_Click()` | `B02_ProjRegister/B02_ProjRegister_UI_Page.ts:96` | 제출 핸들러(검증→fetch POST→B03 이동) | + +## 입력 필드 + +| 필드 | 컴포넌트 | 비고 | +|---|---|---| +| 프로젝트명 | createInputField | 필수 | +| 지역 | createInputField | 필수 | +| 임도 종류 | createSelectField | main/branch/fire/stream 4종 | +| 사업연도 | createInputField(number) | 기본 올해, min 2000/max 올해+5 | +| 예상 연장(m) | createInputField(number) | 선택, min 0 | +| 메모 | createInputField(text) | 선택 | + +## 제출 로직 + +1. **1차 유효성 검사**: name/region 필수, project_year 정수·2000~2100, estimated_length_m ≥0(입력 시) +2. `fetch("${API_BASE_URL}/b02/project", POST)` 직접 호출 (별도 Api_Fetch 파일 없음) + - body: name, region, road_type, project_year, estimated_length_m, memo +3. 성공: `localStorage`에 `CURRENT_PROJECT_ID_KEY`로 project_id 저장 → 성공 토스트 → `navigateTo(ROUTES.B03_FILE_INPUT)` +4. 실패: 응답 detail/message 파싱해 에러 토스트 + +## 로컬라이제이션 + +모든 텍스트는 [[ui_templates]]에서 로드. 하드코딩 금지. + +| UI 요소 | 로케일 키 | +|---|---| +| 제목/부제 | `B02_Proj_Title`, `B02_Proj_Subtitle` | +| 필드 | `B02_Proj_Field_Name`, `_Region`, `_RoadType`, `_Year`, `_Length`, `_Memo` (+각 Placeholder) | +| 임도종류 옵션 | `B02_Proj_RoadType_Main`, `_Branch`, `_Fire`, `_Stream` | +| 제출/성공 | `B02_Proj_Submit`, `B02_Proj_Success` | +| 오류 | `B02_Proj_Error_Required`, `Common_Validation_NumberRange`(공통) | + +## 스타일 (CSS) + +- `.b02-proj` — 페이지 래퍼 (max-width: 720px) +- `.b02-proj__header` — 제목+부제 +- `.b02-proj__grid` — 2열 필드 그리드 (640px 이하 1열) +- `.b02-proj__select` — 드롭다운 화살표 여백 +- `.b02-proj__submit` — 좌측 정렬 버튼 +- 폼 전체는 `createCard({ raised: true })`로 감쌈 + +## 이벤트 핸들러 + +| 함수 | 위치 | 동작 | +|---|---|---| +| `onB02_Proj_Submit_Click()` | `B02_ProjRegister/B02_ProjRegister_UI_Page.ts:96` | 프로젝트 생성 검증·제출 | + +## 의존성 + +- [[a00_app_shell_framework]] — `navigateTo()` 라우팅 +- `config_frontend.ts` — `ROUTES`, `API_BASE_URL`, `CURRENT_PROJECT_ID_KEY` +- `common_util_validate` — `isBlank` +- [[ui_templates]] — `createButton`, `createInputField`, `createSelectField`, `createCard`, `showLoadingOverlay`/`hideLoadingOverlay`, `showToast` +- 백엔드 API → [[B02_ProjRegister/B02_backend]] + +## 참고 + +- 프론트가 fetch를 직접 호출 (A08처럼 별도 API 클라이언트 파일 없음) +- 프로젝트 생성 성공 시 `CURRENT_PROJECT_ID_KEY`가 이후 워크플로우(B03~) 진입의 컨텍스트가 됨 diff --git a/docs/wiki/pages/B03_FileInput/B03_api.md b/docs/wiki/pages/B03_FileInput/B03_api.md new file mode 100644 index 0000000..7218bc2 --- /dev/null +++ b/docs/wiki/pages/B03_FileInput/B03_api.md @@ -0,0 +1,32 @@ +--- +type: page-api +status: stable +page_id: B03_FileInput +related_pages: ["[[B03_FileInput/B03_frontend]]", "[[B03_FileInput/B03_backend]]", "[[B03_FileInput/B03_db]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B03_FileInput_Router.py 실 코드 직접 확인 (2026-07-12) +--- + +# B03_FileInput — API + +기본 prefix: `/api/projects` (`B03_FileInput_Router.py:66`). 세션 인증과 공통 오류 형식은 [[../../concepts/auth_rbac]], [[../../concepts/api_common]]을 참조한다. + +## 일반 업로드 +| 항목 | 위치 | 역할 | +|---|---|---| +| `POST /{project_id}/files` | `B03_FileInput_Router.py:267` | LAS/TIF/TFW/PRJ/DXF 다중 업로드·메타데이터 등록 | + +## 청크 업로드 +| 항목 | 위치 | 역할 | +|---|---|---| +| `POST /{project_id}/upload-sessions` | `B03_FileInput_Router.py:400` | 청크 업로드 세션 생성 | +| `POST /{project_id}/chunks` | `B03_FileInput_Router.py:443` | 청크 1개 저장 및 진행률 반환 | +| `POST /{project_id}/finalize` | `B03_FileInput_Router.py:507` | 모든 청크 병합·원본 파일 등록 | +| `GET /{project_id}/upload-status/{session_id}` | `B03_FileInput_Router.py:623` | 세션 상태·완료 청크 인덱스 조회 | + +## workflow 조회 +| 항목 | 위치 | 역할 | +|---|---|---| +| `GET /{project_id}/workflow-state` | `B03_FileInput_Router.py:667` | `current_stage`와 7단계 상태 반환 | + +전체 경로는 `/api/projects/{project_id}/...`이며, workflow 상태 공통 정의는 [[../../concepts/workflow_state]]에 둔다. diff --git a/docs/wiki/pages/B03_FileInput/B03_backend.md b/docs/wiki/pages/B03_FileInput/B03_backend.md new file mode 100644 index 0000000..12dd394 --- /dev/null +++ b/docs/wiki/pages/B03_FileInput/B03_backend.md @@ -0,0 +1,49 @@ +--- +type: page-backend +status: stable +page_id: B03_FileInput +related_pages: ["[[B03_FileInput/B03_frontend]]", "[[B03_FileInput/B03_api]]", "[[B03_FileInput/B03_db]]", "[[B03_FileInput/B03_dependencies]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B03_FileInput 실 코드 직접 확인 (2026-07-12) +--- + +# B03_FileInput — Backend + +## 입력 검증·파일 처리 +| 항목 | 위치 | 역할 | +|---|---|---| +| `FileUploadDescriptor` | `B03_FileInput_Schema.py:11` | 경로 이탈·확장자·크기 검증 | +| `resolve_upload_destination()` | `B03_FileInput_Engine.py:15` | 프로젝트 WF0 저장 목적지 결정 | +| `save_upload_stream()` | `B03_FileInput_Engine.py:31` | 일반 업로드 스트림 저장 | +| `resolve_chunk_session_dir()` | `B03_FileInput_Engine.py:64` | 임시 청크 디렉터리 결정 | +| `save_upload_chunk()` / `merge_upload_chunks()` | `B03_FileInput_Engine.py:77,124` | 청크 저장·순서 병합 | +| `remove_chunk_session()` | `B03_FileInput_Engine.py:173` | 청크 임시 디렉터리 정리 | + +## 메타데이터 분석 +| 항목 | 위치 | 역할 | +|---|---|---| +| `analyze_las_metadata()` | `B03_FileInput_Engine_Analyze.py:13` | LAS 포인트 수·범위·밀도 분석 | +| `analyze_prj_metadata()` | `B03_FileInput_Engine_Analyze.py:62` | PRJ CRS 분석 | +| `analyze_tfw_metadata()` | `B03_FileInput_Engine_Analyze.py:95` | TFW 변환계수 분석 | +| `analyze_tif_metadata()` | `B03_FileInput_Engine_Analyze.py:119` | TIF 래스터·CRS·범위 분석 | +| `analyze_input_metadata()` | `B03_FileInput_Engine_Analyze.py:146` | 확장자별 분석 라우팅 | + +## 저장소 +| 항목 | 위치 | 역할 | +|---|---|---| +| `create_input_file()` | `B03_FileInput_Repository.py:11` | `input_files` 원본 메타데이터 등록 | +| `get_project_storage_relative_path()` | `B03_FileInput_Repository.py:64` | 프로젝트 상대 저장경로 조회 | +| `create_upload_session()` / `get_upload_session()` | `B03_FileInput_Repository.py:89,135` | 청크 세션 생성·조회 | +| `upsert_upload_chunk()` / `list_completed_chunk_indexes()` | `B03_FileInput_Repository.py:165,216` | 청크 기록·완료 인덱스 조회 | +| `mark_upload_session_completed()` / `mark_upload_session_failed()` | `B03_FileInput_Repository.py:236,253` | 세션 성공·실패 상태 기록 | + +## workflow·알림 +| 항목 | 위치 | 역할 | +|---|---|---| +| `trigger_wf1_analysis_and_email()` | `B03_FileInput_Router.py:147` | WF1 분석 실행과 완료·실패 이메일 연결 | +| `start_stage()` | `B03_FileInput_Router.py:175` | WF1 시작, stage 1 IN_PROGRESS 전이 | +| `complete_stage()` | `B03_FileInput_Router.py:224,347,570` | WF0/WF1 완료 전이 | +| `fail_stage()` | `B03_FileInput_Router.py:256` | WF1 실패 전이 | +| `get_project_workflow_state()` | `B03_FileInput_Router.py:668` | 단일 프로젝트 workflow 상태 반환 | + +workflow 정의: [[../../concepts/workflow_state]], 저장경로: [[../../concepts/storage_paths]]. diff --git a/docs/wiki/pages/B03_FileInput/B03_db.md b/docs/wiki/pages/B03_FileInput/B03_db.md new file mode 100644 index 0000000..fc27317 --- /dev/null +++ b/docs/wiki/pages/B03_FileInput/B03_db.md @@ -0,0 +1,29 @@ +--- +type: page-db +status: stable +page_id: B03_FileInput +related_pages: ["[[B03_FileInput/B03_backend]]", "[[B03_FileInput/B03_api]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B03_FileInput_Repository.py 실 코드 직접 확인 (2026-07-12) +--- + +# B03_FileInput — DB 사용 관계 + +공유 테이블 정의는 [[db_schema/files_surface]]에서 1차 관리한다. + +| 항목 | 위치 | 역할 | +|---|---|---| +| `input_files` | `B03_FileInput_Repository.py:11` | 원본 파일 유형·상대경로·크기·메타데이터 등록 | +| `upload_sessions` | `B03_FileInput_Repository.py:89` | 청크 업로드 세션과 전체 파일 정보 저장 | +| `upload_chunks` | `B03_FileInput_Repository.py:165` | 청크 인덱스·해시·크기 저장 | +| `projects` | `B03_FileInput_Router.py:111` | 업로드·WF1 진행상태 호환 캐시 갱신 | +| `project_workflow_stages` | `B03_FileInput_Router.py:175` | stage 0/1 시작·완료·실패 전이와 상태 조회 | + +## 파일 경로 +| 항목 | 위치 | 역할 | +|---|---|---| +| 원본 입력 | `B03_FileInput_Engine.py:15` | `B03_FileInput/input/{file_type}/`에 저장 | +| 청크 임시파일 | `B03_FileInput_Engine.py:64` | 프로젝트 저장소 하위 임시 세션 디렉터리 사용 | +| DB 저장값 | `B03_FileInput_Repository.py:64` | 프로젝트 루트 기준 상대경로 저장 | + +경로 규칙 상세: [[storage_paths]]. diff --git a/docs/wiki/pages/B03_FileInput/B03_dependencies.md b/docs/wiki/pages/B03_FileInput/B03_dependencies.md new file mode 100644 index 0000000..fb0dc59 --- /dev/null +++ b/docs/wiki/pages/B03_FileInput/B03_dependencies.md @@ -0,0 +1,30 @@ +--- +type: page-dependencies +status: stable +page_id: B03_FileInput +related_pages: ["[[B03_FileInput/B03_frontend]]", "[[B03_FileInput/B03_backend]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B03_FileInput import 구문 직접 확인 (2026-07-12) +--- + +# B03_FileInput — Dependencies + +공유 의존성의 1차 정의는 [[../../concepts/dependencies]]에 둔다. + +| 항목 | 위치 | 역할 | +|---|---|---| +| FastAPI | `B03_FileInput_Router.py:10` | multipart 파일·폼 요청과 라우터 | +| Pydantic | `B03_FileInput_Schema.py:6` | 파일명·크기·확장자·청크 요청 검증 | +| aiomysql | `B03_FileInput_Router.py:9` | MariaDB 비동기 트랜잭션 | +| laspy | `B03_FileInput_Engine_Analyze.py:7` | LAS 포인트클라우드 메타데이터 분석 | +| rasterio | `B03_FileInput_Engine_Analyze.py:9` | TIF 래스터 메타데이터 분석 | +| pyproj | `B03_FileInput_Engine_Analyze.py:10` | PRJ/TIF CRS 해석 | +| numpy | `B03_FileInput_Engine_Analyze.py:8` | LAS 통계 계산 | + +## 공통 모듈 +| 항목 | 위치 | 역할 | +|---|---|---| +| `common_util_storage` | `B03_FileInput_Engine.py:11` | 단계별 저장경로 생성·해석 → [[../../concepts/storage_paths]] | +| `common_util_workflow_state` | `B03_FileInput_Router.py:50` | stage 상태 전이 → [[../../concepts/workflow_state]] | +| `common_util_email` | `B03_FileInput_Email.py:8` | 업로드·분석 완료/실패 이메일 발송 | +| `common_util_json` | `B03_FileInput_Router.py:47` | workflow 보조 JSON 원자적 저장 | diff --git a/docs/wiki/pages/B03_FileInput/B03_frontend.md b/docs/wiki/pages/B03_FileInput/B03_frontend.md new file mode 100644 index 0000000..2343ff2 --- /dev/null +++ b/docs/wiki/pages/B03_FileInput/B03_frontend.md @@ -0,0 +1,46 @@ +--- +type: page-frontend +status: stable +page_id: B03_FileInput +related_pages: ["[[B03_FileInput/B03_backend]]", "[[B03_FileInput/B03_api]]", "[[B03_FileInput/B03_db]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B03_FileInput 실 코드 직접 확인 (2026-07-12) +--- + +# B03_FileInput — Frontend + +## 페이지·업로드 흐름 +| 항목 | 위치 | 역할 | +|---|---|---| +| `renderB03FileInput()` | `B03_FileInput_UI_Page.ts:170` | 파일 입력 화면과 이벤트 등록 | +| 청크 세션 생성 | `B03_FileInput_UI_Page.ts:515` | 대용량 파일을 청크 업로드로 시작 | +| 청크 병합 완료 | `B03_FileInput_UI_Page.ts:558` | 서버 병합 결과를 상태에 저장 | +| WF1 진행률 폴링 | `B03_FileInput_UI_Page.ts:577` | 분석 상태와 진행률 갱신 | +| B04 이동 | `B03_FileInput_UI_Page.ts:609,693` | WF1 완료 시 `ROUTES.B04_WF1_SURFACE`로 이동 | + +## API 클라이언트 +| 항목 | 위치 | 역할 | +|---|---|---| +| `uploadProjectFiles()` | `B03_FileInput_Api_Fetch.ts:60` | 일반 다중 파일 업로드 | +| `createUploadSession()` | `B03_FileInput_Api_Fetch.ts:82` | 청크 세션 생성 | +| `uploadFileChunk()` | `B03_FileInput_Api_Fetch.ts:100` | 단일 청크 전송 | +| `finalizeUploadSession()` | `B03_FileInput_Api_Fetch.ts:119` | 청크 병합 요청 | +| `fetchUploadStatus()` | `B03_FileInput_Api_Fetch.ts:133` | 청크 업로드 상태 조회 | +| `checkWF1AnalysisStatus()` | `B03_FileInput_Api_Fetch.ts:154` | WF1 분석 상태 조회 | + +## 브라우저 상태·오프라인 보조 +| 항목 | 위치 | 역할 | +|---|---|---| +| `loadB03ProjectState()` | `B03_FileInput_State.ts:23` | 프로젝트별 저장 상태 복원 | +| `saveB03UploadedFile()` | `B03_FileInput_State.ts:34` | 업로드 파일 결과 저장 | +| `updateB03AnalysisState()` | `B03_FileInput_State.ts:53` | 분석 상태·진행률 저장 | +| `restoreB03ProjectState()` | `B03_FileInput_State.ts:71` | 재진입 시 상태와 완료 콜백 복원 | +| `registerB03ServiceWorker()` | `B03_FileInput_UI_Page.ts:622` | Service Worker 등록 시도와 안내 토스트 | + +공통 UI는 [[../../concepts/ui_templates]], 단계 상태는 [[../../concepts/workflow_state]]를 참조한다. + +## 기술부채 +| 항목 | 위치 | 역할 | +|---|---|---| +| 700줄 근접 | `B03_FileInput_UI_Page.ts:1` | 695줄; 추가 기능은 상태·업로드·화면 분할 검토 필요 | +| CSS 대형 파일 | `B03_FileInput_UI_Style.css:1` | 376줄; 공통 테마와 페이지 스타일 분리 검토 | diff --git a/docs/wiki/pages/B04_wf1_Surface/B04_api.md b/docs/wiki/pages/B04_wf1_Surface/B04_api.md new file mode 100644 index 0000000..547b920 --- /dev/null +++ b/docs/wiki/pages/B04_wf1_Surface/B04_api.md @@ -0,0 +1,43 @@ +--- +status: stable +page_id: B04_wf1_Surface +related_pages: ["[[B04_wf1_Surface/B04_backend]]", "[[B04_wf1_Surface/B04_frontend]]", "[[B04_wf1_Surface/B04_db]]", "[[B04_wf1_Surface/B04_dependencies]]"] +last_updated: 2026-07-12 +--- + +# B04_wf1_Surface — API + +실제 라우터 prefix: `/api/projects` (`B04_wf1_Surface_Router.py:41`). 총 12개 엔드포인트. + +> ⚠️ 이전 계획서 기반 api.md에는 "추정 경로 surface/analyze·models 2개"로만 기재됐으나, +> 실 코드는 아래 12개(분석·모델·미리보기·등고선·VWorld·GeoJSON 포함). 실 코드 채택(규칙6). + +## 엔드포인트 + +| 엔드포인트 | 위치 | 역할 | +|---|---|---| +| `POST /{project_id}/surface/analyze` | `B04_wf1_Surface_Router.py:147` | LAS 구조화+지면필터+모델생성 실행, DB 기록, WF1 stage 전이 | +| `GET /{project_id}/surface/models` | `B04_wf1_Surface_Router.py:241` | 생성된 지표면 모델 목록 | +| `GET /{project_id}/surface/input-files` | `B04_wf1_Surface_Router.py:260` | 분석 대상 LAS/LAZ 입력파일 목록 | +| `GET /{project_id}/surface/point-cloud` | `B04_wf1_Surface_Router.py:279` | 3D 미리보기용 포인트클라우드 샘플 | +| `GET /{project_id}/surface/ground-stats` | `B04_wf1_Surface_Router.py:341` | 필터별 지면 포인트 통계 | +| `GET /{project_id}/surface/status` | `B04_wf1_Surface_Router.py:372` | WF1 분석 상태 조회 (workflow_state 우선, 레거시 폴백) | +| `GET /{project_id}/surface/models/{model_id}/preview` | `B04_wf1_Surface_Router.py:484` | 모델 미리보기 | +| `GET /{project_id}/surface/models/{model_id}/contour` | `B04_wf1_Surface_Router.py:557` | 등고선 생성/조회 | +| `GET /{project_id}/vworld-meta` | `B04_wf1_Surface_Router.py:643` | VWorld 배경지도 메타 | +| `GET /{project_id}/vworld-map` | `B04_wf1_Surface_Router.py:676` | VWorld 배경지도 타일 | +| `GET /{project_id}/geojson` | `B04_wf1_Surface_Router.py:712` | GIS 벡터 GeoJSON | + +## 요청/응답 스키마 (Pydantic) + +| 모델 | 위치 | 역할 | +|---|---|---| +| `SurfaceAnalyzeRequest` | `B04_wf1_Surface_Schema.py:16` | input_file_id, source_filters?, methods?, force. resolved_filters/methods로 화이트리스트 검증 | +| `SurfaceAnalyzeResponse` | `B04_wf1_Surface_Schema.py:97` | ground_summary, manifest_status, surface_model_ids | +| `SurfaceModelSummary` / `SurfaceModelListResponse` | `B04_wf1_Surface_Schema.py:45,107` | 모델 요약/목록 | +| `SurfaceInputFileSummary` / `...ListResponse` | `B04_wf1_Surface_Schema.py:56,69` | 입력파일 요약/목록 | +| `SurfacePointCloudSampleResponse` | `B04_wf1_Surface_Schema.py:77` | 포인트클라우드 샘플(bounds/points/rgb) | +| `SurfaceGroundStatsResponse` | `B04_wf1_Surface_Schema.py:89` | 필터별 통계 | + +- 공통 오류 포맷 `{"status":"error","message":...}` → [[schema_common]] +- 분석 파라미터 화이트리스트: `SURFACE_MODEL_SOURCE_FILTERS`+`ransac`, `SURFACE_MODEL_PRECOMPUTE` (config_system) diff --git a/docs/wiki/pages/B04_wf1_Surface/B04_backend.md b/docs/wiki/pages/B04_wf1_Surface/B04_backend.md new file mode 100644 index 0000000..8866629 --- /dev/null +++ b/docs/wiki/pages/B04_wf1_Surface/B04_backend.md @@ -0,0 +1,71 @@ +--- +status: stable +page_id: B04_wf1_Surface +related_pages: ["[[B04_wf1_Surface/B04_frontend]]", "[[B04_wf1_Surface/B04_api]]", "[[B04_wf1_Surface/B04_db]]", "[[B04_wf1_Surface/B04_dependencies]]", "[[B03_FileInput/B03_backend]]", "[[B05_wf2_Route/B05_backend]]"] +last_updated: 2026-07-12 +--- + +# B04_wf1_Surface — Backend + +WF1 지표면 분석. LAS 구조화 → 지면 필터 → 지표면 5종 모델 생성 → 스무딩/등고선. 무거운 연산은 `asyncio.to_thread`로 실행. + +## 파일 구성 (오케스트레이터/저장소/라우터) + +| 파일 | 위치 | 역할 | +|---|---|---| +| `B04_wf1_Surface_Router.py` | `B04_wf1_Surface_Router.py:1-739` | `/api/projects` 12개 엔드포인트 → [[B04_wf1_Surface/B04_api]] | +| `B04_wf1_Surface_Schema.py` | `B04_wf1_Surface_Schema.py:1-113` | 요청/응답 검증 | +| `B04_wf1_Surface_Repository.py` | `B04_wf1_Surface_Repository.py:1-236` | processed_point_cloud/surface_models Raw SQL | +| `B04_wf1_Surface_Engine.py` | `B04_wf1_Surface_Engine.py:27` | `run_surface_analysis()` 오케스트레이터(구조화→필터→모델빌드) | + +## 엔진 서브모듈 + +| 파일 | 역할 | +|---|---| +| `..._Engine_Structurize.py` | LAS/LAZ 구조화(structured.npz) | +| `..._Engine_Ground.py` | 지면 마스크 생성/요약(`build_ground_masks`, `summarize_masks`) | +| `..._Engine_Filter_Grid/CSF/PMF/RANSAC.py` | 지면 필터 4종 | +| `..._Engine_Pipeline.py` | `build_all_terrain_models()` 지표면 모델 파이프라인 + manifest | +| `..._Engine_ModelContext.py` | 모델 공통 컨텍스트/메시 유틸 | +| `..._Engine_ModelBuild.py` | TIN/DTM/NURBS/implicit/meshfree 생성 | +| `..._Engine_Smooth.py` | DTM/TIN 스무딩 | +| `..._Engine_Contour.py` | 등고선 생성 | +| `..._Engine_GisVector.py` / `..._Engine_VWorld.py` / `..._Engine_MvtHelper.py` | GIS 벡터 / VWorld 배경지도 / MVT 헬퍼 | + +## 주요 함수 (Router) + +| 함수 | 위치 | 역할 | +|---|---|---| +| `analyze_surface()` | `B04_wf1_Surface_Router.py:147` | 분석 실행: start_stage→to_thread(run_surface_analysis)→DB저장→complete_stage | +| `save_surface_analysis_to_db()` | `B04_wf1_Surface_Router.py:90` | processed_point_cloud + surface_models INSERT (호출자 트랜잭션) | +| `get_wf1_analysis_status()` | `B04_wf1_Surface_Router.py:372` | 상태 조회(project_workflow_stages 우선, 폴백) | +| `update_project_status()` | `B04_wf1_Surface_Router.py:76` | ⚠️ 정의만 있고 **호출처 없음**(죽은 코드, grep 확인) | + +## 워크플로우 상태 전이 + +analyze 흐름에서 `project_workflow_stages`(stage 1) 전이: +- `start_stage(cursor, project_id, 1, params)` — `B04_wf1_Surface_Router.py:168` +- `complete_stage(cursor, project_id, 1)` — `B04_wf1_Surface_Router.py:209` +- `fail_stage(cursor, project_id, 1, err)` — `B04_wf1_Surface_Router.py:227,233` + +→ SSOT 정의·전파 규칙 → [[workflow_state]] + +## ⚠️ 레거시 폴백 (416,420줄) + +`get_wf1_analysis_status()`는 `project_workflow_stages`를 **우선** 조회하고, +행이 없을 때만(백필 미작동 대비) `projects.status` 문자열 비교로 폴백: +- 416줄 `project_status == "WF1_COMPLETE"`, 420줄 `"WF1_ANALYZING"` (`B04_wf1_Surface_Router.py:412-427`) + +이전 wiki는 "구형 잔재, 정리 필요"로 표기했으나, 실제로는 정상 경로가 아닌 **방어적 폴백**. +SSOT가 안정화되면 제거 가능하나 현재는 백필 안전장치로 동작 중. + +## 책임 + +LAS 구조화·지면 필터 → 변환 포인트클라우드 저장 → 지표면 5종 모델 생성 → 스무딩/등고선/미리보기 → 모델 확정 및 하위 단계(B05) stale 전파([[workflow_state]]). + +## 의존성 + +- [[common_util]] — `common_util_workflow_state`(start/complete/fail_stage), 저장소 경로 헬퍼 +- 외부 라이브러리 → [[B04_wf1_Surface/B04_dependencies]] +- DB → [[B04_wf1_Surface/B04_db]] +- config: `SURFACE_MODEL_SOURCE_FILTERS`, `SURFACE_MODEL_PRECOMPUTE`, `build_surface_model_config` diff --git a/docs/wiki/pages/B04_wf1_Surface/B04_db.md b/docs/wiki/pages/B04_wf1_Surface/B04_db.md new file mode 100644 index 0000000..394e610 --- /dev/null +++ b/docs/wiki/pages/B04_wf1_Surface/B04_db.md @@ -0,0 +1,34 @@ +--- +status: stable +page_id: B04_wf1_Surface +related_pages: ["[[B04_wf1_Surface/B04_backend]]", "[[B04_wf1_Surface/B04_api]]", "[[B04_wf1_Surface/B04_dependencies]]", "[[db_schema/files_surface]]"] +last_updated: 2026-07-12 +--- + +# B04_wf1_Surface — DB + +이 페이지가 쓰는 테이블 (정의는 concepts에, 여기선 용도만). + +## 쓰는 테이블 + +| 테이블 | 이 페이지의 용도 | 정의 | +|---|---|---| +| `processed_point_cloud` | 필터/변환된 포인트클라우드 저장(input_files 참조) | [[db_schema/files_surface]] | +| `surface_models` | TIN/DTM/NURBS/implicit/meshfree 모델 메타데이터 | [[db_schema/files_surface]] | +| `terrain_layers` | 등고선 등 파생 레이어 | [[db_schema/files_surface]] | +| `project_workflow_stages` | WF1(stage 1) 상태 전이·조회 | [[workflow_state]] | +| `input_files` | 분석 대상 LAS/LAZ 조회 | [[db_schema/files_surface]] | +| `projects` | (레거시 폴백) status 조회 | [[db_schema/projects]] | + +## Repository 함수 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `create_processed_point_cloud()` | `B04_wf1_Surface_Repository.py` | processed_point_cloud INSERT | +| (surface_models INSERT) | `B04_wf1_Surface_Repository.py` | 모델별 메타데이터 저장 | +| `get_input_file()` | `B04_wf1_Surface_Repository.py` | 입력 LAS 단건 조회 | + +## 참고 + +- `save_surface_analysis_to_db()`([[B04_wf1_Surface/B04_backend]])가 processed_point_cloud + surface_models를 한 트랜잭션으로 저장(호출자가 begin/commit) +- WF1 단계 판정 SSOT는 `project_workflow_stages`. `projects.status`는 레거시 폴백 경로에서만 참조 → [[workflow_state]] diff --git a/docs/wiki/pages/B04_wf1_Surface/B04_dependencies.md b/docs/wiki/pages/B04_wf1_Surface/B04_dependencies.md new file mode 100644 index 0000000..2152491 --- /dev/null +++ b/docs/wiki/pages/B04_wf1_Surface/B04_dependencies.md @@ -0,0 +1,34 @@ +--- +status: stable +page_id: B04_wf1_Surface +related_pages: ["[[B04_wf1_Surface/B04_backend]]", "[[B04_wf1_Surface/B04_frontend]]", "[[dependencies]]"] +last_updated: 2026-07-12 +--- + +# B04_wf1_Surface — Dependencies + +이 페이지가 쓰는 외부 라이브러리 (공통 정의는 [[dependencies]]). + +## 백엔드 (Python) + +| 라이브러리 | 용도 | +|---|---| +| Laspy | LAS/LAZ 구조화 | +| Whitebox / Rasterio | 지면 필터·DEM 처리 | +| Trimesh | TIN/메시 모델 | +| Geopandas / Shapely | GIS 벡터(GeoJSON, 등고선) | +| NumPy | structured.npz 등 배열 연산 | + +→ 공통 정의·버전 → [[dependencies]] + +## 프론트엔드 (TypeScript) + +| 라이브러리 | 위치 | 용도 | +|---|---|---| +| **three.js** | `B04_wf1_Surface_UI_Viewer.ts:1`, `..._TerrainViewer.ts` | WebGL 3D 뷰어(WebGLRenderer, OrbitControls, THREE.Points/Mesh) | + +## ⚠️ dependencies concept 정정 필요 + +[[dependencies]]의 "HTML5 Canvas / WebGL — WebCAD 렌더링 (B04~B06 뷰어, **현재 미구현**)"은 +실 코드와 불일치. B04는 three.js로 3D 뷰어가 **구현됨** → [[B04_wf1_Surface/B04_frontend]]. +dependencies.md에 three.js 항목 추가·"미구현" 문구 정정 필요 (B05/B06 뷰어 상태는 각 페이지 인제스트 시 확인). diff --git a/docs/wiki/pages/B04_wf1_Surface/B04_frontend.md b/docs/wiki/pages/B04_wf1_Surface/B04_frontend.md new file mode 100644 index 0000000..5f5a9bf --- /dev/null +++ b/docs/wiki/pages/B04_wf1_Surface/B04_frontend.md @@ -0,0 +1,66 @@ +--- +status: stable +page_id: B04_wf1_Surface +related_pages: ["[[B04_wf1_Surface/B04_backend]]", "[[B04_wf1_Surface/B04_api]]", "[[B04_wf1_Surface/B04_dependencies]]", "[[ui_templates]]"] +last_updated: 2026-07-12 +--- + +# B04_wf1_Surface — Frontend + +WF1 지표면 분석 화면. 워크플로우 레이아웃(필터/표현 폼 + 모델 목록) + **three.js 기반 3D 뷰어**(포인트클라우드/지형). + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `B04_wf1_Surface_UI_Page.ts` | `B04_wf1_Surface_UI_Page.ts:1-377` | 페이지 조립 + 분석 실행/폴링/뷰어 렌더 | +| `B04_wf1_Surface_UI_Viewer.ts` | `B04_wf1_Surface_UI_Viewer.ts:1-567` | 포인트클라우드 3D 뷰어(three.js) | +| `B04_wf1_Surface_UI_TerrainViewer.ts` | `B04_wf1_Surface_UI_TerrainViewer.ts:1-637` | 지형 메시 3D 뷰어(three.js) | +| `B04_wf1_Surface_Api_Fetch.ts` | `B04_wf1_Surface_Api_Fetch.ts:1-174` | surface API 클라이언트 | +| `B04_wf1_Surface_UI_Style.css` | `B04_wf1_Surface_UI_Style.css` | 폼 그룹/모델 카드/뷰어 스타일 | + +## ⚠️ 계획서와 실 코드 불일치 (3D 뷰어) + +이전 wiki(계획서 기반)는 **"WebCAD 3D 뷰어 미구현"**으로 기재했으나, +실 코드에는 three.js(WebGL) 기반 뷰어가 **구현되어 있음**: +- `createSurfacePointCloudViewer` (`B04_wf1_Surface_UI_Viewer.ts:187` WebGLRenderer, OrbitControls, THREE.Points) +- `createSurfaceTerrainViewer` (`B04_wf1_Surface_UI_TerrainViewer.ts`) +- UI_Page에서 import·인스턴스화(`B04_wf1_Surface_UI_Page.ts:37,38,110,356`) + +→ 규칙6, 실 코드 채택. dependencies도 three.js 반영 → [[B04_wf1_Surface/B04_dependencies]] + +## 컴포넌트 / 함수 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `renderB04Surface(root)` | `B04_wf1_Surface_UI_Page.ts:95` | 워크플로우 레이아웃+뷰어 조립(async) | +| `createSurfacePointCloudViewer()` | `B04_wf1_Surface_UI_Viewer.ts:187` | 포인트클라우드 뷰어 핸들 생성 | +| `createSurfaceTerrainViewer()` | `B04_wf1_Surface_UI_TerrainViewer.ts` | 지형 메시 뷰어 핸들 생성 | + +## API 클라이언트 함수 + +| 함수 | 위치 | 대응 API | +|---|---|---| +| `analyzeSurface()` | `B04_wf1_Surface_Api_Fetch.ts:117` | `POST .../surface/analyze` | +| `listSurfaceModels()` | `B04_wf1_Surface_Api_Fetch.ts:128` | `GET .../surface/models` | +| `listSurfaceInputFiles()` | `B04_wf1_Surface_Api_Fetch.ts:134` | `GET .../surface/input-files` | +| `fetchSurfacePointCloud()` | `B04_wf1_Surface_Api_Fetch.ts:142` | `GET .../surface/point-cloud` | +| `fetchSurfaceGroundStats()` | `B04_wf1_Surface_Api_Fetch.ts:153` | `GET .../surface/ground-stats` | +| `fetchSurfaceStatus()` | `B04_wf1_Surface_Api_Fetch.ts:161` | `GET .../surface/status` | +| `getVWorldMapUrl()` / `fetchVWorldMeta()` | `B04_wf1_Surface_Api_Fetch.ts:182,186` | VWorld 배경지도 | +| `fetchGisGeoJson()` | `B04_wf1_Surface_Api_Fetch.ts:192` | `GET .../geojson` | + +## 처리 흐름 + +1. 워크플로우 레이아웃(`createWorkflowLayout`) + 스텝(`workflowSteps`) 조립 +2. 입력파일/모델 목록 로드 → 필터·표현 폼 구성 +3. 분석 실행(`analyzeSurface`) → 상태 폴링(`fetchSurfaceStatus`) +4. 완료 시 포인트클라우드(`fetchSurfacePointCloud`) → `viewer.render()` (`B04_wf1_Surface_UI_Page.ts:356`) + +## 의존성 + +- [[a00_app_shell_framework]] — `navigateTo`, `workflowSteps`(b_page_scaffold) +- `config_frontend.ts` — `API_BASE_URL`, `CURRENT_PROJECT_ID_KEY`, `ROUTES`, `RENDER_OPTIONS`, `API_TIMEOUT_MS` +- [[ui_templates]] — `createWorkflowLayout`(ui_template_workflow_layout) 등 +- **three.js** (WebGL 3D 뷰어) → [[B04_wf1_Surface/B04_dependencies]] +- 백엔드 API → [[B04_wf1_Surface/B04_api]] diff --git a/docs/wiki/pages/B05_wf2_Route/B05_api.md b/docs/wiki/pages/B05_wf2_Route/B05_api.md new file mode 100644 index 0000000..7294cd6 --- /dev/null +++ b/docs/wiki/pages/B05_wf2_Route/B05_api.md @@ -0,0 +1,28 @@ +--- +type: page-api +status: stable +page_id: B05_wf2_Route +related_pages: ["[[B05_wf2_Route/B05_frontend]]", "[[B05_wf2_Route/B05_backend]]", "[[B05_wf2_Route/B05_db]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B05_wf2_Route_Router.py 실 코드 직접 확인 (2026-07-12) +--- + +# B05_wf2_Route — API + +기본 prefix: `/api/projects` (`B05_wf2_Route_Router.py:30`). 공통 세션·오류 형식은 [[../../concepts/auth_rbac]], [[../../concepts/api_common]]을 참조한다. + +| 항목 | 위치 | 역할 | +|---|---|---| +| `POST /{project_id}/route/solve` | `B05_wf2_Route_Router.py:33` | RouteSolveRequest 검증, 경로 계산, 결과 3종 DB 저장 | +| `POST /{project_id}/route/confirm` | `B05_wf2_Route_Router.py:136` | 최신 DRAFT 경로를 CONFIRMED로 변경 | + +## solve 처리 결과 +| 항목 | 역할 | +|---|---| +| `route_id` | 새 경로 식별자 | +| `total_length_m` | 계산 경로 총연장 | +| `metrics` | 경사·절성토량·비용 등 통계 | +| `required_points_ok` | BP/EP/CP 조건 충족 여부 | +| `route_data_path` | GeoJSON LineString 상대경로 | + +오류는 표준 `{"status":"error","message":...}` 형식으로 반환한다. diff --git a/docs/wiki/pages/B05_wf2_Route/B05_backend.md b/docs/wiki/pages/B05_wf2_Route/B05_backend.md new file mode 100644 index 0000000..5dbae97 --- /dev/null +++ b/docs/wiki/pages/B05_wf2_Route/B05_backend.md @@ -0,0 +1,50 @@ +--- +type: page-backend +status: stable +page_id: B05_wf2_Route +related_pages: ["[[B05_wf2_Route/B05_frontend]]", "[[B05_wf2_Route/B05_api]]", "[[B05_wf2_Route/B05_db]]", "[[B05_wf2_Route/B05_dependencies]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B05_wf2_Route 실 코드 직접 확인 (2026-07-12) +--- + +# B05_wf2_Route — Backend + +## 요청·응답 모델 +| 항목 | 위치 | 역할 | +|---|---|---| +| `RoutePoint` / `CirclePoint` | `B05_wf2_Route_Schema.py:10,20` | BP·EP·CP와 AP·FP 입력 검증 | +| `RouteSolveRequest` | `B05_wf2_Route_Schema.py:30` | 지표면·알고리즘·등급·제약·가중치 검증 | +| `RouteSolveResponse` | `B05_wf2_Route_Schema.py:84` | route ID·길이·메트릭·GeoJSON 상대경로 응답 | +| `RouteConfirmResponse` | `B05_wf2_Route_Schema.py:96` | 확정 route ID와 confirmed 상태 응답 | + +## 경로 계산 엔진 +| 항목 | 위치 | 역할 | +|---|---|---| +| `run_route_design()` | `B05_wf2_Route_Engine.py:68` | 입력 모델을 경로 설계 오케스트레이터로 실행 | +| `solve_optimal_route()` | `B05_wf2_Route_Engine_Solver.py:278` | DTM 격자·비용면·선택 알고리즘 기반 최적화 | +| `single_segment_dijkstra()` | `B05_wf2_Route_Engine_Geometry.py:149` | 단일 구간 격자 Dijkstra 탐색 | +| `solve_ridge_valley_route()` | `B05_wf2_Route_Engine_RidgeValley.py:510` | ridge-valley 후보와 제약 기반 경로 탐색 | +| `load_or_build_skeleton()` | `B05_wf2_Route_Engine_Skeleton.py:275` | D8 흐름누적 skeleton 캐시·생성 | +| `_build_cost_surface()` | `B05_wf2_Route_Engine_Solver.py:173` | 경사·곡률·회피영역 기반 비용면 생성 | +| `_fillet_alignment()` | `B05_wf2_Route_Engine_RidgeValley.py:406` | 굴곡부 fillet 정렬·곡선반경 반영 | + +## 기하·결과 변환 +| 항목 | 위치 | 역할 | +|---|---|---| +| `compute_gradients()` | `B05_wf2_Route_Engine_Geometry.py:33` | 격자 경사 계산 | +| `circumradius_2d()` | `B05_wf2_Route_Engine_Geometry.py:52` | 3점 곡선반경 계산 | +| `circle_intrusions()` | `B05_wf2_Route_Engine_Geometry.py:90` | 회피·금지 원 침범 검사 | +| `_route_geojson()` / `_sample_render_points()` | `B05_wf2_Route_Engine.py:20,32` | LineString 저장·렌더링 포인트 변환 | + +## 라우터·workflow +| 항목 | 위치 | 역할 | +|---|---|---| +| `solve_route()` | `B05_wf2_Route_Router.py:34` | 계산 실행·DB route/points/statistics 저장·stage 2 완료 | +| `confirm_latest_route()` | `B05_wf2_Route_Router.py:137` | 최신 경로 확정·stage 2 완료·후속 단계 stale 전파 | +| `start_stage()` / `complete_stage()` / `fail_stage()` | `B05_wf2_Route_Router.py:51,96,112,117,122,128,152` | WF2 상태 전이 → [[../../concepts/workflow_state]] | + +## 기술부채 +| 항목 | 위치 | 역할 | +|---|---|---| +| 700줄 초과 | `B05_wf2_Route_Engine_RidgeValley.py:1` | 781줄; ridge-valley 기능 분할 검토 | +| 700줄 근접 | `B05_wf2_Route_Engine_Solver.py:1` | 654줄; 비용면·최적화 분리 검토 | diff --git a/docs/wiki/pages/B05_wf2_Route/B05_db.md b/docs/wiki/pages/B05_wf2_Route/B05_db.md new file mode 100644 index 0000000..f2e19f8 --- /dev/null +++ b/docs/wiki/pages/B05_wf2_Route/B05_db.md @@ -0,0 +1,36 @@ +--- +type: page-db +status: stable +page_id: B05_wf2_Route +related_pages: ["[[B05_wf2_Route/B05_backend]]", "[[B05_wf2_Route/B05_api]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B05_wf2_Route_Repository.py 실 코드 직접 확인 (2026-07-12) +--- + +# B05_wf2_Route — DB 사용 관계 + +테이블 정의는 [[db_schema/route_profile]]에서 1차 관리한다. + +| 항목 | 위치 | 역할 | +|---|---|---| +| `routes` | `B05_wf2_Route_Repository.py:27` | surface model·제어점·옵션·GeoJSON 경로 저장 | +| `route_points` | `B05_wf2_Route_Repository.py:75` | chainage·고도·경사별 렌더링 포인트 저장 | +| `route_statistics` | `B05_wf2_Route_Repository.py:109` | 총연장·경사·절성토량·비용 통계 저장 | + +## Repository 함수 +| 항목 | 위치 | 역할 | +|---|---|---| +| `_validate_stage_path()` | `B05_wf2_Route_Repository.py:18` | B05 route 상대경로 이탈 방지 | +| `create_route()` | `B05_wf2_Route_Repository.py:27` | 계산 결과 route 레코드 생성 | +| `insert_route_points()` | `B05_wf2_Route_Repository.py:75` | 샘플 포인트 일괄 저장 | +| `create_route_statistics()` | `B05_wf2_Route_Repository.py:109` | 경로 통계 저장 | +| `get_latest_route()` | `B05_wf2_Route_Repository.py:148` | 프로젝트 최신 경로 조회 | +| `confirm_route()` | `B05_wf2_Route_Repository.py:175` | 경로 상태 CONFIRMED 전환 | + +## 저장 경로 +| 항목 | 역할 | +|---|---| +| `routes.route_data_path` | 프로젝트 루트 기준 `B05_wf2_Route/route/` 내 GeoJSON 상대경로 | +| `route_points` | DB에 렌더링용 샘플 좌표 저장 | + +상세 경로 규칙: [[storage_paths]]. diff --git a/docs/wiki/pages/B05_wf2_Route/B05_dependencies.md b/docs/wiki/pages/B05_wf2_Route/B05_dependencies.md new file mode 100644 index 0000000..a4de18c --- /dev/null +++ b/docs/wiki/pages/B05_wf2_Route/B05_dependencies.md @@ -0,0 +1,29 @@ +--- +type: page-dependencies +status: stable +page_id: B05_wf2_Route +related_pages: ["[[B05_wf2_Route/B05_frontend]]", "[[B05_wf2_Route/B05_backend]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B05_wf2_Route import 구문·엔진 직접 확인 (2026-07-12) +--- + +# B05_wf2_Route — Dependencies + +공유 의존성 정의는 [[../../concepts/dependencies]]에 둔다. + +| 항목 | 역할 | +|---|---| +| Whitebox | D8 흐름누적 기반 skeleton 보조 | +| GeoPandas | 지표면·공간 데이터 처리 | +| Shapely | 경로·금지영역 기하 연산 | +| NumPy | 격자·비용면·Dijkstra 계산 | +| SciPy | 격자 보간·수치 계산 보조 | +| aiomysql | routes·route_points·route_statistics Raw SQL | + +## 페이지 파일별 연결 +| 파일 | 위치 | 역할 | +|---|---|---| +| `B05_wf2_Route_Engine_Skeleton.py` | `:1` | Whitebox/NumPy 흐름누적 skeleton | +| `B05_wf2_Route_Engine_RidgeValley.py` | `:1` | NumPy 기반 ridge-valley 탐색 | +| `B05_wf2_Route_Repository.py` | `:1` | aiomysql 비동기 저장 | +| `B05_wf2_Route_UI_Page.ts` | `:1` | TypeScript DOM·공통 UI 렌더링 | diff --git a/docs/wiki/pages/B05_wf2_Route/B05_frontend.md b/docs/wiki/pages/B05_wf2_Route/B05_frontend.md new file mode 100644 index 0000000..affbb20 --- /dev/null +++ b/docs/wiki/pages/B05_wf2_Route/B05_frontend.md @@ -0,0 +1,44 @@ +--- +type: page-frontend +status: stable +page_id: B05_wf2_Route +related_pages: ["[[B05_wf2_Route/B05_backend]]", "[[B05_wf2_Route/B05_api]]", "[[B05_wf2_Route/B05_db]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B05_wf2_Route 실 코드 직접 확인 (2026-07-12) +--- + +# B05_wf2_Route — Frontend + +## 화면과 상호작용 +| 항목 | 위치 | 역할 | +|---|---|---| +| `renderB05Route()` | `B05_wf2_Route_UI_Page.ts:74` | 제어점·지표면·제약·결과 3단 UI 렌더링 | +| 경로 계산 실행 | `B05_wf2_Route_UI_Page.ts:285` | 입력값을 `solveRoute()`로 전송하고 결과 메트릭 표시 | +| 경로 확정 | `B05_wf2_Route_UI_Page.ts:311` | 최신 계산 경로를 `confirmRoute()`로 확정 | +| workflow 상태 조회 | `B05_wf2_Route_UI_Page.ts:337` | 진입 단계와 진행상태 확인 | +| B 페이지 scaffold | `B05_wf2_Route_UI_Page.ts:354` | 공통 단계 내비게이션과 페이지 이동 | + +## API 클라이언트 +| 항목 | 위치 | 역할 | +|---|---|---| +| `solveRoute()` | `B05_wf2_Route_Api_Fetch.ts:83` | 경로 탐색 실행 요청 | +| `confirmRoute()` | `B05_wf2_Route_Api_Fetch.ts:94` | 최신 경로 확정 요청 | +| `RouteSolveRequest` | `B05_wf2_Route_Api_Fetch.ts:24` | 지표면·제어점·제약 입력 타입 | +| `RouteSolveResponse` | `B05_wf2_Route_Api_Fetch.ts:40` | 경로 ID·길이·메트릭·저장경로 타입 | + +## 입력 그룹 +| 항목 | 역할 | +|---|---| +| BP/EP/CP | 시작점·끝점·경유 제어점 | +| AP/FP | 회피 원·금지 원과 반경 | +| filter/method/smooth | 지표면 필터·표현·평활화 선택 | +| grade/paved/curve radius | 임도 등급·포장·최소 곡선반경 | +| uphill/downhill/weights | 종단경사 제한과 비용 가중치 | + +현재 코드에는 WebCAD 노선 폴리라인 편집·렌더링 컴포넌트가 없다. + +## 기술부채 +| 항목 | 위치 | 역할 | +|---|---|---| +| WebCAD 미구현 | `B05_wf2_Route_UI_Page.ts:74` | 결과는 메트릭·경로 저장경로 중심으로 표시 | +| CSS 분리 검토 | `B05_wf2_Route_UI_Style.css:1` | 132줄 페이지 전용 스타일 | diff --git a/docs/wiki/pages/B06_wf3_ProfileCross/B06_api.md b/docs/wiki/pages/B06_wf3_ProfileCross/B06_api.md new file mode 100644 index 0000000..619f4f3 --- /dev/null +++ b/docs/wiki/pages/B06_wf3_ProfileCross/B06_api.md @@ -0,0 +1,28 @@ +--- +type: page-api +status: stable +page_id: B06_wf3_ProfileCross +related_pages: ["[[B06_wf3_ProfileCross/B06_frontend]]", "[[B06_wf3_ProfileCross/B06_backend]]", "[[B06_wf3_ProfileCross/B06_db]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B06_wf3_ProfileCross_Router.py 실 코드 직접 확인 (2026-07-12) +--- + +# B06_wf3_ProfileCross — API + +기본 prefix: `/api/projects` (`B06_wf3_ProfileCross_Router.py:33`). 공통 세션·오류 형식은 [[../../concepts/auth_rbac]], [[../../concepts/api_common]]을 참조한다. + +| 항목 | 위치 | 역할 | +|---|---|---| +| `POST /{project_id}/sections/generate` | `B06_wf3_ProfileCross_Router.py:48` | 확정 경로 기반 종단·횡단 생성 및 DB 저장 | +| `GET /{project_id}/sections/{route_id}` | `B06_wf3_ProfileCross_Router.py:151` | 종횡단 결과 요약 조회 | +| `POST /{project_id}/sections/{route_id}/confirm` | `B06_wf3_ProfileCross_Router.py:169` | 해당 route의 종횡단 결과 확정 | + +## 생성 응답 +| 항목 | 역할 | +|---|---| +| `longitudinal_id` | 종단면 레코드 ID | +| `cross_section_count` | 생성된 횡단면 수 | +| `length_m` | 대상 경로 총연장 | +| `longitudinal_file_path` | 종단면 산출 파일 상대경로 | + +오류는 표준 `{"status":"error","message":...}` 형식으로 반환한다. diff --git a/docs/wiki/pages/B06_wf3_ProfileCross/B06_backend.md b/docs/wiki/pages/B06_wf3_ProfileCross/B06_backend.md new file mode 100644 index 0000000..4ef8983 --- /dev/null +++ b/docs/wiki/pages/B06_wf3_ProfileCross/B06_backend.md @@ -0,0 +1,43 @@ +--- +type: page-backend +status: stable +page_id: B06_wf3_ProfileCross +related_pages: ["[[B06_wf3_ProfileCross/B06_frontend]]", "[[B06_wf3_ProfileCross/B06_api]]", "[[B06_wf3_ProfileCross/B06_db]]", "[[B06_wf3_ProfileCross/B06_dependencies]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B06_wf3_ProfileCross 실 코드 직접 확인 (2026-07-12) +--- + +# B06_wf3_ProfileCross — Backend + +## 요청·응답 모델 +| 항목 | 위치 | 역할 | +|---|---|---| +| `SectionGenerateRequest` | `B06_wf3_ProfileCross_Schema.py:8` | route·지표면·측점·횡단 옵션 검증 | +| `SectionGenerateResponse` | `B06_wf3_ProfileCross_Schema.py:26` | 종단 ID·횡단 개수·총연장·파일경로 응답 | +| `SectionConfirmResponse` | `B06_wf3_ProfileCross_Schema.py:38` | 확정 route와 confirmed 상태 응답 | +| `SectionSummaryResponse` | `B06_wf3_ProfileCross_Schema.py:47` | 종단·횡단 결과 요약 응답 | + +## 생성 엔진 +| 항목 | 위치 | 역할 | +|---|---|---| +| `run_section_generation()` | `B06_wf3_ProfileCross_Engine.py:50` | B05 경로 로드·표고 sampler·종횡단 생성 오케스트레이션 | +| `build_surface_sampler()` | `B06_wf3_ProfileCross_Engine_Sampler.py:126` | DTM·보간 방식 표고 sampler 선택 | +| `DtmGridSampler` | `B06_wf3_ProfileCross_Engine_Sampler.py:26` | DTM 격자 기반 표고 조회 | +| `InterpolatedSurfaceSampler` | `B06_wf3_ProfileCross_Engine_Sampler.py:109` | 표면 보간 기반 표고 조회 | +| `generate_sections()` | `B06_wf3_ProfileCross_Engine_Section.py:116` | 측점·종단·횡단 샘플 생성 | +| `_chainages()` | `B06_wf3_ProfileCross_Engine_Section.py:77` | 측점 간격과 종점 포함 여부로 chainage 생성 | +| `_interpolate_xy()` / `_tangent_at()` | `B06_wf3_ProfileCross_Engine_Section.py:86,95` | 경로 좌표 보간·접선 방향 계산 | + +## 라우터·workflow +| 항목 | 위치 | 역할 | +|---|---|---| +| `generate_sections()` | `B06_wf3_ProfileCross_Router.py:49` | 확정 경로 검증·생성·DB 저장·stage 3 완료 | +| `get_sections()` | `B06_wf3_ProfileCross_Router.py:152` | route 종횡단 요약 조회 | +| `confirm_sections()` | `B06_wf3_ProfileCross_Router.py:170` | 결과 확정·stage 3 완료 | +| `start_stage()` / `complete_stage()` / `fail_stage()` | `B06_wf3_ProfileCross_Router.py:68,111,127,132,137,143,187` | WF3 상태 전이 → [[../../concepts/workflow_state]] | + +## 재실행 +| 항목 | 위치 | 역할 | +|---|---|---| +| `delete_sections_for_route()` | `B06_wf3_ProfileCross_Repository.py:27` | 동일 route 기존 결과 삭제 후 재생성 | +| `_validate_stage_path()` | `B06_wf3_ProfileCross_Repository.py:18` | WF3 저장경로 이탈 방지 | diff --git a/docs/wiki/pages/B06_wf3_ProfileCross/B06_db.md b/docs/wiki/pages/B06_wf3_ProfileCross/B06_db.md new file mode 100644 index 0000000..d3c64d1 --- /dev/null +++ b/docs/wiki/pages/B06_wf3_ProfileCross/B06_db.md @@ -0,0 +1,35 @@ +--- +type: page-db +status: stable +page_id: B06_wf3_ProfileCross +related_pages: ["[[B06_wf3_ProfileCross/B06_backend]]", "[[B06_wf3_ProfileCross/B06_api]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B06_wf3_ProfileCross_Repository.py 실 코드 직접 확인 (2026-07-12) +--- + +# B06_wf3_ProfileCross — DB 사용 관계 + +테이블 정의는 [[db_schema/route_profile]]에서 1차 관리한다. + +| 항목 | 위치 | 역할 | +|---|---|---| +| `longitudinal_sections` | `B06_wf3_ProfileCross_Repository.py:34` | route별 종단 chainage·표고·경사·설계값 저장 | +| `cross_sections` | `B06_wf3_ProfileCross_Repository.py:67` | 측점별 좌우 표고·폭·절성토 데이터 저장 | + +## Repository 함수 +| 항목 | 위치 | 역할 | +|---|---|---| +| `_validate_stage_path()` | `B06_wf3_ProfileCross_Repository.py:18` | WF3 상대경로 이탈 방지 | +| `delete_sections_for_route()` | `B06_wf3_ProfileCross_Repository.py:27` | 재생성 전 기존 종횡단 삭제 | +| `create_longitudinal_section()` | `B06_wf3_ProfileCross_Repository.py:34` | 종단면 레코드 생성 | +| `insert_cross_sections()` | `B06_wf3_ProfileCross_Repository.py:67` | 횡단면 일괄 저장 | +| `get_longitudinal_section()` | `B06_wf3_ProfileCross_Repository.py:109` | 종단·횡단 결과 조회 | +| `confirm_sections_for_route()` | `B06_wf3_ProfileCross_Repository.py:135` | route 종횡단 상태 확정 | + +## 파일 경로 +| 항목 | 역할 | +|---|---| +| `longitudinal_file_path` | `B06_wf3_ProfileCross/longitudinal/` 산출물 상대경로 | +| `cross_section_file_path` | `B06_wf3_ProfileCross/cross_sections/` 산출물 상대경로 | + +상세 저장 규칙: [[storage_paths]]. diff --git a/docs/wiki/pages/B06_wf3_ProfileCross/B06_dependencies.md b/docs/wiki/pages/B06_wf3_ProfileCross/B06_dependencies.md new file mode 100644 index 0000000..ffdf7e9 --- /dev/null +++ b/docs/wiki/pages/B06_wf3_ProfileCross/B06_dependencies.md @@ -0,0 +1,27 @@ +--- +type: page-dependencies +status: stable +page_id: B06_wf3_ProfileCross +related_pages: ["[[B06_wf3_ProfileCross/B06_frontend]]", "[[B06_wf3_ProfileCross/B06_backend]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B06_wf3_ProfileCross import 구문·엔진 직접 확인 (2026-07-12) +--- + +# B06_wf3_ProfileCross — Dependencies + +공유 의존성 정의는 [[../../concepts/dependencies]]에 둔다. + +| 항목 | 위치 | 역할 | +|---|---|---| +| NumPy | `B06_wf3_ProfileCross_Engine_Section.py:1` | 경로·chainage·단면 샘플 배열 계산 | +| SciPy | `B06_wf3_ProfileCross_Engine_Sampler.py:1` | 표면 보간 sampler | +| aiomysql | `B06_wf3_ProfileCross_Repository.py:1` | 종횡단 Raw SQL 저장·조회 | +| Pydantic | `B06_wf3_ProfileCross_Schema.py:5` | 생성·조회·확정 요청 검증 | +| FastAPI | `B06_wf3_ProfileCross_Router.py:1` | sections API 라우터 | + +## 공통 모듈 +| 항목 | 위치 | 역할 | +|---|---|---| +| `common_util_workflow_state` | `B06_wf3_ProfileCross_Router.py:29` | stage 3 상태 전이 → [[../../concepts/workflow_state]] | +| `common_util_storage` | `B06_wf3_ProfileCross_Engine.py:1` | 프로젝트 상대경로 해석 → [[../../concepts/storage_paths]] | +| `ui_template_workflow_layout` | `B06_wf3_ProfileCross_UI_Page.ts:23` | 공통 workflow 화면 구성 | diff --git a/docs/wiki/pages/B06_wf3_ProfileCross/B06_frontend.md b/docs/wiki/pages/B06_wf3_ProfileCross/B06_frontend.md new file mode 100644 index 0000000..b3a4415 --- /dev/null +++ b/docs/wiki/pages/B06_wf3_ProfileCross/B06_frontend.md @@ -0,0 +1,40 @@ +--- +type: page-frontend +status: stable +page_id: B06_wf3_ProfileCross +related_pages: ["[[B06_wf3_ProfileCross/B06_backend]]", "[[B06_wf3_ProfileCross/B06_api]]", "[[B06_wf3_ProfileCross/B06_db]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B06_wf3_ProfileCross 실 코드 직접 확인 (2026-07-12) +--- + +# B06_wf3_ProfileCross — Frontend + +## 화면·workflow +| 항목 | 위치 | 역할 | +|---|---|---| +| `renderB06ProfileCross()` | `B06_wf3_ProfileCross_UI_Page.ts:57` | 측점·횡단 옵션·결과 메트릭 화면 렌더링 | +| 종횡단 생성 실행 | `B06_wf3_ProfileCross_UI_Page.ts:201` | 입력 옵션을 `generateSections()`로 전송 | +| 종횡단 확정 | `B06_wf3_ProfileCross_UI_Page.ts:233` | route별 종횡단을 `confirmSections()`로 확정 | +| workflow 상태 조회 | `B06_wf3_ProfileCross_UI_Page.ts:259` | 단계 상태와 진입 가능 단계 조회 | +| workflow layout 구성 | `B06_wf3_ProfileCross_UI_Page.ts:271` | 공통 단계·경로·상태 표시 | + +## API 클라이언트 +| 항목 | 위치 | 역할 | +|---|---|---| +| `generateSections()` | `B06_wf3_ProfileCross_Api_Fetch.ts:82` | 종단면·횡단면 생성 요청 | +| `getSections()` | `B06_wf3_ProfileCross_Api_Fetch.ts:93` | route별 결과 요약 조회 | +| `confirmSections()` | `B06_wf3_ProfileCross_Api_Fetch.ts:103` | 생성 결과 확정 요청 | +| `SectionGenerateRequest` | `B06_wf3_ProfileCross_Api_Fetch.ts:18` | 측점·폭·샘플 간격 입력 타입 | +| `SectionGenerateResponse` | `B06_wf3_ProfileCross_Api_Fetch.ts:31` | 종단 ID·횡단 개수·길이·파일경로 타입 | + +## 입력 옵션 +| 항목 | 역할 | +|---|---| +| `route_id` | 확정된 B05 경로 선택 | +| `filter_key`, `method`, `smooth`, `crs` | 지표면 필터·표현·평활화·좌표계 | +| `station_interval_m` | 종단 측점 간격 | +| `cross_half_width_m` | 횡단 좌우 반폭 | +| `cross_sample_interval_m` | 횡단 표고 샘플 간격 | +| `long_sample_interval_m` | 종단 표고 샘플 간격 | + +현재 코드에는 종단도·횡단 프로필을 WebCAD로 렌더링하는 전용 뷰어가 없다. diff --git a/docs/wiki/pages/B07_wf4_DesignDetail/B07_frontend.md b/docs/wiki/pages/B07_wf4_DesignDetail/B07_frontend.md new file mode 100644 index 0000000..2d247fb --- /dev/null +++ b/docs/wiki/pages/B07_wf4_DesignDetail/B07_frontend.md @@ -0,0 +1,45 @@ +--- +status: stable +page_id: B07_wf4_DesignDetail +related_pages: ["[[B06_wf3_ProfileCross/B06_backend]]", "[[B08_wf5_Quantity/B08_frontend]]", "[[db_schema/structure_output]]", "[[storage_paths]]"] +last_updated: 2026-07-12 +--- + +# B07_wf4_DesignDetail — Frontend + +WF4 상세 설계(구조물 배치). **워크플로우 셸만 존재, 본문 미구현.** + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `B07_wf4_DesignDetail_UI_Page.ts` | `B07_wf4_DesignDetail/B07_wf4_DesignDetail_UI_Page.ts:1-27` | 워크플로우 셸(헤더+스텝바)만 렌더, 본문은 "준비중" 안내 | + +## 컴포넌트 / 함수 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `renderB07DesignDetail(root)` | `B07_wf4_DesignDetail_UI_Page.ts:20` | `renderPendingWorkflow()` 호출(title, steps, activeStep:4) | + +## 로컬라이제이션 + +| UI 요소 | 로케일 키 | +|---|---| +| 페이지 제목 | `B07_Design_Title` ("4차 · 상세 설계") | + +## 의존성 + +- [[a00_app_shell_framework]] — `renderPendingWorkflow()`, `workflowSteps()` (b_page_scaffold, B04~B09 공용 셸 헬퍼) +- [[ui_templates]] — `ui_locales`, `currentLanguageIndex` + +## 백엔드/DB — 미착수 (계획적 범위 제외) + +- 백엔드(Schema/Engine/Repository/Router) 파일 자체가 존재하지 않음 +- `raw/guidelines/migration_plan.md:271` — **"B07 이후 기능은 이번 마이그레이션 범위에서 제외한다"** (계획 단계에서 명시적으로 제외) +- `raw/guidelines/structure.md:173-174`도 B07을 "워크플로우 셸"로만 기술 — 실 코드와 일치 +- DB는 `structures` 테이블 예정 (컬럼 정의는 계획서 기준) → [[db_schema/structure_output]] (사용처에 B07 이미 등록됨) + +## 참고 + +- 이 페이지는 B08/B09와 함께 "셸만 존재" 3종 중 하나. 실 코드·raw 문서 모두 미착수로 일관되게 확인됨(모순 없음) +- 향후 구현 시 `structures` 테이블(구조물 유형: 낙석방지책/돌붙임/계간수로 등) 기준 계획서 필요 diff --git a/docs/wiki/pages/B08_wf5_Quantity/B08_db.md b/docs/wiki/pages/B08_wf5_Quantity/B08_db.md new file mode 100644 index 0000000..49e877c --- /dev/null +++ b/docs/wiki/pages/B08_wf5_Quantity/B08_db.md @@ -0,0 +1,29 @@ +--- +type: page-db +status: stable +page_id: B08_wf5_Quantity +related_pages: ["[[B08_wf5_Quantity/B08_frontend]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B08 코드 부재 확인 + DB 개념 문서 대조 (2026-07-12) +--- + +# B08_wf5_Quantity — DB + +현재 B08 코드에는 Repository·라우터·DB 쓰기 구현이 없다. 아래는 프로젝트 DB 설계상 예정된 사용 관계다. + +| 항목 | 위치 | 역할 | +|---|---|---| +| `quantity_items` | [[db_schema/structure_output]] | 토공·구조물·포장·배수·녹화·안전시설별 수량과 단가 저장 예정 | +| `quantity_data_path` | [[db_schema/overview]] | B08 수량 산출 파일 상대경로 저장 예정 | + +## 구현 대기 항목 +| 항목 | 현재 상태 | +|---|---| +| B08 Repository | 파일 없음 | +| B08 Router/API | 파일 없음 | +| Pydantic 스키마 | 파일 없음 | +| 수량 계산 엔진 | 파일 없음 | +| `quantity_items` INSERT/UPDATE | 미구현 | +| WF5 상태 전이 | 미구현 | + +저장 폴더 계획: `storage/{company_slug}/{user_slug}/{project_id}/B08_wf5_Quantity/quantities/` → [[storage_paths]]. diff --git a/docs/wiki/pages/B08_wf5_Quantity/B08_frontend.md b/docs/wiki/pages/B08_wf5_Quantity/B08_frontend.md new file mode 100644 index 0000000..32cdbd6 --- /dev/null +++ b/docs/wiki/pages/B08_wf5_Quantity/B08_frontend.md @@ -0,0 +1,42 @@ +--- +type: page-frontend +status: stable +page_id: B08_wf5_Quantity +related_pages: ["[[B08_wf5_Quantity/B08_db]]"] +last_updated: 2026-07-12 +source: 상위 프로젝트 B08_wf5_Quantity 실 코드 직접 확인 (2026-07-12) +--- + +# B08_wf5_Quantity — Frontend + +## 현재 구현 +| 항목 | 위치 | 역할 | +|---|---|---| +| `renderB08Quantity()` | `B08_wf5_Quantity_UI_Page.ts:20` | B08 수량 산출 페이지 진입점 | +| `renderPendingWorkflow()` | `B08_wf5_Quantity_UI_Page.ts:21` | 공통 준비 중 workflow 셸 렌더링 | +| `workflowSteps()` | `B08_wf5_Quantity_UI_Page.ts:23` | 전체 workflow 단계 표시 | +| `L()` | `B08_wf5_Quantity_UI_Page.ts:14` | 한·영 locale 문자열 선택 | + +## 화면 상태 +| 항목 | 값 | +|---|---| +| 제목 | `ui_locales[B08_Quantity_Title]` | +| 활성 단계 | `activeStep: 5` (WF5) | +| 본문 | 미구현; 헤더와 workflow step bar만 표시 | +| 수량 계산 API | 미구현 | +| 수량 결과 테이블·차트 | 미구현 | +| WebCAD/산출물 뷰어 | 미구현 | + +## 계획 책임 +| 항목 | 계획 역할 | +|---|---| +| 토공·구조물·포장·배수 등 수량 산출 | B07 종횡단·구조물 결과를 수량 항목으로 집계 | +| 수량 결과 저장 | `quantity_items`와 `quantity_data_path` 사용 → [[B08_wf5_Quantity/B08_db]] | +| 다음 단계 연결 | WF6 견적·문서 산출로 전달 | + +공통 셸·locale은 [[../../concepts/a00_app_shell_framework]], [[../../concepts/ui_templates]]를 참조한다. + +## 기술부채 +| 항목 | 위치 | 역할 | +|---|---|---| +| 본문 미구현 | `B08_wf5_Quantity_UI_Page.ts:5` | 수량 계산·조회·확정 기능 설계와 구현 필요 | diff --git a/docs/wiki/pages/B09_wf6_Estimation/B09_frontend.md b/docs/wiki/pages/B09_wf6_Estimation/B09_frontend.md new file mode 100644 index 0000000..fce0067 --- /dev/null +++ b/docs/wiki/pages/B09_wf6_Estimation/B09_frontend.md @@ -0,0 +1,45 @@ +--- +status: stable +page_id: B09_wf6_Estimation +related_pages: ["[[B08_wf5_Quantity/B08_frontend]]", "[[db_schema/structure_output]]", "[[storage_paths]]"] +last_updated: 2026-07-12 +--- + +# B09_wf6_Estimation — Frontend + +WF6 견적·문서 산출(Excel/PDF/DXF). **워크플로우 셸만 존재, 본문 미구현.** + +## 파일 구조 + +| 파일 | 위치 | 역할 | +|---|---|---| +| `B09_wf6_Estimation_UI_Page.ts` | `B09_wf6_Estimation/B09_wf6_Estimation_UI_Page.ts:1-27` | 워크플로우 셸(헤더+스텝바)만 렌더, 본문은 "준비중" 안내 | + +## 컴포넌트 / 함수 + +| 함수 | 위치 | 역할 | +|---|---|---| +| `renderB09Estimation(root)` | `B09_wf6_Estimation_UI_Page.ts:20` | `renderPendingWorkflow()` 호출(title, steps, activeStep:6) | + +## 로컬라이제이션 + +| UI 요소 | 로케일 키 | +|---|---| +| 페이지 제목 | `B09_Estimation_Title` ("6차 · 견적·문서") | + +## 의존성 + +- [[a00_app_shell_framework]] — `renderPendingWorkflow()`, `workflowSteps()` (b_page_scaffold, B04~B09 공용 셸 헬퍼) +- [[ui_templates]] — `ui_locales`, `currentLanguageIndex` + +## 백엔드/DB — 미착수 + +- 백엔드(Schema/Engine/Repository/Router) 파일 자체가 존재하지 않음 +- `raw/guidelines/structure.md:177-178`도 B09를 "워크플로우 셸"로만 기술 — 실 코드와 일치 +- DB는 `outputs`/`output_files` 테이블 예정 → [[db_schema/structure_output]] (사용처에 B09 이미 등록됨) +- 산출물 버전 관리(v1/, v2/, ...)는 워크플로우 전체에서 **이 단계에서만** 사용 → [[storage_paths]] (경로패턴 20줄, B09 이미 related_pages 등록됨) + +## 참고 + +- B07/B08과 함께 "셸만 존재" 3종 중 하나. 실 코드·raw 문서 모두 미착수로 일관되게 확인됨(모순 없음) +- 향후 구현 시 Excel/PDF/DXF 3종 산출물 생성 로직 + `outputs_directory_path`/`output_file_path` 경로 기록 필요 diff --git a/init_db.py b/init_db.py deleted file mode 100644 index 2933247..0000000 --- a/init_db.py +++ /dev/null @@ -1,51 +0,0 @@ -"""DB 마이그레이션 실행 스크립트.""" - -import asyncio -import sys -from pathlib import Path - -import aiomysql - -from config.config_db import DB_HOST, DB_NAME, DB_PASSWORD, DB_PORT, DB_USER - - -async def run_migration(): - """SQL 마이그레이션 파일 실행.""" - connection = await aiomysql.connect( - host=DB_HOST, - port=DB_PORT, - user=DB_USER, - password=DB_PASSWORD, - db=DB_NAME, - charset="utf8mb4", - ) - - try: - async with connection.cursor() as cursor: - migration_file = Path(__file__).parent / "migrations" / "001_create_upload_tables.sql" - sql_content = migration_file.read_text(encoding="utf-8") - - # SQL 파일의 각 명령문 실행 (';'으로 분리) - statements = [stmt.strip() for stmt in sql_content.split(";") if stmt.strip()] - - for i, stmt in enumerate(statements, 1): - print(f"[{i}/{len(statements)}] executing...") - await cursor.execute(stmt) - print(f" OK") - - await connection.commit() - print("\nMigration complete!") - return True - - except Exception as e: - print(f"\nMigration failed: {e}") - await connection.rollback() - return False - - finally: - connection.close() - - -if __name__ == "__main__": - success = asyncio.run(run_migration()) - sys.exit(0 if success else 1) diff --git a/main.py b/main.py index 189a8c5..01d9a91 100644 --- a/main.py +++ b/main.py @@ -28,6 +28,7 @@ from B01_Dashboard.B01_Dashboard_Router import router as b01_dashboard_router from B02_ProjRegister.B02_ProjRegister_Router import router as b02_proj_register_router from B03_FileInput.B03_FileInput_Router import router as b03_file_input_router from B04_wf1_Surface.B04_wf1_Surface_Router import router as b04_surface_router +from B04_wf1_Surface.B04_wf1_Surface_Router import tiles_router from B05_wf2_Route.B05_wf2_Route_Router import router as b05_route_router from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Router import router as b06_section_router from common_util.common_util_auth import require_company, verify_session @@ -244,9 +245,11 @@ protected = [Depends(verify_session)] protected_with_company = [Depends(verify_session), Depends(require_company)] app.include_router(b03_file_input_router, dependencies=protected_with_company) app.include_router(b04_surface_router, dependencies=protected_with_company) +app.include_router(tiles_router, dependencies=protected_with_company) app.include_router(b05_route_router, dependencies=protected_with_company) app.include_router(b06_section_router, dependencies=protected_with_company) + # ───────────────────────────────────────────────────────────────────────── # 앱 실행 # ───────────────────────────────────────────────────────────────────────── diff --git a/requirements.txt b/requirements.txt index a9d80eb..6269631 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,6 +19,7 @@ idna==3.18 ImageIO==2.37.3 Jinja2==3.1.2 laspy==2.4.1 +mapbox-vector-tile>=2.0.1 lazy-loader==0.5 MarkupSafe==3.0.3 networkx==3.6.1 diff --git a/scratch_inspect.py b/scratch_inspect.py deleted file mode 100644 index a4a9797..0000000 --- a/scratch_inspect.py +++ /dev/null @@ -1,9 +0,0 @@ -import re - -path = "D:/02_Software_Prog/임도설계 및 견적자동화 프로그램 개발/0_old/main.py" -with open(path, "r", encoding="utf-8") as f: - code = f.read() - -print("--- Endpoints ---") -for m in re.finditer(r'@app\.(get|post)\("([^"]+)"\)', code): - print(m.group(0)) diff --git a/ui_template/ui_template_locale.ts b/ui_template/ui_template_locale.ts index 4696eb5..3d32c03 100644 --- a/ui_template/ui_template_locale.ts +++ b/ui_template/ui_template_locale.ts @@ -557,7 +557,7 @@ export const ui_locales = { B03_File_Group_Optional: ["선택 파일", "Optional files"], B03_File_Slot_PointCloud: ["포인트클라우드", "Point Cloud"], B03_File_Slot_Projection: ["좌표계 정의", "Projection"], - B03_File_Slot_RasterCoord: ["래스터 좌표", "Raster Coord"], + B03_File_Slot_RasterCoord: ["래스터 좌표", "Raster Coord 1"], B03_File_Slot_TerrainDem: ["지형 래스터", "Terrain DEM"], B03_File_Slot_CadDrawing: ["CAD 도면", "CAD Drawing"], B03_File_Card_Select: ["파일 선택", "Select file"], diff --git a/ui_template/ui_template_workflow_layout.ts b/ui_template/ui_template_workflow_layout.ts index fd96719..4b841d9 100644 --- a/ui_template/ui_template_workflow_layout.ts +++ b/ui_template/ui_template_workflow_layout.ts @@ -43,20 +43,12 @@ function createStepBar( if (index === activeStep) button.classList.add("is-active"); button.textContent = step; - // DB state 기반 활성화 로직 - let enabled = false; - if (options?.stages && options.stages.length > 0) { - enabled = index === 0 || options.stages[index - 1]?.state === "COMPLETE"; - } else { - enabled = index <= activeStep; - } + // 스텝바는 항상 자유롭게 이동 가능(게이팅하지 않음). + // 단계 완료/무효화 판정은 사용자가 각 페이지의 액션 버튼(업로드·분석 실행 등)을 + // 눌렀을 때 백엔드가 계산·DB 갱신하며, 여기서는 그 결과를 색상/툴팁으로 표시만 한다. + button.classList.add("is-enabled"); - button.disabled = !enabled; - if (enabled) { - button.classList.add("is-enabled"); - } - - // state 기반 스타일링 + // state 기반 스타일링 (표시 전용) if (options?.stages && options.stages[index]) { const state = options.stages[index].state; button.classList.add(`state-${state.toLowerCase()}`); @@ -73,8 +65,8 @@ function createStepBar( } } - // 클릭 이벤트 - if (enabled && options?.routes && options?.routes[index]) { + // 클릭 이벤트 — 모든 스텝에서 이동 허용 + if (options?.routes && options?.routes[index]) { button.addEventListener("click", () => { options.onStepClick?.(index, options.routes![index]); }); diff --git a/vite-dev.out.log b/vite-dev.out.log index 76a6a1d..d1a3e11 100644 --- a/vite-dev.out.log +++ b/vite-dev.out.log @@ -7,3 +7,4 @@ Port 5173 is in use, trying another one... VITE v8.1.0 ready in 295 ms ➜ Local: http://127.0.0.1:5174/ +오후 7:36:11 [vite] (client) page reload app_shell.ts diff --git a/wiki/설계자동화/.obsidian/app.json b/wiki/설계자동화/.obsidian/app.json deleted file mode 100644 index 9e26dfe..0000000 --- a/wiki/설계자동화/.obsidian/app.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/wiki/설계자동화/환영합니다!.md b/wiki/설계자동화/환영합니다!.md deleted file mode 100644 index d80d118..0000000 --- a/wiki/설계자동화/환영합니다!.md +++ /dev/null @@ -1,5 +0,0 @@ -새로운 *보관함*입니다. - -내용을 한번 적어보세요, [[create a link]], 혹은 [임포터](https://help.obsidian.md/Plugins/Importer)를 사용해봐도 좋습니다! - -준비가 됐다면 이 노트를 삭제하고 맞춤형 보관함을 만들어보세요. \ No newline at end of file