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.
- {noah_code-0.5.1 → noah_code-0.7.0}/PKG-INFO +31 -7
- {noah_code-0.5.1 → noah_code-0.7.0}/README.md +29 -6
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/configuration.md +8 -6
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/interactive-reference.md +94 -34
- noah_code-0.7.0/docs/releases/v0.6.0.md +68 -0
- noah_code-0.7.0/docs/releases/v0.7.0.md +51 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/reliability.md +29 -4
- {noah_code-0.5.1 → noah_code-0.7.0}/pyproject.toml +2 -1
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/__init__.py +1 -1
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/agent.py +81 -9
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/checkpoints.py +118 -79
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/cli.py +61 -53
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/config.py +49 -228
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/hooks.py +33 -11
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/host.py +204 -61
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/llm.py +0 -14
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/permissions.py +55 -19
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/runtime_state.py +51 -5
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/sessions.py +3 -7
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/snapshots.py +14 -4
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/steer.py +1 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/summarization.py +17 -12
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/git_tools.py +99 -29
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/process_tools.py +37 -15
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/task_tools.py +30 -11
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/workspace_tools.py +47 -4
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/ui/textual.css +70 -2
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/ui/textual_app.py +992 -600
- noah_code-0.7.0/src/noah_code/verification.py +312 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_agent_security.py +87 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_checkpoints.py +189 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_cli.py +88 -0
- noah_code-0.7.0/tests/test_compaction_eviction.py +228 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_config.py +97 -2
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_hooks.py +64 -30
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_host.py +120 -3
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_permissions.py +46 -0
- noah_code-0.7.0/tests/test_run_exit.py +191 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_runtime_state.py +52 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_snapshots.py +37 -1
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_steer.py +1 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_task_tools.py +37 -1
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_textual_tui.py +251 -51
- noah_code-0.7.0/tests/test_tui_composer_queue.py +291 -0
- noah_code-0.7.0/tests/test_tui_editing.py +135 -0
- noah_code-0.7.0/tests/test_tui_history_dialogs.py +223 -0
- noah_code-0.7.0/tests/test_tui_layout.py +105 -0
- noah_code-0.7.0/tests/test_tui_review_receipt.py +489 -0
- noah_code-0.7.0/tests/test_verification.py +262 -0
- noah_code-0.7.0/tests/test_verification_tools.py +119 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/uv.lock +12 -1
- noah_code-0.5.1/tests/test_compaction_eviction.py +0 -136
- noah_code-0.5.1/tests/test_run_exit.py +0 -113
- {noah_code-0.5.1 → noah_code-0.7.0}/.github/workflows/ci.yml +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/.github/workflows/release.yml +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/.gitignore +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/.pre-commit-config.yaml +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/assets/noah-in-action.svg +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/assets/noah-logo.svg +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/development.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/extensions.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.1.0.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.1.1.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.2.0.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.2.1.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.2.2.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.2.3.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.2.4.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.3.0.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.4.0.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.4.1.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.5.0.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/releases/v0.5.1.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/docs/security.md +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/install.sh +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/__main__.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/agents.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/approvals.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/budget.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/commands.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/composer.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/credentials.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/custom_commands.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/event_bridge.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/events.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/github.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/llm_replies.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/macos_sandbox.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/mcp_setup.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/nooa_compat.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/predict.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/project_notes.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/providers.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/redaction.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/secure_files.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/skills_setup.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/telemetry.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/themes.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tool_output.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/__init__.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/diff_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/github_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/lsp_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/media_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/memory_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/plan_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/question_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/tools/web_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/ui/__init__.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/ui/console.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/ui/protocol.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/updates.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/usage.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/workspace.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/src/noah_code/worktree.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/conftest.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_agents.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_approvals.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_budget.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_cache_context.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_commands.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_composer.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_console_ui.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_credentials.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_custom_commands.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_diff_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_efficiency.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_event_bridge.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_event_bridge_and_shell.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_git_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_github.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_installer.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_lean_reasoning.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_llm.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_llm_replies.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_lsp_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_mcp_setup.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_nooa_migration.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_plan_memory_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_process_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_project_notes.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_prompt_scorecard.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_providers.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_question_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_redaction.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_sessions.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_skills_setup.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_summarization.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_telemetry.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_tool_output.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_updates.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_wave1_e2e.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_web_tools.py +0 -0
- {noah_code-0.5.1 → noah_code-0.7.0}/tests/test_workspace_tools.py +0 -0
- {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.
|
|
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
|
|
65
|
-
|
|
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
|
-
| `
|
|
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` |
|
|
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
|
|
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
|
|
20
|
-
|
|
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
|
-
| `
|
|
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` |
|
|
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
|
|
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
|
|
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
|
-
|
|
366
|
-
|
|
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
|
|
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` |
|
|
8
|
-
| `Shift+Enter` | Insert a newline without sending |
|
|
9
|
-
| `
|
|
10
|
-
| `
|
|
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
|
-
| `
|
|
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` |
|
|
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` |
|
|
23
|
-
| `F3` |
|
|
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
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
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
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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`
|
|
89
|
-
|
|
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`
|
|
96
|
-
finishes, including `/undo`, `/redo`, `/mode`, `/model`, `/
|
|
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.
|
|
57
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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]
|