noah-code 0.5.0__tar.gz → 0.6.0__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 (149) hide show
  1. {noah_code-0.5.0 → noah_code-0.6.0}/PKG-INFO +19 -11
  2. {noah_code-0.5.0 → noah_code-0.6.0}/README.md +13 -6
  3. {noah_code-0.5.0 → noah_code-0.6.0}/docs/configuration.md +8 -6
  4. {noah_code-0.5.0 → noah_code-0.6.0}/docs/interactive-reference.md +65 -29
  5. noah_code-0.6.0/docs/releases/v0.5.1.md +36 -0
  6. noah_code-0.6.0/docs/releases/v0.6.0.md +68 -0
  7. {noah_code-0.5.0 → noah_code-0.6.0}/docs/reliability.md +7 -4
  8. {noah_code-0.5.0 → noah_code-0.6.0}/pyproject.toml +6 -5
  9. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/__init__.py +1 -1
  10. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/agent.py +114 -10
  11. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/checkpoints.py +118 -79
  12. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/cli.py +1 -15
  13. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/config.py +49 -228
  14. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/hooks.py +33 -11
  15. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/host.py +168 -51
  16. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/llm.py +0 -14
  17. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/nooa_compat.py +1 -1
  18. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/permissions.py +55 -19
  19. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/runtime_state.py +51 -5
  20. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/sessions.py +3 -7
  21. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/snapshots.py +14 -4
  22. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/steer.py +1 -0
  23. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/summarization.py +17 -12
  24. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/git_tools.py +99 -29
  25. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/workspace_tools.py +21 -3
  26. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/ui/textual.css +70 -2
  27. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/ui/textual_app.py +922 -545
  28. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_agent_security.py +94 -2
  29. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_checkpoints.py +189 -0
  30. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_cli.py +12 -0
  31. noah_code-0.6.0/tests/test_compaction_eviction.py +228 -0
  32. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_config.py +97 -2
  33. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_hooks.py +64 -30
  34. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_host.py +72 -3
  35. noah_code-0.6.0/tests/test_lean_reasoning.py +201 -0
  36. noah_code-0.6.0/tests/test_nooa_migration.py +28 -0
  37. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_permissions.py +46 -0
  38. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_runtime_state.py +52 -0
  39. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_snapshots.py +37 -1
  40. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_steer.py +1 -0
  41. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_textual_tui.py +101 -39
  42. noah_code-0.6.0/tests/test_tui_composer_queue.py +291 -0
  43. noah_code-0.6.0/tests/test_tui_history_dialogs.py +223 -0
  44. noah_code-0.6.0/tests/test_tui_layout.py +105 -0
  45. noah_code-0.6.0/tests/test_tui_review_receipt.py +450 -0
  46. {noah_code-0.5.0 → noah_code-0.6.0}/uv.lock +22 -11
  47. noah_code-0.5.0/tests/test_compaction_eviction.py +0 -136
  48. {noah_code-0.5.0 → noah_code-0.6.0}/.github/workflows/ci.yml +0 -0
  49. {noah_code-0.5.0 → noah_code-0.6.0}/.github/workflows/release.yml +0 -0
  50. {noah_code-0.5.0 → noah_code-0.6.0}/.gitignore +0 -0
  51. {noah_code-0.5.0 → noah_code-0.6.0}/.pre-commit-config.yaml +0 -0
  52. {noah_code-0.5.0 → noah_code-0.6.0}/docs/assets/noah-in-action.svg +0 -0
  53. {noah_code-0.5.0 → noah_code-0.6.0}/docs/assets/noah-logo.svg +0 -0
  54. {noah_code-0.5.0 → noah_code-0.6.0}/docs/development.md +0 -0
  55. {noah_code-0.5.0 → noah_code-0.6.0}/docs/extensions.md +0 -0
  56. {noah_code-0.5.0 → noah_code-0.6.0}/docs/releases/v0.1.0.md +0 -0
  57. {noah_code-0.5.0 → noah_code-0.6.0}/docs/releases/v0.1.1.md +0 -0
  58. {noah_code-0.5.0 → noah_code-0.6.0}/docs/releases/v0.2.0.md +0 -0
  59. {noah_code-0.5.0 → noah_code-0.6.0}/docs/releases/v0.2.1.md +0 -0
  60. {noah_code-0.5.0 → noah_code-0.6.0}/docs/releases/v0.2.2.md +0 -0
  61. {noah_code-0.5.0 → noah_code-0.6.0}/docs/releases/v0.2.3.md +0 -0
  62. {noah_code-0.5.0 → noah_code-0.6.0}/docs/releases/v0.2.4.md +0 -0
  63. {noah_code-0.5.0 → noah_code-0.6.0}/docs/releases/v0.3.0.md +0 -0
  64. {noah_code-0.5.0 → noah_code-0.6.0}/docs/releases/v0.4.0.md +0 -0
  65. {noah_code-0.5.0 → noah_code-0.6.0}/docs/releases/v0.4.1.md +0 -0
  66. {noah_code-0.5.0 → noah_code-0.6.0}/docs/releases/v0.5.0.md +0 -0
  67. {noah_code-0.5.0 → noah_code-0.6.0}/docs/security.md +0 -0
  68. {noah_code-0.5.0 → noah_code-0.6.0}/install.sh +0 -0
  69. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/__main__.py +0 -0
  70. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/agents.py +0 -0
  71. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/approvals.py +0 -0
  72. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/budget.py +0 -0
  73. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/commands.py +0 -0
  74. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/composer.py +0 -0
  75. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/credentials.py +0 -0
  76. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/custom_commands.py +0 -0
  77. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/event_bridge.py +0 -0
  78. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/events.py +0 -0
  79. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/github.py +0 -0
  80. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/llm_replies.py +0 -0
  81. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/macos_sandbox.py +0 -0
  82. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/mcp_setup.py +0 -0
  83. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/predict.py +0 -0
  84. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/project_notes.py +0 -0
  85. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/providers.py +0 -0
  86. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/redaction.py +0 -0
  87. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/secure_files.py +0 -0
  88. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/skills_setup.py +0 -0
  89. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/telemetry.py +0 -0
  90. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/themes.py +0 -0
  91. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tool_output.py +0 -0
  92. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/__init__.py +0 -0
  93. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/diff_tools.py +0 -0
  94. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/github_tools.py +0 -0
  95. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/lsp_tools.py +0 -0
  96. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/media_tools.py +0 -0
  97. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/memory_tools.py +0 -0
  98. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/plan_tools.py +0 -0
  99. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/process_tools.py +0 -0
  100. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/question_tools.py +0 -0
  101. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/task_tools.py +0 -0
  102. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/tools/web_tools.py +0 -0
  103. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/ui/__init__.py +0 -0
  104. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/ui/console.py +0 -0
  105. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/ui/protocol.py +0 -0
  106. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/updates.py +0 -0
  107. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/usage.py +0 -0
  108. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/workspace.py +0 -0
  109. {noah_code-0.5.0 → noah_code-0.6.0}/src/noah_code/worktree.py +0 -0
  110. {noah_code-0.5.0 → noah_code-0.6.0}/tests/conftest.py +0 -0
  111. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_agents.py +0 -0
  112. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_approvals.py +0 -0
  113. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_budget.py +0 -0
  114. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_cache_context.py +0 -0
  115. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_commands.py +0 -0
  116. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_composer.py +0 -0
  117. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_console_ui.py +0 -0
  118. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_credentials.py +0 -0
  119. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_custom_commands.py +0 -0
  120. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_diff_tools.py +0 -0
  121. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_efficiency.py +0 -0
  122. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_event_bridge.py +0 -0
  123. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_event_bridge_and_shell.py +0 -0
  124. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_git_tools.py +0 -0
  125. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_github.py +0 -0
  126. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_installer.py +0 -0
  127. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_llm.py +0 -0
  128. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_llm_replies.py +0 -0
  129. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_lsp_tools.py +0 -0
  130. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_mcp_setup.py +0 -0
  131. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_plan_memory_tools.py +0 -0
  132. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_process_tools.py +0 -0
  133. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_project_notes.py +0 -0
  134. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_prompt_scorecard.py +0 -0
  135. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_providers.py +0 -0
  136. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_question_tools.py +0 -0
  137. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_redaction.py +0 -0
  138. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_run_exit.py +0 -0
  139. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_sessions.py +0 -0
  140. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_skills_setup.py +0 -0
  141. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_summarization.py +0 -0
  142. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_task_tools.py +0 -0
  143. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_telemetry.py +0 -0
  144. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_tool_output.py +0 -0
  145. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_updates.py +0 -0
  146. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_wave1_e2e.py +0 -0
  147. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_web_tools.py +0 -0
  148. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_workspace_tools.py +0 -0
  149. {noah_code-0.5.0 → noah_code-0.6.0}/tests/test_worktree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: noah-code
