noah-code 0.2.0__tar.gz → 0.2.2__tar.gz

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 (103) hide show
  1. {noah_code-0.2.0 → noah_code-0.2.2}/.github/workflows/ci.yml +16 -0
  2. {noah_code-0.2.0 → noah_code-0.2.2}/.github/workflows/release.yml +7 -1
  3. noah_code-0.2.2/PKG-INFO +242 -0
  4. noah_code-0.2.2/README.md +199 -0
  5. noah_code-0.2.2/docs/assets/noah-in-action.svg +234 -0
  6. {noah_code-0.2.0 → noah_code-0.2.2}/docs/configuration.md +32 -21
  7. {noah_code-0.2.0 → noah_code-0.2.2}/docs/extensions.md +25 -5
  8. {noah_code-0.2.0 → noah_code-0.2.2}/docs/interactive-reference.md +30 -6
  9. noah_code-0.2.2/docs/releases/v0.2.1.md +36 -0
  10. noah_code-0.2.2/docs/releases/v0.2.2.md +42 -0
  11. {noah_code-0.2.0 → noah_code-0.2.2}/pyproject.toml +1 -2
  12. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/__init__.py +1 -1
  13. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/agent.py +48 -7
  14. noah_code-0.2.2/src/noah_code/agents.py +112 -0
  15. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/approvals.py +20 -4
  16. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/cli.py +41 -9
  17. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/commands.py +15 -6
  18. noah_code-0.2.2/src/noah_code/composer.py +127 -0
  19. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/config.py +78 -3
  20. noah_code-0.2.2/src/noah_code/credentials.py +190 -0
  21. noah_code-0.2.2/src/noah_code/event_bridge.py +361 -0
  22. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/host.py +132 -15
  23. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/mcp_setup.py +74 -4
  24. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/permissions.py +124 -41
  25. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/providers.py +9 -3
  26. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/skills_setup.py +5 -2
  27. noah_code-0.2.2/src/noah_code/themes.py +118 -0
  28. noah_code-0.2.2/src/noah_code/tools/__init__.py +17 -0
  29. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/tools/git_tools.py +40 -9
  30. noah_code-0.2.2/src/noah_code/tools/media_tools.py +31 -0
  31. noah_code-0.2.2/src/noah_code/tools/question_tools.py +109 -0
  32. noah_code-0.2.2/src/noah_code/tools/task_tools.py +126 -0
  33. noah_code-0.2.2/src/noah_code/tools/web_tools.py +176 -0
  34. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/tools/workspace_tools.py +156 -11
  35. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/ui/console.py +7 -0
  36. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/ui/protocol.py +5 -1
  37. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/ui/textual.css +24 -15
  38. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/ui/textual_app.py +569 -105
  39. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/updates.py +28 -0
  40. noah_code-0.2.2/tests/conftest.py +17 -0
  41. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_agent_security.py +5 -0
  42. noah_code-0.2.2/tests/test_agents.py +52 -0
  43. noah_code-0.2.2/tests/test_approvals.py +29 -0
  44. noah_code-0.2.2/tests/test_composer.py +75 -0
  45. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_config.py +25 -4
  46. noah_code-0.2.2/tests/test_credentials.py +140 -0
  47. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_efficiency.py +3 -3
  48. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_event_bridge.py +47 -5
  49. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_git_tools.py +51 -0
  50. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_host.py +158 -12
  51. noah_code-0.2.2/tests/test_mcp_setup.py +200 -0
  52. noah_code-0.2.2/tests/test_permissions.py +152 -0
  53. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_providers.py +16 -1
  54. noah_code-0.2.2/tests/test_question_tools.py +54 -0
  55. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_run_exit.py +46 -0
  56. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_skills_setup.py +7 -0
  57. noah_code-0.2.2/tests/test_task_tools.py +77 -0
  58. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_textual_tui.py +271 -11
  59. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_updates.py +20 -0
  60. noah_code-0.2.2/tests/test_wave1_e2e.py +197 -0
  61. noah_code-0.2.2/tests/test_web_tools.py +86 -0
  62. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_workspace_tools.py +112 -1
  63. {noah_code-0.2.0 → noah_code-0.2.2}/uv.lock +1 -93
  64. noah_code-0.2.0/PKG-INFO +0 -227
  65. noah_code-0.2.0/README.md +0 -183
  66. noah_code-0.2.0/src/noah_code/credentials.py +0 -103
  67. noah_code-0.2.0/src/noah_code/event_bridge.py +0 -196
  68. noah_code-0.2.0/src/noah_code/tools/__init__.py +0 -6
  69. noah_code-0.2.0/tests/test_credentials.py +0 -60
  70. noah_code-0.2.0/tests/test_mcp_setup.py +0 -69
  71. noah_code-0.2.0/tests/test_permissions.py +0 -70
  72. {noah_code-0.2.0 → noah_code-0.2.2}/.gitignore +0 -0
  73. {noah_code-0.2.0 → noah_code-0.2.2}/docs/development.md +0 -0
  74. {noah_code-0.2.0 → noah_code-0.2.2}/docs/releases/v0.1.0.md +0 -0
  75. {noah_code-0.2.0 → noah_code-0.2.2}/docs/releases/v0.1.1.md +0 -0
  76. {noah_code-0.2.0 → noah_code-0.2.2}/docs/releases/v0.2.0.md +0 -0
  77. {noah_code-0.2.0 → noah_code-0.2.2}/docs/security.md +0 -0
  78. {noah_code-0.2.0 → noah_code-0.2.2}/install.sh +0 -0
  79. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/__main__.py +0 -0
  80. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/benchmark.py +0 -0
  81. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/custom_commands.py +0 -0
  82. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/events.py +0 -0
  83. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/llm.py +0 -0
  84. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/macos_sandbox.py +0 -0
  85. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/sessions.py +0 -0
  86. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/snapshots.py +0 -0
  87. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/summarization.py +0 -0
  88. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/tool_output.py +0 -0
  89. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/tools/lsp_tools.py +0 -0
  90. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/tools/process_tools.py +0 -0
  91. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/ui/__init__.py +0 -0
  92. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/usage.py +0 -0
  93. {noah_code-0.2.0 → noah_code-0.2.2}/src/noah_code/workspace.py +0 -0
  94. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_cli.py +0 -0
  95. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_custom_commands.py +0 -0
  96. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_event_bridge_and_shell.py +0 -0
  97. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_installer.py +0 -0
  98. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_llm.py +0 -0
  99. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_lsp_tools.py +0 -0
  100. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_process_tools.py +0 -0
  101. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_sessions.py +0 -0
  102. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_snapshots.py +0 -0
  103. {noah_code-0.2.0 → noah_code-0.2.2}/tests/test_summarization.py +0 -0
