@niroai/niro 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/README.md +123 -302
  3. package/bin/niro.js +12 -1
  4. package/docs/agent-antigravity.md +37 -0
  5. package/docs/agent-claude-code.md +48 -0
  6. package/docs/agent-claude-desktop.md +47 -0
  7. package/docs/agent-cline.md +42 -0
  8. package/docs/agent-codex.md +45 -0
  9. package/docs/agent-copilot-cli.md +42 -0
  10. package/docs/agent-cursor.md +44 -0
  11. package/docs/agent-factory.md +42 -0
  12. package/docs/agent-gemini-cli.md +42 -0
  13. package/docs/agent-goose.md +42 -0
  14. package/docs/agent-kiro.md +37 -0
  15. package/docs/agent-opencode.md +37 -0
  16. package/docs/agent-vscode.md +45 -0
  17. package/docs/agent-windsurf.md +38 -0
  18. package/docs/answer-shapes.md +69 -0
  19. package/docs/builds-and-updates.md +68 -0
  20. package/docs/cloud-README.md +372 -0
  21. package/docs/configuring-a-folder.md +51 -0
  22. package/docs/connect-ci.md +24 -0
  23. package/docs/connect-overview.md +20 -0
  24. package/docs/connect-review-bots.md +17 -0
  25. package/docs/connect-team-server.md +12 -0
  26. package/docs/connect-terminal.md +49 -0
  27. package/docs/connect-web-agents.md +9 -0
  28. package/docs/connect-your-ai-assistant.md +59 -175
  29. package/docs/coverage-audit-and-consent.md +51 -0
  30. package/docs/evaluate-what-niro-did.md +271 -0
  31. package/docs/faq-assistants-and-mcp.md +122 -0
  32. package/docs/faq-feedback-and-receipts.md +33 -0
  33. package/docs/faq-indexing.md +127 -0
  34. package/docs/faq-install-and-setup.md +103 -0
  35. package/docs/faq-licence-and-plans.md +86 -0
  36. package/docs/faq-login-and-account.md +69 -0
  37. package/docs/faq-offline.md +34 -0
  38. package/docs/faq-performance.md +33 -0
  39. package/docs/faq-privacy-and-security.md +113 -0
  40. package/docs/faq-uninstall.md +47 -0
  41. package/docs/faq-updates.md +59 -0
  42. package/docs/faq-worktrees-and-branches.md +59 -0
  43. package/docs/faq-wrong-or-missing-answers.md +275 -0
  44. package/docs/hosted-only.md +33 -0
  45. package/docs/how-the-graph-works.md +47 -0
  46. package/docs/index.md +157 -0
  47. package/docs/licence-and-plans.md +72 -0
  48. package/docs/lifecycle-debug.md +48 -0
  49. package/docs/lifecycle-onboarding.md +32 -0
  50. package/docs/lifecycle-overview.md +77 -0
  51. package/docs/lifecycle-plan-and-design.md +44 -0
  52. package/docs/lifecycle-review.md +30 -0
  53. package/docs/lifecycle-security-and-privacy.md +35 -0
  54. package/docs/lifecycle-test.md +28 -0
  55. package/docs/lifecycle-write-code.md +35 -0
  56. package/docs/llms-full.txt +8015 -0
  57. package/docs/llms.txt +126 -0
  58. package/docs/playbook-add-a-feature.md +108 -0
  59. package/docs/playbook-change-safely.md +93 -0
  60. package/docs/playbook-data-and-events.md +107 -0
  61. package/docs/playbook-debug-after-a-change.md +96 -0
  62. package/docs/playbook-debug-config.md +95 -0
  63. package/docs/playbook-debug-exception.md +124 -0
  64. package/docs/playbook-debug-failing-service-call.md +119 -0
  65. package/docs/playbook-debug-slow-path.md +80 -0
  66. package/docs/playbook-debug-wrong-value.md +137 -0
  67. package/docs/playbook-onboard.md +95 -0
  68. package/docs/playbook-review-a-change.md +72 -0
  69. package/docs/playbook-test-a-change.md +73 -0
  70. package/docs/reference-cli.md +113 -0
  71. package/docs/reference-config-files.md +42 -0
  72. package/docs/reference-engine-commands.md +56 -0
  73. package/docs/reference-environment-variables.md +89 -0
  74. package/docs/reference-exit-codes.md +67 -0
  75. package/docs/reference-limits.md +75 -0
  76. package/docs/reference-mcp-tools.md +326 -0
  77. package/docs/reference-messages.md +180 -0
  78. package/docs/secrets-and-masking.md +48 -0
  79. package/docs/supported-c.md +130 -0
  80. package/docs/supported-cpp.md +157 -0
  81. package/docs/supported-csharp.md +211 -0
  82. package/docs/supported-go.md +258 -0
  83. package/docs/supported-java.md +226 -0
  84. package/docs/supported-javascript.md +223 -0
  85. package/docs/supported-kotlin.md +124 -0
  86. package/docs/supported-overview.md +89 -0
  87. package/docs/supported-php.md +157 -0
  88. package/docs/supported-python.md +224 -0
  89. package/docs/supported-ruby.md +162 -0
  90. package/docs/supported-rust.md +150 -0
  91. package/docs/supported-swift.md +133 -0
  92. package/docs/supported-typescript.md +220 -0
  93. package/docs/tokens-speed-and-accuracy.md +99 -0
  94. package/docs/troubleshooting.md +42 -0
  95. package/docs/uninstall.md +74 -0
  96. package/docs/what-leaves-your-machine.md +71 -0
  97. package/docs/where-things-are-stored.md +59 -0
  98. package/docs/worktrees-and-branches.md +55 -0
  99. package/package.json +5 -3
  100. package/src/commands/add-repo.js +5 -0
  101. package/src/commands/auditSend.js +67 -0
  102. package/src/commands/build.js +6 -0
  103. package/src/commands/docsSend.js +73 -0
  104. package/src/commands/engine.js +120 -0
  105. package/src/commands/engineRoutes.js +105 -0
  106. package/src/commands/guide.js +254 -0
  107. package/src/commands/init.js +6 -2
  108. package/src/commands/initLocal.js +96 -0
  109. package/src/commands/journalSend.js +47 -0
  110. package/src/commands/login.js +89 -12
  111. package/src/commands/mcp.js +22 -6
  112. package/src/commands/plan.js +99 -0
  113. package/src/commands/repoPush.js +33 -0
  114. package/src/commands/requestIntegration.js +38 -0
  115. package/src/commands/share.js +56 -0
  116. package/src/commands/start.js +451 -371
  117. package/src/commands/status.js +57 -0
  118. package/src/commands/takeover.js +6 -0
  119. package/src/commands/uninstall.js +180 -0
  120. package/src/commands/upgrade.js +38 -8
  121. package/src/commands/watch.js +420 -6
  122. package/src/index.js +174 -3
  123. package/src/lib/agentApi.js +32 -1
  124. package/src/lib/api.js +20 -6
  125. package/src/lib/auditUpload.js +293 -0
  126. package/src/lib/branchDrift.js +149 -0
  127. package/src/lib/choose.js +116 -0
  128. package/src/lib/cloudGuard.js +74 -0
  129. package/src/lib/credentials.js +2 -2
  130. package/src/lib/docsMarked.js +55 -0
  131. package/src/lib/docsState.js +213 -0
  132. package/src/lib/docsUpload.js +481 -0
  133. package/src/lib/engine.js +619 -0
  134. package/src/lib/folderSync.js +2 -1
  135. package/src/lib/graphCheck.js +40 -0
  136. package/src/lib/guide.js +293 -0
  137. package/src/lib/guideSearch.js +252 -0
  138. package/src/lib/integrationRequest.js +89 -0
  139. package/src/lib/journalUpload.js +147 -0
  140. package/src/lib/languages.js +129 -0
  141. package/src/lib/lease.js +375 -0
  142. package/src/lib/localBuild.js +285 -0
  143. package/src/lib/localEngine.js +210 -0
  144. package/src/lib/localOnboard.js +124 -0
  145. package/src/lib/localWorktrees.js +243 -0
  146. package/src/lib/machineCheck.js +58 -0
  147. package/src/lib/mcpClients.js +10 -1
  148. package/src/lib/migrationNotice.js +118 -0
  149. package/src/lib/modelFetch.js +153 -0
  150. package/src/lib/nestedOutput.js +23 -9
  151. package/src/lib/onboardingLog.js +34 -0
  152. package/src/lib/planUsage.js +165 -0
  153. package/src/lib/progressBar.js +46 -0
  154. package/src/lib/prompt.js +1 -1
  155. package/src/lib/redact.js +155 -0
  156. package/src/lib/release.js +33 -0
  157. package/src/lib/repoPush.js +495 -0
  158. package/src/lib/secret.js +1 -1
  159. package/src/lib/service.js +372 -63
  160. package/src/lib/shareCode.js +367 -0
  161. package/src/lib/shareExclusions.js +114 -0
  162. package/src/lib/shareFiles.js +129 -0
  163. package/src/lib/spinner.js +9 -5
  164. package/src/lib/watchDaemon.js +33 -10
  165. package/src/lib/watchState.js +12 -1
  166. package/src/lib/windowsPaths.js +67 -0
  167. package/src/mcp/lineCheck.js +382 -0
  168. package/src/mcp/lineName.js +92 -0
  169. package/src/mcp/localBackend.js +751 -0
  170. package/src/mcp/localMode.js +383 -0
  171. package/src/mcp/localSkill.js +189 -0
  172. package/src/mcp/server.js +610 -79
  173. package/src/mcp/setup.js +519 -131
  174. package/src/mcp/shellSearchHook.js +509 -0
  175. package/src/mcp/teardown.js +173 -91
  176. package/src/mcp/usingNiro.js +39 -0
  177. package/docs/working-on-branches.md +0 -162