3
- Version: 0.5.0
3
+ Version: 0.6.0
4
4
  Summary: Noah Code terminal coding agent, built on NVIDIA OO Agents (NOOA)
5
5
  Project-URL: Homepage, https://github.com/skundu42/noah-code
6
6
  Project-URL: Documentation, https://github.com/skundu42/noah-code#readme
@@ -21,13 +21,14 @@ Classifier: Topic :: Software Development
21
21
  Requires-Python: <3.14,>=3.12
22
22
  Requires-Dist: click<9.0.0,>=8.1.0
23
23
  Requires-Dist: litellm<1.99.0,>=1.96.0
24
- Requires-Dist: nooa-cli==0.0.9
25
- Requires-Dist: nooa==0.0.9
24
+ Requires-Dist: nooa-cli==0.0.10
25
+ Requires-Dist: nooa==0.0.10
26
26
  Requires-Dist: packaging<27.0,>=24.0
27
27
  Requires-Dist: pydantic<3.0.0,>=2.5.0
28
28
  Requires-Dist: pyyaml<7.0.0,>=6.0.0
29
29
  Requires-Dist: rich<16.0.0,>=13.0.0
30
30
  Requires-Dist: textual<9.0.0,>=1.0.0
31
+ Requires-Dist: tomlkit<1.0.0,>=0.13.2
31
32
  Provides-Extra: dev