@@ -34,6 +34,12 @@ jobs:
34
34
  - name: Install locked dependencies
35
35
  run: uv sync --locked --all-extras --dev
36
36
 
37
+ - name: Install ripgrep
38
+ run: |
39
+ sudo apt-get update
40
+ sudo apt-get install -y ripgrep
41
+ rg --version
42
+
37
43
  - name: Check lock file
38
44
  run: uv lock --check
39
45
 
@@ -76,6 +82,16 @@ jobs:
76
82
  - name: Install locked dependencies
77
83
  run: uv sync --locked --all-extras --dev
78
84
 
85
+ - name: Install ripgrep
86
+ run: |
87
+ if [ "${{ runner.os }}" = "Linux" ]; then
88
+ sudo apt-get update
89
+ sudo apt-get install -y ripgrep
90
+ else
91
+ HOMEBREW_NO_AUTO_UPDATE=1 brew install ripgrep
92
+ fi
93
+ rg --version
94
+
79
95
  - name: Run tests
80
96
  run: uv run pytest tests -W error::pytest.PytestUnraisableExceptionWarning
81
97
 
@@ -47,6 +47,12 @@ jobs:
47
47
  - name: Install locked dependencies
48
48
  run: uv sync --locked --all-extras --dev
49
49
 
50
+ - name: Install ripgrep
51
+ run: |
52
+ sudo apt-get update
53
+ sudo apt-get install -y ripgrep
54
+ rg --version
55
+
50
56
  - name: Run release checks
