noah-code 0.5.1__tar.gz → 0.7.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 (155) hide show
  1. {noah_code-0.5.1 → noah_code-0.7.0}/PKG-INFO +31 -7
  2. {noah_code-0.5.1 → noah_code-0.7.0}/README.md +29 -6
  3. {noah_code-0.5.1 → noah_code-0.7.0}/docs/configuration.md +8 -6
  4. {noah_code-0.5.1 → noah_code-0.7.0}/docs/interactive-reference.md +94 -34
  5. noah_code-0.7.0/docs/releases/v0.6.0.md +68 -0
  6. noah_code-0.7.0/docs/releases/v0.7.0.md +51 -0
  7. {noah_code-0.5.1 → noah_code-0.7.0}/docs/reliability.md +29 -4
  8. {noah_code-0.5.1 → noah_code-0.7.0}/pyproject.toml +2 -1
  9. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/__init__.py +1 -1
  10. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/agent.py +81 -9
  11. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/checkpoints.py +118 -79
  12. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/cli.py +61 -53
  13. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/config.py +49 -228
  14. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/hooks.py +33 -11
  15. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/host.py +204 -61
  16. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/llm.py +0 -14
  17. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/permissions.py +55 -19
  18. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/runtime_state.py +51 -5
  19. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/sessions.py +3 -7
  20. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/snapshots.py +14 -4
  21. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/steer.py +1 -0
  22. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/summarization.py +17 -12
  23. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/git_tools.py +99 -29
  24. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/process_tools.py +37 -15
  25. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/task_tools.py +30 -11
  26. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/workspace_tools.py +47 -4
  27. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/ui/textual.css +70 -2
  28. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/ui/textual_app.py +992 -600
  29. noah_code-0.7.0/src/noah_code/verification.py +312 -0
  30. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_agent_security.py +87 -0
  31. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_checkpoints.py +189 -0
  32. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_cli.py +88 -0
  33. noah_code-0.7.0/tests/test_compaction_eviction.py +228 -0
  34. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_config.py +97 -2
  35. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_hooks.py +64 -30
  36. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_host.py +120 -3
  37. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_permissions.py +46 -0
  38. noah_code-0.7.0/tests/test_run_exit.py +191 -0
  39. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_runtime_state.py +52 -0
  40. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_snapshots.py +37 -1
  41. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_steer.py +1 -0
  42. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_task_tools.py +37 -1
  43. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_textual_tui.py +251 -51
  44. noah_code-0.7.0/tests/test_tui_composer_queue.py +291 -0
  45. noah_code-0.7.0/tests/test_tui_editing.py +135 -0
  46. noah_code-0.7.0/tests/test_tui_history_dialogs.py +223 -0
  47. noah_code-0.7.0/tests/test_tui_layout.py +105 -0
  48. noah_code-0.7.0/tests/test_tui_review_receipt.py +489 -0
  49. noah_code-0.7.0/tests/test_verification.py +262 -0
  50. noah_code-0.7.0/tests/test_verification_tools.py +119 -0
  51. {noah_code-0.5.1 → noah_code-0.7.0}/uv.lock +12 -1
  52. noah_code-0.5.1/tests/test_compaction_eviction.py +0 -136
  53. noah_code-0.5.1/tests/test_run_exit.py +0 -113
  54. {noah_code-0.5.1 → noah_code-0.7.0}/.github/workflows/ci.yml +0 -0
  55. {noah_code-0.5.1 → noah_code-0.7.0}/.github/workflows/release.yml +0 -0
  56. {noah_code-0.5.1 → noah_code-0.7.0}/.gitignore +0 -0
  57. {noah_code-0.5.1 → noah_code-0.7.0}/.pre-commit-config.yaml +0 -0
  58. {noah_code-0.5.1 → noah_code-0.7.0}/docs/assets/noah-in-action.svg +0 -0
  59. {noah_code-0.5.1 → noah_code-0.7.0}/docs/assets/noah-logo.svg +0 -0
  60. {noah_code-0.5.1 → noah_code-0.7.0}/docs/development.md +0 -0
  61. {noah_code-0.5.1 → noah_code-0.7.0}/docs/extensions.md +0 -0
  62. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.1.0.md +0 -0
  63. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.1.1.md +0 -0
  64. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.2.0.md +0 -0
  65. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.2.1.md +0 -0
  66. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.2.2.md +0 -0
  67. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.2.3.md +0 -0
  68. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.2.4.md +0 -0
  69. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.3.0.md +0 -0
  70. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.4.0.md +0 -0
  71. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.4.1.md +0 -0
  72. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.5.0.md +0 -0
  73. {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.5.1.md +0 -0
  74. {noah_code-0.5.1 → noah_code-0.7.0}/docs/security.md +0 -0
  75. {noah_code-0.5.1 → noah_code-0.7.0}/install.sh +0 -0
  76. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/__main__.py +0 -0
  77. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/agents.py +0 -0
  78. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/approvals.py +0 -0
  79. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/budget.py +0 -0
  80. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/commands.py +0 -0
  81. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/composer.py +0 -0
  82. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/credentials.py +0 -0
  83. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/custom_commands.py +0 -0
  84. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/event_bridge.py +0 -0
  85. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/events.py +0 -0
  86. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/github.py +0 -0
  87. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/llm_replies.py +0 -0
  88. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/macos_sandbox.py +0 -0
  89. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/mcp_setup.py +0 -0
  90. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/nooa_compat.py +0 -0
  91. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/predict.py +0 -0
  92. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/project_notes.py +0 -0
  93. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/providers.py +0 -0
  94. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/redaction.py +0 -0
  95. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/secure_files.py +0 -0
  96. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/skills_setup.py +0 -0
  97. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/telemetry.py +0 -0
  98. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/themes.py +0 -0
  99. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tool_output.py +0 -0
  100. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/__init__.py +0 -0
  101. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/diff_tools.py +0 -0
  102. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/github_tools.py +0 -0
  103. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/lsp_tools.py +0 -0
  104. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/media_tools.py +0 -0
  105. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/memory_tools.py +0 -0
  106. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/plan_tools.py +0 -0
  107. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/question_tools.py +0 -0
  108. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/web_tools.py +0 -0
  109. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/ui/__init__.py +0 -0
  110. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/ui/console.py +0 -0
  111. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/ui/protocol.py +0 -0
  112. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/updates.py +0 -0
  113. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/usage.py +0 -0
  114. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/workspace.py +0 -0
  115. {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/worktree.py +0 -0
  116. {noah_code-0.5.1 → noah_code-0.7.0}/tests/conftest.py +0 -0
  117. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_agents.py +0 -0
  118. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_approvals.py +0 -0
  119. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_budget.py +0 -0
  120. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_cache_context.py +0 -0
  121. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_commands.py +0 -0
  122. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_composer.py +0 -0
  123. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_console_ui.py +0 -0
  124. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_credentials.py +0 -0
  125. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_custom_commands.py +0 -0
  126. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_diff_tools.py +0 -0
  127. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_efficiency.py +0 -0
  128. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_event_bridge.py +0 -0
  129. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_event_bridge_and_shell.py +0 -0
  130. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_git_tools.py +0 -0
  131. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_github.py +0 -0
  132. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_installer.py +0 -0
  133. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_lean_reasoning.py +0 -0
  134. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_llm.py +0 -0
  135. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_llm_replies.py +0 -0
  136. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_lsp_tools.py +0 -0
  137. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_mcp_setup.py +0 -0
  138. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_nooa_migration.py +0 -0
  139. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_plan_memory_tools.py +0 -0
  140. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_process_tools.py +0 -0
  141. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_project_notes.py +0 -0
  142. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_prompt_scorecard.py +0 -0
  143. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_providers.py +0 -0
  144. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_question_tools.py +0 -0
  145. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_redaction.py +0 -0
  146. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_sessions.py +0 -0
  147. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_skills_setup.py +0 -0
  148. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_summarization.py +0 -0
  149. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_telemetry.py +0 -0
  150. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_tool_output.py +0 -0
  151. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_updates.py +0 -0
  152. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_wave1_e2e.py +0 -0
  153. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_web_tools.py +0 -0
  154. {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_workspace_tools.py +0 -0
  155. {noah_code-0.5.1 → noah_code-0.7.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.1
3
+ Version: 0.7.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
@@ -28,6 +28,7 @@ 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'
@@ -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.
@@ -136,6 +137,9 @@ noah --mode plan .
136
137
  # Run one task and exit
137
138
  noah run "Explain how authentication is wired" .
138
139
 
140
+ # Emit one structured result on stdout (progress goes to stderr)
141
+ noah run --json "Fix the failing unit test" .
142
+
139
143
  # Allow actions that would normally ask; explicit deny rules still apply
140
144
  noah run --auto "Fix the failing unit test" .
141
145
 
@@ -147,6 +151,13 @@ noah --session SESSION_ID .
147
151
  noah --console .
148
152
  ```
149
153
 
154
+ `run --json` reports `status` (`completed`, `needs_input`, `failed`, or `cancelled`),
155
+ `exit_code`, `explanation`, `session_id`, `run_id`, session `usage`, and recorded `checks`.
156
+ Check `status` when automating: a request for input keeps the existing exit code 0,
157
+ but its status is `needs_input`. Check results are separate from task completion;
158
+ an empty list means no checks were recorded. Errors keep nonzero exit codes and
159
+ Ctrl+C returns 130. Delegated agents also retain `needs_input` in the work ledger.
160
+
150
161
  Check the installation and resolved configuration with:
151
162
 
152
163
  ```bash
@@ -166,20 +177,33 @@ Type `/` to search the full command and configuration reference. The most common
166
177
  | Control | Action |
167
178
  | --- | --- |
168
179
  | `Enter` | Send the current prompt or accept a selected suggestion |
169
- | `Shift+Enter` | Insert a newline |
180
+ | `Shift+Enter` / `Ctrl+J` | Insert a newline |
181
+ | `Alt+Enter` | Expand or collapse the composer |
182
+ | `Alt+Z` | Restore a displaced draft |
183
+ | Click / arrows in the prompt | Position the editing cursor |
184
+ | `Ctrl+A` / `Ctrl+X` / `Ctrl+V` | Select all / cut / paste prompt text |
185
+ | `Ctrl+Z` / `Ctrl+Y` | Undo / redo prompt edits |
186
+ | `Ctrl+Home` / `Ctrl+End` | Jump to the beginning / end of the prompt; Shift selects |
170
187
  | Drag, then `Cmd+C` / `Ctrl+Shift+C` | Select and copy TUI text |
171
188
  | `Ctrl+Shift+C` with no selection | Copy the latest Noah reply |
172
189
  | `Ctrl+G` | Open the searchable skills picker |
190
+ | `Ctrl+P` | Search and run slash commands |
173
191
  | `Ctrl+L` | Open the model picker |
174
192
  | `Ctrl+R` | Search and recall a prior prompt |
175
193
  | `Ctrl+T` | Expand or collapse live tool output |
176
- | `Shift+Tab` | Open the reasoning-effort picker |
194
+ | `Alt+E` | Open the reasoning-effort picker |
177
195
  | `Alt+Up` | Recall the newest queued prompt for editing |
178
196
  | `Ctrl+]` | Return to live transcript output |
179
- | `Tab` | Switch between build and plan mode |
197
+ | `Tab` / `Shift+Tab` | Navigate focus; Tab completes suggestions |
198
+ | `Enter` or click a command | Run the selected slash command or open its picker; required arguments stay editable |
199
+ | `Ctrl+B` | Switch between build and plan mode |
200
+ | `Ctrl+D` | Review changes while working or idle |
201
+ | `Ctrl+C` | Stop the current run and pause queued follow-ups |
180
202
  | `F2` | Open execution activity |
181
203
  | `F3` | Open paginated conversation history |
182
204
  | `F4` | Open the live agent, terminal, and job ledger |
205
+ | `F5` | Edit, reorder, resume, or discard queued follow-ups |
206
+ | `F8` | Show or hide the sidebar |
183
207
  | `Shift+F7` | Focus or leave the scrollable context rail |
184
208
  | `/model` | Configure a provider or switch the session model |
185
209
  | `/theme` | Choose Atom One Dark, Noah Ocean, Graphite, or High Contrast |
@@ -247,7 +271,7 @@ are configured under `[reliability.retries]`.
247
271
  ## Updates
248
272
 
249
273
  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
274
+ banner when an update is available, with `F6` opening its details. Installation
251
275
  remains explicit by default:
252
276
 
253
277
  ```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.
@@ -91,6 +91,9 @@ noah --mode plan .
91
91
  # Run one task and exit
92
92
  noah run "Explain how authentication is wired" .
93
93
 
94
+ # Emit one structured result on stdout (progress goes to stderr)
95
+ noah run --json "Fix the failing unit test" .
96
+
94
97
  # Allow actions that would normally ask; explicit deny rules still apply
95
98
  noah run --auto "Fix the failing unit test" .
96
99
 
@@ -102,6 +105,13 @@ noah --session SESSION_ID .
102
105
  noah --console .
103
106
  ```
104
107
 
108
+ `run --json` reports `status` (`completed`, `needs_input`, `failed`, or `cancelled`),
109
+ `exit_code`, `explanation`, `session_id`, `run_id`, session `usage`, and recorded `checks`.
110
+ Check `status` when automating: a request for input keeps the existing exit code 0,
111
+ but its status is `needs_input`. Check results are separate from task completion;
112
+ an empty list means no checks were recorded. Errors keep nonzero exit codes and
113
+ Ctrl+C returns 130. Delegated agents also retain `needs_input` in the work ledger.
114
+
105
115
  Check the installation and resolved configuration with:
106
116
 
107
117
  ```bash
@@ -121,20 +131,33 @@ Type `/` to search the full command and configuration reference. The most common
121
131
  | Control | Action |
122
132
  | --- | --- |
123
133
  | `Enter` | Send the current prompt or accept a selected suggestion |
124
- | `Shift+Enter` | Insert a newline |
134
+ | `Shift+Enter` / `Ctrl+J` | Insert a newline |
135
+ | `Alt+Enter` | Expand or collapse the composer |
136
+ | `Alt+Z` | Restore a displaced draft |
137
+ | Click / arrows in the prompt | Position the editing cursor |
138
+ | `Ctrl+A` / `Ctrl+X` / `Ctrl+V` | Select all / cut / paste prompt text |
139
+ | `Ctrl+Z` / `Ctrl+Y` | Undo / redo prompt edits |
140
+ | `Ctrl+Home` / `Ctrl+End` | Jump to the beginning / end of the prompt; Shift selects |
125
141
  | Drag, then `Cmd+C` / `Ctrl+Shift+C` | Select and copy TUI text |
126
142
  | `Ctrl+Shift+C` with no selection | Copy the latest Noah reply |
127
143
  | `Ctrl+G` | Open the searchable skills picker |
144
+ | `Ctrl+P` | Search and run slash commands |
128
145
  | `Ctrl+L` | Open the model picker |
129
146
  | `Ctrl+R` | Search and recall a prior prompt |
130
147
  | `Ctrl+T` | Expand or collapse live tool output |
131
- | `Shift+Tab` | Open the reasoning-effort picker |
148
+ | `Alt+E` | Open the reasoning-effort picker |
132
149
  | `Alt+Up` | Recall the newest queued prompt for editing |
133
150
  | `Ctrl+]` | Return to live transcript output |
134
- | `Tab` | Switch between build and plan mode |
151
+ | `Tab` / `Shift+Tab` | Navigate focus; Tab completes suggestions |
152
+ | `Enter` or click a command | Run the selected slash command or open its picker; required arguments stay editable |
153
+ | `Ctrl+B` | Switch between build and plan mode |
154
+ | `Ctrl+D` | Review changes while working or idle |
155
+ | `Ctrl+C` | Stop the current run and pause queued follow-ups |
135
156
  | `F2` | Open execution activity |
136
157
  | `F3` | Open paginated conversation history |
137
158
  | `F4` | Open the live agent, terminal, and job ledger |
159
+ | `F5` | Edit, reorder, resume, or discard queued follow-ups |
160
+ | `F8` | Show or hide the sidebar |
138
161
  | `Shift+F7` | Focus or leave the scrollable context rail |
139
162
  | `/model` | Configure a provider or switch the session model |
140
163
  | `/theme` | Choose Atom One Dark, Noah Ocean, Graphite, or High Contrast |
@@ -202,7 +225,7 @@ are configured under `[reliability.retries]`.
202
225
  ## Updates
203
226
 
204
227
  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
228
+ banner when an update is available, with `F6` opening its details. Installation
206
229
  remains explicit by default:
207
230
 
208
231
  ```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
 
@@ -4,60 +4,78 @@
4
4
 
5
5
  | Key | Action |
6
6
  |-----|--------|
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 |
10
- | `Ctrl+P` | Open the command palette |
7
+ | `Enter` | Run the highlighted command, send the current message, or queue a follow-up while a turn is running |
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 |
13
+ | `Ctrl+P` | Search and run slash commands |
11
14
  | `Ctrl+G` | Open the searchable skills picker |
12
15
  | `Ctrl+L` | Open the model picker |
13
16
  | `Ctrl+O` | Open the session picker |
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
48
- continuously. Use `Up`/`Down` to highlight a command, `Enter` or `Tab` to complete it, and `Esc` to
49
- close the list. Press `Enter` again to run the completed command. Typing `/config` expands the list
50
- to every resolved configuration path and its current redacted value.
60
+ continuously. Use `Up`/`Down` to highlight a command, then press `Enter` or click once to run it
61
+ or open its picker. `Tab` completes the command for editing, and `Esc` closes the list. Commands
62
+ requiring arguments and file mentions remain editable. Typing `/config` expands the list to every
63
+ resolved configuration path and its current redacted value. `Ctrl+P` offers the same single-action
64
+ selection in a searchable command picker.
51
65
 
52
66
  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.
67
+ the composer without sending it and saves the displaced draft for `Alt+Z`. Palette choices
68
+ use the same draft protection; skill selections insert at the cursor. Pressing `Esc` leaves
69
+ the current draft unchanged. Commands blocked while busy remain editable.
70
+
71
+ Until a session has its first user prompt, the main pane keeps the Noah wordmark centered.
72
+ The sidebar scrolls when needed; press Tab to focus it or use `Shift+F7`, then arrows,
73
+ Page Up/Down, Home, or End. Git status is collected in a background worker at startup and
74
+ turn boundaries, and every five seconds while working with the sidebar visible. Existing
75
+ sessions restore their recent transcript. F3 preserves reading position when older pages
76
+ load; its search covers the messages loaded so far. F2 searches captured action labels,
77
+ commands, results, and output. Failed tool attempts remain visible in the conversation
78
+ with an F2 details hint.
61
79
 
62
80
  Drag across transcript, activity, diff, or history text to select it. `Cmd+C` on macOS or
63
81
  `Ctrl+Shift+C` in other terminals copies the selection; when there is no selection, the same
@@ -72,6 +90,28 @@ Inside the composer, `Cmd+C`/`Ctrl+C` copies the composer's
72
90
  own selection; `Ctrl+C` with no composer selection keeps its cancel-turn behavior. Selection uses a
73
91
  high-contrast highlight in every Noah theme.
74
92
 
93
+ The prompt input supports mouse placement, drag selection, and normal text editing:
94
+
95
+ | Prompt control | Action |
96
+ | --- | --- |
97
+ | Click / arrow keys | Place or move the cursor within the prompt |
98
+ | `Shift` + arrow keys | Extend a selection |
99
+ | `Ctrl+A` / `Cmd+A` | Select the entire prompt |
100
+ | `Ctrl+X` / `Cmd+X` | Cut selected text; with no selection, cut the current line |
101
+ | `Ctrl+C` / `Cmd+C` | Copy selected prompt text |
102
+ | `Ctrl+V` / `Cmd+V` | Paste, replacing the selected text |
103
+ | `Ctrl+Z` / `Ctrl+Y` | Undo / redo prompt edits |
104
+ | `Home` / `End` | Move to the beginning / end of the current line |
105
+ | `Ctrl+Home` / `Ctrl+End` | Move to the beginning / end of the entire prompt |
106
+ | `Ctrl+Shift+Home` / `Ctrl+Shift+End` | Select to the beginning / end of the entire prompt |
107
+ | `Ctrl+Left` / `Ctrl+Right` | Move by word; hold Shift to select |
108
+ | `Alt+Enter` | Expand the prompt for longer edits |
109
+
110
+ `Ctrl+A` now selects all; use `Home` for the former line-start behavior. Prompt undo is
111
+ separate from `/undo`, which reverts workspace edits. A paste waits for an in-progress
112
+ cut/copy to reach the clipboard; if the draft, selection, focus, or session changes while
113
+ the clipboard is being read, that paste is cancelled to protect the newer input.
114
+
75
115
  ### Mid-turn follow-ups
76
116
 
77
117
  While Noah is working, the composer stays open. `Enter` queues the current text instead of starting
@@ -85,15 +125,18 @@ The queue holds at most 100 items. A 101st `Enter` drops the oldest and status-p
85
125
  `steer dropped oldest`. `@path` mentions and `/attach` paths expand when the item is injected, not
86
126
  when it is queued. A follow-up that names files Noah cannot resolve is dropped; later items stay.
87
127
  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.
128
+ not lose them. `Ctrl+C` stops the current turn and pauses delivery, keeping queued prompts
129
+ and pending attachments. Pause state, order, and attachments survive reopening the session.
130
+ F5 lets you edit a selected prompt, resume delivery with R, or explicitly discard everything
131
+ with X. Switching or starting a session clears the active queue; durable state belongs to
132
+ its originating session.
90
133
 
91
134
  Approval and `ask.question` modals keep the composer. Queueing resumes after the modal closes.
92
135
 
93
136
  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`,
137
+ `/health`, `/help`, `/trace`, `/work`, `/diff`, and `/terminals`. `/attach PATH` remembers the file for the next queued follow-up.
138
+ `/exit` stops the turn and leaves with queued input preserved. Mutating commands wait until the turn
139
+ finishes, including `/undo`, `/redo`, `/mode`, `/model`, `/new`, `/sessions`, `/worktree`,
97
140
  `/pr`, `/plan`, `/memory`, and `/compact`.
98
141
 
99
142
  Tool and shell output is batched into a live execution panel instead of forcing one full-screen
@@ -104,6 +147,23 @@ Consecutive reads or writes merge into a single line (`✓ Read a.py, b.py +1`)
104
147
  compact. `F2` retains the latest 100 activity records, bounded by the configured
105
148
  `max_output_chars` per activity.
106
149
 
150
+
151
+ ### Reviewing results
152
+
153
+ `Ctrl+D` or `/diff` opens the changed-file list first. Patches and editor diagnostics load
154
+ when selected, with separate capture timestamps; Ctrl+R refreshes the list. Review is
155
+ available during a run, with revert and undo disabled until work is idle. Type `/` to
156
+ filter filenames, J/K to change files, N/P to move between hunks, V to toggle editor
157
+ diagnostics, and O to open the selected
158
+ file using `$VISUAL` or `$EDITOR` (falling back to `vi`). Large patch previews explicitly
159
+ state when truncated. Editor diagnostics describe the current worktree, including when
160
+ viewing staged changes.
161
+
162
+ Completion receipts show recorded check commands and their actual exit statuses, separate
163
+ from editor diagnostics. They include observable changed-file counts and advertise journal
164
+ undo only when its preflight succeeds. When results are unavailable, the receipt says so;
165
+ compound shell expressions are not treated as individual passing test commands.
166
+
107
167
  ## Built-in slash commands
108
168
 
109
169
  | Command | Purpose |
@@ -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
@@ -0,0 +1,51 @@
1
+ # Noah Code v0.7.0
2
+
3
+ Slash commands now run with one Enter or click. Check results are shared across agents and
4
+ background jobs, and headless runs expose structured outcomes for automation.
5
+
6
+ ## Commands and editing
7
+
8
+ - Enter or a single click runs the highlighted slash command or opens its picker. Tab completes
9
+ the command for editing; required arguments and file mentions remain editable.
10
+ - Ctrl+P opens Noah's command picker and runs the selected command immediately. Displaced drafts
11
+ remain available through Alt+Z, and typed command arguments are preserved.
12
+ - Prompt editing and clipboard handling are more reliable, including selection and paste behavior.
13
+
14
+ ## Shared verification
15
+
16
+ - Foreground checks, streamed commands, subagents, background jobs, and terminal commands use a
17
+ shared session ledger. Records include the command, source, exit code, execution directory when
18
+ known, and workspace fingerprints before and after execution.
19
+ - Receipts mark results stale when workspace files change during or after a check. Interrupted
20
+ checks remain incomplete, and unavailable workspace fingerprints are reported as unknown.
21
+ - Agents can inspect the same evidence with `await self.ws.checks()`. Records survive session
22
+ reopening and are included in JSON outcomes. Headless outcomes refresh after process cleanup.
23
+ - Workspace fingerprints use file metadata. Ignored untracked artifacts, external dependencies,
24
+ and metadata-preserving changes are outside their scope. Compound shell commands are not
25
+ credited as individual checks.
26
+
27
+ ## Task outcomes
28
+
29
+ - Subagents requesting input retain a distinct `needs_input` state. The interface reports
30
+ "Input needed" instead of showing a completed turn.
31
+ - `noah run --json` emits one result on stdout and sends progress to stderr. The result includes
32
+ `status`, `exit_code`, `explanation`, `session_id`, `run_id`, session `usage`, and `checks`.
33
+ - Status distinguishes `completed`, `needs_input`, `failed`, and `cancelled`. Existing exit codes
34
+ remain compatible: both completion and waiting for input return zero, so automation should
35
+ inspect `status`. Task completion is separate from passing checks.
36
+ - Headless follow-ups using `--session` continue the waiting run. Invalid agent stop reasons
37
+ and persistence failures are reported as failures.
38
+
39
+ ## Upgrade
40
+
41
+ ```bash
42
+ noah update
43
+ ```
44
+
45
+ Example structured run:
46
+
47
+ ```bash
48
+ noah run --json "Fix the failing unit test" .
49
+ ```
50
+
51
+ **Full changelog:** https://github.com/skundu42/noah-code/compare/v0.6.0...v0.7.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
@@ -139,6 +142,28 @@ unbounded growth. Delete sessions that are no longer needed with `noah sessions
139
142
 
140
143
  ## Observability
141
144
 
145
+ ### Verification evidence
146
+
147
+ Foreground and streamed check commands, subagents, background jobs, and persistent-terminal
148
+ commands share a bounded verification ledger. The agent can inspect it with
149
+ `await self.ws.checks()`. Each record includes the observed exit code, command, source, execution
150
+ directory when known, and workspace fingerprints before and after execution. Records persist with
151
+ the session and are included in `noah run --json` results.
152
+
153
+ Turn receipts recompute check status against the current workspace. A check becomes `stale` if
154
+ files changed during or after its execution; missing fingerprints produce `unknown`, and an
155
+ interrupted check is `incomplete`. A successful rerun supersedes the earlier attempt in the receipt.
156
+ Completion and verification are separate: `completed` means the agent finished its turn, while
157
+ the check records show the evidence available for its changes.
158
+
159
+ Fingerprints use file metadata and symlink targets without reading file contents. In Git checkouts
160
+ they cover tracked files and non-ignored untracked files; outside Git, common cache, build, and
161
+ vendor directories are excluded. Ignored artifacts, external dependencies, and metadata-preserving
162
+ edits are outside this check. Commands containing shell chaining, redirection, or expansion are
163
+ not credited as individual checks because their exit code cannot establish each check's result.
164
+
165
+ ### Runtime status
166
+
142
167
  Use `/health` during idle or active work. It reports runtime database and artifact sizes, pending
143
168
  inbox items and interactions, live jobs, retained runtime events, and the current non-terminal run.
144
169
  Use `/status` for workspace/session state, `/tokens` for model and cache usage, `F2` for activity,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "noah-code"
3
- version = "0.5.1"
3
+ version = "0.7.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"
@@ -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]
@@ -1,3 +1,3 @@
1
1
  """Noah Code: terminal coding agent on NVIDIA OO Agents."""
2
2
 
3
- __version__ = "0.5.1"
3
+ __version__ = "0.7.0"