32
33
  Requires-Dist: mypy>=2.3.1; extra == 'dev'
33
34
  Requires-Dist: pytest-asyncio>=0.24.0; extra == 'dev'
@@ -37,9 +38,9 @@ Requires-Dist: pytest>=8.0.0; extra == 'dev'
37
38
  Requires-Dist: ruff>=0.8.0; extra == 'dev'
38
39
  Requires-Dist: types-pyyaml>=6.0.12.20260815; extra == 'dev'
39
40
  Provides-Extra: mcp
40
- Requires-Dist: nooa[mcp]==0.0.9; extra == 'mcp'
41
+ Requires-Dist: nooa[mcp]==0.0.10; extra == 'mcp'
41
42
  Provides-Extra: tracing
42
- Requires-Dist: nooa[tracing]==0.0.9; extra == 'tracing'
43
+ Requires-Dist: nooa[tracing]==0.0.10; extra == 'tracing'
43
44
  Requires-Dist: opentelemetry-exporter-otlp-proto-http<2.0.0,>=1.44.0; extra == 'tracing'
44
45
  Description-Content-Type: text/markdown
45
46
 
@@ -61,8 +62,8 @@ Description-Content-Type: text/markdown
61
62
 
62
63
  <p align="center"><sub>The real Textual interface, captured from a deterministic Noah Code session.</sub></p>
63
64
 
64
- Noah keeps the conversation central while the context rail tracks live work, Git changes, session,
65
- model usage, and the current plan. Tool execution stays visible, completed work compacts into
65
+ Noah keeps the conversation central while the sidebar tracks the current action, changed files,
66
+ and the active plan. Tool execution stays visible, completed work compacts into
66
67
  readable records, and every session remains scoped to its repository.
67
68
 
68
69
  Built on the [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents) runtime.
@@ -166,20 +167,27 @@ Type `/` to search the full command and configuration reference. The most common
166
167
  | Control | Action |
167
168
  | --- | --- |
168
169
  | `Enter` | Send the current prompt or accept a selected suggestion |
169
- | `Shift+Enter` | Insert a newline |
170
+ | `Shift+Enter` / `Ctrl+J` | Insert a newline |
171
+ | `Alt+Enter` | Expand or collapse the composer |
172
+ | `Alt+Z` | Restore a displaced draft |
170
173
  | Drag, then `Cmd+C` / `Ctrl+Shift+C` | Select and copy TUI text |
171
174
  | `Ctrl+Shift+C` with no selection | Copy the latest Noah reply |
172
175
  | `Ctrl+G` | Open the searchable skills picker |
173
176
  | `Ctrl+L` | Open the model picker |
174
177
  | `Ctrl+R` | Search and recall a prior prompt |
175
178
  | `Ctrl+T` | Expand or collapse live tool output |
176
- | `Shift+Tab` | Open the reasoning-effort picker |
179
+ | `Alt+E` | Open the reasoning-effort picker |
177
180
  | `Alt+Up` | Recall the newest queued prompt for editing |
178
181
  | `Ctrl+]` | Return to live transcript output |
179
- | `Tab` | Switch between build and plan mode |
182
+ | `Tab` / `Shift+Tab` | Navigate focus; Tab completes suggestions |
183
+ | `Ctrl+B` | Switch between build and plan mode |
184
+ | `Ctrl+D` | Review changes while working or idle |
185
+ | `Ctrl+C` | Stop the current run and pause queued follow-ups |
180
186
  | `F2` | Open execution activity |
181
187
  | `F3` | Open paginated conversation history |
182
188
  | `F4` | Open the live agent, terminal, and job ledger |
189
+ | `F5` | Edit, reorder, resume, or discard queued follow-ups |
190
+ | `F8` | Show or hide the sidebar |
183
191
  | `Shift+F7` | Focus or leave the scrollable context rail |
184
192
  | `/model` | Configure a provider or switch the session model |
185
193
  | `/theme` | Choose Atom One Dark, Noah Ocean, Graphite, or High Contrast |
@@ -247,7 +255,7 @@ are configured under `[reliability.retries]`.
247
255
  ## Updates
248
256
 
249
257
  Noah checks PyPI for new versions at most once every 24 hours. New TUI sessions show a temporary
250
- banner when an update is available and keep the version visible in the context rail. Installation
258
+ banner when an update is available, with `F6` opening its details. Installation
251
259
  remains explicit by default:
252
260
 
