noah-code 0.2.1__tar.gz → 0.2.3__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 (143) hide show
  1. {noah_code-0.2.1 → noah_code-0.2.3}/.github/workflows/ci.yml +16 -0
  2. {noah_code-0.2.1 → noah_code-0.2.3}/.gitignore +3 -0
  3. noah_code-0.2.3/.pre-commit-config.yaml +8 -0
  4. noah_code-0.2.3/PKG-INFO +246 -0
  5. noah_code-0.2.3/README.md +202 -0
  6. noah_code-0.2.3/docs/assets/noah-in-action.svg +234 -0
  7. {noah_code-0.2.1 → noah_code-0.2.3}/docs/configuration.md +40 -22
  8. {noah_code-0.2.1 → noah_code-0.2.3}/docs/development.md +20 -9
  9. {noah_code-0.2.1 → noah_code-0.2.3}/docs/extensions.md +22 -9
  10. {noah_code-0.2.1 → noah_code-0.2.3}/docs/interactive-reference.md +65 -15
  11. {noah_code-0.2.1 → noah_code-0.2.3}/docs/releases/v0.1.1.md +1 -1
  12. {noah_code-0.2.1 → noah_code-0.2.3}/docs/releases/v0.2.0.md +3 -3
  13. noah_code-0.2.3/docs/releases/v0.2.2.md +42 -0
  14. noah_code-0.2.3/docs/releases/v0.2.3.md +50 -0
  15. {noah_code-0.2.1 → noah_code-0.2.3}/pyproject.toml +29 -2
  16. noah_code-0.2.3/src/noah_code/__init__.py +3 -0
  17. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/__main__.py +1 -1
  18. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/agent.py +224 -47
  19. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/agents.py +41 -17
  20. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/approvals.py +15 -2
  21. noah_code-0.2.3/src/noah_code/budget.py +230 -0
  22. noah_code-0.2.3/src/noah_code/checkpoints.py +186 -0
  23. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/cli.py +326 -44
  24. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/commands.py +97 -22
  25. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/config.py +137 -10
  26. noah_code-0.2.3/src/noah_code/custom_commands.py +222 -0
  27. noah_code-0.2.3/src/noah_code/event_bridge.py +399 -0
  28. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/events.py +6 -0
  29. noah_code-0.2.3/src/noah_code/github.py +193 -0
  30. noah_code-0.2.3/src/noah_code/hooks.py +136 -0
  31. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/host.py +931 -138
  32. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/llm.py +14 -0
  33. noah_code-0.2.3/src/noah_code/llm_replies.py +96 -0
  34. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/mcp_setup.py +20 -6
  35. noah_code-0.2.3/src/noah_code/nooa_compat.py +69 -0
  36. noah_code-0.2.3/src/noah_code/permissions.py +1003 -0
  37. noah_code-0.2.3/src/noah_code/project_notes.py +115 -0
  38. noah_code-0.2.3/src/noah_code/redaction.py +75 -0
  39. noah_code-0.2.3/src/noah_code/secure_files.py +265 -0
  40. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/sessions.py +113 -10
  41. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/skills_setup.py +2 -1
  42. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/snapshots.py +5 -0
  43. noah_code-0.2.3/src/noah_code/steer.py +73 -0
  44. noah_code-0.2.3/src/noah_code/summarization.py +120 -0
  45. noah_code-0.2.3/src/noah_code/themes.py +118 -0
  46. noah_code-0.2.3/src/noah_code/tools/diff_tools.py +263 -0
  47. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/tools/git_tools.py +1 -1
  48. noah_code-0.2.3/src/noah_code/tools/github_tools.py +93 -0
  49. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/tools/lsp_tools.py +13 -9
  50. noah_code-0.2.3/src/noah_code/tools/memory_tools.py +62 -0
  51. noah_code-0.2.3/src/noah_code/tools/plan_tools.py +90 -0
  52. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/tools/process_tools.py +12 -3
  53. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/tools/question_tools.py +5 -1
  54. noah_code-0.2.3/src/noah_code/tools/task_tools.py +219 -0
  55. noah_code-0.2.3/src/noah_code/tools/web_tools.py +384 -0
  56. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/tools/workspace_tools.py +416 -78
  57. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/ui/textual.css +29 -20
  58. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/ui/textual_app.py +946 -140
  59. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/updates.py +28 -0
  60. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/usage.py +35 -0
  61. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/workspace.py +3 -0
  62. noah_code-0.2.3/src/noah_code/worktree.py +242 -0
  63. noah_code-0.2.3/tests/conftest.py +17 -0
  64. noah_code-0.2.3/tests/test_agents.py +130 -0
  65. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_approvals.py +1 -1
  66. noah_code-0.2.3/tests/test_budget.py +149 -0
  67. noah_code-0.2.3/tests/test_cache_context.py +262 -0
  68. noah_code-0.2.3/tests/test_checkpoints.py +135 -0
  69. noah_code-0.2.3/tests/test_cli.py +274 -0
  70. noah_code-0.2.3/tests/test_compaction_eviction.py +136 -0
  71. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_config.py +98 -7
  72. noah_code-0.2.3/tests/test_console_ui.py +140 -0
  73. noah_code-0.2.3/tests/test_custom_commands.py +150 -0
  74. noah_code-0.2.3/tests/test_diff_tools.py +108 -0
  75. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_efficiency.py +3 -11
  76. noah_code-0.2.3/tests/test_event_bridge.py +151 -0
  77. noah_code-0.2.3/tests/test_github.py +182 -0
  78. noah_code-0.2.3/tests/test_hooks.py +200 -0
  79. noah_code-0.2.3/tests/test_host.py +1475 -0
  80. noah_code-0.2.3/tests/test_llm_replies.py +128 -0
  81. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_lsp_tools.py +2 -2
  82. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_mcp_setup.py +93 -1
  83. noah_code-0.2.3/tests/test_permissions.py +541 -0
  84. noah_code-0.2.3/tests/test_plan_memory_tools.py +82 -0
  85. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_process_tools.py +19 -4
  86. noah_code-0.2.3/tests/test_project_notes.py +134 -0
  87. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_question_tools.py +1 -1
  88. noah_code-0.2.3/tests/test_redaction.py +60 -0
  89. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_sessions.py +95 -0
  90. noah_code-0.2.3/tests/test_steer.py +72 -0
  91. noah_code-0.2.3/tests/test_task_tools.py +268 -0
  92. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_textual_tui.py +632 -15
  93. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_updates.py +23 -3
  94. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_wave1_e2e.py +8 -3
  95. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_web_tools.py +80 -2
  96. noah_code-0.2.3/tests/test_workspace_tools.py +649 -0
  97. noah_code-0.2.3/tests/test_worktree.py +92 -0
  98. {noah_code-0.2.1 → noah_code-0.2.3}/uv.lock +208 -2
  99. noah_code-0.2.1/PKG-INFO +0 -230
  100. noah_code-0.2.1/README.md +0 -187
  101. noah_code-0.2.1/src/noah_code/__init__.py +0 -3
  102. noah_code-0.2.1/src/noah_code/benchmark.py +0 -140
  103. noah_code-0.2.1/src/noah_code/custom_commands.py +0 -103
  104. noah_code-0.2.1/src/noah_code/event_bridge.py +0 -196
  105. noah_code-0.2.1/src/noah_code/permissions.py +0 -483
  106. noah_code-0.2.1/src/noah_code/summarization.py +0 -34
  107. noah_code-0.2.1/src/noah_code/tools/task_tools.py +0 -126
  108. noah_code-0.2.1/src/noah_code/tools/web_tools.py +0 -176
  109. noah_code-0.2.1/tests/test_agents.py +0 -52
  110. noah_code-0.2.1/tests/test_cli.py +0 -155
  111. noah_code-0.2.1/tests/test_custom_commands.py +0 -50
  112. noah_code-0.2.1/tests/test_event_bridge.py +0 -64
  113. noah_code-0.2.1/tests/test_host.py +0 -483
  114. noah_code-0.2.1/tests/test_permissions.py +0 -152
  115. noah_code-0.2.1/tests/test_task_tools.py +0 -77
  116. noah_code-0.2.1/tests/test_workspace_tools.py +0 -329
  117. {noah_code-0.2.1 → noah_code-0.2.3}/.github/workflows/release.yml +0 -0
  118. {noah_code-0.2.1 → noah_code-0.2.3}/docs/releases/v0.1.0.md +0 -0
  119. {noah_code-0.2.1 → noah_code-0.2.3}/docs/releases/v0.2.1.md +0 -0
  120. {noah_code-0.2.1 → noah_code-0.2.3}/docs/security.md +0 -0
  121. {noah_code-0.2.1 → noah_code-0.2.3}/install.sh +0 -0
  122. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/composer.py +0 -0
  123. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/credentials.py +0 -0
  124. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/macos_sandbox.py +0 -0
  125. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/providers.py +0 -0
  126. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/tool_output.py +0 -0
  127. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/tools/__init__.py +0 -0
  128. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/tools/media_tools.py +0 -0
  129. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/ui/__init__.py +0 -0
  130. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/ui/console.py +0 -0
  131. {noah_code-0.2.1 → noah_code-0.2.3}/src/noah_code/ui/protocol.py +0 -0
  132. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_agent_security.py +0 -0
  133. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_composer.py +0 -0
  134. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_credentials.py +0 -0
  135. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_event_bridge_and_shell.py +0 -0
  136. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_git_tools.py +0 -0
  137. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_installer.py +0 -0
  138. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_llm.py +0 -0
  139. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_providers.py +0 -0
  140. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_run_exit.py +0 -0
  141. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_skills_setup.py +0 -0
  142. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_snapshots.py +0 -0
  143. {noah_code-0.2.1 → noah_code-0.2.3}/tests/test_summarization.py +0 -0