51
57
  run: |
52
58
  uv run ruff check src tests
@@ -68,7 +74,7 @@ jobs:
68
74
  "${UV_TOOL_BIN_DIR}/noah" --version
69
75
 
70
76
  - name: Upload release distributions
71
- uses: actions/upload-artifact@v5
77
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
72
78
  with:
73
79
  name: python-package-distributions
74
80
  path: dist/
@@ -0,0 +1,242 @@
1
+ Metadata-Version: 2.5
2
+ Name: noah-code
3
+ Version: 0.2.2
4
+ Summary: Noah Code terminal coding agent, built on NVIDIA OO Agents (NOOA)
5
+ Project-URL: Homepage, https://github.com/skundu42/noah-code
6
+ Project-URL: Documentation, https://github.com/skundu42/noah-code#readme
7
+ Project-URL: Repository, https://github.com/skundu42/noah-code.git
8
+ Project-URL: Issues, https://github.com/skundu42/noah-code/issues
9
+ Project-URL: Releases, https://github.com/skundu42/noah-code/releases
10
+ Author: noah-code contributors
11
+ License: Apache-2.0
12
+ Keywords: agents,coding,nooa,terminal
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Environment :: Console
15
+ Classifier: License :: OSI Approved :: Apache Software License
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Software Development
21
+ Requires-Python: <3.14,>=3.12
22
+ Requires-Dist: click>=8.1.0
23
+ Requires-Dist: litellm<1.92.0,>=1.84.0
24
+ Requires-Dist: nooa-cli==0.0.9
25
+ Requires-Dist: nooa==0.0.9
26
+ Requires-Dist: packaging>=24.0
27
+ Requires-Dist: pydantic>=2.5.0
28
+ Requires-Dist: pyyaml>=6.0.0
29
+ Requires-Dist: rich>=13.0.0
30
+ Requires-Dist: textual>=1.0.0
31
+ Requires-Dist: tomli>=2.0.0; python_version < '3.11'
32
+ Provides-Extra: dev
33
+ Requires-Dist: pytest-asyncio>=0.24.0; extra == 'dev'
34
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
35
+ Requires-Dist: ruff>=0.8.0; extra == 'dev'
36
+ Provides-Extra: mcp
37
+ Requires-Dist: nooa[mcp]==0.0.9; extra == 'mcp'
38
+ Provides-Extra: tracing
39
+ Requires-Dist: nooa[tracing]==0.0.9; extra == 'tracing'
40
+ Provides-Extra: tui
41
+ Requires-Dist: textual>=1.0.0; extra == 'tui'
42
+ Description-Content-Type: text/markdown
43
+
44
+ <div align="center">
45
+
46
+ # Noah Code
47
+
48
+ **A terminal coding harness built on NVIDIA's NOAA framework**
49
+
50
+ [![PyPI](https://img.shields.io/pypi/v/noah-code.svg)](https://pypi.org/project/noah-code/)
51
+ [![CI](https://github.com/skundu42/noah-code/actions/workflows/ci.yml/badge.svg)](https://github.com/skundu42/noah-code/actions/workflows/ci.yml)
52
+ [![Python](https://img.shields.io/pypi/pyversions/noah-code.svg)](https://pypi.org/project/noah-code/)
53
+
54
+ </div>
55
+
56
+ ![Noah Code handling a repository change in its terminal interface](docs/assets/noah-in-action.svg)
57
+
58
+ <p align="center"><sub>The real Textual interface, captured from a deterministic Noah Code session.</sub></p>
59
+
60
+ Noah keeps the conversation central while the context rail tracks the workspace, model, session,
61
+ token usage, and current plan. Tool execution stays visible, completed work compacts into readable
62
+ records, and every session remains scoped to its repository.
63
+
64
+ Built on the [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents) runtime.
65
+
66
+ ## Install
67
+
68
+ Install Noah Code and its managed Python runtime with one command:
69
+
70
+ ```bash
71
+ curl -LsSf https://raw.githubusercontent.com/skundu42/noah-code/main/install.sh | sh
72
+ ```
73
+
74
+ Open a new terminal, move into a repository, and start Noah:
75
+
76
+ ```bash
77
+ cd your-project
78
+ noah .
79
+ ```
80
+
81
+ Noah is compatible with macOS on Apple Silicon and Intel, plus Linux on arm64 and x86_64.
82
+
83
+ On the first launch, the TUI walks through provider, API key, model, and reasoning setup. Keys are
84
+ stored in Noah's private auth file with owner-only permissions; they are never written to project
85
+ configuration or session history.
86
+
87
+ ## Why Noah
88
+
89
+ - **Repository-aware exploration.** Search with ripgrep, inspect Git history and diffs, navigate
90
+ symbols through language servers, and use an mtime-cached repository map.
91
+ - **Controlled edits.** Apply anchored replacements or atomic multi-file patches with exact
92
+ preimages, concurrent-change detection, immediate diagnostics, and rollback.
93
+ - **Visible execution.** Stream bounded shell output while commands run, keep servers and watchers
94
+ as managed background jobs, and revisit activity details with `F2`.
95
+ - **Recoverable work.** Review staged and unstaged changes in `/diff`, then undo or redo journaled
96
+ file edits even after restarting Noah.
97
+ - **Persistent sessions.** Resume repository-scoped conversations, todos, model choices, and
98
+ automatically compacted context without losing the full underlying tool results.
99
+ - **Explicit control.** Switch between implementation-focused **build** mode and read-only
100
+ **plan** mode, with ordered `allow`, `ask`, and `deny` permission rules.
101
+ - **Extensible workflows.** Add slash commands, opt-in skills, MCP servers, or markdown subagents;
102
+ attach `@files` and images when the task needs more context.
103
+
104
+ Noah follows repository instructions from `AGENTS.md`, `CLAUDE.md`, and
105
+ `.noah-code/instructions.md`.
106
+
107
+ ## Quick start
108
+
109
+ Describe the outcome you want rather than prescribing every edit:
110
+
111
+ ```text
112
+ Find the cause of the failing parser tests, implement the smallest safe fix, and run the
113
+ focused test file.
114
+ ```
115
+
116
+ Useful launch modes:
117
+
118
+ ```bash
119
+ # Open another workspace
120
+ noah /path/to/repository
121
+
122
+ # Inspect and plan without editing
123
+ noah --mode plan .
124
+
125
+ # Run one task and exit
126
+ noah run "Explain how authentication is wired" .
127
+
128
+ # Allow actions that would normally ask; explicit deny rules still apply
129
+ noah run --auto "Fix the failing unit test" .
130
+
131
+ # Resume previous work
132
+ noah --continue .
133
+ noah --session SESSION_ID .
134
+
135
+ # Use the line-oriented interface
136
+ noah --console .
137
+ ```
138
+
139
+ Check the installation and resolved configuration with:
140
+
141
+ ```bash
142
+ noah --version
143
+ noah doctor .
144
+ noah config show .
145
+ noah update --check
146
+ noah benchmark .
147
+ ```
148
+
149
+ The package also installs `noah-code` and `nc` as equivalent entry points. Because `nc` commonly
150
+ means netcat, `noah` or `noah-code` is recommended.
151
+
152
+ ## Inside the TUI
153
+
154
+ Type `/` to search the full command and configuration reference. The most common controls are:
155
+
156
+ | Control | Action |
157
+ | --- | --- |
158
+ | `Enter` | Send the current prompt or accept a selected suggestion |
159
+ | `Shift+Enter` | Insert a newline |
160
+ | `Tab` | Switch between build and plan mode |
161
+ | `F2` | Open execution activity |
162
+ | `F3` | Open paginated conversation history |
163
+ | `/model` | Configure a provider or switch the session model |
164
+ | `/theme` | Choose Atom One Dark, Noah Ocean, Graphite, or High Contrast |
165
+ | `/diff` | Review staged and unstaged changes |
166
+ | `/undo` / `/redo` | Traverse the persistent edit journal |
167
+ | `/tokens` | Inspect tokens, cache usage, model wait, and tool output |
168
+ | `/efficiency` | Switch between `fast`, `balanced`, and `deep` budgets |
169
+
170
+ On wide terminals, the side rail keeps the active workspace, session, model, tokens, update state,
171
+ and plan in view. The main pane remains centered on the Noah mark until the first prompt, then
172
+ becomes the conversation and execution timeline.
173
+
174
+ ## Models and providers
175
+
176
+ Noah supports OpenAI, Anthropic, OpenRouter, NVIDIA, and custom OpenAI-compatible providers. It
177
+ also works with vLLM, LM Studio, Ollama, Azure OpenAI, Bedrock, Gemini, Groq, Mistral, xAI,
178
+ DeepSeek, Together AI, and Perplexity.
179
+
180
+ The guided `/model` flow is the easiest way to configure a provider. Environment variables and
181
+ the CLI remain available for scripts and headless environments:
182
+
183
+ ```bash
184
+ export OPENAI_API_KEY="..." # or ANTHROPIC_API_KEY / OPENROUTER_API_KEY
185
+ noah providers list
186
+ noah providers add openai --model MODEL_NAME
187
+ noah .
188
+ ```
189
+
190
+ `/model MODEL` changes only the current session and remembers that choice when resumed. Use
191
+ `/model --global MODEL` to set the default for future sessions in every repository.
192
+
193
+ For compatible reasoning models, choose `default`, `none`, `minimal`, `low`, `medium`, `high`, or
194
+ `xhigh`. `default` omits the provider parameter:
195
+
196
+ ```bash
197
+ noah --model openai/MODEL --reasoning-effort high .
198
+ ```
199
+
200
+ See the [provider configuration guide](docs/configuration.md#bring-your-own-api-provider) for
201
+ gateway-specific setup.
202
+
203
+ ## Updates
204
+
205
+ Noah checks PyPI for new versions at most once every 24 hours. New TUI sessions show a temporary
206
+ banner when an update is available and keep the version visible in the context rail. Installation
207
+ remains explicit by default:
208
+
209
+ ```bash
210
+ noah update --check
211
+ noah update
212
+ ```
213
+
214
+ ## Documentation
215
+
216
+ - [Interactive interface and sessions](docs/interactive-reference.md)
217
+ - [Configuration, modes, permissions, and updates](docs/configuration.md)
218
+ - [Generated-code security](docs/security.md)
219
+ - [Custom commands, skills, MCP, and tracing](docs/extensions.md)
220
+ - [Development, CI, and releases](docs/development.md)
221
+ - [Release notes](docs/releases/)
222
+
223
+ ## Development
224
+
225
+ ```bash
226
+ uv sync --extra dev --extra mcp --extra tracing
227
+ uv run ruff check src tests
228
+ uv run pytest tests
229
+ uv build
230
+ ```
231
+
232
+ See the [development guide](docs/development.md) for platform checks and the release process.
233
+
234
+ ## License
235
+
236
+ Apache-2.0. NOOA remains separately licensed by its upstream
237
+ project.
238
+
239
+ ## Credits
240
+
241
+ Built on [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents). Thanks to the
242
+ NVIDIA NeMo team and NOOA contributors for the agent runtime that powers Noah Code.
@@ -0,0 +1,199 @@
1
+ <div align="center">
2
+
3
+ # Noah Code
4
+
5
+ **A terminal coding harness built on NVIDIA's NOAA framework**
6
+
7
+ [![PyPI](https://img.shields.io/pypi/v/noah-code.svg)](https://pypi.org/project/noah-code/)
8
+ [![CI](https://github.com/skundu42/noah-code/actions/workflows/ci.yml/badge.svg)](https://github.com/skundu42/noah-code/actions/workflows/ci.yml)
9
+ [![Python](https://img.shields.io/pypi/pyversions/noah-code.svg)](https://pypi.org/project/noah-code/)
10
+
11
+ </div>
12
+
13
+ ![Noah Code handling a repository change in its terminal interface](docs/assets/noah-in-action.svg)
14
+
15
+ <p align="center"><sub>The real Textual interface, captured from a deterministic Noah Code session.</sub></p>
16
+
17
+ Noah keeps the conversation central while the context rail tracks the workspace, model, session,
18
+ token usage, and current plan. Tool execution stays visible, completed work compacts into readable
19
+ records, and every session remains scoped to its repository.
20
+
21
+ Built on the [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents) runtime.
22
+
23
+ ## Install
24
+
25
+ Install Noah Code and its managed Python runtime with one command:
26
+
27
+ ```bash
28
+ curl -LsSf https://raw.githubusercontent.com/skundu42/noah-code/main/install.sh | sh
29
+ ```
30
+
31
+ Open a new terminal, move into a repository, and start Noah:
32
+
33
+ ```bash
34
+ cd your-project
35
+ noah .
36
+ ```
37
+
38
+ Noah is compatible with macOS on Apple Silicon and Intel, plus Linux on arm64 and x86_64.
39
+
40
+ On the first launch, the TUI walks through provider, API key, model, and reasoning setup. Keys are
41
+ stored in Noah's private auth file with owner-only permissions; they are never written to project
42
+ configuration or session history.
43
+
44
+ ## Why Noah
45
+
46
+ - **Repository-aware exploration.** Search with ripgrep, inspect Git history and diffs, navigate
47
+ symbols through language servers, and use an mtime-cached repository map.
48
+ - **Controlled edits.** Apply anchored replacements or atomic multi-file patches with exact
49
+ preimages, concurrent-change detection, immediate diagnostics, and rollback.
50
+ - **Visible execution.** Stream bounded shell output while commands run, keep servers and watchers
51
+ as managed background jobs, and revisit activity details with `F2`.
52
+ - **Recoverable work.** Review staged and unstaged changes in `/diff`, then undo or redo journaled
53
+ file edits even after restarting Noah.
54
+ - **Persistent sessions.** Resume repository-scoped conversations, todos, model choices, and
55
+ automatically compacted context without losing the full underlying tool results.
56
+ - **Explicit control.** Switch between implementation-focused **build** mode and read-only
57
+ **plan** mode, with ordered `allow`, `ask`, and `deny` permission rules.
58
+ - **Extensible workflows.** Add slash commands, opt-in skills, MCP servers, or markdown subagents;
59
+ attach `@files` and images when the task needs more context.
60
+
61
+ Noah follows repository instructions from `AGENTS.md`, `CLAUDE.md`, and
62
+ `.noah-code/instructions.md`.
63
+
64
+ ## Quick start
65
+
66
+ Describe the outcome you want rather than prescribing every edit:
67
+
68
+ ```text
69
+ Find the cause of the failing parser tests, implement the smallest safe fix, and run the
70
+ focused test file.
71
+ ```
72
+
73
+ Useful launch modes:
74
+
75
+ ```bash
76
+ # Open another workspace
77
+ noah /path/to/repository
78
+
79
+ # Inspect and plan without editing
80
+ noah --mode plan .
81
+
82
+ # Run one task and exit
83
+ noah run "Explain how authentication is wired" .
84
+
85
+ # Allow actions that would normally ask; explicit deny rules still apply
86
+ noah run --auto "Fix the failing unit test" .
87
+
88
+ # Resume previous work
89
+ noah --continue .
90
+ noah --session SESSION_ID .
91
+
92
+ # Use the line-oriented interface
93
+ noah --console .
94
+ ```
95
+
96
+ Check the installation and resolved configuration with:
97
+
98
+ ```bash
99
+ noah --version
100
+ noah doctor .
101
+ noah config show .
102
+ noah update --check
103
+ noah benchmark .
104
+ ```
105
+
106
+ The package also installs `noah-code` and `nc` as equivalent entry points. Because `nc` commonly
107
+ means netcat, `noah` or `noah-code` is recommended.
108
+
109
+ ## Inside the TUI
110
+
111
+ Type `/` to search the full command and configuration reference. The most common controls are:
112
+
113
+ | Control | Action |
114
+ | --- | --- |
115
+ | `Enter` | Send the current prompt or accept a selected suggestion |
116
+ | `Shift+Enter` | Insert a newline |
117
+ | `Tab` | Switch between build and plan mode |
118
+ | `F2` | Open execution activity |
119
+ | `F3` | Open paginated conversation history |
120
+ | `/model` | Configure a provider or switch the session model |
121
+ | `/theme` | Choose Atom One Dark, Noah Ocean, Graphite, or High Contrast |
122
+ | `/diff` | Review staged and unstaged changes |
123
+ | `/undo` / `/redo` | Traverse the persistent edit journal |
124
+ | `/tokens` | Inspect tokens, cache usage, model wait, and tool output |
125
+ | `/efficiency` | Switch between `fast`, `balanced`, and `deep` budgets |
126
+
127
+ On wide terminals, the side rail keeps the active workspace, session, model, tokens, update state,
128
+ and plan in view. The main pane remains centered on the Noah mark until the first prompt, then
129
+ becomes the conversation and execution timeline.
130
+
131
+ ## Models and providers
132
+
133
+ Noah supports OpenAI, Anthropic, OpenRouter, NVIDIA, and custom OpenAI-compatible providers. It
134
+ also works with vLLM, LM Studio, Ollama, Azure OpenAI, Bedrock, Gemini, Groq, Mistral, xAI,
135
+ DeepSeek, Together AI, and Perplexity.
136
+
137
+ The guided `/model` flow is the easiest way to configure a provider. Environment variables and
138
+ the CLI remain available for scripts and headless environments:
139
+
140
+ ```bash
141
+ export OPENAI_API_KEY="..." # or ANTHROPIC_API_KEY / OPENROUTER_API_KEY
142
+ noah providers list
143
+ noah providers add openai --model MODEL_NAME
144
+ noah .
145
+ ```
146
+
147
+ `/model MODEL` changes only the current session and remembers that choice when resumed. Use
148
+ `/model --global MODEL` to set the default for future sessions in every repository.
149
+
150
+ For compatible reasoning models, choose `default`, `none`, `minimal`, `low`, `medium`, `high`, or
151
+ `xhigh`. `default` omits the provider parameter:
152
+
153
+ ```bash
154
+ noah --model openai/MODEL --reasoning-effort high .
155
+ ```
156
+
157
+ See the [provider configuration guide](docs/configuration.md#bring-your-own-api-provider) for
158
+ gateway-specific setup.
159
+
160
+ ## Updates
161
+
162
+ Noah checks PyPI for new versions at most once every 24 hours. New TUI sessions show a temporary
163
+ banner when an update is available and keep the version visible in the context rail. Installation
164
+ remains explicit by default:
165
+
166
+ ```bash
167
+ noah update --check
168
+ noah update
169
+ ```
170
+
171
+ ## Documentation
172
+
173
+ - [Interactive interface and sessions](docs/interactive-reference.md)
174
+ - [Configuration, modes, permissions, and updates](docs/configuration.md)
175
+ - [Generated-code security](docs/security.md)
176
+ - [Custom commands, skills, MCP, and tracing](docs/extensions.md)
177
+ - [Development, CI, and releases](docs/development.md)
178
+ - [Release notes](docs/releases/)
179
+
180
+ ## Development
181
+
182
+ ```bash
183
+ uv sync --extra dev --extra mcp --extra tracing
184
+ uv run ruff check src tests
185
+ uv run pytest tests
186
+ uv build
187
+ ```
188
+
189
+ See the [development guide](docs/development.md) for platform checks and the release process.
190
+
191
+ ## License
192
+
193
+ Apache-2.0. NOOA remains separately licensed by its upstream
194
+ project.
195
+
196
+ ## Credits
197
+
198
+ Built on [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents). Thanks to the
199
+ NVIDIA NeMo team and NOOA contributors for the agent runtime that powers Noah Code.