253
261
  ```bash
@@ -16,8 +16,8 @@
16
16
 
17
17
  <p align="center"><sub>The real Textual interface, captured from a deterministic Noah Code session.</sub></p>
18
18
 
19
- Noah keeps the conversation central while the context rail tracks live work, Git changes, session,
20
- model usage, and the current plan. Tool execution stays visible, completed work compacts into
19
+ Noah keeps the conversation central while the sidebar tracks the current action, changed files,
20
+ and the active plan. Tool execution stays visible, completed work compacts into
21
21
  readable records, and every session remains scoped to its repository.
22
22
 
23
23
  Built on the [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents) runtime.
@@ -121,20 +121,27 @@ Type `/` to search the full command and configuration reference. The most common
121
121
  | Control | Action |
122
122
  | --- | --- |
123
123
  | `Enter` | Send the current prompt or accept a selected suggestion |
124
- | `Shift+Enter` | Insert a newline |
124
+ | `Shift+Enter` / `Ctrl+J` | Insert a newline |
125
+ | `Alt+Enter` | Expand or collapse the composer |
126
+ | `Alt+Z` | Restore a displaced draft |
125
127
  | Drag, then `Cmd+C` / `Ctrl+Shift+C` | Select and copy TUI text |
126
128
  | `Ctrl+Shift+C` with no selection | Copy the latest Noah reply |
127
129
  | `Ctrl+G` | Open the searchable skills picker |
128
130
  | `Ctrl+L` | Open the model picker |
129
131
  | `Ctrl+R` | Search and recall a prior prompt |
130
132
  | `Ctrl+T` | Expand or collapse live tool output |
131
- | `Shift+Tab` | Open the reasoning-effort picker |
133
+ | `Alt+E` | Open the reasoning-effort picker |
132
134
  | `Alt+Up` | Recall the newest queued prompt for editing |
133
135
  | `Ctrl+]` | Return to live transcript output |
134
- | `Tab` | Switch between build and plan mode |
136
+ | `Tab` / `Shift+Tab` | Navigate focus; Tab completes suggestions |
137
+ | `Ctrl+B` | Switch between build and plan mode |
138
+ | `Ctrl+D` | Review changes while working or idle |
139
+ | `Ctrl+C` | Stop the current run and pause queued follow-ups |
135
140
  | `F2` | Open execution activity |
136
141
  | `F3` | Open paginated conversation history |
137
142
  | `F4` | Open the live agent, terminal, and job ledger |
143
+ | `F5` | Edit, reorder, resume, or discard queued follow-ups |
144
+ | `F8` | Show or hide the sidebar |
138
145
  | `Shift+F7` | Focus or leave the scrollable context rail |
139
146
  | `/model` | Configure a provider or switch the session model |
140
147
  | `/theme` | Choose Atom One Dark, Noah Ocean, Graphite, or High Contrast |
@@ -202,7 +209,7 @@ are configured under `[reliability.retries]`.
202
209
  ## Updates
203
210
 
204
211
  Noah checks PyPI for new versions at most once every 24 hours. New TUI sessions show a temporary
205
- banner when an update is available and keep the version visible in the context rail. Installation
212
+ banner when an update is available, with `F6` opening its details. Installation
206
213
  remains explicit by default:
207
214
 
208
215
  ```bash
@@ -219,12 +219,14 @@ supported by the OTLP exporters; keep authentication headers in the environment
219
219
  secret store rather than TOML.
220
220
 
221
221
  Repository-controlled configuration cannot weaken the host trust boundary. Project config is
222
- ignored for `auto_approve`, `budget`, `efficiency`, `enabled_skills`, `hooks`, `lsp`, `mcp`,
222
+ ignored for `auto_approve`, `yolo`, `budget`, `checkpoints`, `efficiency`, `enabled_skills`, `hooks`, `lsp`, `mcp`,
223
223
  `permission_rules`, `processes`, `reliability`, `session_dir`, `tracing`, `updates`, and
224
224
  `unsafe_inprocess_code_execution`. Put those settings in trusted user config, the environment, or
225
225
  an explicit CLI flag. Language-server overrides and hooks are user-only because they launch local
226
- executables; reliability and budget settings are user-only so repository content cannot weaken
227
- host limits.
226
+ executables; reliability, budget, and checkpoint settings are user-only so repository content cannot
227
+ weaken host limits or recovery protections. Project config may select `mode = "plan"`, but choosing
228
+ build mode requires trusted configuration or an explicit CLI flag. Newly added settings are user-only
229
+ unless explicitly approved for project configuration.
228
230
 
229
231
  A user-configured `permission_rules` array replaces the default rule array. Copy forward every
230
232
  default you still want before adding overrides. Hard secret, destructive-shell, and plan-mode
@@ -362,8 +364,8 @@ Permission rules are evaluated in order, and the last matching rule wins. The de
362
364
  - Keeps file tools inside the active workspace and asks before MCP access.
363
365
  - Denies plan-mode mutations regardless of broader allow rules. Plan mode may still run
364
366
  read-only subagents. Its shell allowlist accepts only literal, unqualified read-only programs;
365
- test collection and interpreter execution are not treated as read-only because they can load
366
- repository code.
367
+ arguments are checked for write-capable options. Test collection and interpreter execution,
368
+ including arbitrary awk programs, are not treated as read-only because they can execute code.
367
369
 
368
370
  `--auto` changes routine ask decisions to allow but never overrides an explicit deny.
369
371
  Elevated-risk commands such as file removal, downloads, and package installation still require
