[{"data":1,"prerenderedAt":4754},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fcli":135,"\u002Fdocs\u002Fcli-surround":4749},[4],{"title":5,"path":6,"stem":7,"children":8,"page":134},"Docs","\u002Fdocs","docs",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130],{"title":10,"path":11,"stem":12},"AI harnesses: LLM tools, MCP servers and agents","\u002Fdocs\u002Fai-tools","docs\u002Fai-tools",{"title":14,"path":15,"stem":16},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002Farchitecture",{"title":18,"path":19,"stem":20},"Web \u002F native bridges","\u002Fdocs\u002Fbridges","docs\u002Fbridges",{"title":22,"path":23,"stem":24},"Broadcast channels and tests","\u002Fdocs\u002Fchannels-and-tests","docs\u002Fchannels-and-tests",{"title":26,"path":27,"stem":28},"CLI reference","\u002Fdocs\u002Fcli","docs\u002Fcli",{"title":30,"path":31,"stem":32},"Completeness: how far an answer reaches","\u002Fdocs\u002Fcompleteness","docs\u002Fcompleteness",{"title":34,"path":35,"stem":36},"Configuration","\u002Fdocs\u002Fconfiguration","docs\u002Fconfiguration",{"title":38,"path":39,"stem":40},"External systems","\u002Fdocs\u002Fexternal","docs\u002Fexternal",{"title":42,"path":43,"stem":44},"Generated, copied and vendored files","\u002Fdocs\u002Fgenerated","docs\u002Fgenerated",{"title":46,"path":47,"stem":48},"Installing and updating cg","\u002Fdocs\u002Finstall","docs\u002Finstall",{"title":50,"path":51,"stem":52},"Java","\u002Fdocs\u002Fjava","docs\u002Fjava",{"title":54,"path":55,"stem":56},"Kotlin","\u002Fdocs\u002Fkotlin","docs\u002Fkotlin",{"title":58,"path":59,"stem":60},"Known limitations","\u002Fdocs\u002Flimitations","docs\u002Flimitations",{"title":62,"path":63,"stem":64,"children":65},"MCP server","\u002Fdocs\u002Fmcp","docs\u002Fmcp",[66],{"title":67,"path":68,"stem":69},"code-graph MCP: sample outputs (real calls via the MCP Python SDK stdio client)","\u002Fdocs\u002Fmcp\u002Fsample_outputs","docs\u002Fmcp\u002Fsample_outputs",{"title":71,"path":72,"stem":73},"Rust, C and C++","\u002Fdocs\u002Fnative","docs\u002Fnative",{"title":75,"path":76,"stem":77},"Port gaps: cg parity","\u002Fdocs\u002Fparity","docs\u002Fparity",{"title":79,"path":80,"stem":81},"PHP","\u002Fdocs\u002Fphp","docs\u002Fphp",{"title":83,"path":84,"stem":85},"Planned changes","\u002Fdocs\u002Fplans","docs\u002Fplans",{"title":87,"path":88,"stem":89},"Platform-specific code","\u002Fdocs\u002Fplatforms","docs\u002Fplatforms",{"title":91,"path":92,"stem":93},"Protocol links","\u002Fdocs\u002Fprotocols","docs\u002Fprotocols",{"title":95,"path":96,"stem":97},"Python","\u002Fdocs\u002Fpython","docs\u002Fpython",{"title":99,"path":100,"stem":101},"Quick start","\u002Fdocs\u002Fquickstart","docs\u002Fquickstart",{"title":103,"path":104,"stem":105},"Graph schema","\u002Fdocs\u002Fschema","docs\u002Fschema",{"title":107,"path":108,"stem":109},"Attack surface","\u002Fdocs\u002Fsurface","docs\u002Fsurface",{"title":111,"path":112,"stem":113},"Swift","\u002Fdocs\u002Fswift","docs\u002Fswift",{"title":115,"path":116,"stem":117},"TypeScript \u002F JavaScript frameworks","\u002Fdocs\u002Fts-frameworks","docs\u002Fts-frameworks",{"title":119,"path":120,"stem":121},"How we validate","\u002Fdocs\u002Fvalidation","docs\u002Fvalidation",{"title":123,"path":124,"stem":125},"Validation log","\u002Fdocs\u002Fvalidation-log","docs\u002Fvalidation-log",{"title":127,"path":128,"stem":129},"Value facts and resolutions","\u002Fdocs\u002Fvalue-facts","docs\u002Fvalue-facts",{"title":131,"path":132,"stem":133},"Visual view","\u002Fdocs\u002Fviz","docs\u002Fviz",false,{"id":136,"title":26,"body":137,"description":4743,"extension":4744,"meta":4745,"navigation":4746,"path":27,"seo":4747,"stem":28,"__hash__":4748},"docs\u002Fdocs\u002Fcli.md",{"type":138,"value":139,"toc":4722},"minimark",[140,160,165,1536,1540,1824,1839,1842,1868,1907,1951,1963,1970,2017,2025,2055,2069,2073,2348,2421,2425,2611,2615,2624,2720,2726,2794,2798,2811,2873,2879,2903,2907,2939,2945,2949,2975,2981,2985,2990,3170,3176,3188,3194,3197,3207,3233,3235,3245,3248,3293,3296,3343,3357,3408,3410,3431,3446,3451,3487,3518,3630,3633,3669,3684,3731,3748,3775,3777,3801,4058,4075,4082,4084,4128,4155,4220,4294,4375,4398,4400,4414,4471,4543,4545,4567,4604,4696,4718],[141,142,143,147,148,151,152,155,156,159],"p",{},[144,145,146],"code",{},"cg \u003Ccommand>"," is ",[144,149,150],{},"python -m cg_code_graph.cli \u003Ccommand>",". Query commands need ",[144,153,154],{},"--db",". Flags not listed here: ",[144,157,158],{},"cg \u003Ccommand> -h",".",[161,162,164],"h2",{"id":163},"commands-at-a-glance","Commands at a glance",[166,167,168,184],"table",{},[169,170,171],"thead",{},[172,173,174,178,181],"tr",{},[175,176,177],"th",{},"Command",[175,179,180],{},"One line",[175,182,183],{},"Detail",[185,186,187,220,235,262,280,300,332,402,417,455,480,506,520,534,549,570,603,625,640,655,723,764,779,799,832,858,878,921,958,1023,1074,1165,1191,1214,1249,1281,1302,1340,1365,1394,1410,1432,1460,1476,1495,1515],"tbody",{},[172,188,189,195,213],{},[190,191,192],"td",{},[144,193,194],{},"index ROOT --db DB",[190,196,197,198,201,202,201,205,208,209,212],{},"Build the graph. Stats JSON on stdout; coverage on stderr. ",[144,199,200],{},"--name",", ",[144,203,204],{},"--gates",[144,206,207],{},"--scip"," (repeatable). Missing toolchain skips that language. Invalid ",[144,210,211],{},".cg.yaml"," exits 2.",[190,214,215],{},[216,217,219],"a",{"href":218},"\u002Fdocs\u002Fconfiguration#project-file","configuration",[172,221,222,227,230],{},[190,223,224],{},[144,225,226],{},"detect ROOT",[190,228,229],{},"Languages and frameworks under ROOT, no index.",[190,231,232],{},[144,233,234],{},"cg detect -h",[172,236,237,242,257],{},[190,238,239],{},[144,240,241],{},"doctor [ROOT]",[190,243,244,245,248,249,252,253,256],{},"Versions, extractors, and exact \u002F heuristic \u002F unavailable per language. ROOT limits this to the project. ",[144,246,247],{},"--scip FILE"," checks an index (repeatable). A module that fails to import exits 1. Says when a newer release is on PyPI (one request with a 2 s timeout, cached for a day; silent offline; off with ",[144,250,251],{},"CG_NO_UPDATE_CHECK=1"," and under CI). ",[144,254,255],{},"cg --version"," repeats that notice from the cache and never connects.",[190,258,259],{},[216,260,261],{"href":47},"install",[172,263,264,269,276],{},[190,265,266],{},[144,267,268],{},"setup [LANG]...",[190,270,271,272,275],{},"Install TypeScript \u002F PHP \u002F Dart extractors now (",[144,273,274],{},"--quiet","). Default: every language whose toolchain is present.",[190,277,278],{},[216,279,261],{"href":47},[172,281,282,287,294],{},[190,283,284],{},[144,285,286],{},"setup --prune",[190,288,289,290,293],{},"Remove extractor installs this cg does not use. ",[144,291,292],{},"--dry-run"," lists them. A held lock is kept.",[190,295,296],{},[216,297,299],{"href":298},"#clean","clean",[172,301,302,307,328],{},[190,303,304],{},[144,305,306],{},"config show|validate [ROOT]",[190,308,309,310,312,313,201,316,319,320,323,324,327],{},"Effective config and where each value comes from, or check ",[144,311,211],{}," (exit 2 if invalid). Same flags as ",[144,314,315],{},"index",[144,317,318],{},"routes",", and ",[144,321,322],{},"serve"," (",[144,325,326],{},"--no-apps"," included).",[190,329,330],{},[216,331,219],{"href":218},[172,333,334,339,397],{},[190,335,336],{},[144,337,338],{},"coverage --db DB",[190,340,341,342,345,346,349,350,353,354,357,358,357,361,357,364,367,368,371,372,375,376,379,380,383,384,201,387,201,390,379,393,396],{},"One-line summary per repo and per language that is not fully indexed. Every non-zero bucket is on that line, ",[144,343,344],{},"excluded"," included, and ",[144,347,348],{},"indexed"," plus the buckets equals ",[144,351,352],{},"discovered",". A TypeScript-plugin entry with no ",[144,355,356],{},".ts"," \u002F ",[144,359,360],{},".tsx",[144,362,363],{},".mts",[144,365,366],{},".cts"," files is labelled ",[144,369,370],{},"javascript"," (JSON keeps ",[144,373,374],{},"language"," and adds ",[144,377,378],{},"label","). ",[144,381,382],{},"--details"," names each excluded file with why (",[144,385,386],{},"tool config",[144,388,389],{},"test file",[144,391,392],{},".cg.yaml exclude",[144,394,395],{},"--all-files"," lists every path.",[190,398,399],{},[216,400,401],{"href":31},"completeness",[172,403,404,409,412],{},[190,405,406],{},[144,407,408],{},"starters --db DB",[190,410,411],{},"Starter queries, each with the matching command and MCP call.",[190,413,414],{},[216,415,416],{"href":132},"viz",[172,418,419,424,449],{},[190,420,421],{},[144,422,423],{},"link --backend DB --frontend DB --db OUT",[190,425,426,427,357,430,433,434,437,438,441,442,445,446,159],{},"Merge graphs and match client HTTP calls to routes. Two repos: ",[144,428,429],{},"--backend",[144,431,432],{},"--frontend",". N repos: repeat ",[144,435,436],{},"--repo NAME=DB[:role]",". ",[144,439,440],{},"--report PREFIX"," writes ",[144,443,444],{},".json"," and ",[144,447,448],{},".md",[190,450,451],{},[216,452,454],{"href":453},"#workspace","workspace",[172,456,457,462,474],{},[190,458,459],{},[144,460,461],{},"reaches SPEC...",[190,463,464,465,468,469,473],{},"Dependents, grouped by entry classification. On a base method, overrides are followed. A table target also follows its columns. ",[144,466,467],{},"--connection NAME"," keeps one database connection (",[216,470,472],{"href":471},"#database-connections","connections",").",[190,475,476],{},[216,477,479],{"href":478},"#query-targets-specs","specs",[172,481,482,487,500],{},[190,483,484],{},[144,485,486],{},"impact SPEC",[190,488,489,490,493,494,497,498,473],{},"Callers up to entry points. ",[144,491,492],{},"--plans-dir"," adds external snapshot clients. A ",[144,495,496],{},"connections:"," line lists the non-default database connections the function's own table \u002F column edges go to (",[216,499,472],{"href":471},[190,501,502],{},[216,503,505],{"href":504},"#answer-shape","answer shape",[172,507,508,513,516],{},[190,509,510],{},[144,511,512],{},"downstream SPEC",[190,514,515],{},"Forward walk: page, composables, HTTP, routes, services, tables.",[190,517,518],{},[216,519,479],{"href":478},[172,521,522,527,530],{},[190,523,524],{},[144,525,526],{},"path SRC DST",[190,528,529],{},"One shortest evidence chain. No path: reason on stdout, exit 1.",[190,531,532],{},[216,533,505],{"href":504},[172,535,536,540,543],{},[190,537,538],{},[144,539,318],{},[190,541,542],{},"Guards, what the route reaches, and frontend callers on a linked graph.",[190,544,545],{},[216,546,548],{"href":547},"#routes-and-guards","routes and guards",[172,550,551,556,565],{},[190,552,553],{},[144,554,555],{},"search NAME",[190,557,558,559,201,562,159],{},"Nodes by name or FQN substring, plus middleware \u002F guard \u002F auth names. ",[144,560,561],{},"--kind",[144,563,564],{},"--limit",[190,566,567],{},[144,568,569],{},"cg search -h",[172,571,572,577,599],{},[190,573,574],{},[144,575,576],{},"snippet SPEC",[190,578,579,580,583,584,201,587,590,591,594,595,598],{},"Source from the index: ",[144,581,582],{},"path:start-end",", then numbered lines. ",[144,585,586],{},"--context",[144,588,589],{},"--max-lines"," (default 200). Ambiguous name lists candidates and exits nonzero; that reply and a miss end with a ",[144,592,593],{},"cg search \u003Cname>"," hint (the MCP ",[144,596,597],{},"snippet"," tool says the same).",[190,600,601],{},[216,602,479],{"href":478},[172,604,605,610,619],{},[190,606,607],{},[144,608,609],{},"explore QUERY",[190,611,612,613,201,616,159],{},"Question or spec → source, entry points, call paths, blast radius in one answer. ",[144,614,615],{},"--budget",[144,617,618],{},"--json",[190,620,621],{},[216,622,624],{"href":623},"#explore","explore",[172,626,627,632,635],{},[190,628,629],{},[144,630,631],{},"node SPEC",[190,633,634],{},"Location, fqn, platforms, attrs, and edges (one site, with a count).",[190,636,637],{},[144,638,639],{},"cg node -h",[172,641,642,647,650],{},[190,643,644],{},[144,645,646],{},"stats",[190,648,649],{},"Project, languages, coverage line, node and edge counts.",[190,651,652],{},[144,653,654],{},"cg stats -h",[172,656,657,662,717],{},[190,658,659],{},[144,660,661],{},"writers SPEC",[190,663,664,665,201,668,201,671,379,674,147,677,201,679,201,682,201,685,201,688,691,692,695,696,698,699,323,702,201,704,201,707,710,711,437,714,716],{},"Writers of a table, a column, or a stored property (",[144,666,667],{},"WRITES_TABLE",[144,669,670],{},"WRITES_COLUMN",[144,672,673],{},"WRITES_PROP",[144,675,676],{},"SPEC",[144,678,166],{},[144,680,681],{},"table:X",[144,683,684],{},"table.column",[144,686,687],{},"column:table.column",[144,689,690],{},"Type.prop"," or ",[144,693,694],{},"Class::$prop",". A column lists its column writers, then \"table-level writes (columns not recorded)\". ",[144,697,618],{}," rows carry ",[144,700,701],{},"target_kind",[144,703,166],{},[144,705,706],{},"column",[144,708,709],{},"property",") and ",[144,712,713],{},"connection",[144,715,467],{}," keeps one database connection.",[190,718,719],{},[216,720,722],{"href":721},"#readers-and-writers-specs","spec forms",[172,724,725,730,760],{},[190,726,727],{},[144,728,729],{},"readers SPEC",[190,731,732,733,201,736,739,740,742,743,746,747,749,750,753,754,757,758,716],{},"Readers of a table (",[144,734,735],{},"READS_TABLE",[144,737,738],{},"READS_COLUMN"," grouped by column), a column (",[144,741,738],{},"), or a stored property (",[144,744,745],{},"READS_PROP","). Same ",[144,748,676],{}," forms as ",[144,751,752],{},"writers",". Heuristic string matches (",[144,755,756],{},"MENTIONS_COLUMN",") come last and are labelled. ",[144,759,467],{},[190,761,762],{},[216,763,722],{"href":721},[172,765,766,771,774],{},[190,767,768],{},[144,769,770],{},"siblings SYMBOL",[190,772,773],{},"Hierarchy, the same method on siblings, shared resources, co-callers.",[190,775,776],{},[144,777,778],{},"cg siblings -h",[172,780,781,786,793],{},[190,782,783],{},[144,784,785],{},"roundtrip Type.prop",[190,787,788,789,792],{},"Heuristic lossy-write \u002F UI-seed pairs. ",[144,790,791],{},"--tests"," includes test code. Nothing is written to the graph.",[190,794,795],{},[216,796,798],{"href":797},"#heuristics","heuristics",[172,800,801,806,828],{},[190,802,803],{},[144,804,805],{},"lint async-state",[190,807,808,809,201,812,201,815,201,818,437,821,824,825,827],{},"Heuristic rules ",[144,810,811],{},"stale-async-result",[144,813,814],{},"two-writers",[144,816,817],{},"incomplete-cache-key",[144,819,820],{},"echo-suppression",[144,822,823],{},"--rules"," is a subset. ",[144,826,791],{}," includes test code.",[190,829,830],{},[216,831,798],{"href":797},[172,833,834,839,853],{},[190,835,836],{},[144,837,838],{},"api-calls SPEC",[190,840,841,842,201,845,848,849,852],{},"Client endpoints, call sites, request keys, matched route. SPEC is ",[144,843,844],{},"all",[144,846,847],{},"unmatched",", a substring, or a ",[144,850,851],{},"*"," glob.",[190,854,855],{},[144,856,857],{},"cg api-calls -h",[172,859,860,865,872],{},[190,861,862],{},[144,863,864],{},"channels [PATTERN]",[190,866,867,868,871],{},"Who can join, who publishes, who listens. ",[144,869,870],{},"--no-source"," hides source.",[190,873,874],{},[216,875,877],{"href":876},"\u002Fdocs\u002Fchannels-and-tests#broadcast-channels","channels",[172,879,880,885,916],{},[190,881,882],{},[144,883,884],{},"bridges [PATTERN]",[190,886,887,888,323,891,201,894,201,897,201,900,201,903,201,906,201,909,912,913,159],{},"Web \u002F native bridges and Electron \u002F Tauri boundaries. ",[144,889,890],{},"--protocol",[144,892,893],{},"capacitor",[144,895,896],{},"react-native",[144,898,899],{},"flutter",[144,901,902],{},"flutter-event",[144,904,905],{},"electron-ipc",[144,907,908],{},"electron-preload",[144,910,911],{},"tauri","), ",[144,914,915],{},"--unmatched",[190,917,918],{},[216,919,920],{"href":19},"bridges",[172,922,923,928,953],{},[190,924,925],{},[144,926,927],{},"protocols [PATTERN]",[190,929,930,931,201,934,201,937,201,940,201,943,379,946,201,949,952],{},"Summary per protocol, or one endpoint's senders, receivers, guards, and checks (",[144,932,933],{},"no_receiver",[144,935,936],{},"no_sender",[144,938,939],{},"ambiguous",[144,941,942],{},"schema_mismatch",[144,944,945],{},"unguarded",[144,947,948],{},"--side send|receive",[144,950,951],{},"--listeners"," (TCP \u002F UDP binds).",[190,954,955],{},[216,956,957],{"href":92},"protocols",[172,959,960,965,1019],{},[190,961,962],{},[144,963,964],{},"surface",[190,966,967,968,201,971,201,974,201,977,201,979,201,982,201,985,201,988,991,992,201,995,201,998,201,1000,201,1003,201,1006,201,1009,1012,1013,201,1016,159],{},"Security views: findings (",[144,969,970],{},"hardcoded",[144,972,973],{},"plaintext",[144,975,976],{},"unverified",[144,978,945],{},[144,980,981],{},"exposed-listener",[144,983,984],{},"tls-off",[144,986,987],{},"ipc-exposed",[144,989,990],{},"ssrf",") and the inbound \u002F outbound surface. ",[144,993,994],{},"--inbound",[144,996,997],{},"--outbound",[144,999,890],{},[144,1001,1002],{},"--finding",[144,1004,1005],{},"--min-confidence",[144,1007,1008],{},"--format text|json|sarif",[144,1010,1011],{},"--fail-on"," (exit 1), ",[144,1014,1015],{},"--strict",[144,1017,1018],{},"--show-ignored",[190,1020,1021],{},[216,1022,964],{"href":108},[172,1024,1025,1030,1069],{},[190,1026,1027],{},[144,1028,1029],{},"tools [PATTERN]",[190,1031,1032,1033,323,1036,201,1039,201,1042,201,1045,201,1048,201,1051,201,1054,912,1057,201,1060,323,1062,201,1064,201,1066,473],{},"LLM and MCP tools. ",[144,1034,1035],{},"--framework",[144,1037,1038],{},"mcp",[144,1040,1041],{},"openai",[144,1043,1044],{},"anthropic",[144,1046,1047],{},"langchain",[144,1049,1050],{},"openai-agents",[144,1052,1053],{},"llamaindex",[144,1055,1056],{},"custom",[144,1058,1059],{},"--agent",[144,1061,915],{},[144,1063,933],{},[144,1065,936],{},[144,1067,1068],{},"name_collision",[190,1070,1071],{},[216,1072,1073],{"href":11},"ai-tools",[172,1075,1076,1081,1160],{},[190,1077,1078],{},[144,1079,1080],{},"external [PATTERN]",[190,1082,1083,1084,323,1086,201,1089,201,1092,201,1095,201,1098,201,1101,201,1104,201,1107,201,1110,201,1113,201,1116,201,1119,201,1122,201,1125,201,1128,201,1131,201,1134,1137,1138,147,1141,201,1144,201,1147,201,1150,1153,1154,437,1157,159],{},"External systems, who uses them, address and credential source, TLS. ",[144,1085,890],{},[144,1087,1088],{},"postgres",[144,1090,1091],{},"mysql",[144,1093,1094],{},"redis",[144,1096,1097],{},"smtp",[144,1099,1100],{},"amqp",[144,1102,1103],{},"mongodb",[144,1105,1106],{},"ldap",[144,1108,1109],{},"ssh",[144,1111,1112],{},"ftp",[144,1114,1115],{},"s3",[144,1117,1118],{},"https",[144,1120,1121],{},"saas",[144,1123,1124],{},"aws",[144,1126,1127],{},"gcp",[144,1129,1130],{},"azure",[144,1132,1133],{},"k8s",[144,1135,1136],{},"docker",", …). ",[144,1139,1140],{},"--source",[144,1142,1143],{},"literal",[144,1145,1146],{},"env",[144,1148,1149],{},"env-example",[144,1151,1152],{},"compose",", or ",[144,1155,1156],{},"config",[144,1158,1159],{},"--tls-off",[190,1161,1162],{},[216,1163,1164],{"href":39},"external",[172,1166,1167,1172,1186],{},[190,1168,1169],{},[144,1170,1171],{},"tests SPEC",[190,1173,1174,1175,201,1178,1181,1182,1185],{},"Direct and transitive tests. ",[144,1176,1177],{},"--unit-only",[144,1179,1180],{},"--exclude-root"," (repeatable), ",[144,1183,1184],{},"--through-roots",". A file or module spec covers every symbol in it.",[190,1187,1188],{},[216,1189,877],{"href":1190},"\u002Fdocs\u002Fchannels-and-tests#tests",[172,1192,1193,1198,1208],{},[190,1194,1195],{},[144,1196,1197],{},"affected [FILES...]",[190,1199,1200,1201,1204,1205,1207],{},"Tests and entry points a change reaches. ",[144,1202,1203],{},"--base REF"," uses only the touched lines; ",[144,1206,274],{}," prints test files.",[190,1209,1210],{},[216,1211,1213],{"href":1212},"#affected","affected",[172,1215,1216,1221,1244],{},[190,1217,1218],{},[144,1219,1220],{},"parity --db SRC --against TGT",[190,1222,1223,1224,201,1227,1181,1230,437,1233,1236,1237,445,1240,1243],{},"Symbols in SRC with no counterpart in TGT. ",[144,1225,1226],{},"--map",[144,1228,1229],{},"--strip-prefix",[144,1231,1232],{},"--no-fuzzy",[144,1234,1235],{},"--structure"," also pairs by use; ",[144,1238,1239],{},"--no-learn",[144,1241,1242],{},"--write-map"," apply only with it.",[190,1245,1246],{},[216,1247,1248],{"href":76},"parity",[172,1250,1251,1256,1276],{},[190,1252,1253],{},[144,1254,1255],{},"platforms [summary|divergence]",[190,1257,1258,1259,437,1262,147,1264,201,1267,201,1270,1153,1273,159],{},"Targets and tagged symbols, or divergence findings. ",[144,1260,1261],{},"--target",[144,1263,561],{},[144,1265,1266],{},"variants",[144,1268,1269],{},"api_surface",[144,1271,1272],{},"missing_callee",[144,1274,1275],{},"missing_callee_tests",[190,1277,1278],{},[216,1279,1280],{"href":88},"platforms",[172,1282,1283,1288,1297],{},[190,1284,1285],{},[144,1286,1287],{},"resolutions CONCEPT",[190,1289,1290,1291,201,1294,159],{},"Where a value is resolved, its fallbacks, and whether the client sends it. ",[144,1292,1293],{},"--within",[144,1295,1296],{},"--no-client",[190,1298,1299],{},[216,1300,1301],{"href":128},"value facts",[172,1303,1304,1309,1335],{},[190,1305,1306],{},[144,1307,1308],{},"plan ACTION [NAME]",[190,1310,1311,201,1314,201,1317,201,1320,201,1323,437,1326,201,1329,201,1332,159],{},[144,1312,1313],{},"list",[144,1315,1316],{},"load",[144,1318,1319],{},"validate",[144,1321,1322],{},"check",[144,1324,1325],{},"baseline",[144,1327,1328],{},"--verify",[144,1330,1331],{},"--summary",[144,1333,1334],{},"-o",[190,1336,1337],{},[216,1338,1339],{"href":84},"plans",[172,1341,1342,1347,1361],{},[190,1343,1344],{},[144,1345,1346],{},"serve --db DB",[190,1348,1349,1350,201,1353,201,1356,201,1358,159],{},"Local web UI. ",[144,1351,1352],{},"--port",[144,1354,1355],{},"--host",[144,1357,492],{},[144,1359,1360],{},"--presets",[190,1362,1363],{},[216,1364,416],{"href":132},[172,1366,1367,1372,1390],{},[190,1368,1369],{},[144,1370,1371],{},"viz-export MODE SPECS -o OUT",[190,1373,1374,1375,201,1378,201,1381,1153,1384,437,1387,159],{},"Self-contained HTML. MODE is ",[144,1376,1377],{},"reaches",[144,1379,1380],{},"impact",[144,1382,1383],{},"downstream",[144,1385,1386],{},"path",[144,1388,1389],{},"--sinks",[190,1391,1392],{},[216,1393,416],{"href":132},[172,1395,1396,1401,1406],{},[190,1397,1398],{},[144,1399,1400],{},"viz-plan NAME -o OUT",[190,1402,1403,1404,159],{},"Self-contained HTML of a plan on the graph. ",[144,1405,492],{},[190,1407,1408],{},[216,1409,1339],{"href":84},[172,1411,1412,1417,1428],{},[190,1413,1414],{},[144,1415,1416],{},"agents ACTION",[190,1418,1419,1420,1423,1424,1427],{},"Opt-in block in agent guidance files. Previews and asks. ",[144,1421,1422],{},"--mcp"," also writes the ",[144,1425,1426],{},"cg-mcp"," server entry.",[190,1429,1430],{},[216,1431,1038],{"href":63},[172,1433,1434,1441,1455],{},[190,1435,1436,357,1438],{},[144,1437,261],{},[144,1439,1440],{},"uninstall",[190,1442,1443,1444,1447,1448,201,1450,201,1453,159],{},"Register or remove the cg MCP server (key ",[144,1445,1446],{},"cg",") in a host config. ",[144,1449,1355],{},[144,1451,1452],{},"--global",[144,1454,292],{},[190,1456,1457],{},[216,1458,261],{"href":1459},"#install",[172,1461,1462,1467,1470],{},[190,1463,1464],{},[144,1465,1466],{},"hooks install|uninstall|status",[190,1468,1469],{},"Opt-in git hooks that refresh the index after commit, checkout and merge. Nothing is installed by default.",[190,1471,1472],{},[216,1473,1475],{"href":1474},"#hooks","hooks",[172,1477,1478,1483,1491],{},[190,1479,1480],{},[144,1481,1482],{},"refresh ROOT --db DB",[190,1484,1485,1486,201,1488,1490],{},"Re-index when sources changed. ",[144,1487,200],{},[144,1489,274],{},". Hooks run this in the background.",[190,1492,1493],{},[216,1494,1475],{"href":1474},[172,1496,1497,1502,1509],{},[190,1498,1499],{},[144,1500,1501],{},"watch ROOT --db DB",[190,1503,1504,1505,1508],{},"Re-index on save, debounced (",[144,1506,1507],{},"watchfiles"," if installed, else polling). Ctrl-C stops.",[190,1510,1511],{},[216,1512,1514],{"href":1513},"#watch","watch",[172,1516,1517,1522,1532],{},[190,1518,1519],{},[144,1520,1521],{},"clean [ROOT]",[190,1523,1524,1525,1528,1529,159],{},"Cache entries for one project, ",[144,1526,1527],{},"--stale"," ones, or ",[144,1530,1531],{},"--all",[190,1533,1534],{},[216,1535,299],{"href":298},[161,1537,1539],{"id":1538},"common-flags","Common flags",[166,1541,1542,1555],{},[169,1543,1544],{},[172,1545,1546,1549,1552],{},[175,1547,1548],{},"Flag",[175,1550,1551],{},"Where",[175,1553,1554],{},"Meaning",[185,1556,1557,1578,1594,1638,1677,1696,1721,1747,1794],{},[172,1558,1559,1564,1575],{},[190,1560,1561],{},[144,1562,1563],{},"--db DB",[190,1565,1566,1567,201,1569,201,1572,1574],{},"every query, plus ",[144,1568,315],{},[144,1570,1571],{},"link",[144,1573,322],{},", viz",[190,1576,1577],{},"graph file",[172,1579,1580,1584,1587],{},[190,1581,1582],{},[144,1583,618],{},[190,1585,1586],{},"most commands",[190,1588,1589,1590,1593],{},"one JSON document (",[144,1591,1592],{},"config show",": the effective config)",[172,1595,1596,1601,1635],{},[190,1597,1598],{},[144,1599,1600],{},"--min-confidence {heuristic,resolved,exact}",[190,1602,1603,201,1605,201,1607,201,1609,201,1611,201,1613,201,1616,201,1619,201,1622,201,1624,201,1627,201,1629,201,1632],{},[144,1604,1377],{},[144,1606,1380],{},[144,1608,1383],{},[144,1610,1386],{},[144,1612,752],{},[144,1614,1615],{},"readers",[144,1617,1618],{},"siblings",[144,1620,1621],{},"node",[144,1623,646],{},[144,1625,1626],{},"api-calls",[144,1628,318],{},[144,1630,1631],{},"tests",[144,1633,1634],{},"viz-export",[190,1636,1637],{},"drop edges below this",[172,1639,1640,1645,1667],{},[190,1641,1642],{},[144,1643,1644],{},"--max-depth N",[190,1646,1647,201,1649,201,1651,201,1653,201,1655,201,1657,201,1659,201,1661,201,1663,201,1665],{},[144,1648,1377],{},[144,1650,1380],{},[144,1652,1383],{},[144,1654,752],{},[144,1656,1615],{},[144,1658,1618],{},[144,1660,1621],{},[144,1662,646],{},[144,1664,1626],{},[144,1666,1631],{},[190,1668,1669,1670,1672,1673,1676],{},"hop cap (",[144,1671,1631],{},": ",[144,1674,1675],{},"0"," is any depth)",[172,1678,1679,1684,1693],{},[190,1680,1681],{},[144,1682,1683],{},"--no-paths",[190,1685,1686,1687,1690,1691],{},"the ",[144,1688,1689],{},"--max-depth"," commands, plus ",[144,1692,318],{},[190,1694,1695],{},"omit evidence chains",[172,1697,1698,1703,1710],{},[190,1699,1700],{},[144,1701,1702],{},"--gate GATE",[190,1704,1686,1705,1707,1708],{},[144,1706,1689],{}," commands except ",[144,1709,1631],{},[190,1711,1712,1713,1716,1717,1720],{},"live\u002Fgated split; default the scenario that was indexed (",[144,1714,1715],{},"auto","); ",[144,1718,1719],{},"none"," disables",[172,1722,1723,1727,1735],{},[190,1724,1725],{},[144,1726,467],{},[190,1728,1729,201,1731,201,1733],{},[144,1730,1377],{},[144,1732,752],{},[144,1734,1615],{},[190,1736,1737,1738,1741,1742,379,1745],{},"only table \u002F column edges on that database connection (",[144,1739,1740],{},"attrs.connection","; a dynamic name by its pattern, ",[144,1743,1744],{},"legacy_{store.id}",[216,1746,472],{"href":471},[172,1748,1749,1754,1769],{},[190,1750,1751],{},[144,1752,1753],{},"--platform TARGET",[190,1755,1756,201,1758,201,1760,201,1762,201,1764,201,1766],{},[144,1757,1377],{},[144,1759,1380],{},[144,1761,1383],{},[144,1763,1386],{},[144,1765,318],{},[144,1767,1768],{},"search",[190,1770,1771,1772,201,1775,201,1778,201,1781,201,1784,201,1787,1790,1791],{},"one build: ",[144,1773,1774],{},"windows",[144,1776,1777],{},"linux",[144,1779,1780],{},"macos",[144,1782,1783],{},"ios",[144,1785,1786],{},"android",[144,1788,1789],{},"web",". The first line names the filter and how many conditions could not be evaluated. ",[216,1792,1280],{"href":1793},"\u002Fdocs\u002Fplatforms#queries",[172,1795,1796,1801,1821],{},[190,1797,1798],{},[144,1799,1800],{},"--max-items N",[190,1802,1803,1804,201,1806,201,1808,201,1811,201,1813,201,1815,201,1817,1820],{},"list commands (",[144,1805,318],{},[144,1807,957],{},[144,1809,1810],{},"tools",[144,1812,1164],{},[144,1814,1248],{},[144,1816,1280],{},[144,1818,1819],{},"plan",", …)",[190,1822,1823],{},"cap listed rows",[141,1825,1826,1829,1830,437,1833,147,1836,159],{},[144,1827,1828],{},"node --json"," is a list of ",[144,1831,1832],{},"{node, out, in}",[144,1834,1835],{},"stats --json",[144,1837,1838],{},"{project, root, indexed_at, nodes, edges, nodes_by_kind, edges_by_kind, stats}",[161,1840,1841],{"id":454},"Workspace",[141,1843,1844,445,1846,1848,1849,1852,1853,147,1856,201,1859,691,1862,1865,1866,473],{},[144,1845,429],{},[144,1847,432],{}," merge two graphs. ",[144,1850,1851],{},"--repo"," (repeatable) merges any number. The two forms cannot be combined. ",[144,1854,1855],{},"role",[144,1857,1858],{},"backend",[144,1860,1861],{},"frontend",[144,1863,1864],{},"both"," (default ",[144,1867,1864],{},[1869,1870,1875],"pre",{"className":1871,"code":1872,"language":1873,"meta":1874,"style":1874},"language-bash shiki shiki-themes cg-light cg-light cg-dark","cg link --backend out\u002Fapi.db --frontend out\u002Fweb.db --db out\u002Fgraph.db\n","bash","",[144,1876,1877],{"__ignoreMap":1874},[1878,1879,1882,1885,1889,1892,1895,1898,1901,1904],"span",{"class":1880,"line":1881},"line",1,[1878,1883,1446],{"class":1884},"sZJo5",[1878,1886,1888],{"class":1887},"sha9Y"," link",[1878,1890,1891],{"class":1887}," --backend",[1878,1893,1894],{"class":1887}," out\u002Fapi.db",[1878,1896,1897],{"class":1887}," --frontend",[1878,1899,1900],{"class":1887}," out\u002Fweb.db",[1878,1902,1903],{"class":1887}," --db",[1878,1905,1906],{"class":1887}," out\u002Fgraph.db\n",[1869,1908,1910],{"className":1871,"code":1909,"language":1873,"meta":1874,"style":1874},"cg link --repo orders=out\u002Forders.db:backend \\\n        --repo gateway=out\u002Fgateway.db:backend \\\n        --repo web=out\u002Fweb.db:frontend --db out\u002Fgraph.db\n",[144,1911,1912,1928,1939],{"__ignoreMap":1874},[1878,1913,1914,1916,1918,1921,1924],{"class":1880,"line":1881},[1878,1915,1446],{"class":1884},[1878,1917,1888],{"class":1887},[1878,1919,1920],{"class":1887}," --repo",[1878,1922,1923],{"class":1887}," orders=out\u002Forders.db:backend",[1878,1925,1927],{"class":1926},"sZWGQ"," \\\n",[1878,1929,1931,1934,1937],{"class":1880,"line":1930},2,[1878,1932,1933],{"class":1887},"        --repo",[1878,1935,1936],{"class":1887}," gateway=out\u002Fgateway.db:backend",[1878,1938,1927],{"class":1926},[1878,1940,1942,1944,1947,1949],{"class":1880,"line":1941},3,[1878,1943,1933],{"class":1887},[1878,1945,1946],{"class":1887}," web=out\u002Fweb.db:frontend",[1878,1948,1903],{"class":1887},[1878,1950,1906],{"class":1887},[141,1952,1953,1954,1957,1958,1962],{},"Every repo's client calls are matched to routes on every other server, so a backend may call another backend. A frontend ",[144,1955,1956],{},"links:"," list limits which servers that app calls (",[216,1959,1961],{"href":1960},"\u002Fdocs\u002Fconfiguration#apps-and-workspace","apps and workspace","). Channels, protocols, payload checks and entry tagging run once on the combined graph. Stats include one row per client\u002Fserver pair plus totals.",[141,1964,1965,1966,1969],{},"Webhook sections of the ",[144,1967,1968],{},"--report"," markdown (#152 part B):",[1971,1972,1973,1995],"ul",{},[1974,1975,1976,1979,1980,1983,1984,1987,1988,1991,1992,159],"li",{},[144,1977,1978],{},"## Webhook subscriptions paired by URL",": each subscriber URL a sender repo records (seed data, config, ",[144,1981,1982],{},".env.example",") whose path matches a route of another repo (",[144,1985,1986],{},"heuristic"," ",[144,1989,1990],{},"MATCHES_ROUTE"," from the sender endpoint), or ",[144,1993,1994],{},"unpaired: \u003Curl> (\u003Creason>)",[1974,1996,1997,2000,2001,2004,2005,2008,2009,691,2011,2013,2014,2016],{},[144,1998,1999],{},"## Routes called back by external parties",": routes that a ",[144,2002,2003],{},"REGISTERS_CALLBACK"," edge names, with the registering function, the body key and the outbound endpoint. These routes are left out of ",[144,2006,2007],{},"## Backend routes without a client call",", as are routes a subscriber URL pairs with. The registering repo needs the role ",[144,2010,1858],{},[144,2012,1864],{},", because routes of a ",[144,2015,1861],{}," repo are not read.",[1869,2018,2023],{"className":2019,"code":2021,"language":2022,"meta":1874},[2020],"language-text","## Webhook subscriptions paired by URL\n\n- `route:POST \u002Fwebhooks\u002Forders` \u003C- subscriber URL https:\u002F\u002Fbookstore-api.test\u002Fwebhooks\u002Forders (heuristic) from `endpoint:webhook:sender-php:order.paid`; configured at sender-php\u002Fdatabase\u002Fseeders\u002FWebhookSubscriptionSeeder.php:13\n- unpaired: https:\u002F\u002Felsewhere.test\u002Fhooks\u002Fnone (not a backend URL (no route shares its first segment: local asset \u002F device bridge \u002F external)) from `endpoint:webhook:sender-php:order.paid`; configured at sender-php\u002Fdatabase\u002Fseeders\u002FWebhookSubscriptionSeeder.php:18\n\n## Routes called back by external parties\n\n- `route:POST \u002Fwebhooks\u002Fpayments\u002F{store}` \u003C- callback URL registered in `PaymentsClient::createPayment` (body key `callback_url`, outbound `http:POST https:\u002F\u002Fpay.provider.test\u002Fv1\u002Fpayments`) at sender-php\u002Fapp\u002FServices\u002FPaymentsClient.php:15\n","text",[144,2024,2021],{"__ignoreMap":1874},[141,2026,2027,2028,2031,2032,2035,2036,445,2039,2042,2043,445,2046,2048,2049,2052,2053,473],{},"An id that exists in two repos is stored as ",[144,2029,2030],{},"repo:"," plus the original id (",[144,2033,2034],{},"orders:class:Order","), and edges that used it are rewritten. ",[144,2037,2038],{},"external:",[144,2040,2041],{},"endpoint:"," ids stay a single node. Every other id is unchanged, so a two-repo link with no shared ids keeps the same ids. ",[144,2044,2045],{},"orders:Order",[144,2047,2034],{}," select that repo; a plain ",[144,2050,2051],{},"Order"," matches every repo that defines it (",[216,2054,479],{"href":478},[141,2056,2057,2060,2061,2063,2064,2066,2067,473],{},[144,2058,2059],{},"cg index"," on a workspace ",[144,2062,211],{}," writes one combined ",[144,2065,154],{}," for every app (",[216,2068,1961],{"href":1960},[161,2070,2072],{"id":2071},"query-targets-specs","Query targets (specs)",[166,2074,2075,2085],{},[169,2076,2077],{},[172,2078,2079,2082],{},[175,2080,2081],{},"Form",[175,2083,2084],{},"Selects",[185,2086,2087,2098,2108,2128,2141,2158,2175,2185,2198,2214,2235,2280,2293,2303,2319],{},[172,2088,2089,2095],{},[190,2090,2091,201,2093],{},[144,2092,684],{},[144,2094,687],{},[190,2096,2097],{},"a DB column",[172,2099,2100,2105],{},[190,2101,2102],{},[144,2103,2104],{},"table:NAME",[190,2106,2107],{},"a DB table",[172,2109,2110,2118],{},[190,2111,2112,201,2115],{},[144,2113,2114],{},"connection:NAME",[144,2116,2117],{},"connection:tenant_*",[190,2119,2120,2121,2124,2125],{},"a connection from ",[144,2122,2123],{},"config\u002Fdatabase.php",", plus dynamic ",[144,2126,2127],{},"Config::set('database.connections.…')",[172,2129,2130,2138],{},[190,2131,2132,201,2135],{},[144,2133,2134],{},"env:KEY",[144,2136,2137],{},"config:dotted.key",[190,2139,2140],{},"an env or config key",[172,2142,2143,2155],{},[190,2144,2145,201,2148,201,2151,2154],{},[144,2146,2147],{},"Class.method",[144,2149,2150],{},"Class::method",[144,2152,2153],{},"Class",", FQN",[190,2156,2157],{},"a symbol, suffix match",[172,2159,2160,2168],{},[190,2161,2162,201,2165],{},[144,2163,2164],{},"repo:Class.method",[144,2166,2167],{},"repo:class:Order",[190,2169,2170,2171,2174],{},"that symbol in one repo of a combined graph (",[144,2172,2173],{},"orders:Order.total","). A plain name matches every repo",[172,2176,2177,2182],{},[190,2178,2179],{},[144,2180,2181],{},"page:\u002Freports\u002F:id",[190,2183,2184],{},"a Nuxt page by route",[172,2186,2187,2195],{},[190,2188,2189,201,2192],{},[144,2190,2191],{},"app\u002Fpages\u002Fx.vue",[144,2193,2194],{},"app\u002Fcomposables\u002FuseX.ts",[190,2196,2197],{},"a TS module or Vue SFC (repo-relative suffix)",[172,2199,2200,2211],{},[190,2201,2202,201,2205,201,2208],{},[144,2203,2204],{},"useX",[144,2206,2207],{},"useX.fn",[144,2209,2210],{},"fn",[190,2212,2213],{},"a TS composable, store, or function",[172,2215,2216,2224],{},[190,2217,2218,201,2221],{},[144,2219,2220],{},"src\u002Fapp.ts#listOrders",[144,2222,2223],{},"svc.ts#OrderService.create",[190,2225,2226,2227,2230,2231,2234],{},"a TS \u002F JS \u002F Vue symbol in one file (",[144,2228,2229],{},"file#name~2"," is the second hit; ",[144,2232,2233],{},"function:src\u002Fapp.ts#listOrders"," is the full id)",[172,2236,2237,2245],{},[190,2238,2239,201,2242],{},[144,2240,2241],{},"http:GET \u002Fv1\u002F…",[144,2243,2244],{},"route:GET \u002Fv1\u002F…",[190,2246,2247,2248,2251,2252,357,2255,357,2258,2261,2262,2265,2266,323,2269,2271,2272,2275,2276,2279],{},"a client endpoint, or one backend route. ",[144,2249,2250],{},"route:VERB \u002Fpath"," is exact: the verb is case-insensitive, and ",[144,2253,2254],{},":id",[144,2256,2257],{},"{id}",[144,2259,2260],{},"{order}"," match the same ",[144,2263,2264],{},"{param}"," segment. ",[144,2267,2268],{},"route:POST \u002Fpayments\u002F*",[144,2270,851],{}," spans segments) and ",[144,2273,2274],{},"route:* \u002Fpayments"," are the wider forms. An unknown route exits 1 with ",[144,2277,2278],{},"no such route"," and up to five nearest routes",[172,2281,2282,2290],{},[190,2283,2284,201,2287],{},[144,2285,2286],{},"channel:orders.{order}",[144,2288,2289],{},"channel_sub:orders.{id}",[190,2291,2292],{},"a broadcast channel or a client subscription",[172,2294,2295,2300],{},[190,2296,2297],{},[144,2298,2299],{},"test:tests\u002FFeature\u002FOrderTest.php::…",[190,2301,2302],{},"a test case",[172,2304,2305,2313],{},[190,2306,2307,201,2310],{},[144,2308,2309],{},"request_key:timezone",[144,2311,2312],{},"setting:reports.timezone",[190,2314,2315,2316,2318],{},"a value fact (",[216,2317,1301],{"href":128},")",[172,2320,2321,2341],{},[190,2322,2323,201,2326,201,2329,201,2332,201,2335,201,2338],{},[144,2324,2325],{},"crate::mod::Type::method",[144,2327,2328],{},"mod:path",[144,2330,2331],{},"feature:",[144,2333,2334],{},"cfg:",[144,2336,2337],{},"define:",[144,2339,2340],{},"unsafe:",[190,2342,2343,2344,2318],{},"Rust \u002F C \u002F C++ (",[216,2345,2347],{"href":2346},"\u002Fdocs\u002Fnative#query-specs","native",[1971,2349,2350,2359,2399,2415],{},[1974,2351,2352,2353,2355,2356,159],{},"Either separator works. A spec that misses is retried with the other. Swift, Kotlin, Python, TS, and Dart fqns use ",[144,2354,159],{},"; PHP, Rust, and C++ use ",[144,2357,2358],{},"::",[1974,2360,2361,2364,2365,2368,2369,2372,2373,2375,2376,2379,2380,2382,2383,2386,2387,2390,2391,445,2393,2395,2396,2398],{},[144,2362,2363],{},"Sub.method"," for a method ",[144,2366,2367],{},"Sub"," inherits and does not redefine resolves to that definition (",[144,2370,2371],{},"B.run -> inherited from Base.run","; ",[144,2374,618],{}," has fqns). Callers are the definition's, narrowed by receiver type (",[144,2377,2378],{},"attrs.recv","): a receiver that cannot be a ",[144,2381,2367],{}," is left out and counted (",[144,2384,2385],{},"callers narrowed to B: 2 of 6 calls on other classes left out","). Unknown receivers, and ancestry the graph does not know (",[144,2388,2389],{},"extends mix(Base)","), stay. ",[144,2392,1377],{},[144,2394,1631],{}," narrow the same way. Only overrides in ",[144,2397,2367],{}," and its subclasses are followed.",[1974,2400,2401,2402,2404,2405,2408,2409,323,2411,2414],{},"When ",[144,2403,2367],{}," overrides the method, callers of the base (",[144,2406,2407],{},"via base",") drop calls whose receiver cannot be a ",[144,2410,2367],{},[144,2412,2413],{},"override_narrowed"," in JSON).",[1974,2416,2417,2418,2420],{},"Several specs in one ",[144,2419,1377],{}," call are unioned.",[161,2422,2424],{"id":2423},"answer-shape","Answer shape",[1971,2426,2427,2464,2493,2505],{},[1974,2428,2429,2431,2432,2435,2436,2372,2439,379,2442,2445,2446,2449,2450,2453,2454,323,2456,379,2458,2460,2461,159],{},[144,2430,315],{}," leaves generated, copied, and vendored files out unless ",[144,2433,2434],{},"--include-generated"," (labelled ",[144,2437,2438],{},"attrs.generated",[216,2440,2441],{"href":43},"generated",[144,2443,2444],{},"--python-root"," (repeatable) replaces detection and ",[144,2447,2448],{},"python.source_roots",". Workspace ",[144,2451,2452],{},"apps"," are indexed into one combined graph unless ",[144,2455,326],{},[216,2457,1961],{"href":1960},[144,2459,207],{}," is repeatable. Starters that miss a 20s budget are named in ",[144,2462,2463],{},"starters_skipped",[1974,2465,2466,2468,2469,2472,2473,2476,2477,445,2480,2483,2484,437,2487,2489,2490,159],{},[144,2467,1380],{}," marks a held function ",[144,2470,2471],{},"(ref: collection | callback | assignment | decorator)"," and a dispatch or plugin list ",[144,2474,2475],{},"(call through a collection)",". Override lines are ",[144,2478,2479],{},"overrides: Base.m",[144,2481,2482],{},"overridden by: A.m, B.m",". The base is not a caller of its override; a call of the base declaration is ",[144,2485,2486],{},"(via base Base.m)",[144,2488,1380],{}," on a base also lists callers of the overrides, ",[144,2491,2492],{},"(via override A.m +1)",[1974,2494,2495,2497,2498,2501,2502,159],{},[144,2496,1386],{}," to ",[144,2499,2500],{},"table:"," with no table edge ends at the column that is read or written. A hop that passes keys the next request never sends adds ",[144,2503,2504],{},"note: sent but not forwarded: …",[1974,2506,2507,2509,2510,2513,2514,2517,2518,2521,2522,2525,2526,1987,2529,357,2532,147,2535,2538,2539,437,2542,2545,2546,2548,2549,2552,2553,445,2556,2559,2560,2563,2564,323,2567,201,2570,2573,2574,1987,2577,2580,2581,2584,2585,2587,2588,445,2591,2594,2595,2598,2599,2601,2602,2605,2606,1987,2608,159],{},[144,2508,1626],{}," folds a runtime or env base URL (",[144,2511,2512],{},"(base {runtimeConfig.apiBase} = …)","). Endpoints only tests call are marked ",[144,2515,2516],{},"(called from tests only)",". A call site whose function no entry point reaches is ",[144,2519,2520],{},"(no live caller)"," (or ",[144,2523,2524],{},"(no live caller found; N files not indexed)"," when TypeScript files or unresolved Vue navigation could hide a caller). A wrapper exported from ",[144,2527,2528],{},"package.json",[144,2530,2531],{},"main",[144,2533,2534],{},"exports",[144,2536,2537],{},"(exported)",". The summary adds ",[144,2540,2541],{},", N with no live caller",[144,2543,2544],{},"cg api-calls dead"," lists matched endpoints with no live call site. ",[144,2547,618],{}," has ",[144,2550,2551],{},"live"," on the endpoint and each call site. Each call site lists ",[144,2554,2555],{},"body keys:",[144,2557,2558],{},"query keys:"," when the extractor recorded them (a conditional key ends with ",[144,2561,2562],{},"?","). A body sent as axios ",[144,2565,2566],{},"data",[144,2568,2569],{},"delete",[144,2571,2572],{},"request",", ...) or ",[144,2575,2576],{},"$fetch",[144,2578,2579],{},"body"," is listed too; ",[144,2582,2583],{},"params"," are the query keys. ",[144,2586,618],{}," includes ",[144,2589,2590],{},"body_keys",[144,2592,2593],{},"query_keys"," on the call. A ",[144,2596,2597],{},"route:"," spec filters on the matched route only (exact, unless the spec contains ",[144,2600,851],{},"). An unknown route prints ",[144,2603,2604],{},"no such route: VERB \u002Fpath",", up to five nearest routes, and with ",[144,2607,618],{},[144,2609,2610],{},"{\"error\": \"no_such_route\", \"spec\", \"suggestions\"}",[161,2612,2614],{"id":2613},"readers-and-writers-specs","Readers and writers specs",[141,2616,2617,445,2620,2623],{},[144,2618,2619],{},"cg writers SPEC",[144,2621,2622],{},"cg readers SPEC"," use one resolver. A spec that names both a stored property and a column (a Python class field and a table with the same dotted name) lists both groups, each labelled.",[166,2625,2626,2642],{},[169,2627,2628],{},[172,2629,2630,2634,2638],{},[175,2631,2632],{},[144,2633,676],{},[175,2635,2636],{},[144,2637,752],{},[175,2639,2640],{},[144,2641,1615],{},[185,2643,2644,2671,2699],{},[172,2645,2646,2654,2661],{},[190,2647,2648,201,2651],{},[144,2649,2650],{},"books",[144,2652,2653],{},"table:books",[190,2655,2656,445,2658,2660],{},[144,2657,667],{},[144,2659,670],{}," of every column",[190,2662,2663,2665,2666,2668,2669],{},[144,2664,735],{},", then ",[144,2667,738],{}," per column, then ",[144,2670,756],{},[172,2672,2673,2681,2692],{},[190,2674,2675,201,2678],{},[144,2676,2677],{},"books.title",[144,2679,2680],{},"column:books.title",[190,2682,2683,2685,2686,1672,2689,2691],{},[144,2684,670],{}," into the column, then ",[144,2687,2688],{},"table-level writes of books (columns not recorded)",[144,2690,667],{}," edges from functions that record no column write to that table",[190,2693,2694,2665,2696,2698],{},[144,2695,738],{},[144,2697,756],{}," (heuristic string-literal matches, labelled)",[172,2700,2701,2712,2716],{},[190,2702,2703,201,2706,201,2709],{},[144,2704,2705],{},"Cart.total",[144,2707,2708],{},"Cart::$total",[144,2710,2711],{},"field:Cart.total",[190,2713,2714],{},[144,2715,673],{},[190,2717,2718],{},[144,2719,745],{},[1869,2721,2724],{"className":2722,"code":2723,"language":2022,"meta":1874},[2020],"$ cg writers books.age_rating --db out\u002Fapi.db\n[Http\u002FControllers\u002FAdmin] App\\Http\\Controllers\\Admin\\BookController::update  WRITES_COLUMN column:books.age_rating  @app\u002FHttp\u002FControllers\u002FAdmin\u002FBookController.php:30 (resolved)  entries: http_route\ntable-level writes of books (columns not recorded):\n  [Console\u002FCommands] App\\Console\\Commands\\SyncWarehouseCommand::handle  WRITES_TABLE table:books  @app\u002FConsole\u002FCommands\u002FSyncWarehouseCommand.php:19 (resolved)  entries: artisan_command\n2 write edges, 2 writers\n",[144,2725,2723],{"__ignoreMap":1874},[141,2727,2728,2729,201,2732,201,2735,201,2738,2741,2742,2745,2746,691,2748,2750,2751,379,2755,2757,2758,323,2760,201,2762,691,2764,710,2766,323,2769,201,2771,201,2773,201,2776,201,2779,2781,2782,445,2784,2786,2787,2790,2791,2793],{},"The table-level group omits a function that already has a column write to that table. Entry kinds are listed per site (",[144,2730,2731],{},"entries: http_route",[144,2733,2734],{},"scheduled",[144,2736,2737],{},"queue_job",[144,2739,2740],{},"artisan_command",", ...). To answer \"does anything write this table in the background?\", check ",[144,2743,2744],{},"entries:"," for ",[144,2747,2734],{},[144,2749,2737],{},". No such entry means the indexed code declares no scheduled or queued writer, not that none runs in production (whether a scheduler or worker is running is ",[216,2752,2754],{"href":2753},"\u002Fdocs\u002Flimitations#runtime-behaviour","out of scope",[144,2756,618],{}," is the flat list of rows; each row has ",[144,2759,701],{},[144,2761,166],{},[144,2763,706],{},[144,2765,709],{},[144,2767,2768],{},"group",[144,2770,166],{},[144,2772,706],{},[144,2774,2775],{},"table_level",[144,2777,2778],{},"mentions",[144,2780,709],{},"). The MCP tools ",[144,2783,752],{},[144,2785,1615],{}," take the same specs and print the same groups. ",[144,2788,2789],{},"cg reaches"," prints the same ",[144,2792,2744],{}," on each writer.",[161,2795,2797],{"id":2796},"database-connections","Database connections",[141,2799,2800,2801,2372,2803,201,2806,2810],{},"Table and column edges record the database connection they go to (",[144,2802,1740],{},[216,2804,79],{"href":2805},"\u002Fdocs\u002Fphp#database-connections-on-table-edges-179",[216,2807,2809],{"href":2808},"\u002Fdocs\u002Fschema#edge-kinds","schema","). Output shows it only when it is not the default:",[1971,2812,2813,2834,2852,2861],{},[1974,2814,2815,201,2817,445,2820,2822,2823,2826,2827,319,2830,2833],{},[144,2816,1377],{},[144,2818,2819],{},"routes --reaches",[144,2821,1386],{}," add ",[144,2824,2825],{},"conn=\u003Cname>"," to the edge step: ",[144,2828,2829],{},"READS_COLUMN[resolved @ app\u002FServices\u002FArchiveService.php:13 conn=legacy_{store.id}]-> column:books.store_id",[144,2831,2832],{},"READS_COLUMN@ArchiveService.php:13~r conn=legacy_{store.id}"," in a route line.",[1974,2835,2836,445,2838,2822,2840,2842,2843,698,2845,2847,2848,2851],{},[144,2837,752],{},[144,2839,1615],{},[144,2841,2825],{}," to the row; ",[144,2844,618],{},[144,2846,713],{}," (and ",[144,2849,2850],{},"connection_default",") on every row.",[1974,2853,2854,2856,2857,2860],{},[144,2855,1380],{}," on a function prints ",[144,2858,2859],{},"connections: \u003Cname> (\u003Chow>, \u003Cfile>:\u003Cline>; \u003CModel> default: \u003Cconnection>)"," for each non-default connection its own table and column edges use, and nothing when it uses only the default.",[1974,2862,2863,2865,2866,201,2868,445,2870,2872],{},[144,2864,467],{}," on ",[144,2867,1377],{},[144,2869,752],{},[144,2871,1615],{}," filters by that name. With no match the reply names what exists:",[1869,2874,2877],{"className":2875,"code":2876,"language":2022,"meta":1874},[2020],"$ cg writers books --connection warehouse --db out\u002Fapi.db\nno writers recorded for table 'books' on connection 'warehouse' (connections seen: mysql 26 edges, legacy_{store.id} 1 edge).\n",[144,2878,2876],{"__ignoreMap":1874},[141,2880,2881,2882,2884,2885,201,2887,445,2889,2891,2892,2372,2894,201,2896,201,2898,445,2900,2902],{},"An edge whose connection could not be resolved is ",[144,2883,2562],{},". The MCP tools ",[144,2886,1377],{},[144,2888,752],{},[144,2890,1615],{}," take ",[144,2893,713],{},[144,2895,1377],{},[144,2897,1380],{},[144,2899,752],{},[144,2901,1615],{}," print the same labels.",[161,2904,2906],{"id":2905},"empty-results","Empty results",[141,2908,2909,201,2911,201,2913,201,2915,201,2917,201,2919,201,2921,319,2923,2926,2927,2930,2931,2934,2935,2938],{},[144,2910,1380],{},[144,2912,752],{},[144,2914,1615],{},[144,2916,1618],{},[144,2918,1386],{},[144,2920,318],{},[144,2922,1768],{},[144,2924,2925],{},"resolutions"," say why a miss happened and name a next query: a missing table lists similar names, an unknown column lists the table's columns and close matches (",[144,2928,2929],{},"table books has no column 'titel'; similar: title. columns: id, store_id, ...","), a spec that matches nothing says what was tried (",[144,2932,2933],{},"no stored property, table or column 'X'","; the Swift \u002F Kotlin ",[144,2936,2937],{},"field:"," hint appears only when the graph has those languages), a method with no callers lists other incoming edges, a symbol with no siblings points at callees that touch data, and a missing path reports the opposite direction when one exists.",[1869,2940,2943],{"className":2941,"code":2942,"language":2022,"meta":1874},[2020],"$ cg siblings StockService::reserve --db out\u002Fgraph.db\ntarget: Services\\StockService::reserve\nno siblings found for Services\\StockService::reserve: its class has no parent class, interface or trait shared with other classes; it touches no table, column, config, env key or connection directly; all 2 of its callees are in its own class, which co-caller matching skips.\ntry: siblings('Services\\StockService::reserveLocal') (a callee that touches data); siblings('Services\\StockService::reserveFromWarehouse') (a callee that touches data); impact('Services\\StockService::reserve') for its callers and entry points; downstream('Services\\StockService::reserve') for the tables, config and connections it reaches\n",[144,2944,2942],{"__ignoreMap":1874},[161,2946,2948],{"id":2947},"partial-answers","Partial answers",[141,2950,2951,201,2953,201,2955,319,2957,2959,2960,2963,2964,437,2967,2969,2970,2972,2973],{},[144,2952,318],{},[144,2954,1380],{},[144,2956,1377],{},[144,2958,1631],{}," mark a partial answer: a route or handler registration cg does not model, or a file in the answer's language that is not indexed. Totals then read as indexed totals. A ",[144,2961,2962],{},"coverage note:"," names where to search by hand. On a combined graph each file-count or heuristic fragment names its repo: ",[144,2965,2966],{},"3 TypeScript \u002F JavaScript files not indexed (bookstore-api), 3 TypeScript \u002F JavaScript files not indexed (bookstore-web)",[144,2968,618],{}," carries the same facts in ",[144,2971,401],{},". A complete answer keeps the usual wording. ",[216,2974,401],{"href":31},[1869,2976,2979],{"className":2977,"code":2978,"language":2022,"meta":1874},[2020],"$ cg routes --db out\u002Fshop.db\nall routes: 1 indexed (possibly more: 1 unmodelled route registration)\ncoverage note: 1 route registration cg does not model (Django urlpatterns built by a function call, comprehension or loop: shop\u002Furls.py:9). There, use your normal search and file reading (an empty cg answer is not proof of absence).\n",[144,2980,2978],{"__ignoreMap":1874},[161,2982,2984],{"id":2983},"routes-and-guards","Routes and guards",[141,2986,2987,2989],{},[144,2988,318],{}," joins guards, what the route reaches, and who calls it. One evidence chain per route. On a combined graph, frontend callers are included.",[1971,2991,2992,3027,3043,3075,3082,3104,3121,3165],{},[1974,2993,2994,2998,2999,357,3002,357,3005,3008,3009,3012,3013,3016,3017,3020,3021,357,3024,159],{},[2995,2996,2997],"strong",{},"Guards"," come from Laravel route and group middleware, Nest ",[144,3000,3001],{},"@UseGuards",[144,3003,3004],{},"@UseInterceptors",[144,3006,3007],{},"@UsePipes"," (plus ",[144,3010,3011],{},"APP_GUARD"," and global guards \u002F interceptors), Express \u002F Fastify \u002F Koa \u002F Hono \u002F Elysia, Next.js ",[144,3014,3015],{},"middleware.ts",", django-ninja ",[144,3018,3019],{},"auth=",", Django view decorators and access mixins, and DRF ",[144,3022,3023],{},"permission_classes",[144,3025,3026],{},"authentication_classes",[1974,3028,3029,1987,3032,691,3035,3038,3039,3042],{},[2995,3030,3031],{},"Scope.",[144,3033,3034],{},"--writes",[144,3036,3037],{},"--writes TABLE",", and\u002For ",[144,3040,3041],{},"--reaches SPEC...",". No scope lists every route.",[1974,3044,3045,3048,3049,357,3052,1987,3054,3057,3058,201,3061,201,3064,3067,3068,3071,3072,159],{},[2995,3046,3047],{},"Auth,"," in order: ",[144,3050,3051],{},"--auth-pattern",[144,3053,211],{},[144,3055,3056],{},"auth.extra_patterns",", the preset's auth guards (not ",[144,3059,3060],{},"csrf_protect",[144,3062,3063],{},"ThrottlerGuard",[144,3065,3066],{},"AllowAny",", …), then the auth name pattern. Each guard records ",[144,3069,3070],{},"auth_by",". Presets: ",[216,3073,219],{"href":3074},"\u002Fdocs\u002Fconfiguration#framework-presets",[1974,3076,3077,3078,3081],{},"Laravel kernel middleware and Django ",[144,3079,3080],{},"MIDDLEWARE"," apply to every route and are not repeated.",[1974,3083,3084,3087,3088,3090,3091,2372,3094,3096,3097,437,3100],{},[2995,3085,3086],{},"External callbacks."," A route whose URL the app registers with an external party (",[144,3089,2003],{},") shows ",[144,3092,3093],{},"client: external callback (PaymentsClient::createPayment)",[144,3095,618],{}," carries them as ",[144,3098,3099],{},"callbacks",[216,3101,3103],{"href":3102},"\u002Fdocs\u002Fprotocols#subscriptions-callbacks-and-drivers-152-part-b","Webhooks",[1974,3105,3106,1987,3109,3112,3113,3116,3117,3120],{},[2995,3107,3108],{},"Filters.",[144,3110,3111],{},"--unguarded"," keeps routes with no auth guard. An unconditional inline check counts, so those routes are left out. ",[144,3114,3115],{},"--unguarded --strict"," counts route guards only. ",[144,3118,3119],{},"--missing NAME"," keeps routes whose route guards and inline checks do not contain NAME.",[1974,3122,3123,3126,3127,3129,3130,1672,3133,201,3136,323,3139,201,3142,201,3145,201,3148,912,3150,201,3153,437,3156,3158,3159,3161,3162,159],{},[2995,3124,3125],{},"Inline guards (Laravel)."," Checks the handler runs before its own work are a separate line, not route middleware. ",[144,3128,618],{}," adds ",[144,3131,3132],{},"inline_guards",[144,3134,3135],{},"name",[144,3137,3138],{},"kind",[144,3140,3141],{},"policy",[144,3143,3144],{},"permission",[144,3146,3147],{},"secret",[144,3149,1855],{},[144,3151,3152],{},"at",[144,3154,3155],{},"conditional",[144,3157,3056],{}," selects project method names when that method rejects, or when the caller aborts on its result. A conditional check stays listed and does not hide the route from ",[144,3160,3111],{},". See ",[216,3163,79],{"href":3164},"\u002Fdocs\u002Fphp#inline-guards",[1974,3166,3167,3169],{},[144,3168,1768],{}," matches the same guard names, including inline checks.",[1869,3171,3174],{"className":3172,"code":3173,"language":2022,"meta":1874},[2020],"$ cg routes --db api.db\nPOST \u002Fv1\u002Forders\u002F{order}\u002Frefund  @routes\u002Fapi.php:25\n    guards: auth:sanctum [auth]\n    inline: hasPermission('orders.refund') [permission] RefundController::store\nPOST \u002Fv1\u002Fwarehouse\u002Fsync  @routes\u002Fapi.php:26\n    guards: (none)\n    inline: ensureValidSecret (hash_equals config:bookstore.sync_secret) [secret] WarehouseSyncController::ensureValidSecret\n",[144,3175,3173],{"__ignoreMap":1874},[141,3177,3178,3180,3181,3183,3184,3187],{},[144,3179,3111],{}," lists neither route. ",[144,3182,3115],{}," lists ",[144,3185,3186],{},"POST \u002Fv1\u002Fwarehouse\u002Fsync"," (no route middleware; the secret check is inline).",[1869,3189,3192],{"className":3190,"code":3191,"language":2022,"meta":1874},[2020],"$ cg routes --writes books --missing auth:api --db out\u002Fgraph.db\nroutes reaching a write to books: 3 of 9 routes | filter: missing a guard matching 'auth:api' -> 2\nauth guard: 0 with, 2 without (auth = a framework preset auth guard or a name matching the auth pattern)\n\nPOST \u002Fv1\u002Fadmin\u002Fbooks  @bookstore-api\u002Froutes\u002Fapi.php:23  NO AUTH\n    guards: (none)\n    writes books via Http\\Controllers\\Admin\\BookController::store conf=resolved  ROUTES_TO@api.php:23 → WRITES_COLUMN@BookController.php:15~r → column:books.store_id\n\nPUT \u002Fv1\u002Fadmin\u002Fbooks\u002F{id}  @bookstore-api\u002Froutes\u002Fapi.php:24  NO AUTH\n    guards: (none)\n    writes books via Http\\Controllers\\Admin\\BookController::update conf=resolved  ROUTES_TO@api.php:24 → WRITES_COLUMN@BookController.php:30~r → column:books.title\n",[144,3193,3191],{"__ignoreMap":1874},[161,3195,3196],{"id":798},"Heuristics",[141,3198,3199,3200,3202,3203,3206],{},"Both are labelled ",[144,3201,1986],{}," in text and in JSON (",[144,3204,3205],{},"confidence","). Neither adds edges.",[1971,3208,3209,3222],{},[1974,3210,3211,3214,3215,3218,3219,159],{},[144,3212,3213],{},"roundtrip"," pairs a write of a stored property through a lossy transform with a read that seeds UI state (path: write, lossy call, property, read, seed, each with ",[144,3216,3217],{},"file:line","). MCP tool: ",[144,3220,3221],{},"roundtrip(prop)",[1974,3223,3224,3226,3227,3229,3230,159],{},[144,3225,805],{}," runs all four rules unless ",[144,3228,823],{}," lists a subset. MCP tool: ",[144,3231,3232],{},"lint_async_state",[161,3234,624],{"id":624},[141,3236,3237,3240,3241,323,3243,473],{},[144,3238,3239],{},"cg explore"," answers a question in one call: matching symbols, then entry points, call paths, blast radius and source. The same answer is the MCP tool ",[144,3242,624],{},[216,3244,62],{"href":63},[141,3246,3247],{},"Resolution, in order:",[1971,3249,3250,3264,3271],{},[1974,3251,3252,3253,3256,3257,1153,3260,3263],{},"A spec that matches 1 to ",[144,3254,3255],{},"--max-symbols"," nodes wins (a node id, ",[144,3258,3259],{},"catalog.api.place_order",[144,3261,3262],{},"POST \u002Fapi\u002Forders\u002F","). A bare word that only names a test fixture or a module falls through to the word match.",[1974,3265,3266,3267,3270],{},"A token that is a source file (",[144,3268,3269],{},"catalog\u002Fapi.py",") uses the symbols defined in that file.",[1974,3272,3273,3274,201,3277,201,3280,201,3283,201,3285,3288,3289,3292],{},"Otherwise the words are stemmed and matched. ",[144,3275,3276],{},"module",[144,3278,3279],{},"file",[144,3281,3282],{},"field",[144,3284,706],{},[144,3286,3287],{},"constant"," and test nodes (tests, and code in test files such as ",[144,3290,3291],{},"conftest.py",") are left out. A word in a symbol's own name counts more than one found only in its module path; the highest scores are kept.",[141,3294,3295],{},"Sections:",[1971,3297,3298,3312,3321,3327,3337],{},[1974,3299,3300,3303,3304,201,3307,201,3310,473],{},[2995,3301,3302],{},"entry points"," — up to six per symbol, with kind, name and confidence (",[144,3305,3306],{},"exact",[144,3308,3309],{},"resolved",[144,3311,1986],{},[1974,3313,3314,3317,3318,159],{},[2995,3315,3316],{},"call paths"," — the path from the first entry point, then a path between resolved symbols. A hop is ",[144,3319,3320],{},"-KIND[confidence @ file:line]->",[1974,3322,3323,3326],{},[2995,3324,3325],{},"blast radius"," — callers, tables written and read, env keys, jobs and connections, each with a confidence label.",[1974,3328,3329,3332,3333,3336],{},[2995,3330,3331],{},"source"," — numbered lines, grouped by file, inside the token budget. A cut-off body ends with a ",[144,3334,3335],{},"snippet(...)"," hint; symbols that did not fit are listed the same way.",[1974,3338,3339,3342],{},[2995,3340,3341],{},"next"," — the fine-grained calls to run after this answer.",[141,3344,3345,3346,3348,3349,3352,3353,3356],{},"The default budget is 3000 tokens (about 4 characters each), clamped to 500..20000. Header, entry points, call paths, blast radius and next steps come first; when they alone would not fit, the lowest-ranked symbols are dropped and listed under ",[2995,3347,3341],{}," as ",[144,3350,3351],{},"explore(...)"," calls. Source fills what remains. The last line is ",[144,3354,3355],{},"budget: used\u002Flimit tokens",". Nothing matched exits 1.",[166,3358,3359,3368],{},[169,3360,3361],{},[172,3362,3363,3366],{},[175,3364,3365],{},"flag",[175,3367],{},[185,3369,3370,3380,3390,3399],{},[172,3371,3372,3377],{},[190,3373,3374],{},[144,3375,3376],{},"--budget N",[190,3378,3379],{},"token budget (default 3000, clamped to 500..20000)",[172,3381,3382,3387],{},[190,3383,3384],{},[144,3385,3386],{},"--max-symbols N",[190,3388,3389],{},"symbols to expand (default 4)",[172,3391,3392,3396],{},[190,3393,3394],{},[144,3395,618],{},[190,3397,3398],{},"print the result object",[172,3400,3401,3405],{},[190,3402,3403],{},[144,3404,1563],{},[190,3406,3407],{},"graph database (required)",[161,3409,1213],{"id":1213},[141,3411,3412,3415,3416,3418,3419,3422,3423,3426,3427,3430],{},[144,3413,3414],{},"cg affected"," maps a change to the symbols it touches, then to the tests and entry points that reach those symbols. A path argument is the whole file. ",[144,3417,1203],{}," (alias ",[144,3420,3421],{},"--git-diff",") reads ",[144,3424,3425],{},"git diff"," against that revision and keeps only the touched lines. The innermost symbol wins: a changed method, not the class that contains it. A pure rename uses both the new path and the old one; a rename the index has not caught up with falls back to the old path. A deletion is resolved from the index. A changed test is listed itself (",[144,3428,3429],{},"changed","). A file with no symbols is reported as not in the index.",[141,3432,3433,3434,323,3437,201,3440,3443,3444,159],{},"The same expansion is what a file or module spec does in ",[144,3435,3436],{},"cg tests",[144,3438,3439],{},"app\u002Futil.py",[144,3441,3442],{},"app.util","): every symbol defined in that file. See ",[216,3445,22],{"href":1190},[141,3447,3448,3450],{},[144,3449,274],{}," prints the test files, one per line, so a runner can take them:",[1869,3452,3454],{"className":1871,"code":3453,"language":1873,"meta":1874,"style":1874},"pytest $(cg affected --base main --db out\u002Fgraph.db --quiet)\n",[144,3455,3456],{"__ignoreMap":1874},[1878,3457,3458,3461,3465,3467,3470,3473,3476,3478,3481,3484],{"class":1880,"line":1881},[1878,3459,3460],{"class":1884},"pytest",[1878,3462,3464],{"class":3463},"sZ_TN"," $(",[1878,3466,1446],{"class":1884},[1878,3468,3469],{"class":1887}," affected",[1878,3471,3472],{"class":1887}," --base",[1878,3474,3475],{"class":1887}," main",[1878,3477,1903],{"class":1887},[1878,3479,3480],{"class":1887}," out\u002Fgraph.db",[1878,3482,3483],{"class":1887}," --quiet",[1878,3485,3486],{"class":3463},")\n",[141,3488,3489,3490,3493,3494,3496,3497,3500,3501,3503,3504,3506,3507,3510,3511,3514,3515,3517],{},"At most ",[144,3491,3492],{},"--max-targets"," symbols are walked (default 200, ",[144,3495,1675],{}," for no cap). The text report says when it stopped early and JSON reports it under ",[144,3498,3499],{},"truncated",". With no test found, ",[144,3502,274],{}," prints nothing, and a bare ",[144,3505,3460],{}," would then run the whole suite. No files, no ",[144,3508,3509],{},"--base"," and no ",[144,3512,3513],{},"--stdin"," exits 2. A bad revision, or ",[144,3516,3509],{}," outside a git checkout, exits 2. Finding no tests is still exit 0.",[166,3519,3520,3528],{},[169,3521,3522],{},[172,3523,3524,3526],{},[175,3525,3365],{},[175,3527],{},[185,3529,3530,3542,3551,3561,3570,3582,3591,3604,3615],{},[172,3531,3532,3539],{},[190,3533,3534,201,3536],{},[144,3535,1203],{},[144,3537,3538],{},"--git-diff REF",[190,3540,3541],{},"only the lines the diff touches",[172,3543,3544,3548],{},[190,3545,3546],{},[144,3547,3513],{},[190,3549,3550],{},"one path per line on stdin",[172,3552,3553,3558],{},[190,3554,3555],{},[144,3556,3557],{},"--root DIR",[190,3559,3560],{},"git root (default: the indexed root)",[172,3562,3563,3567],{},[190,3564,3565],{},[144,3566,274],{},[190,3568,3569],{},"test file paths only",[172,3571,3572,3576],{},[190,3573,3574],{},[144,3575,1644],{},[190,3577,3578,3579,3581],{},"transitive tests within N application hops (",[144,3580,1675],{},": any)",[172,3583,3584,3588],{},[190,3585,3586],{},[144,3587,1177],{},[190,3589,3590],{},"leave out UI \u002F snapshot tests",[172,3592,3593,3598],{},[190,3594,3595],{},[144,3596,3597],{},"--max-targets N",[190,3599,3600,3601,3603],{},"cap on symbols walked (",[144,3602,1675],{},": none)",[172,3605,3606,3610],{},[190,3607,3608],{},[144,3609,618],{},[190,3611,3612,3613],{},"the result object, plus ",[144,3614,401],{},[172,3616,3617,3621],{},[190,3618,3619],{},[144,3620,1005],{},[190,3622,3623,3625,3626,201,3628],{},[144,3624,1986],{}," (default), ",[144,3627,3309],{},[144,3629,3306],{},[161,3631,3632],{"id":3632},"agents",[141,3634,3635,445,3637,3640,3641,445,3644,3647,3648,3651,3652,445,3655,3657,3658,2372,3661,3664,3665,3668],{},[144,3636,261],{},[144,3638,3639],{},"update"," write one block between ",[144,3642,3643],{},"\u003C!-- BEGIN cg agent rules … -->",[144,3645,3646],{},"\u003C!-- END cg agent rules -->",". Bytes outside it stay. ",[144,3649,3650],{},"remove"," deletes the block. ",[144,3653,3654],{},"show",[144,3656,292],{}," print the diff only. Otherwise cg prints the diff and asks ",[144,3659,3660],{},"apply N change(s)? [y\u002FN]",[144,3662,3663],{},"--yes"," skips that. A second run replaces the block in place; when nothing would change it reports ",[144,3666,3667],{},"no change (block up to date)"," and writes nothing.",[141,3670,3671,3672,3675,3676,3679,3680,3683],{},"The first selected file in the table order (",[144,3673,3674],{},"AGENTS.md",", else ",[144,3677,3678],{},"CLAUDE.md",", else the Cursor rule) gets the full block. The others get a one-line pointer inside the same markers. The block pins ",[144,3681,3682],{},"pip install 'cg-code-graph>=MAJOR.MINOR'"," (the published package). Re-running converts an old full copy into a pointer when that file is no longer primary.",[166,3685,3686,3696],{},[169,3687,3688],{},[172,3689,3690,3694],{},[175,3691,3692],{},[144,3693,1261],{},[175,3695,3279],{},[185,3697,3698,3708,3719],{},[172,3699,3700,3704],{},[190,3701,3702],{},[144,3703,3632],{},[190,3705,3706],{},[144,3707,3674],{},[172,3709,3710,3715],{},[190,3711,3712],{},[144,3713,3714],{},"claude",[190,3716,3717],{},[144,3718,3678],{},[172,3720,3721,3726],{},[190,3722,3723],{},[144,3724,3725],{},"cursor",[190,3727,3728],{},[144,3729,3730],{},".cursor\u002Frules\u002Fcg.mdc",[141,3732,3733,3735,3736,3738,3739,3741,3742,3745,3746,473],{},[144,3734,1261],{}," repeats. ",[144,3737,1531],{}," selects all three. With neither, cg acts on the files that already exist, and exits 2 when none exist unless ",[144,3740,1422],{}," was given. ",[144,3743,3744],{},"--dir"," is the project root (default ",[144,3747,159],{},[141,3749,3750,3752,3753,3755,3756,3758,3759,1672,3762,3765,3766,323,3769,3772,3773],{},[144,3751,1422],{}," adds, or on ",[144,3754,3650],{}," deletes, one ",[144,3757,1446],{}," entry under ",[144,3760,3761],{},"mcpServers",[144,3763,3764],{},"{\"command\": \"cg-mcp\", \"args\": [\"--db\", \"out\u002Fgraph.db\"]}",". Default path ",[144,3767,3768],{},"\u003Cdir>\u002F.cursor\u002Fmcp.json",[144,3770,3771],{},"--mcp-file"," overrides). The entry is edited in place; other keys stay. Invalid JSON is left untouched. ",[216,3774,1038],{"href":63},[161,3776,261],{"id":261},[141,3778,3779,3782,3783,437,3785,3788,3789,3792,3793,3795,3796,437,3798,3800],{},[144,3780,3781],{},"cg install"," registers the MCP server under the key ",[144,3784,1446],{},[144,3786,3787],{},"cg uninstall"," removes it (and a cg-owned legacy ",[144,3790,3791],{},"code-graph"," entry). Both preview a diff and ask ",[144,3794,3660],{}," unless ",[144,3797,3663],{},[144,3799,292],{}," prints the diff and writes nothing.",[166,3802,3803,3812],{},[169,3804,3805],{},[172,3806,3807,3809],{},[175,3808,3365],{},[175,3810,3811],{},"meaning",[185,3813,3814,3848,3858,3873,3885,3900,3915,3932,3948,3963,3980,3998,4010,4040,4049],{},[172,3815,3816,3821],{},[190,3817,3818],{},[144,3819,3820],{},"--host H",[190,3822,3823,201,3825,201,3827,201,3830,201,3833,201,3836,201,3839,201,3842,1153,3845,3847],{},[144,3824,3725],{},[144,3826,3714],{},[144,3828,3829],{},"claude-desktop",[144,3831,3832],{},"vscode",[144,3834,3835],{},"windsurf",[144,3837,3838],{},"codex",[144,3840,3841],{},"gemini",[144,3843,3844],{},"zed",[144,3846,844],{},". Repeatable. Default: hosts already detected for the scope",[172,3849,3850,3855],{},[190,3851,3852],{},[144,3853,3854],{},"--project",[190,3856,3857],{},"project config (default)",[172,3859,3860,3864],{},[190,3861,3862],{},[144,3863,1452],{},[190,3865,3866,3867,3869,3870],{},"user config. Requires ",[144,3868,154],{}," (a global entry serves one graph), unless ",[144,3871,3872],{},"--registry",[172,3874,3875,3880],{},[190,3876,3877],{},[144,3878,3879],{},"--dir ROOT",[190,3881,3882,3883,2318],{},"project root (default ",[144,3884,159],{},[172,3886,3887,3891],{},[190,3888,3889],{},[144,3890,1563],{},[190,3892,3893,3894,3897,3898],{},"graph file. Project default: ",[144,3895,3896],{},"\u003Cdir>\u002Fout\u002Fgraph.db",". Not used with ",[144,3899,3872],{},[172,3901,3902,3906],{},[190,3903,3904],{},[144,3905,3872],{},[190,3907,3908,3909,3911,3912,3914],{},"one global ",[144,3910,1446],{}," entry and no ",[144,3913,154],{},"; the server reads the graph registry",[172,3916,3917,3922],{},[190,3918,3919],{},[144,3920,3921],{},"--migrate",[190,3923,3924,3925,3928,3929],{},"fold per-repo ",[144,3926,3927],{},"cg-*"," entries into the registry. Dry run unless ",[144,3930,3931],{},"--apply",[172,3933,3934,3938],{},[190,3935,3936],{},[144,3937,3931],{},[190,3939,3940,3941,3943,3944,3947],{},"with ",[144,3942,3921],{},", write the registry and the host config (a ",[144,3945,3946],{},".bak"," of each)",[172,3949,3950,3955],{},[190,3951,3952],{},[144,3953,3954],{},"--graphs FILE",[190,3956,3957,3958,1865,3960,2318],{},"registry path for ",[144,3959,3921],{},[144,3961,3962],{},"~\u002F.config\u002Fcg\u002Fgraphs.toml",[172,3964,3965,3970],{},[190,3966,3967],{},[144,3968,3969],{},"--tools LIST",[190,3971,3972,3973,323,3976,2318],{},"allowlist stored as ",[144,3974,3975],{},"--tools",[216,3977,3979],{"href":3978},"\u002Fdocs\u002Fmcp#choosing-tools","Choosing tools",[172,3981,3982,3987],{},[190,3983,3984],{},[144,3985,3986],{},"--portable",[190,3988,3989,1987,3992,445,3994,3997],{},[144,3990,3991],{},"command",[144,3993,1426],{},[144,3995,3996],{},"--db out\u002Fgraph.db",", for a file committed to git",[172,3999,4000,4005],{},[190,4001,4002],{},[144,4003,4004],{},"--uninstall",[190,4006,4007,4008],{},"remove, on ",[144,4009,3781],{},[172,4011,4012,4017],{},[190,4013,4014],{},[144,4015,4016],{},"--no-rules",[190,4018,4019,4020,4023,4024,4026,4027,1987,4030,4032,4033,4035,4036,2318],{},"skip the agent rules. By default, project scope also writes a marked ",[144,4021,4022],{},"\u003C!-- cg:start -->"," section in ",[144,4025,3674],{}," and an ",[144,4028,4029],{},"alwaysApply",[144,4031,3730],{}," telling agents to use cg first. A re-run replaces only that section, and ",[144,4034,3787],{}," removes it (",[216,4037,4039],{"href":4038},"\u002Fdocs\u002Fmcp#install-into-a-host","Install into a host",[172,4041,4042,4046],{},[190,4043,4044],{},[144,4045,292],{},[190,4047,4048],{},"print the diff and write nothing",[172,4050,4051,4055],{},[190,4052,4053],{},[144,4054,3663],{},[190,4056,4057],{},"skip the prompt",[141,4059,4060,4061,4063,4064,4066,4067,4069,4070,4063,4072,4074],{},"Exit 0 on success or when nothing changes. Exit 2 on invalid JSON or TOML (the file is left untouched), a refused host, ",[144,4062,1452],{}," without ",[144,4065,154],{}," and without ",[144,4068,3872],{},", or when no host is detected. Exit 1 when the prompt is declined. ",[144,4071,3921],{},[144,4073,3931],{}," only prints the plan.",[141,4076,4077,4079,4080,159],{},[144,4078,3787],{}," takes the same flags. See ",[216,4081,4039],{"href":4038},[161,4083,1475],{"id":1475},[141,4085,4086,201,4088,445,4090,4093,4094,201,4097,445,4100,4103,4104,445,4107,4110,4111,4114,4115,4118,4119,4121,4122,4124,4125,4127],{},[144,4087,261],{},[144,4089,1440],{},[144,4091,4092],{},"status"," manage one block in ",[144,4095,4096],{},"post-commit",[144,4098,4099],{},"post-checkout",[144,4101,4102],{},"post-merge",". Nothing is installed by default. The block sits between ",[144,4105,4106],{},"# >>> cg hooks (managed by cg hooks; edit with cg, not here) >>>",[144,4108,4109],{},"# \u003C\u003C\u003C cg hooks \u003C\u003C\u003C",". cg finds that directory with ",[144,4112,4113],{},"git rev-parse --git-path hooks",", so ",[144,4116,4117],{},"core.hooksPath"," and worktrees apply. Linked worktrees share one hooks directory, and it holds one block, so the last ",[144,4120,261],{}," decides which root and ",[144,4123,154],{}," it refreshes. A ",[144,4126,4117],{}," outside the repository (shared by other repositories) gets a note at install time. Not a git repository: exit 2.",[141,4129,4130,4131,4134,4135,4138,4139,4142,4143,4145,4146,437,4149,4151,4152,4154],{},"A missing hook becomes ",[144,4132,4133],{},"#!\u002Fbin\u002Fsh"," plus the block, mode ",[144,4136,4137],{},"0755",". An existing shell hook keeps every other byte; the block is inserted immediately after the shebang, so a later ",[144,4140,4141],{},"exit 0"," cannot skip it. A second ",[144,4144,261],{}," replaces that block in place. A hook with no shebang, or a non-shell shebang, is left unchanged and reported as ",[144,4147,4148],{},"skipped (not a shell hook)",[144,4150,1440],{}," removes only the block and restores the original bytes. A file that then contains only the ",[144,4153,4133],{}," cg wrote is deleted.",[141,4156,4157,4158,4161,4162,4164,4165,4168,4169,4172,4173,4176,4177,4180,4181,4183,4184,4187,4188,4191,4192,4195,4196,4198,4199,4202,4203,4206,4207,445,4210,4213,4214,4216,4217,4219],{},"The block never calls ",[144,4159,4160],{},"exit",". It backgrounds the refresh, discards its output, and ends with a succeeding command, so git is not blocked and a hook failure cannot fail the git command. ",[144,4163,4099],{}," does nothing when ",[144,4166,4167],{},"$1"," equals ",[144,4170,4171],{},"$2"," (HEAD unchanged). ",[144,4174,4175],{},"CG_NO_HOOKS=1"," skips the block (",[216,4178,34],{"href":4179},"\u002Fdocs\u002Fconfiguration#environment-variables","). The command is the absolute ",[144,4182,1446],{}," next to the Python that ran ",[144,4185,4186],{},"cg hooks install",", when that file exists; otherwise ",[144,4189,4190],{},"'\u003Cpython>' -m cg_code_graph.cli refresh '\u003Croot>' --db '\u003Cdb>' --quiet","; otherwise ",[144,4193,4194],{},"cg refresh …"," when ",[144,4197,1446],{}," is on ",[144,4200,4201],{},"PATH",". If none of those exists, the block does nothing. A block that still runs ",[144,4204,4205],{},"-m codegraph.cli",", or that still checks the pre-0.19 hook switch, is outdated: ",[144,4208,4209],{},"cg hooks status",[144,4211,4212],{},"cg doctor"," say so, and ",[144,4215,261],{}," rewrites it. Run ",[144,4218,261],{}," again after moving or recreating that environment.",[141,4221,4222,4225,4226,4229,4230,4233,4234,1153,4237,4240,4241,4244,4245,4248,4249,4252,4253,4256,4257,4259,4260,4263,4264,357,4266,4268,4269,4272,4273,4275,4276,4279,4280,4282,4283,357,4286,4289,4290,4293],{},[144,4223,4224],{},"cg refresh ROOT --db DB"," re-indexes when the checkout changed. Every run touches ",[144,4227,4228],{},"\u003Cdb>.refresh.pending",", then takes ",[144,4231,4232],{},"\u003Cdb>.refresh.lock"," (non-blocking ",[144,4235,4236],{},"flock",[144,4238,4239],{},"msvcrt.locking"," on Windows; the OS releases either if the process dies). If another refresh holds the lock, it prints ",[144,4242,4243],{},"refresh already running; marked pending"," and exits 0. The holder clears the flag before each pass and runs another pass while it is set again, at most three passes per run, so a burst of checkouts collapses into a few runs and a request that arrives mid-pass is not lost. When the database exists and ROOT is a git repo, cg hashes the path, mtime and size of every file from ",[144,4246,4247],{},"git ls-files -c -o --exclude-standard","; if that matches ",[144,4250,4251],{},"\u003Cdb>.refresh.state"," (written by the last successful refresh, together with the database's mtime), it prints ",[144,4254,4255],{},"up to date"," and exits 0. A rename, an added or deleted file, an edit, or a database rewritten by something else (",[144,4258,2059],{},") re-indexes. Not a git repo, or a workspace app root outside ROOT: always re-index. Otherwise it indexes into ",[144,4261,4262],{},"\u003Cdb>.refresh.tmp"," (root, name and recorded ",[144,4265,2444],{},[144,4267,2434],{}," flags from the database, or the CLI arguments when the database is new), refuses a 0-node result without replacing the database, then moves the file into place with an atomic rename. A workspace ",[144,4270,4271],{},"apps:"," list is indexed on that temporary path as well; per-app databases derived from it are moved next to the real ",[144,4274,154],{},". A combined graph from ",[144,4277,4278],{},"cg link"," (no ",[144,4281,4271],{},") is refused and left unchanged. Git's own ",[144,4284,4285],{},"GIT_DIR",[144,4287,4288],{},"GIT_INDEX_FILE"," and similar variables, which git sets for hooks, are ignored, so ROOT is always the repository indexed. The last run is written to ",[144,4291,4292],{},"\u003Cdb>.refresh.log",". Exit 0 means refreshed, up to date, or another refresh holds the lock; a failure or refusal is nonzero, and the hooks ignore it.",[166,4295,4296,4304],{},[169,4297,4298],{},[172,4299,4300,4302],{},[175,4301,1548],{},[175,4303,1554],{},[185,4305,4306,4319,4334,4342,4353,4364],{},[172,4307,4308,4312],{},[190,4309,4310],{},[144,4311,3744],{},[190,4313,4314,4315,1865,4317,2318],{},"project root for ",[144,4316,1475],{},[144,4318,159],{},[172,4320,4321,4325],{},[190,4322,4323],{},[144,4324,154],{},[190,4326,4327,4328,4330,4331],{},"graph file; required for ",[144,4329,261],{},"; stored absolute. Required for ",[144,4332,4333],{},"refresh",[172,4335,4336,4340],{},[190,4337,4338],{},[144,4339,292],{},[190,4341,4048],{},[172,4343,4344,4348],{},[190,4345,4346],{},[144,4347,3663],{},[190,4349,4350,4351],{},"skip ",[144,4352,3660],{},[172,4354,4355,4359],{},[190,4356,4357],{},[144,4358,274],{},[190,4360,4361,4363],{},[144,4362,4333],{}," only: no stdout",[172,4365,4366,4370],{},[190,4367,4368],{},[144,4369,200],{},[190,4371,4372,4374],{},[144,4373,4333],{}," only: project name when the database is new",[141,4376,4377,4378,201,4381,445,4384,4387,4388,445,4391,4394,4395,4397],{},"The database file and its sidecars (",[144,4379,4380],{},"\u003Cdb>",[144,4382,4383],{},"\u003Cdb>.*",[144,4385,4386],{},"\u003Cdb>-*",", including ",[144,4389,4390],{},"-wal",[144,4392,4393],{},".refresh.*",") are left out of the fingerprint, so a database that lives inside ROOT and is not gitignored still reports ",[144,4396,4255],{}," on the next run.",[161,4399,1514],{"id":1514},[141,4401,4402,4405,4406,4409,4410,4413],{},[144,4403,4404],{},"cg watch ROOT --db DB"," runs the same refresh as the git hooks, once at start and again when sources change. Install the optional backend with ",[144,4407,4408],{},"pip install \"cg-code-graph[watch]\"",". Without it, cg polls the git fingerprint (",[144,4411,4412],{},"--poll"," forces that path). Polling needs a git repository and exits 2 otherwise.",[141,4415,4416,4419,4420,4423,4424,4426,4427,201,4430,201,4433,201,4436,201,4439,201,4442,201,4445,445,4448,4451,4452,4455,4456,4459,4460,4462,4463,4466,4467,4470],{},[144,4417,4418],{},".gitignore"," applies because a refresh runs only when the ",[144,4421,4422],{},"git ls-files"," fingerprint changes. ",[144,4425,1507],{}," also skips ",[144,4428,4429],{},"vendor",[144,4431,4432],{},"build",[144,4434,4435],{},"dist",[144,4437,4438],{},"target",[144,4440,4441],{},"out",[144,4443,4444],{},".next",[144,4446,4447],{},".nuxt",[144,4449,4450],{},".dart_tool",", and both backends ignore the database and its sidecars. Polling waits until two checks ",[144,4453,4454],{},"--debounce"," seconds apart see the same fingerprint (at most 30s) and then refreshes once. Before each refresh, cg waits while ",[144,4457,4458],{},"git rev-parse --git-path index.lock"," exists (a branch switch), so a checkout is one refresh. If files change while a refresh runs, one more refresh follows, then cg waits for the next change. The run shares ",[144,4461,4232],{}," with ",[144,4464,4465],{},"cg hooks",". Ctrl-C prints ",[144,4468,4469],{},"watch stopped"," and exits 0.",[166,4472,4473,4481],{},[169,4474,4475],{},[172,4476,4477,4479],{},[175,4478,1548],{},[175,4480,1554],{},[185,4482,4483,4492,4501,4510,4520,4531],{},[172,4484,4485,4489],{},[190,4486,4487],{},[144,4488,154],{},[190,4490,4491],{},"graph file (required)",[172,4493,4494,4498],{},[190,4495,4496],{},[144,4497,200],{},[190,4499,4500],{},"project name when the database is new",[172,4502,4503,4507],{},[190,4504,4505],{},[144,4506,4454],{},[190,4508,4509],{},"seconds to let writes settle (default 1)",[172,4511,4512,4517],{},[190,4513,4514],{},[144,4515,4516],{},"--interval",[190,4518,4519],{},"polling interval in seconds (default 2, minimum 0.2)",[172,4521,4522,4526],{},[190,4523,4524],{},[144,4525,4412],{},[190,4527,4528,4529],{},"poll with git instead of ",[144,4530,1507],{},[172,4532,4533,4537],{},[190,4534,4535],{},[144,4536,274],{},[190,4538,4539,4540,4542],{},"pass ",[144,4541,274],{}," through to each refresh",[161,4544,299],{"id":299},[141,4546,4547,4548,3675,4551,3675,4554,3675,4557,4560,4561,4564,4565],{},"Cache root: ",[144,4549,4550],{},"$CG_CACHE",[144,4552,4553],{},"%LOCALAPPDATA%\\cg",[144,4555,4556],{},"$XDG_CACHE_HOME\u002Fcg",[144,4558,4559],{},"~\u002F.cache\u002Fcg",". A directory left at the previous ",[144,4562,4563],{},"codegraph"," name is moved on first use. ",[216,4566,219],{"href":4179},[141,4568,4569,4572,4573,201,4576,2847,4579,912,4582,201,4585,201,4588,201,4591,201,4594,201,4597,437,4600,4603],{},[144,4570,4571],{},"doctor"," prints size per kind. Paths under the root: ",[144,4574,4575],{},"extractors\u002F\u003Clanguage>-\u003Clock hash>\u002F",[144,4577,4578],{},"scip\u002F\u003Cname>-v\u003CN>-\u003Cproject key>-\u003Ckey>.scip",[144,4580,4581],{},".lock",[144,4583,4584],{},"scip\u002Fra-config-\u003Cproject key>-\u003Chash>.json",[144,4586,4587],{},"scip\u002Fswift-v\u003CN>-\u003Cbuild key>.lock",[144,4589,4590],{},"swift-build\u002F\u003Cbuild key>\u002F",[144,4592,4593],{},"ts\u002F\u003Cproject key>-v\u003CN>-\u003Cfingerprint>.json",[144,4595,4596],{},"dart\u002F\u003Cproject key>-v\u003CN>-\u003Cfingerprint>.json",[144,4598,4599],{},"projects\u002F\u003Cproject key>",[144,4601,4602],{},"v\u003CN>"," is the cache version. The project key is the first 12 hex digits of the SHA-256 of the resolved root.",[166,4605,4606,4616],{},[169,4607,4608],{},[172,4609,4610,4613],{},[175,4611,4612],{},"Invocation",[175,4614,4615],{},"Removes",[185,4617,4618,4628,4646,4656,4666,4684],{},[172,4619,4620,4625],{},[190,4621,4622],{},[144,4623,4624],{},"clean ROOT",[190,4626,4627],{},"entries of that project and of projects indexed below it, every kind except extractors",[172,4629,4630,4635],{},[190,4631,4632],{},[144,4633,4634],{},"clean --stale",[190,4636,4637,4638,4641,4642,4645],{},"older cache versions and layouts (names with no cache version or project key), ",[144,4639,4640],{},".tmp"," files older than ",[144,4643,4644],{},"CG_INDEXER_TIMEOUT"," + 10 min, SCIP locks with no cache entry",[172,4647,4648,4653],{},[190,4649,4650],{},[144,4651,4652],{},"clean --all",[190,4654,4655],{},"the cache root, extractors kept",[172,4657,4658,4663],{},[190,4659,4660],{},[144,4661,4662],{},"clean --all --extractors",[190,4664,4665],{},"the cache root, including extractor installs",[172,4667,4668,4672],{},[190,4669,4670],{},[144,4671,1563],{},[190,4673,4674,4675,357,4677,357,4680,4683],{},"that graph plus ",[144,4676,4390],{},[144,4678,4679],{},"-shm",[144,4681,4682],{},"-journal"," (alone, the cache is left as-is)",[172,4685,4686,4690],{},[190,4687,4688],{},[144,4689,292],{},[190,4691,4692,4693,4695],{},"paths and sizes only; ",[144,4694,618],{}," is the same list",[141,4697,4698,4699,4701,4702,4704,4705,4708,4709,4712,4713,201,4715,4717],{},"Nothing outside the cache root is deleted except an explicit ",[144,4700,154],{},". Symlinks are removed, not followed. A lock a running cg holds is skipped. A non-SQLite ",[144,4703,154],{}," is refused. If the root resolves to ",[144,4706,4707],{},"\u002F",", a drive root, ",[144,4710,4711],{},"$HOME",", or a directory above ",[144,4714,4711],{},[144,4716,299],{}," exits 2 and deletes nothing.",[4719,4720,4721],"style",{},"html pre.shiki code .sZJo5, html code.shiki .sZJo5{--shiki-light:#65A30D;--shiki-default:#65A30D;--shiki-dark:#84CC16}html pre.shiki code .sha9Y, html code.shiki .sha9Y{--shiki-light:#9F8CFF;--shiki-default:#9F8CFF;--shiki-dark:#C4B5FD}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZWGQ, html code.shiki .sZWGQ{--shiki-light:#8B5CF6;--shiki-default:#8B5CF6;--shiki-dark:#C4B5FD}html pre.shiki code .sZ_TN, html code.shiki .sZ_TN{--shiki-light:#71717A;--shiki-default:#71717A;--shiki-dark:#A1A1AA}",{"title":1874,"searchDepth":4723,"depth":1930,"links":4724},4,[4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742],{"id":163,"depth":1930,"text":164},{"id":1538,"depth":1930,"text":1539},{"id":454,"depth":1930,"text":1841},{"id":2071,"depth":1930,"text":2072},{"id":2423,"depth":1930,"text":2424},{"id":2613,"depth":1930,"text":2614},{"id":2796,"depth":1930,"text":2797},{"id":2905,"depth":1930,"text":2906},{"id":2947,"depth":1930,"text":2948},{"id":2983,"depth":1930,"text":2984},{"id":798,"depth":1930,"text":3196},{"id":624,"depth":1930,"text":624},{"id":1213,"depth":1930,"text":1213},{"id":3632,"depth":1930,"text":3632},{"id":261,"depth":1930,"text":261},{"id":1475,"depth":1930,"text":1475},{"id":1514,"depth":1930,"text":1514},{"id":299,"depth":1930,"text":299},"cg \u003Ccommand> is python -m cg_code_graph.cli \u003Ccommand>. Query commands need --db. Flags not listed here: cg \u003Ccommand> -h.","md",{},true,{"title":26,"description":4743},"IDvO7eZ701CBDfNeQy30PTM7gzmA5JIF-5BGMe4JrgE",[4750,4752],{"title":22,"path":23,"stem":24,"description":4751,"children":-1},"Realtime channels (who may join, what publishes, which client listens) and test code (which\ntests exercise a symbol, route or table). Examples are the task-board fixture in\ntests\u002Fbroadcast_fixture (api\u002F Laravel, web\u002F Nuxt, joined with cg link).",{"title":30,"path":31,"stem":32,"description":4753,"children":-1},"Every positive answer has evidence (file:line, a confidence label). Completeness is the\nother half: which part of the repo that answer was drawn from, so \"no callers\" is reliable when\nthe index is complete, and an agent knows where to fall back to text search when it is not.",1792170232404]