@@ -0,0 +1,103 @@
1
+ # FAQ: install and setup
2
+
3
+ ### Which computers does Niro run on?
4
+ macOS and Linux, on Intel and ARM processors. Windows is supported, and the details are coming.
5
+ <!-- source: src/lib/engine.js:79-90; Windows: Niraj, 2026-11-10 -->
6
+
7
+ ### I am on Windows. Setup says "Niro Local runs on macOS and Linux. On Windows, use WSL 2."
8
+ Windows support is coming to this guide. Until it arrives, follow the message: install WSL 2 (Windows Subsystem for Linux, which runs Linux inside Windows), and run Niro inside it.
9
+ <!-- source: src/commands/start.js:165-167 (the message); Windows supported, details coming: Niraj, 2026-11-10 -->
10
+
11
+ ### "Node vX. Niro needs Node 18 or newer."
12
+ Install Node.js 18 or newer, then run `niro start` again.
13
+ <!-- source: src/commands/start.js:178; src/lib/machineCheck.js:13 -->
14
+
15
+ ### "N GB free. A large repository's graph may need more."
16
+ This is a warning, not a stop. It appears when less than 2 GB of disk is free. Free some space if you are indexing a large repository.
17
+ <!-- source: src/commands/start.js:175; src/lib/machineCheck.js:14 -->
18
+
19
+ ### "`niro start` is interactive and there is no terminal to prompt on."
20
+ `niro start` asks questions, so it needs a terminal. Run it in a terminal window. For a machine with no person at it, see [connect-ci.md](connect-ci.md).
21
+ <!-- source: src/commands/start.js:97-104 -->
22
+
23
+ ### "Global install failed. Install it yourself, then run niro start"
24
+ You ran Niro through `npx`, and Niro tried to install itself for good, so that background updates keep working after npx clears its cache. That failed, often for lack of permission. Run `npm install -g @niroai/niro`, then `niro start`.
25
+ <!-- source: src/commands/start.js:537-552 -->
26
+
27
+ ### "<folder> is your home folder ... Niro will not index it."
28
+ Niro refuses your home folder, a folder above it, the root of the disk and system folders, because it would index everything below as one project. Run `niro start` from your project's folder instead. `--force` does not change this.
29
+ <!-- source: src/lib/onboardTarget.js:81-104; niro-local src/niro_local/onboard.py:137-140 -->
30
+
31
+ ### "<folder> does not exist." or "<folder> is a file, not a folder."
32
+ Check the path you gave, then run the command again.
33
+ <!-- source: src/commands/start.js:579-598 -->
34
+
35
+ ### "Nothing that looks like a project in <folder>."
36
+ Niro looks for a build file (such as `package.json`, `pom.xml` or `go.mod`) in the folder, or up to three levels below it. If your folder really is a project without one, add it anyway with `niro init --force`.
37
+ <!-- source: niro-local src/niro_local/onboard.py:154-159 -->
38
+
39
+ ### "It holds more than 60 repositories, too many to index as one folder."
40
+ Add the repositories one by one, or add a smaller folder.
41
+ <!-- source: niro-local src/niro_local/offer.py:251; src/niro_local/modules/resolve.py:61 -->
42
+
43
+ ### "It holds no source file niro-local can read."
44
+ The folder has no file in a language Niro reads. See [supported-overview.md](supported-overview.md).
45
+ <!-- source: niro-local src/niro_local/offer.py:262 -->
46
+
47
+ ### I ran `niro start` again. Will it redo everything?
48
+ No. It carries on from the first step that did not finish.
49
+ <!-- source: src/commands/start.js:61 (a second run resumes at the first unfinished step) -->
50
+
51
+ ### I typed `niro` on its own and it started setup.
52
+ Before you have signed in, `niro` on its own runs `niro start`.
53
+ <!-- source: src/index.js:468-470 -->
54
+
55
+ ### "The local engine is not installed. Run `niro start` once to set up this machine."
56
+ The engine (the program that builds and answers from the graph) is missing. Run `niro start`, or `niro engine install`.
57
+ <!-- source: src/commands/engineRoutes.js:58; src/commands/initLocal.js:43 -->
58
+
59
+ ### "Downloading the local engine failed: HTTP n" or "The engine manifest came back incomplete."
60
+ The download did not finish. Check your connection, then run `niro engine install`.
61
+ <!-- source: src/lib/engine.js:415, :475 -->
62
+
63
+ ### "The local engine that arrived is not the one Niro published, so it was not installed."
64
+ The downloaded file did not match its published fingerprint (SHA-256), so Niro threw it away. Try again. If it keeps happening, tell Niro (help@niro.ai).
65
+ <!-- source: src/lib/engine.js:551 -->
66
+
67
+ ### "Another process has been downloading the local engine for too long."
68
+ A lock folder from an earlier download is still there. If nothing else is downloading, remove the lock folder the message names, and try again.
69
+ <!-- source: src/lib/engine.js:449 -->
70
+
71
+ ### "There is no local engine for <platform> <arch>."
72
+ There is no engine built for this kind of computer.
73
+ <!-- source: src/lib/engine.js:84-87 -->
74
+
75
+ ### `niro engine status` says another niro-local is on my PATH.
76
+ A second copy of the engine is installed somewhere on your PATH. `niro` does not use it. Remove it, so that only one version is on this computer.
77
+ <!-- source: src/commands/engine.js:92-116 -->
78
+
79
+ ### The engine install ended with "Nothing was installed."
80
+ Niro's service refused the download. The message above it gives the service's reason, for example that your plan does not include the engine.
81
+ <!-- source: src/commands/engine.js:54-56 -->
82
+
83
+ ### "The local engine cannot open its graph on this machine" or "Make that folder writable, or set NIRO_LOCAL_HOME"
84
+ The engine cannot write to `~/.niro-local`. Make that folder writable by you. Or set `NIRO_LOCAL_HOME` to a folder you can write, and run `niro service install` so the watcher uses it too.
85
+ <!-- source: src/commands/engine.js:73; niro-local src/niro_local/graph/sqlite_writer.py:389-390; src/niro_local/cli.py:105-143; src/lib/service.js:74-108 -->
86
+
87
+ ### "PM2 is not installed." / "PM2 install failed" / "PM2 was installed but [is not] runnable from this shell"
88
+ PM2 is the tool that keeps Niro's background watcher running.
89
+
90
+ - **Install failed.** If installing it failed (usually a permission error), run `sudo npm install -g pm2`, then `niro service install`.
91
+ - **Installed but not found.** If it installed but cannot be found, npm's global folder is not on your PATH. Find it with `npm prefix -g`, and add its `bin` folder to your PATH.
92
+ <!-- source: src/lib/watchDaemon.js:36-81 (messages; the last one is quoted from code, which uses a contraction) -->
93
+
94
+ ### "Could not set niro-watch to start on login"
95
+ The watcher runs, but will not start again by itself after you log out. The message gives the command to try again. That command may need `sudo`.
96
+ <!-- source: src/lib/service.js:276-277 -->
97
+
98
+ ### `niro status` says the background updates are "stopped", "not installed" or "OFF".
99
+ The graph will not follow your edits until the watcher runs. The status line names the fix:
100
+
101
+ - **Stopped or not installed:** run `niro service install`.
102
+ - **OFF:** PM2 is missing. Install it with `npm install -g pm2`, then run `niro service install`.
103
+ <!-- source: src/commands/status.js:35-40 -->
@@ -0,0 +1,86 @@
1
+ # FAQ: licence and plans
2
+
3
+ ### What plans are there, and how many lines does each allow?
4
+ Free allows 500,000 lines. Free with code sharing on has no line limit. There is also a 30-day Pro trial. `niro plan` shows yours. See [licence-and-plans.md](licence-and-plans.md).
5
+ <!-- source: Niraj, 2026-11-10; src/lib/planUsage.js:53-66 -->
6
+
7
+ ### What counts as a line?
8
+ Every line of every file Niro reads, blank lines and comments included. Two copies of one repository (branches, worktrees) count once, by the larger. Different repositories add up. A folder inside another indexed folder counts once.
9
+ <!-- source: niro-local src/niro_local/licence/limit.py:9-60; src/lib/planUsage.js:1-21 -->
10
+
11
+ ### "Not built: this machine already holds N lines of code, over the M line limit."
12
+ This computer is at or over your plan's line limit, and this folder would add new lines. A page in the console opens to help you choose. The choices are also listed under the next questions.
13
+ <!-- source: src/commands/initLocal.js:59-62; src/commands/start.js:305-318 -->
14
+
15
+ ### "No room left under the limit, so a new folder will not be indexed. Folders already indexed still rebuild."
16
+ You are at your limit. Folders you already index keep updating. A new folder is refused until you free room or change plan.
17
+ <!-- source: src/lib/planUsage.js:75 -->
18
+
19
+ ### "Not indexing: this machine already holds N lines ..." with a list ending "removing it frees nothing"
20
+ The engine lists your folders and how many lines each counts for. "Same repository: removing it frees nothing" marks a second copy of a repository you already count. Removing it does not lower your total.
21
+ <!-- source: niro-local src/niro_local/licence/limit.py:145-190 -->
22
+
23
+ ### How do I get past the limit?
24
+ `niro plan` lists three ways:
25
+
26
+ 1. **Turn on "Share redacted code"** in the console (Settings, Privacy). On the Free plan this removes the limit.
27
+ 2. **Ask for a Pro free trial** at `console.niroai.dev/request?plan=pro`.
28
+ 3. **Stop indexing a folder** with `niro plan remove <folder>`.
29
+ <!-- source: src/commands/plan.js:63-67 -->
30
+
31
+ ### What does "no line limit while you share" mean, and what is shared?
32
+ Code sharing is the "Share redacted code" switch on your account. With it on, the Free plan has no line limit, and the background watcher sends the files Niro indexes, masked, by itself: the whole set the first time, then only changed files. Keep a folder out with `niro share exclude <folder>`. You can also send one folder at once with `niro audit-push-repo`.
33
+ <!-- source: src/lib/planUsage.js:53-66; src/lib/shareCode.js; src/lib/shareExclusions.js; src/lib/repoPush.js -->
34
+
35
+ ### Is code sharing the same as the coverage audit?
36
+ No. The coverage audit sends small masked snippets on every plan, whether sharing is on or off. See [coverage-audit-and-consent.md](coverage-audit-and-consent.md).
37
+ <!-- source: src/lib/auditUpload.js:27-30 -->
38
+
39
+ ### "Could not read your plan from Niro. Check your connection, then run niro plan again."
40
+ Niro's service could not be reached, or did not answer. Check your connection.
41
+ <!-- source: src/commands/plan.js:20, :41 -->
42
+
43
+ ### "Niro will not license the local engine: <reason>"
44
+ Niro's service refused the licence, so the engine stopped. The reason follows the message. If it is about your account, write to help@niro.ai.
45
+ <!-- source: src/lib/lease.js:271-276 -->
46
+
47
+ ### "Could not renew the local engine's licence ... It keeps working offline for up to a day."
48
+ The licence service could not be reached. Niro keeps working for up to a day, and renews when it can.
49
+ <!-- source: src/lib/lease.js:282-286 -->
50
+
51
+ ### "Working on an expired licence: N hours of offline allowance left"
52
+ The licence has run out and could not be renewed. The engine keeps working for the hours shown. Reconnect before they run out.
53
+ <!-- source: niro-local src/niro_local/licence/report.py:122 -->
54
+
55
+ ### "Not indexing: ..." followed by "Reason given: ..."
56
+ The engine refused to build because its licence was missing or not valid. The reasons are:
57
+
58
+ - **No licence reached the engine.** It was started some other way than by `niro`.
59
+ - **The service refused it.**
60
+ - **It has run out.**
61
+ - **It does not match this engine, or its signature or key is not one the engine trusts.**
62
+ - **It is damaged or incomplete.**
63
+ <!-- source: niro-local src/niro_local/licence/report.py:17-71 (NO_LEASE, REFUSED_BY_SERVICE, EXPIRED, WRONG_NONCE, BAD_SIGNATURE, UNSUPPORTED_VERSION, UNKNOWN_KEY, MALFORMED, INCOMPLETE, NO_TRUSTED_KEY) -->
64
+
65
+ Run the command again through `niro` (for example `niro build`). If it persists, run `niro upgrade`.
66
+ <!-- source: niro-local src/niro_local/licence/report.py:17-71, :81-101 (NO_LEASE, REFUSED_BY_SERVICE, EXPIRED, WRONG_NONCE, BAD_SIGNATURE, UNSUPPORTED_VERSION, UNKNOWN_KEY, MALFORMED, INCOMPLETE, NO_TRUSTED_KEY) -->
67
+
68
+ ### "The Niro CLI has not handed this engine its licence yet."
69
+ The engine has just started and is waiting for its licence. Ask again in a few seconds. If it keeps saying this, the engine was not started by `niro`: connect your agent with `niro mcp install`.
70
+ <!-- source: niro-local src/niro_local/cli.py:1368, :2662, :2678 -->
71
+
72
+ ### Typing `niro-local build` or `niro-local ask` is refused.
73
+ The engine runs only with the licence `niro` hands it. Use `niro build` and `niro ask`.
74
+ <!-- source: niro-local src/niro_local/commands.py:1-72; src/lib/release.js:25-31 -->
75
+
76
+ ### Does the Pro trial have a line limit?
77
+ The Pro trial lasts 30 days. `niro plan` shows its limit, if it has one.
78
+ <!-- source: Niraj, 2026-11-10 (30-day Pro trial); README.md (Pro trial: "no line limit, no sharing needed"); src/commands/plan.js:57-61 -->
79
+
80
+ ### I am over the limit. Will my folders and branches still update?
81
+ Yes. Folders already indexed keep rebuilding, and so do new branches and worktrees of them. Only a new folder is refused.
82
+ <!-- source: src/lib/planUsage.js:71-87 -->
83
+
84
+ ### A page opened in my browser by itself, at ".../limit".
85
+ That is the console's page for choosing what to do at the limit. `niro start` and `niro init` open it when a folder would take you over.
86
+ <!-- source: src/commands/start.js:305-318; src/commands/initLocal.js:59 -->
@@ -0,0 +1,69 @@
1
+ # FAQ: login and account
2
+
3
+ ### Do I need an account to use Niro on my own computer?
4
+ Yes. The account carries your plan, and the engine needs a licence from it to run. Sign up at console.niroai.dev.
5
+ <!-- source: src/lib/lease.js:42-44; sign-up: Niraj, 2026-11-10 -->
6
+
7
+ ### The browser did not open when I signed in.
8
+ Niro prints the address and a code. Open the address yourself, in any browser, and enter the code.
9
+ <!-- source: src/commands/login.js:168-176, :231-250 -->
10
+
11
+ ### "Login timed out. Run niro login to try again."
12
+ The code was not approved in time. A code lasts 10 minutes unless the service says otherwise. Run `niro start` or `niro login` again for a new code.
13
+ <!-- source: src/commands/login.js:23-24, :213 -->
14
+
15
+ ### "You are on the list. We will email you when you are in."
16
+ Your account is waiting to be let in. Niro emails you when it is. Then run `niro start` again.
17
+ <!-- source: src/commands/login.js:286-305 (account_waiting) -->
18
+
19
+ ### "Request sent. We reply within one business day."
20
+ Your request (for example for a trial) has reached Niro. Run `niro start` again once you hear back.
21
+ <!-- source: src/commands/login.js:286-305 (request_submitted) -->
22
+
23
+ ### "This account cannot sign in to Niro."
24
+ This account is blocked. If you think that is a mistake, reply to any Niro email, or write to help@niro.ai.
25
+ <!-- source: src/commands/login.js:286-305 (account_blocked) -->
26
+
27
+ ### "The sign-in was not completed. Run niro start again to get a new code."
28
+ The sign-in was declined in the browser, or the code ran out. Run `niro start` again.
29
+ <!-- source: src/commands/login.js:286-305 (access_denied, expired_token) -->
30
+
31
+ ### "Not logged in", "Session expired" or "Token refresh failed"
32
+ Your saved sign-in is missing or no longer valid. Run `niro login`.
33
+ <!-- source: src/lib/credentials.js:61, :66; src/lib/api.js:72, :82, :110 -->
34
+
35
+ ### "Credentials rejected by server (401). Run niro login to refresh."
36
+ The service no longer accepts your saved sign-in. Run `niro login`.
37
+ <!-- source: src/commands/whoami.js:21 -->
38
+
39
+ ### I signed in with `--api-key` or `--password`, and `niro mcp install` says "Not signed in. Run niro login".
40
+ Connecting agents needs the browser sign-in. Run `niro login` with no options, approve in the browser, then run `niro mcp install` again. `niro start` does not help here: it sees the saved key, skips the sign-in, and the installer refuses again. Signing in with a key is due to be removed.
41
+ <!-- source: src/mcp/setup.js:574-583, :2950-2955; src/commands/start.js:197-198, :470-473; src/commands/login.js:35-38; TODO.md:51-62 -->
42
+
43
+ ### A command says "`--api-url` ..." is not accepted.
44
+ Only `niro login` accepts `--api-url`. Sign in with it once: the other commands then use the address you signed in to.
45
+ <!-- source: src/index.js:30-39; src/lib/api.js:33-41 -->
46
+
47
+ ### Signing in hangs and nothing happens.
48
+ Sign-in and other account calls have no time limit, so on a stalled network they wait. Press Ctrl-C, check your connection, and try again.
49
+ <!-- source: src/lib/api.js:146-149 -->
50
+
51
+ ### "Device flow not available on this server, falling back to API key login."
52
+ Niro could not use the browser sign-in, so it asks for a key instead. This happens when the service has no browser sign-in (a custom `--api-url`), and also when the check for it fails with a network error. In the second case, press Ctrl-C, check your connection, and run `niro login` again.
53
+ <!-- source: src/commands/login.js:36-42, :132-141 (a network error with no HTTP status returns false, and login falls back) -->
54
+
55
+ ### "Invalid API key." or "Server did not return a token."
56
+ The key was wrong or has been withdrawn. Use the browser sign-in instead: `niro login`.
57
+ <!-- source: src/commands/login.js:69, :85 -->
58
+
59
+ ### What does `niro logout` remove?
60
+ It withdraws the sign-in on Niro's service where it can, and deletes `~/.niro/credentials.json`. Your graphs stay.
61
+ <!-- source: src/commands/logout.js:19-20 -->
62
+
63
+ ### `niro whoami` says I am signed in, but I am offline.
64
+ When the service cannot be reached, `niro whoami --json` reports your saved sign-in. It does not check that sign-in with the service.
65
+ <!-- source: src/commands/whoami.js:52-58 -->
66
+
67
+ ### How do I delete my account?
68
+ Email help@niro.ai.
69
+ <!-- source: Niraj, 2026-11-10 -->
@@ -0,0 +1,34 @@
1
+ # FAQ: offline use
2
+
3
+ ### Can I use Niro offline?
4
+ Yes, for up to about a day at a time. The engine needs a licence from Niro's service, and keeps working for about a day when it cannot renew it. Your agent's questions never need the network.
5
+ <!-- source: src/lib/lease.js:282-286; niro-local src/niro_local/licence/report.py:122; src/lib/planUsage.js:118 -->
6
+
7
+ ### What needs the network?
8
+ - signing in;
9
+ - renewing the licence;
10
+ - downloading the engine;
11
+ - sending the coverage audit and the tool-usage record.
12
+
13
+ Everything else runs on your computer.
14
+ <!-- source: src/lib/api.js; src/lib/lease.js; src/lib/engine.js; src/lib/auditUpload.js; src/lib/journalUpload.js -->
15
+
16
+ ### Can Niro run on a computer with no internet at all?
17
+ Not for more than about a day. The licence needs Niro's service. There is no offline licence.
18
+ <!-- source: src/lib/lease.js:9-57 -->
19
+
20
+ ### Does Niro work behind a company proxy?
21
+ `niro` has no proxy setting of its own. When the background watcher is installed, it is given four proxy variables from your environment: `HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY` and `NODE_USE_ENV_PROXY`. It is also given `NODE_EXTRA_CA_CERTS`, `SSL_CERT_FILE` and `SSL_CERT_DIR`, for a company's own certificates. This is so that a watcher behind a company proxy can upload. Set them before you run `niro service install`. Other proxy setups have not been tested.
22
+ <!-- source: src/lib/service.js:72-73 ("without them a watcher behind a company proxy or private certificate cannot upload"), :83 (the four proxy names) -->
23
+
24
+ ### What happens to the audit and tool-usage records while I am offline?
25
+ They wait on your computer, and the watcher tries every 5 minutes. A record the service refuses is kept in `~/.niro/journal-refused`.
26
+ <!-- source: src/commands/watch.js:423-426; src/lib/journalUpload.js:120-129 -->
27
+
28
+ ### "Network error calling <method> <path>"
29
+ Niro's service could not be reached. Check your connection, and try again.
30
+ <!-- source: src/lib/api.js:155, :192-200 -->
31
+
32
+ ### The first answer of a session takes about 20 seconds when I am offline.
33
+ The engine waits for its licence before answering. Known problem.
34
+ <!-- source: niro-local docs/NIRO-LOCAL-ISSUES.md:3617 (open) -->
@@ -0,0 +1,33 @@
1
+ # FAQ: performance
2
+
3
+ ### A build is slow.
4
+ A build with 200 or more files to read uses one worker process per processor core, up to 8. Set `NIRO_LOCAL_PARSE_WORKERS` to change that. Later builds handle only what changed. For scale: a full build of about 9,000 files was measured at about 103 seconds.
5
+ <!-- source: niro-local src/niro_local/build/parallel_parse.py:59-61, :197-198; niro-local TODO.md:189 -->
6
+
7
+ ### Answers slow down while a build runs.
8
+ Known: questions asked without pause during a build slow the build down several times.
9
+ <!-- source: niro-local docs/NIRO-LOCAL-ISSUES.md:4172 (open) -->
10
+
11
+ ### A deep reverse call chain is slow.
12
+ A reverse chain 8 levels deep on a much-called name can take several seconds. Ask fewer levels (`depth=3`), or use `purpose=ASSESS_RISK` for counts.
13
+ <!-- source: niro-local docs/NIRO-LOCAL-ISSUES.md:3774 (open); src/niro_local/mcp/purpose.py -->
14
+
15
+ ### The graph file keeps growing.
16
+ The graph keeps a side file of recent writes (the write-ahead log), trimmed to 64 MB by default (`NIRO_LOCAL_WAL_LIMIT_MB`). A tool that holds the graph open for a long time can stop the trim. Run `niro db status` to see the size. Run `niro clean` to remove the graphs of deleted folders.
17
+ <!-- source: niro-local src/niro_local/graph/sqlite_writer.py:105-111; niro-local docs/NIRO-LOCAL-ISSUES.md:3729 (open); src/commands/engineRoutes.js:35-36 -->
18
+
19
+ ### How much disk does the graph use?
20
+ It depends on your code. `niro db status` shows it for your computer.
21
+ <!-- source: src/commands/engineRoutes.js:36 -->
22
+
23
+ ### How much memory and processor time does the background watcher use?
24
+ Not measured yet. It waits for file changes, and builds only after a folder goes quiet.
25
+ <!-- source: src/lib/localBuild.js:16-46 -->
26
+
27
+ ### `code_grep` stops early, or an answer is cut short.
28
+ A search stops after 1.5 seconds, and gives a `continue_from` value to carry on. An answer is cut at 20,000 characters. Narrow the search with `path_pattern`, or raise `NIRO_LOCAL_MAX_ANSWER_CHARS`.
29
+ <!-- source: niro-local src/niro_local/mcp/source_tools.py:101-162 -->
30
+
31
+ ### A tool call took more than 30 seconds and stopped.
32
+ One call to the engine may take 30 seconds. Ask a narrower question, or a lower `depth`.
33
+ <!-- source: src/mcp/localBackend.js:183 -->
@@ -0,0 +1,113 @@
1
+ # FAQ: privacy and security
2
+
3
+ ### What leaves my computer?
4
+ A short list:
5
+
6
+ - your sign-in;
7
+ - the licence check;
8
+ - the engine download;
9
+ - masked snippets from the coverage audit;
10
+ - a record of which tools your agent used;
11
+ - while "Share redacted code" is on: the files Niro indexes, masked, sent by the background watcher;
12
+ - a whole repository, only if you send one yourself.
13
+
14
+ See [what-leaves-your-machine.md](what-leaves-your-machine.md).
15
+ <!-- source: src/lib/planUsage.js:116-134; src/lib/lease.js; src/lib/auditUpload.js; src/lib/journalUpload.js; src/lib/shareCode.js; src/lib/repoPush.js -->
16
+
17
+ ### Is my code sent to an AI model?
18
+ Not in this release. It has no LLM documentation, and your agent's questions are answered on your computer. Niro's Data Processing Agreement also says Niro does not train AI models on your code.
19
+ <!-- source: src/lib/release.js:33 (llmDocs: false); src/lib/planUsage.js:118; Niro DPA v3.0 clause 10.1 -->
20
+
21
+ ### What is the coverage audit, and can I turn it off?
22
+ It sends small masked snippets of code the build could not read, so Niro can add support for it. It is sent on every plan, and `niro` has no switch for it. For what Niro may keep and do with what it receives, read Niro's Data Processing Agreement, summarised in [what-leaves-your-machine.md](what-leaves-your-machine.md). See [coverage-audit-and-consent.md](coverage-audit-and-consent.md).
23
+ <!-- source: src/lib/auditUpload.js:27-30 -->
24
+
25
+ ### What exactly is in an audit snippet? Can I see it first?
26
+ For each flagged line, the snippet holds the method around it, plus one line per name that method uses. Every other line is blank, and secrets are masked. Each item also carries the file's path inside the repository, masked. To see what is waiting, run `niro audit`. To write it to a folder, run `niro audit --export DIR`.
27
+ <!-- source: src/lib/redact.js:89-121; niro-local src/niro_local/cli.py:2413-2415, src/niro_local/audit/queue.py:838-846 (the masked path); src/commands/engineRoutes.js:37; niro-local src/niro_local/cli.py:478 -->
28
+
29
+ ### How are secrets masked?
30
+ Each secret value is replaced with a placeholder, and the name is kept. The rules are the ones Niro's own service uses before anything reaches an AI model. See [secrets-and-masking.md](secrets-and-masking.md).
31
+ <!-- source: niro-local src/niro_local/redact/mask.py:1-75, :898 -->
32
+
33
+ ### Why were names in my code replaced with `<author>` or `<company>`?
34
+ In audit snippets and in shared code, the names of copyright holders, your email's company and the git remote's owner are replaced, so they do not leave your computer.
35
+ <!-- source: src/lib/redact.js:1-18 -->
36
+
37
+ ### "N item(s) not sent: the local engine is too old to mask secrets. Run `niro upgrade`."
38
+ Niro sends nothing that has not been masked. Upgrade, and the waiting items go out masked.
39
+ <!-- source: src/commands/auditSend.js; src/lib/journalUpload.js -->
40
+
41
+ ### What is in the tool-usage record?
42
+ It holds:
43
+
44
+ - the tools your agent used, how long each took, and any failures;
45
+ - a short summary of the task;
46
+ - the names, paths and search text your agent asked about.
47
+
48
+ Free text is masked first and cut to about 1,000 characters. It never holds the contents of your files. A search pattern your agent typed can, though, be a short piece of code.
49
+ <!-- source: src/lib/journalUpload.js:9-26; src/lib/planUsage.js (comment above AUDIT_CLAUSE); src/lib/journalUpload.js:12-14 and niro-local src/niro_local/journal/store.py:90 (about 1,000 characters of free text); niro-local src/niro_local/journal/sanitise.py:81-84 (200 characters per argument) -->
50
+
51
+ ### What does "Share redacted code" send?
52
+ The code Niro indexes on your computer, by itself. While it is on, the background watcher sends, every 5 minutes, the files Niro indexes in each folder: the source files it parses and the config, build and text files it reads. It never sends a gitignored file, a real `.env`, a key or key store, or `node_modules`. Secrets are masked and author and company names removed first. The first time, a folder's whole indexed set goes; after that, only changed files. Niro deletes it after processing and never uses it to train AI. It also removes the Free line limit.
53
+
54
+ ### How do I send my repository to Niro for support?
55
+ Run `niro audit-push-repo` in the folder. It sends that folder's indexed files, with secrets masked and author and company names removed first. It shows how many files and how large, and asks before it sends; your yes is the consent. It works with "Share redacted code" on or off, on every plan.
56
+ <!-- source: src/lib/repoPush.js; src/commands/repoPush.js -->
57
+ <!-- source: src/lib/planUsage.js:53-66 and sharingBlock; src/lib/shareCode.js; src/lib/shareFiles.js; niro-local src/niro_local/share_files.py; src/lib/repoPush.js -->
58
+
59
+ ### Can I keep one folder out while sharing stays on?
60
+ Yes. Run `niro share exclude <folder>`. The watcher never sends that folder, or any folder inside it. If you later run `niro audit-push-repo` in it, it asks "You excluded this folder from sharing. Send it anyway?" and sends only if you say yes. `niro share` lists the folders kept out, and `niro share include <folder>` shares one again. `niro plan` lists them too. Another checkout of the same repository in a different folder is not kept out by this.
61
+ <!-- source: src/commands/share.js; src/lib/shareExclusions.js; src/lib/shareCode.js; src/lib/repoPush.js; src/commands/plan.js -->
62
+
63
+ ### How do I stop sharing?
64
+ Turn "Share redacted code" off in the console, under Settings, Privacy. The watcher checks before each round and before each batch of files, so nothing more is sent after that check.
65
+ <!-- source: src/lib/shareCode.js (the lease gate and its re-check before each batch) -->
66
+
67
+ ### "the Niro service cannot yet promise to delete this code when sharing is switched off, so nothing was sent"
68
+ Niro refuses to send a whole repository, or share code in the background, until its service can promise to delete the copy when you turn sharing off.
69
+ <!-- source: src/lib/repoPush.js -->
70
+
71
+ ### Does uninstalling Niro turn off code sharing?
72
+ No. It is a setting on your account. Turn it off in the console, under Settings, Privacy.
73
+ <!-- source: src/commands/uninstall.js:97-101 -->
74
+
75
+ ### Which files does Niro never open?
76
+ Real `.env` files, private keys and key stores, and tool credential files (such as `.npmrc` and `.netrc`). Config and text files named as secrets (such as `secrets.yaml`), and config and text files that `.gitignore` covers, are not read either. Source code is read whatever its name. See [secrets-and-masking.md](secrets-and-masking.md).
77
+ <!-- source: niro-local src/niro_local/mcp/text_files.py:186-202 (secret_named) -->
78
+
79
+ ### Does Niro keep a copy of my source code?
80
+ No full copy. The graph keeps names, places and links. The tools read your files from disk when asked. The build state can hold short values written in the code, such as a default value. It stays on your computer, readable by you only.
81
+ <!-- source: niro-local src/niro_local/mcp/freshness.py:305-308; src/niro_local/build/state.py:1-40; niro-local docs/NIRO-LOCAL-ISSUES.md:863 -->
82
+
83
+ ### Who can read the files Niro keeps?
84
+ Only your user account. Niro's folders are readable by their owner only.
85
+ <!-- source: niro-local src/niro_local/registry.py:53-104; src/lib/credentials.js:51-72 -->
86
+
87
+ ### Can someone on my network reach my graph?
88
+ No. Your agent talks to Niro through its own standard input and output, not the network. `niro ui` listens only at 127.0.0.1, which is this computer.
89
+ <!-- source: src/mcp/setup.js:241-247; niro-local src/niro_local/ui/server.py:35 -->
90
+
91
+ ### "Passwords and tokens are refused and never stored"
92
+ `niro env` stores addresses only. It refuses a value that looks like a password or token.
93
+ <!-- source: niro-local src/niro_local/env_args.py:34 -->
94
+
95
+ ### "That is not a form of this command, and it is not repeated here in case it holds a secret."
96
+ You typed a form of a command the engine does not know. It does not print what you typed back, in case it held a secret.
97
+ <!-- source: niro-local src/niro_local/env_args.py:76-88 -->
98
+
99
+ ### Why does `code_grep` show `<MASK_...>` in my config file?
100
+ Config values are masked in answers by default. To see real values on your own computer, see [secrets-and-masking.md](secrets-and-masking.md).
101
+ <!-- source: niro-local src/niro_local/folder_settings.py:43-46 -->
102
+
103
+ ### Does Niro send telemetry?
104
+ Everything `niro` sends is listed in [what-leaves-your-machine.md](what-leaves-your-machine.md), including the account calls `niro whoami` and `niro logout` make. The tool-usage record is the record of use.
105
+ <!-- source: src/commands/whoami.js:48; src/commands/logout.js:19-20; src/lib/journalUpload.js:9-37; src/lib/onboardingLog.js:1-6 (kept on the machine only) -->
106
+
107
+ ### Is the downloaded engine checked?
108
+ Yes. Niro checks its fingerprint (SHA-256) against the published one. It refuses an engine that does not match.
109
+ <!-- source: src/lib/engine.js:551 -->
110
+
111
+ ### Is there a Data Processing Agreement? How do I delete my account?
112
+ Yes, there is a Data Processing Agreement (version 3.0). It is summarised in [what-leaves-your-machine.md](what-leaves-your-machine.md). To delete your account, email help@niro.ai.
113
+ <!-- source: Niro DPA v3.0 (wiki, Legal collection); account deletion: Niraj, 2026-11-10 -->
@@ -0,0 +1,47 @@
1
+ # FAQ: uninstall
2
+
3
+ The steps are in [uninstall.md](uninstall.md).
4
+
5
+ ### How do I remove Niro completely?
6
+ Run `niro uninstall`, then `npm uninstall -g @niroai/niro`, then restart your agents.
7
+ <!-- source: src/commands/uninstall.js:164-168 -->
8
+
9
+ ### How do I remove Niro from one agent only?
10
+ Run `niro mcp uninstall --client <id>`.
11
+ <!-- source: src/mcp/teardown.js:645-653 -->
12
+
13
+ ### How do I stop indexing one folder?
14
+ Run `niro plan remove <folder>`, or `niro remove --path <folder>`. Its graph is deleted, and the lines it used are freed.
15
+ <!-- source: src/commands/plan.js:76-86; src/commands/engineRoutes.js:44 -->
16
+
17
+ ### "Nothing removed: there is no terminal to confirm on. Pass --yes to go ahead."
18
+ `niro uninstall` asks before it removes anything. In a script, add `--yes`.
19
+ <!-- source: src/commands/uninstall.js:108 -->
20
+
21
+ ### "Niro is partly removed; see the problems above."
22
+ Some steps failed. The lines above name them. Fix those, and run `niro uninstall` again.
23
+ <!-- source: src/commands/uninstall.js:164-168 -->
24
+
25
+ ### PM2's start-at-login entry is still there after uninstalling.
26
+ `niro uninstall` removes the watcher itself. What happens to PM2's start-at-login entry depends on your computer:
27
+
28
+ - **PM2 still runs other programs:** the entry is kept, because it is not Niro's.
29
+ - **macOS, with nothing else in PM2:** the entry is removed.
30
+ - **Otherwise (Linux):** removing it needs administrator rights, so the uninstall prints the command for you to run. Until you run it, PM2 starts on login with nothing of Niro's in it.
31
+ <!-- source: src/lib/service.js:301-328; src/commands/uninstall.js:150, :169-171 ("PM2 still starts on login (with nothing of Niro's). To remove that too: ...") -->
32
+
33
+ ### Cursor rule files are still in other folders.
34
+ `niro mcp uninstall` removes the Cursor rule from the current folder only. Delete `.cursor/rules/niro.mdc` in the other folders yourself.
35
+ <!-- source: src/mcp/teardown.js:431-438 -->
36
+
37
+ ### "Could not send the waiting usage and audit records"
38
+ Before deleting anything, `niro uninstall` tries to send the records that are waiting. It could not, and it goes on with the uninstall anyway.
39
+ <!-- source: src/commands/uninstall.js:46-59, :128-137 -->
40
+
41
+ ### "Niro is not installed on this machine, so there is nothing to remove."
42
+ Niro found nothing of its own. If the `niro` command is still there, run `npm uninstall -g @niroai/niro`.
43
+ <!-- source: src/commands/uninstall.js:79 -->
44
+
45
+ ### Does uninstalling delete my account or turn off code sharing?
46
+ No to both. Turn sharing off in the console (Settings, Privacy). To delete your account, email help@niro.ai.
47
+ <!-- source: src/commands/uninstall.js:94-101; account deletion: Niraj, 2026-11-10 -->
@@ -0,0 +1,59 @@
1
+ # FAQ: updates
2
+
3
+ ### How do I upgrade?
4
+ Run `niro upgrade`. It does three things:
5
+
6
+ 1. It installs the newest `niro` with npm.
7
+ 2. It refreshes every agent you connected, the engine and the background watcher.
8
+ 3. It tells you to restart your agents.
9
+
10
+ Your graphs, sign-in and settings stay.
11
+ <!-- source: src/commands/upgrade.js:85-293 -->
12
+
13
+ ### "npm could not replace the package. The usual cause is that your npm global folder needs root"
14
+ npm could not write to its global folder. Run the upgrade with the permissions npm needs. Or point npm's global folder at a folder you own. (Exit code 1.)
15
+ <!-- source: src/commands/upgrade.js:125-132 -->
16
+
17
+ ### "Not upgrading: niro is npm-linked to a working copy" or "you are not running the globally installed niro"
18
+ The `niro` you ran is not the copy npm installed for everyone. Upgrade anyway with `niro upgrade --force`. (Exit code 5.)
19
+ <!-- source: src/commands/upgrade.js:85-103 -->
20
+
21
+ ### "npm reported success, but there is no niro in your npm global folder."
22
+ npm finished, but the `niro` command is not where it should be. Run `npm install -g @niroai/niro` yourself. (Exit code 2.)
23
+ <!-- source: src/commands/upgrade.js:137-142 -->
24
+
25
+ ### "The version just installed does not support `niro upgrade --finish`"
26
+ The new version could not finish the job. The message lists the commands to run by hand: `niro mcp install` and `niro service install`. (Exit code 3.)
27
+ <!-- source: src/commands/upgrade.js:75-78, :150-156 -->
28
+
29
+ ### "N of M refreshed, K failed."
30
+ Some agents were not refreshed. Run `niro mcp install --client <id>` for each one named, to see why. (Exit code 4.)
31
+ <!-- source: src/commands/upgrade.js (finish phase) -->
32
+
33
+ ### "The local engine was not upgraded: <message>. Try again with niro engine install."
34
+ `niro` was upgraded, but the engine was not. Run `niro engine install`.
35
+ <!-- source: src/commands/upgrade.js (finish phase) -->
36
+
37
+ ### Does the engine update by itself?
38
+ No. `niro upgrade` updates it. Niro keeps an engine newer than the published one rather than going back. It does not replace an engine that is running: close your agents and the watcher first.
39
+ <!-- source: src/lib/engine.js:505-528 -->
40
+
41
+ ### After an upgrade, answers say to rebuild.
42
+ A new major version stores the graph in a new format. Run `niro build` once.
43
+ <!-- source: niro-local src/niro_local/graph/sqlite_writer.py:311-313 -->
44
+
45
+ ### Two versions of Niro keep rebuilding each other's graph.
46
+ Known problem when two versions share one `~/.niro-local`. Keep one version on the computer. `niro engine status` warns when a second engine is on your PATH.
47
+ <!-- source: niro-local docs/NIRO-LOCAL-ISSUES.md:3759 (open); src/commands/engine.js:92-116 -->
48
+
49
+ ### "Heads up: you are not signed in, so each client's installer will stop without refreshing it."
50
+ The upgrade itself worked, but your agents were not refreshed: each one's installer stops with "Not signed in", and the run ends "N of M refreshed, K failed". Run `niro login`, then `niro upgrade --finish`.
51
+ <!-- source: src/commands/upgrade.js:334-346, :365-380; src/mcp/setup.js:2952-2956 -->
52
+
53
+ ### "Folders from Niro web: N folder(s) were set up with Niro web on this machine."
54
+ These folders were set up with hosted Niro by an older version. This version indexes on your computer, and no longer uploads them. To keep using Niro in one of them, run `niro init` in it. `niro start` offers to do this, up to your line limit.
55
+ <!-- source: src/lib/migrationNotice.js:108-114; src/commands/start.js:353-373 -->
56
+
57
+ ### Do I need Docker? I have an old `niro-local-memgraph` container.
58
+ No. Niro no longer uses Docker or Memgraph. Remove the old container with `docker rm -f niro-local-memgraph`, and its data with `docker volume rm niro-local-memgraph-data`.
59
+ <!-- source: niro-local docs/NIRO-LOCAL-USER-FLOW.md:247-254; niro-local CLAUDE.md (2026-10-31: the graph moved to a SQLite file) -->
@@ -0,0 +1,59 @@
1
+ # FAQ: worktrees and branches
2
+
3
+ How it works is in [worktrees-and-branches.md](worktrees-and-branches.md). This page answers the messages you may see.
4
+
5
+ ### "This folder is now on <branch>, which niro-local has not indexed."
6
+ You switched to a branch with no graph yet. If the repository is indexed on another branch, Niro makes a temporary copy and builds it. Otherwise it offers to index the folder.
7
+ <!-- source: niro-local src/niro_local/offer.py:291; src/niro_local/temporary.py -->
8
+
9
+ ### "this folder's index was copied from project P and has not been built from this folder's files yet"
10
+ Answers come from a copy of the main project's graph until this folder's own build finishes. That takes moments for small changes.
11
+ <!-- source: niro-local src/niro_local/mcp/server.py:775; src/niro_local/offer.py:393-397 -->
12
+
13
+ ### "A project's folders must all be on one branch."
14
+ A project's folders must all be on the same branch. Put them on one branch. Or add the folder to a different project with `niro init --project <name>`.
15
+ <!-- source: niro-local src/niro_local/offer.py:243; src/niro_local/onboard.py:267 -->
16
+
17
+ ### "This folder is on no named branch"
18
+ You have a commit checked out directly (a detached HEAD). Niro answers from the folder's last used graph, and names its branch.
19
+ <!-- source: niro-local src/niro_local/mcp/server.py:724 -->
20
+
21
+ ### I switched back to my old branch. Is its graph still there?
22
+ Yes. Niro keeps one graph per folder and per branch, and switches without rebuilding. Each answer then carries one line saying which project it came from.
23
+ <!-- source: niro-local src/niro_local/mcp/server.py:734; src/niro_local/cli.py:366-369 -->
24
+
25
+ ### A new git worktree was built by itself, but an older one was not.
26
+ The watcher builds worktrees it sees appear. Worktrees that existed before Niro first saw the repository are only noted. Build one with `niro build` in its folder.
27
+ <!-- source: src/lib/localWorktrees.js:1-21 -->
28
+
29
+ ### "Gave up building <folder> after N tries; run `niro build` there to see why."
30
+ The watcher tried three times, waiting 2 and then 10 minutes in between. Run `niro build` in that folder to see the error.
31
+ <!-- source: src/lib/localWorktrees.js:71-72, :198 -->
32
+
33
+ ### When are temporary projects deleted?
34
+ After 14 days with no build and no question. They are kept while a build runs, while a folder of them is on that branch, or while a folder of them is missing. Change the 14 days with `NIRO_LOCAL_BRANCH_INDEX_IDLE_DAYS`.
35
+ <!-- source: niro-local src/niro_local/cleanup.py:39-40, :116-147; niro-local TODO.md:124 -->
36
+
37
+ ### A folder that came back still shows its old "missing since" date.
38
+ Known. The first date it went missing is kept.
39
+ <!-- source: niro-local TODO.md:214 -->
40
+
41
+ ### The same file has two names in two worktrees.
42
+ Known problem.
43
+ <!-- source: niro-local docs/NIRO-LOCAL-ISSUES.md:2208 (open) -->
44
+
45
+ ### My folder is not in git. How does it get a branch?
46
+ Give one when you add it: `niro init --branch <name>`. For a folder in git, the branch is read from git, and `--branch` is ignored.
47
+ <!-- source: src/index.js:490-502; niro-local src/niro_local/cli.py:189 -->
48
+
49
+ ### Folders on different branches ended up in one project.
50
+ Known problem for folders added without a branch (outside git).
51
+ <!-- source: niro-local docs/NIRO-LOCAL-ISSUES.md:3548 (open) -->
52
+
53
+ ### My folder holds several repositories on different branches.
54
+ Niro treats such a folder as having mixed branches. Add the repositories one by one if you need each on its own branch.
55
+ <!-- source: niro-local src/niro_local/repository_identity.py (MIXED) -->
56
+
57
+ ### "<path> is now on X; its part of this answer describes Y"
58
+ Another folder of this project switched branch since its last build. That part of the answer is about the old branch until it is rebuilt.
59
+ <!-- source: niro-local src/niro_local/mcp/server.py:803 -->