@@ -384,7 +386,7 @@ sh install.sh
384
386
  ```
385
387
 
386
388
  Installs created by the one-line command check PyPI at most once every 24 hours. If a release is
387
- available, a new TUI session shows a temporary banner and keeps the version in the context rail.
389
+ available, a new TUI session shows a temporary banner with `F6` opening its details.
388
390
  Run `noah update` when ready. When an update is installed, Noah exits before starting the task so
389
391
  it cannot mix old and new runtime modules. Rerun the command to continue on the new version.
390
392
 
@@ -5,8 +5,11 @@
5
5
  | Key | Action |
6
6
  |-----|--------|
7
7
  | `Enter` | Send the current message, or queue a follow-up while a turn is running |
8
- | `Shift+Enter` | Insert a newline without sending |
9
- | `Tab` | Toggle `build`/`plan` mode; accept the highlighted slash option while suggestions are open |
8
+ | `Shift+Enter` or `Ctrl+J` | Insert a newline without sending |
9
+ | `Alt+Enter` | Expand or collapse the composer |
10
+ | `Alt+Z` | Restore the draft saved before a palette or history selection |
11
+ | `Tab` / `Shift+Tab` | Move focus forward/back; Tab completes an open suggestion |
12
+ | `Ctrl+B` | Switch between build and plan mode |
10
13
  | `Ctrl+P` | Open the command palette |
11
14
  | `Ctrl+G` | Open the searchable skills picker |
12
15
  | `Ctrl+L` | Open the model picker |
@@ -14,34 +17,43 @@
14
17
  | `Ctrl+R` | Search prior prompts and recall one into the composer |
15
18
  | `Ctrl+T` | Expand or collapse live tool output |
16
19
  | `Alt+Up` | Recall the newest queued prompt into the composer |
17
- | `Shift+Tab` | Open the reasoning-effort picker |
20
+ | `Alt+E` | Open the reasoning-effort picker |
21
+ | `Ctrl+D` | Review changed files, including while work is running |
18
22
  | `Ctrl+N` | Start a new session |
19
- | `Ctrl+C` | Cancel the active turn and clear queued follow-ups; press twice while idle to quit |
23
+ | `Ctrl+C` | Stop the active turn and pause queued follow-ups, keeping attachments; press twice while idle to quit |
20
24
  | `Ctrl+Q` | Quit |
21
25
  | `F1` or `?` | Show help |
22
- | `F2` | Open recent activity and full captured output |
23
- | `F3` | Open paginated persisted conversation history |
26
+ | `F2` | Search recent activity and inspect captured output |
27
+ | `F3` | Search loaded conversation history; Ctrl+Home loads older messages |
24
28
  | `F4` | Open the live work ledger for agents, terminals, and background jobs |
29
+ | `F5` | Manage queued prompts: E edit, R resume, X discard all |
30
+ | `F6` | Inspect the latest notice or error |
31
+ | `F7` | Inspect context sources |
32
+ | `F8` | Show or hide the sidebar |
25
33
  | `Shift+F7` | Focus or leave the context rail on wide terminals |
26
34
  | `Ctrl+]` | Return to live transcript output and clear the new-output counter |
27
35
 
28
36
  At an approval prompt, press `1` to approve once, `2` to remember the approval for the current
29
- session, or `3`/`Esc` to reject it.
37
+ session, or `3`/`Esc` to reject it. The dialog explains the matching scope and keeps the
38
+ full target scrollable. Question cards accept numbered choices and show question progress;
39
+ `Esc` skips that question.
30
40
 
31
41
  The TUI uses Atom One Dark by default and also includes Noah Ocean, Graphite, and High Contrast.
32
- Switch and persist the active palette with `/theme`. Its conversation-first layout adapts to
33
- terminal size. At 110 columns or wider, a change-ledger rail prioritizes the current action, Git
34
- branch and staged/modified/new counts, session, model usage, and up to six open or blocked todos.
35
- Narrow terminals retain the transcript, live activity, suggestions, and composer without the rail.
36
- Terminals 25 rows high or shorter use compact spacing.
37
-
38
- The line below the composer keeps the active keyboard guidance on the left and, when space permits,
42
+ Switch and persist the active palette with `/theme`; dialogs and tool output use the same
43
+ semantic colors. The sidebar appears automatically at 128 columns and 24 rows or larger,
44
+ prioritizing the current action, changed filenames, and the active plan. Empty work sections
45
+ stay hidden. `F8` toggles the sidebar and remembers that choice for the app run; below 100
46
+ columns it stays hidden. Narrow terminals keep the full conversation width. Terminals 25
47
+ rows high or shorter use compact spacing. Model and mode remain in the header; `/status`,
48
+ `/tokens`, and the existing inspectors provide full metadata.
49
+
50
+ The line below the composer keeps clickable, focused-pane keyboard guidance on the left and, when space permits,
39
51
  session input/output tokens, cache hit rate, and estimated cost on the right. This telemetry remains
40
52
  available even when the wide context rail is hidden.
41
53
 
42
54
  Live tool output stays in a compact two-line drawer so long commands do not push the conversation
43
- away. Press `Ctrl+T` to expand the drawer in place; `F2` retains the complete output after the tool
44
- finishes. The drawer replaces the animated working banner while a visible tool is active, avoiding
55
+ away. Press `Ctrl+T` to expand the drawer in place; `F2` retains bounded captured output after the tool
56
+ finishes, explicitly marking omitted middle output when the capture limit is reached. The drawer replaces the animated working banner while a visible tool is active, avoiding
45
57
  duplicate status lines; the banner returns between tools.
46
58
 
47
59
  Type `/` in the composer to open the inline command list; the list remains visible and filters
@@ -50,14 +62,18 @@ close the list. Press `Enter` again to run the completed command. Typing `/confi
50
62
  to every resolved configuration path and its current redacted value.