@@ -9,10 +9,15 @@ on:
9
9
  permissions:
10
10
  contents: read
11
11
 
12
+ concurrency:
13
+ group: ${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
12
16
  jobs:
13
17
  quality:
14
18
  name: Python ${{ matrix.python-version }} quality
15
19
  runs-on: ubuntu-latest
20
+ timeout-minutes: 30
16
21
  strategy:
17
22
  fail-fast: false
18
23
  matrix:
@@ -46,7 +51,17 @@ jobs:
46
51
  - name: Lint
47
52
  run: uv run ruff check src tests
48
53
 
54
+ - name: Type check
55
+ run: uv run mypy src/noah_code
56
+
57
+ - name: Test with coverage (3.12 only)
58
+ if: matrix.python-version == '3.12'
59
+ run: |
60
+ uv run pytest tests --cov=noah_code --cov-report=term-missing \
61
+ --cov-fail-under=70 -W error::pytest.PytestUnraisableExceptionWarning
62
+
49
63
  - name: Test
64
+ if: matrix.python-version != '3.12'
50
65
  run: uv run pytest tests -W error::pytest.PytestUnraisableExceptionWarning
51
66
 
52
67
  - name: Build distributions
@@ -55,6 +70,7 @@ jobs:
55
70
  platform:
56
71
  name: ${{ matrix.name }} smoke test
57
72
  runs-on: ${{ matrix.runner }}
73
+ timeout-minutes: 40
58
74
  strategy:
59
75
  fail-fast: false
60
76
  matrix:
@@ -11,3 +11,6 @@ build/
11
11
  htmlcov/
12
12
  traces/
13
13
  .DS_Store
14
+ docs/superpowers/plans/
15
+ docs/superpowers/specs/
16
+ .noah-code/
@@ -0,0 +1,8 @@
1
+ # Pre-commit hooks mirroring the CI lint gate.
2
+ # Install with: uv run pre-commit install (or `pre-commit install` once installed)
3
+ repos:
4
+ - repo: https://github.com/astral-sh/ruff-pre-commit
5
+ rev: v0.16.1
6
+ hooks:
7
+ - id: ruff-check
8
+ args: [--fix]
@@ -0,0 +1,246 @@
1
+ Metadata-Version: 2.5
2
+ Name: noah-code
3
+ Version: 0.2.3
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
+ Provides-Extra: dev
32
+ Requires-Dist: mypy>=1.13.0; extra == 'dev'
33
+ Requires-Dist: pytest-asyncio>=0.24.0; extra == 'dev'
34
+ Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
35
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
36
+ Requires-Dist: ruff>=0.8.0; extra == 'dev'
37
+ Provides-Extra: mcp
38
+ Requires-Dist: nooa[mcp]==0.0.9; extra == 'mcp'
39
+ Provides-Extra: tracing
40
+ Requires-Dist: nooa[tracing]==0.0.9; extra == 'tracing'
41
+ Provides-Extra: tui
42
+ Requires-Dist: textual>=1.0.0; extra == 'tui'
43
+ Description-Content-Type: text/markdown
44
+
45
+ <div align="center">
46
+
47
+ # Noah Code
48
+
49
+ **A terminal coding agent built on NVIDIA's NOAA framework**
50
+
51
+ [![PyPI](https://img.shields.io/pypi/v/noah-code.svg)](https://pypi.org/project/noah-code/)
52
+ [![CI](https://github.com/skundu42/noah-code/actions/workflows/ci.yml/badge.svg)](https://github.com/skundu42/noah-code/actions/workflows/ci.yml)
53
+ [![Python](https://img.shields.io/pypi/pyversions/noah-code.svg)](https://pypi.org/project/noah-code/)
54
+
55
+ </div>
56
+
57
+ ![Noah Code handling a repository change in its terminal interface](docs/assets/noah-in-action.svg)
58
+
59
+ <p align="center"><sub>The real Textual interface, captured from a deterministic Noah Code session.</sub></p>
60
+
61
+ Noah keeps the conversation central while the context rail tracks live work, Git changes, session,
62
+ model usage, and the current plan. Tool execution stays visible, completed work compacts into
63
+ readable records, and every session remains scoped to its repository.
64
+
65
+ Built on the [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents) runtime.
66
+
67
+ ## Install
68
+
69
+ Install Noah Code and its managed Python runtime with one command:
70
+
71
+ ```bash
72
+ curl -LsSf https://raw.githubusercontent.com/skundu42/noah-code/main/install.sh | sh
73
+ ```
74
+
75
+ Open a new terminal, move into a repository, and start Noah:
76
+
77
+ ```bash
78
+ cd your-project
79
+ noah .
80
+ ```
81
+
82
+ Noah is compatible with macOS on Apple Silicon and Intel, plus Linux on arm64 and x86_64.
83
+
84
+ On the first launch, the TUI walks through provider, API key, model, and reasoning setup. Keys are
85
+ stored in Noah's private auth file with owner-only permissions; they are never written to project
86
+ configuration or session history.
87
+
88
+ ## Why Noah
89
+
90
+ - **Repository-aware exploration.** Search with ripgrep, inspect Git history and diffs, navigate
91
+ symbols through language servers, and use an mtime-cached repository map.
92
+ - **Controlled edits.** Apply anchored replacements or atomic multi-file patches with exact
93
+ preimages, concurrent-change detection, immediate diagnostics, and rollback.
94
+ - **Visible execution.** Stream bounded shell output while commands run, keep servers and watchers
95
+ as managed background jobs, and revisit activity details with `F2`.
96
+ - **Recoverable work.** Review staged and unstaged changes in `/diff`, then undo or redo journaled
97
+ file edits even after restarting Noah.
98
+ - **Persistent sessions.** Resume repository-scoped conversations, todos, model choices, and
99
+ automatically compacted context without losing the full underlying tool results.
100
+ - **Token-efficient by construction.** Lean tool-output bounds with disk-backed recall, condensed
101
+ subagent results, cache-stable request prefixes (volatile status arrives as appended events),
102
+ and pointer-eviction compaction — measured live with `/tokens`.
103
+ - **Explicit control.** Switch between implementation-focused **build** mode and read-only
104
+ **plan** mode, with ordered `allow`, `ask`, and `deny` permission rules.
105
+ - **Extensible workflows.** Add slash commands, opt-in skills, MCP servers, or markdown subagents;
106
+ attach `@files` and images when the task needs more context.
107
+
108
+ Noah follows repository instructions from `AGENTS.md`, `CLAUDE.md`, and
109
+ `.noah-code/instructions.md`.
110
+
111
+ ## Quick start
112
+
113
+ Describe the outcome you want rather than prescribing every edit:
114
+
115
+ ```text
116
+ Find the cause of the failing parser tests, implement the smallest safe fix, and run the
117
+ focused test file.
118
+ ```
119
+
120
+ Useful launch modes:
121
+
122
+ ```bash
123
+ # Open another workspace
124
+ noah /path/to/repository
125
+
126
+ # Inspect and plan without editing
127
+ noah --mode plan .
128
+
129
+ # Run one task and exit
130
+ noah run "Explain how authentication is wired" .
131
+
132
+ # Allow actions that would normally ask; explicit deny rules still apply
133
+ noah run --auto "Fix the failing unit test" .
134
+
135
+ # Resume previous work
136
+ noah --continue .
137
+ noah --session SESSION_ID .
138
+
139
+ # Use the line-oriented interface
140
+ noah --console .
141
+ ```
142
+
143
+ Check the installation and resolved configuration with:
144
+
145
+ ```bash
146
+ noah --version
147
+ noah doctor .
148
+ noah config show .
149
+ noah update --check
150
+ ```
151
+
152
+ The package also installs `noah-code` and `nc` as equivalent entry points. Because `nc` commonly
153
+ means netcat, `noah` or `noah-code` is recommended.
154
+
155
+ ## Inside the TUI
156
+
157
+ Type `/` to search the full command and configuration reference. The most common controls are:
158
+
159
+ | Control | Action |
160
+ | --- | --- |
161
+ | `Enter` | Send the current prompt or accept a selected suggestion |
162
+ | `Shift+Enter` | Insert a newline |
163
+ | `Tab` | Switch between build and plan mode |
164
+ | `F2` | Open execution activity |
165
+ | `F3` | Open paginated conversation history |
166
+ | `/model` | Configure a provider or switch the session model |
167
+ | `/theme` | Choose Atom One Dark, Noah Ocean, Graphite, or High Contrast |
168
+ | `/diff` | Review staged and unstaged changes |
169
+ | `/undo` / `/redo` | Traverse the persistent edit journal |
170
+ | `/tokens` | Inspect tokens, cache usage, prefix stability, model wait, and tool output |
171
+ | `/efficiency` | Switch between `fast`, `balanced`, and `deep` budgets |
172
+
173
+ On wide terminals, the side rail prioritizes the active operation, Git branch and change counts,
174
+ session, model usage, update state, and plan. Git status is refreshed in the background at turn
175
+ boundaries, so the animated working state stays responsive. The main pane remains centered on the
176
+ Noah mark until the first prompt, then becomes the conversation and execution timeline.
177
+
178
+ ## Models and providers
179
+
180
+ Noah supports OpenAI, Anthropic, OpenRouter, NVIDIA, and custom OpenAI-compatible providers. It
181
+ also works with vLLM, LM Studio, Ollama, Azure OpenAI, Bedrock, Gemini, Groq, Mistral, xAI,
182
+ DeepSeek, Together AI, and Perplexity.
183
+
184
+ The guided `/model` flow is the easiest way to configure a provider. Environment variables and
185
+ the CLI remain available for scripts and headless environments:
186
+
187
+ ```bash
188
+ export OPENAI_API_KEY="..." # or ANTHROPIC_API_KEY / OPENROUTER_API_KEY
189
+ noah providers list
190
+ noah providers add openai --model MODEL_NAME
191
+ noah .
192
+ ```
193
+
194
+ `/model MODEL` changes only the current session and remembers that choice when resumed. Use
195
+ `/model --global MODEL` to set the default for future sessions in every repository.
196
+
197
+ For compatible reasoning models, choose `default`, `none`, `minimal`, `low`, `medium`, `high`, or
198
+ `xhigh`. `default` omits the provider parameter:
199
+
200
+ ```bash
201
+ noah --model openai/MODEL --reasoning-effort high .
202
+ ```
203
+
204
+ See the [provider configuration guide](docs/configuration.md#bring-your-own-api-provider) for
205
+ gateway-specific setup.
206
+
207
+ ## Updates
208
+
209
+ Noah checks PyPI for new versions at most once every 24 hours. New TUI sessions show a temporary
210
+ banner when an update is available and keep the version visible in the context rail. Installation
211
+ remains explicit by default:
212
+
213
+ ```bash
214
+ noah update --check
215
+ noah update
216
+ ```
217
+
218
+ ## Documentation
219
+
220
+ - [Interactive interface and sessions](docs/interactive-reference.md)
221
+ - [Configuration, modes, permissions, and updates](docs/configuration.md)
222
+ - [Generated-code security](docs/security.md)
223
+ - [Custom commands, skills, MCP, and tracing](docs/extensions.md)
224
+ - [Development, CI, and releases](docs/development.md)
225
+ - [Release notes](docs/releases/)
226
+
227
+ ## Development
228
+
229
+ ```bash
230
+ uv sync --extra dev --extra mcp --extra tracing
231
+ uv run ruff check src tests
232
+ uv run pytest tests
233
+ uv build
234
+ ```
235
+
236
+ See the [development guide](docs/development.md) for platform checks and the release process.
237
+
238
+ ## License
239
+
240
+ Apache-2.0. NOOA remains separately licensed by its upstream
241
+ project.
242
+
243
+ ## Credits
244
+
245
+ Built on [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents). Thanks to the
246
+ NVIDIA NeMo team and NOOA contributors for the agent runtime that powers Noah Code.
@@ -0,0 +1,202 @@
1
+ <div align="center">
2
+
3
+ # Noah Code
4
+
5
+ **A terminal coding agent 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 live work, Git changes, session,
18
+ model usage, and the current plan. Tool execution stays visible, completed work compacts into
19
+ readable 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
+ - **Token-efficient by construction.** Lean tool-output bounds with disk-backed recall, condensed
57
+ subagent results, cache-stable request prefixes (volatile status arrives as appended events),
58
+ and pointer-eviction compaction — measured live with `/tokens`.
59
+ - **Explicit control.** Switch between implementation-focused **build** mode and read-only
60
+ **plan** mode, with ordered `allow`, `ask`, and `deny` permission rules.
61
+ - **Extensible workflows.** Add slash commands, opt-in skills, MCP servers, or markdown subagents;
62
+ attach `@files` and images when the task needs more context.
63
+
64
+ Noah follows repository instructions from `AGENTS.md`, `CLAUDE.md`, and
65
+ `.noah-code/instructions.md`.
66
+
67
+ ## Quick start
68
+
69
+ Describe the outcome you want rather than prescribing every edit:
70
+
71
+ ```text
72
+ Find the cause of the failing parser tests, implement the smallest safe fix, and run the
73
+ focused test file.
74
+ ```
75
+
76
+ Useful launch modes:
77
+
78
+ ```bash
79
+ # Open another workspace
80
+ noah /path/to/repository
81
+
82
+ # Inspect and plan without editing
83
+ noah --mode plan .
84
+
85
+ # Run one task and exit
86
+ noah run "Explain how authentication is wired" .
87
+
88
+ # Allow actions that would normally ask; explicit deny rules still apply
89
+ noah run --auto "Fix the failing unit test" .
90
+
91
+ # Resume previous work
92
+ noah --continue .
93
+ noah --session SESSION_ID .
94
+
95
+ # Use the line-oriented interface
96
+ noah --console .
97
+ ```
98
+
99
+ Check the installation and resolved configuration with:
100
+
101
+ ```bash
102
+ noah --version
103
+ noah doctor .
104
+ noah config show .
105
+ noah update --check
106
+ ```
107
+
108
+ The package also installs `noah-code` and `nc` as equivalent entry points. Because `nc` commonly
109
+ means netcat, `noah` or `noah-code` is recommended.
110
+
111
+ ## Inside the TUI
112
+
113
+ Type `/` to search the full command and configuration reference. The most common controls are:
114
+
115
+ | Control | Action |
116
+ | --- | --- |
117
+ | `Enter` | Send the current prompt or accept a selected suggestion |
118
+ | `Shift+Enter` | Insert a newline |
119
+ | `Tab` | Switch between build and plan mode |
120
+ | `F2` | Open execution activity |
121
+ | `F3` | Open paginated conversation history |
122
+ | `/model` | Configure a provider or switch the session model |
123
+ | `/theme` | Choose Atom One Dark, Noah Ocean, Graphite, or High Contrast |
124
+ | `/diff` | Review staged and unstaged changes |
125
+ | `/undo` / `/redo` | Traverse the persistent edit journal |
126
+ | `/tokens` | Inspect tokens, cache usage, prefix stability, model wait, and tool output |
127
+ | `/efficiency` | Switch between `fast`, `balanced`, and `deep` budgets |
128
+
129
+ On wide terminals, the side rail prioritizes the active operation, Git branch and change counts,
130
+ session, model usage, update state, and plan. Git status is refreshed in the background at turn
131
+ boundaries, so the animated working state stays responsive. The main pane remains centered on the
132
+ Noah mark until the first prompt, then becomes the conversation and execution timeline.
133
+
134
+ ## Models and providers
135
+
136
+ Noah supports OpenAI, Anthropic, OpenRouter, NVIDIA, and custom OpenAI-compatible providers. It
137
+ also works with vLLM, LM Studio, Ollama, Azure OpenAI, Bedrock, Gemini, Groq, Mistral, xAI,
138
+ DeepSeek, Together AI, and Perplexity.
139
+
140
+ The guided `/model` flow is the easiest way to configure a provider. Environment variables and
141
+ the CLI remain available for scripts and headless environments:
142
+
143
+ ```bash
144
+ export OPENAI_API_KEY="..." # or ANTHROPIC_API_KEY / OPENROUTER_API_KEY
145
+ noah providers list
146
+ noah providers add openai --model MODEL_NAME
147
+ noah .
148
+ ```
149
+
150
+ `/model MODEL` changes only the current session and remembers that choice when resumed. Use
151
+ `/model --global MODEL` to set the default for future sessions in every repository.
152
+
153
+ For compatible reasoning models, choose `default`, `none`, `minimal`, `low`, `medium`, `high`, or
154
+ `xhigh`. `default` omits the provider parameter:
155
+
156
+ ```bash
157
+ noah --model openai/MODEL --reasoning-effort high .
158
+ ```
159
+
160
+ See the [provider configuration guide](docs/configuration.md#bring-your-own-api-provider) for
161
+ gateway-specific setup.
162
+
163
+ ## Updates
164
+
165
+ Noah checks PyPI for new versions at most once every 24 hours. New TUI sessions show a temporary
166
+ banner when an update is available and keep the version visible in the context rail. Installation
167
+ remains explicit by default:
168
+
169
+ ```bash
170
+ noah update --check
171
+ noah update
172
+ ```
173
+
174
+ ## Documentation
175
+
176
+ - [Interactive interface and sessions](docs/interactive-reference.md)
177
+ - [Configuration, modes, permissions, and updates](docs/configuration.md)
178
+ - [Generated-code security](docs/security.md)
179
+ - [Custom commands, skills, MCP, and tracing](docs/extensions.md)
180
+ - [Development, CI, and releases](docs/development.md)
181
+ - [Release notes](docs/releases/)
182
+
183
+ ## Development
184
+
185
+ ```bash
186
+ uv sync --extra dev --extra mcp --extra tracing
187
+ uv run ruff check src tests
188
+ uv run pytest tests
189
+ uv build
190
+ ```
191
+
192
+ See the [development guide](docs/development.md) for platform checks and the release process.
193
+
194
+ ## License
195
+
196
+ Apache-2.0. NOOA remains separately licensed by its upstream
197
+ project.
198
+
199
+ ## Credits
200
+
201
+ Built on [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents). Thanks to the
202
+ NVIDIA NeMo team and NOOA contributors for the agent runtime that powers Noah Code.