51
63
 
52
64
  Press `Ctrl+R` to search prompts already shown in the current session. Choosing one loads it into
53
- the composer without sending it; pressing `Esc` keeps the current draft unchanged.
54
-
55
- Until a session has its first user prompt, the main pane keeps the large Noah wordmark centered. Startup,
56
- repository changes, model, mode, usage, and update state live in the context rail on wide
57
- terminals. The rail scrolls when its sections exceed the available rows; press `Shift+F7`, then use
58
- arrows, Page Up/Down, Home, or End without leaving the keyboard. Git status is collected in a
59
- background worker at startup and turn boundaries; the animated Noah path updates only the working
60
- banner and live activity. Existing sessions with user history restore their transcript normally.
65
+ the composer without sending it and saves the displaced draft for `Alt+Z`. Palette choices
66
+ use the same draft protection; skill selections insert at the cursor. Pressing `Esc` leaves
67
+ the current draft unchanged. Commands blocked while busy remain editable.
68
+
69
+ Until a session has its first user prompt, the main pane keeps the Noah wordmark centered.
70
+ The sidebar scrolls when needed; press Tab to focus it or use `Shift+F7`, then arrows,
71
+ Page Up/Down, Home, or End. Git status is collected in a background worker at startup and
72
+ turn boundaries, and every five seconds while working with the sidebar visible. Existing
73
+ sessions restore their recent transcript. F3 preserves reading position when older pages
74
+ load; its search covers the messages loaded so far. F2 searches captured action labels,
75
+ commands, results, and output. Failed tool attempts remain visible in the conversation
76
+ with an F2 details hint.
61
77
 
62
78
  Drag across transcript, activity, diff, or history text to select it. `Cmd+C` on macOS or
63
79
  `Ctrl+Shift+C` in other terminals copies the selection; when there is no selection, the same
@@ -85,15 +101,18 @@ The queue holds at most 100 items. A 101st `Enter` drops the oldest and status-p
85
101
  `steer dropped oldest`. `@path` mentions and `/attach` paths expand when the item is injected, not
86
102
  when it is queued. A follow-up that names files Noah cannot resolve is dropped; later items stay.
87
103
  Sequenced items are persisted in the session runtime database, so an unexpected process exit does
88
- not lose them. `Ctrl+C` cancels the turn and clears the queue. Switching or starting a session also
89
- clears it.
104
+ not lose them. `Ctrl+C` stops the current turn and pauses delivery, keeping queued prompts
105
+ and pending attachments. Pause state, order, and attachments survive reopening the session.
106
+ F5 lets you edit a selected prompt, resume delivery with R, or explicitly discard everything
107
+ with X. Switching or starting a session clears the active queue; durable state belongs to
108
+ its originating session.
90
109
 
91
110
  Approval and `ask.question` modals keep the composer. Queueing resumes after the modal closes.
92
111
 
93
112
  These slash commands still run while a turn is in progress: `/status`, `/tokens`, `/todos`,
94
- `/health`, `/help`, `/trace`, `/work`, and `/terminals`. `/attach PATH` remembers the file for the next queued follow-up.
95
- `/exit` cancels the turn (and the queue) then leaves. Mutating commands wait until the turn
96
- finishes, including `/undo`, `/redo`, `/mode`, `/model`, `/diff`, `/new`, `/sessions`, `/worktree`,
113
+ `/health`, `/help`, `/trace`, `/work`, `/diff`, and `/terminals`. `/attach PATH` remembers the file for the next queued follow-up.
114
+ `/exit` stops the turn and leaves with queued input preserved. Mutating commands wait until the turn
115
+ finishes, including `/undo`, `/redo`, `/mode`, `/model`, `/new`, `/sessions`, `/worktree`,
97
116
  `/pr`, `/plan`, `/memory`, and `/compact`.
98
117
 
99
118
  Tool and shell output is batched into a live execution panel instead of forcing one full-screen
@@ -104,6 +123,23 @@ Consecutive reads or writes merge into a single line (`✓ Read a.py, b.py +1`)
104
123
  compact. `F2` retains the latest 100 activity records, bounded by the configured
105
124
  `max_output_chars` per activity.
106
125
 
126
+
127
+ ### Reviewing results
128
+
129
+ `Ctrl+D` or `/diff` opens the changed-file list first. Patches and editor diagnostics load
130
+ when selected, with separate capture timestamps; Ctrl+R refreshes the list. Review is
131
+ available during a run, with revert and undo disabled until work is idle. Type `/` to
132
+ filter filenames, J/K to change files, N/P to move between hunks, V to toggle editor
133
+ diagnostics, and O to open the selected
134
+ file using `$VISUAL` or `$EDITOR` (falling back to `vi`). Large patch previews explicitly
135
+ state when truncated. Editor diagnostics describe the current worktree, including when
136
+ viewing staged changes.
137
+
138
+ Completion receipts show recorded check commands and their actual exit statuses, separate
139
+ from editor diagnostics. They include observable changed-file counts and advertise journal
140
+ undo only when its preflight succeeds. When results are unavailable, the receipt says so;
141
+ compound shell expressions are not treated as individual passing test commands.
142
+
107
143
  ## Built-in slash commands
108
144
 
109
145
  | Command | Purpose |
@@ -0,0 +1,36 @@
1
+ # Noah Code v0.5.1
2
+
3
+ This release migrates Noah to NOOA 0.0.10 and preserves reasoning state in the default
4
+ lean execution mode.
5
+
6
+ ## Reasoning continuity
7
+
8
+ - Structured reasoning returned alongside tool calls is retained in lean-mode history and
9
+ included in the next provider request. Noah keeps its compact tool transcript while gaining
10
+ upstream's reasoning-state support.
11
+ - Regression checks cover the follow-up provider request, multiple tool calls, and responses
12
+ without reasoning state.
13
+
14
+ ## Runtime migration
15
+
16
+ - Pin NOOA and NOOA CLI, including MCP and tracing extras, to 0.0.10.
17
+ - Adopt upstream's shell framing fixes: malformed quotes and heredocs report syntax errors,
18
+ and commands that read stdin cannot consume the shell's internal control protocol.
19
+ - Carry upstream's configured error-output limits into Noah's macOS sandbox worker.
20
+ - Preserve Noah's background-task and recovery notifications after upstream's queue changes.
21
+ - Supply absolute file locations for upstream's updated edit anchors, keeping Noah's stale-edit
22
+ protections and workspace-relative display paths.
23
+
24
+ The migration also includes upstream's bounded, source-aware sandbox diagnostics and preservation
25
+ of MCP call timeouts during OAuth refresh.
26
+
27
+ ## Upgrade
28
+
29
+ ```bash
30
+ noah update
31
+ ```
32
+
33
+ Validation uses deterministic provider responses and runtime regressions. This release does not
34
+ claim measured live-provider quality improvements or general token savings.
35
+
36
+ **Full changelog:** https://github.com/skundu42/noah-code/compare/v0.5.0...v0.5.1
@@ -0,0 +1,68 @@
1
+ # Noah Code v0.6.0
2
+
3
+ Noah now preserves drafts and queued work, makes changes easier to review while the agent runs,
4
+ and reports recorded check results alongside accurate undo availability. This release also fixes
5
+ permission boundaries, crash recovery, checkpoint restoration, and resumed-session continuity.
6
+
7
+ ## Input and navigation
8
+
9
+ - Palette and history selections save the displaced draft for `Alt+Z`; skills insert at the
10
+ cursor. Blocked commands and failed queue writes leave the prompt editable.
11
+ - `Ctrl+C` stops the current run and pauses queued prompts while retaining attachments.
12
+ Paused state, delivery order, and attachments survive reopening. `F5` edits a selected prompt,
13
+ resumes delivery, or explicitly discards waiting input.
14
+ - `Tab` and `Shift+Tab` move focus; Tab still completes open suggestions. Use `Ctrl+B` for
15
+ Build/Plan, `Alt+E` for reasoning, `Alt+Enter` to expand the composer, and `Ctrl+J` as a newline
16
+ alternative to Shift+Enter. These replace the previous Tab and Shift+Tab mode/settings shortcuts.
17
+ - The sidebar prioritizes current work, changed filenames, and the active plan. It appears
18
+ automatically at 128 columns and 24 rows or larger; `F8` toggles it. Footer actions follow focus.
19
+ - `F2` searches captured activity; `F3` searches loaded conversation history and preserves reading
20
+ position when loading older pages. Failed tool attempts remain visible with a details hint.
21
+ - Approval details scroll without hiding the decision buttons. Question cards support numbered
22
+ choices and progress. Dialogs use the selected theme's semantic colors.
23
+
24
+ ## Review and check results
25
+
26
+ - `Ctrl+D` or `/diff` opens the file list immediately and loads selected patches and diagnostics
27
+ progressively. Read-only review stays available during work.
28
+ - Filter files, navigate hunks with N/P, open a file in the configured editor with O, toggle
29
+ diagnostics with V, and refresh with Ctrl+R. Compact terminals reserve space for the patch.
30
+ - Reviews show capture timestamps and identify truncated previews. Revert checks the captured
31
+ file, index, and HEAD again after approval; active work blocks revert and undo.
32
+ - Completion receipts report recorded check-command exit statuses, separate from editor
33
+ diagnostics. Changed-file observations include Git-visible shell edits and journaled edits;
34
+ undo is offered only when its preflight succeeds and covers the observed files.
35
+ - Command history retains 512 results. Unknown or compound shell commands are not classified as
36
+ individual checks, and missing results are reported explicitly.
37
+
38
+ ## Reliability and permission fixes
39
+
40
+ - Repository configuration can no longer enable YOLO or override trusted permission, sandbox,
41
+ hook, credential, or checkpoint settings. Repository mode may tighten execution to plan mode.
42
+ - Command classification requires approval for mutating or unrecognized filter options.
43
+ Broker checks validate the complete operation path and protect capabilities from replacement.
44
+ - Checkpoint restore preserves protected files and refuses conflicting paths before writing.
45
+ Capture batches Git operations and bypasses repository content filters.
46
+ - Interrupted-write recovery saves the current contents before restoring the preimage, preserving
47
+ repairs made after a crash. Empty files retain their correct undo/redo state after resume.
48
+ - Journal retention is consistently bounded to 20 turns. Compaction artifacts preserve complete
49
+ mixed tool results, and live summarizers survive session reopening and older snapshots.
50
+ - Timed-out hooks terminate their process groups and retain bounded output. Configuration writes
51
+ use TOMLKit to preserve valid TOML structure and comments while updating settings atomically.
52
+ - Remove duplicate configuration writers, command registration, sampling helpers, and UI state.
53
+
54
+ ## Upgrade
55
+
56
+ ```bash
57
+ noah update
58
+ ```
59
+
60
+ Move privileged settings previously stored in repository configuration to trusted user
61
+ configuration. See the [configuration guide](https://github.com/skundu42/noah-code/blob/v0.6.0/docs/configuration.md) and
62
+ [updated keyboard reference](https://github.com/skundu42/noah-code/blob/v0.6.0/docs/interactive-reference.md).
63
+
64
+ Local validation: 960 tests passed on Python 3.13/macOS, with one opt-in network test deselected;
65
+ lint, type checks, lockfile validation, and wheel/source builds passed. The release workflow also
66
+ validates package metadata and binary-only installation before publishing.
67
+
68
+ **Full changelog:** https://github.com/skundu42/noah-code/compare/v0.5.1...v0.6.0
@@ -53,16 +53,19 @@ fresh process-status snapshot, and continues the same journaled turn.
53
53
 
54
54
  Direct workspace writes and atomic multi-file patches record their pre-images in the runtime
55
55
  database before changing the checkout. A crash before the commit record restores those pre-images
56
- on the next launch. This protection complements the persistent edit journal used by `/undo` and
57
- `/redo`.
56
+ on the next launch. Before rollback, the current contents and path metadata are saved in the session's
57
+ `recovery/` directory, whose location is reported at startup. This preserves repairs made after the
58
+ crash. If the backup cannot be saved, recovery stops before replacing that file. The persistent edit
59
+ journal used by `/undo` and `/redo` retains the newest 20 turns in memory and across restarts.
58
60
 
59
61
  Git checkpoints are enabled by default. Noah captures them at turn boundaries and before mutating
60
62
  shell commands, stores them under `refs/noah-code/checkpoints/<session>/`, and keeps the newest 50
61
63
  by default. Capturing uses a temporary Git index and does not move `HEAD` or disturb the user's
62
- index. Capture is filter-free plumbing (`hash-object --no-filters` + `update-index --cacheinfo`),
64
+ index. Capture batches filter-free hashing and index updates,
63
65
  so repository clean filters never execute during capture, and paths the permission engine
64
66
  classifies as secrets (`.env`, key stores, credential files) are never staged into checkpoint
65
- refs. Inspect and restore them with:
67
+ refs. Restore also excludes these paths, preserving their current contents and index entries.
68
+ Inspect and restore checkpoints with:
66
69
 
67
70
  ```text
68
71
  /checkpoints
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "noah-code"
3
- version = "0.5.0"
3
+ version = "0.6.0"
4
4
  description = "Noah Code terminal coding agent, built on NVIDIA OO Agents (NOOA)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12,<3.14"
@@ -19,8 +19,8 @@ classifiers = [
19
19
  ]
20
20
 
21
21
  dependencies = [
22
- "nooa==0.0.9",
23
- "nooa-cli==0.0.9",
22
+ "nooa==0.0.10",
23
+ "nooa-cli==0.0.10",
24
24
  # LiteLLM 1.92.0-1.95.x intermittently shipped without macOS wheels,
25
25
  # forcing a Rust source build. Wheels are back for every release since
26
26
  # 1.96.0 (abi3 since 1.96.2), so the installer stays binary-only.
@@ -33,6 +33,7 @@ dependencies = [
33
33
  "packaging>=24.0,<27.0",
34
34
  "rich>=13.0.0,<16.0.0",
35
35
  "textual>=1.0.0,<9.0.0",
36
+ "tomlkit>=0.13.2,<1.0.0",
36
37
  ]
37
38
 
38
39
  [project.urls]
@@ -53,10 +54,10 @@ dev = [
53
54
  "types-pyyaml>=6.0.12.20260815",
54
55
  ]
55
56
  mcp = [
56
- "nooa[mcp]==0.0.9",
57
+ "nooa[mcp]==0.0.10",
57
58
  ]
58
59
  tracing = [
59
- "nooa[tracing]==0.0.9",
60
+ "nooa[tracing]==0.0.10",
60
61
  "opentelemetry-exporter-otlp-proto-http>=1.44.0,<2.0.0",
61
62
  ]
62
63
 
@@ -1,3 +1,3 @@
1
1
  """Noah Code: terminal coding agent on NVIDIA OO Agents."""
2
2
 
3
- __version__ = "0.5.0"
3
+ __version__ = "0.6.0"