noah-code 0.1.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.1.0/.github/workflows/ci.yml +92 -0
- noah_code-0.1.0/.github/workflows/release.yml +127 -0
- noah_code-0.1.0/.gitignore +13 -0
- noah_code-0.1.0/PKG-INFO +173 -0
- noah_code-0.1.0/README.md +131 -0
- noah_code-0.1.0/docs/configuration.md +126 -0
- noah_code-0.1.0/docs/development.md +45 -0
- noah_code-0.1.0/docs/extensions.md +58 -0
- noah_code-0.1.0/docs/interactive-reference.md +55 -0
- noah_code-0.1.0/docs/security.md +36 -0
- noah_code-0.1.0/install.sh +79 -0
- noah_code-0.1.0/pyproject.toml +90 -0
- noah_code-0.1.0/src/noah_code/__init__.py +3 -0
- noah_code-0.1.0/src/noah_code/__main__.py +6 -0
- noah_code-0.1.0/src/noah_code/agent.py +378 -0
- noah_code-0.1.0/src/noah_code/approvals.py +105 -0
- noah_code-0.1.0/src/noah_code/cli.py +422 -0
- noah_code-0.1.0/src/noah_code/commands.py +70 -0
- noah_code-0.1.0/src/noah_code/config.py +279 -0
- noah_code-0.1.0/src/noah_code/custom_commands.py +103 -0
- noah_code-0.1.0/src/noah_code/event_bridge.py +132 -0
- noah_code-0.1.0/src/noah_code/events.py +27 -0
- noah_code-0.1.0/src/noah_code/host.py +662 -0
- noah_code-0.1.0/src/noah_code/macos_sandbox.py +142 -0
- noah_code-0.1.0/src/noah_code/mcp_setup.py +91 -0
- noah_code-0.1.0/src/noah_code/permissions.py +400 -0
- noah_code-0.1.0/src/noah_code/sessions.py +157 -0
- noah_code-0.1.0/src/noah_code/skills_setup.py +51 -0
- noah_code-0.1.0/src/noah_code/snapshots.py +313 -0
- noah_code-0.1.0/src/noah_code/tools/__init__.py +6 -0
- noah_code-0.1.0/src/noah_code/tools/git_tools.py +44 -0
- noah_code-0.1.0/src/noah_code/tools/workspace_tools.py +269 -0
- noah_code-0.1.0/src/noah_code/ui/__init__.py +6 -0
- noah_code-0.1.0/src/noah_code/ui/console.py +88 -0
- noah_code-0.1.0/src/noah_code/ui/protocol.py +33 -0
- noah_code-0.1.0/src/noah_code/ui/textual.css +9 -0
- noah_code-0.1.0/src/noah_code/ui/textual_app.py +435 -0
- noah_code-0.1.0/src/noah_code/updates.py +184 -0
- noah_code-0.1.0/src/noah_code/workspace.py +49 -0
- noah_code-0.1.0/tests/test_agent_security.py +88 -0
- noah_code-0.1.0/tests/test_cli.py +64 -0
- noah_code-0.1.0/tests/test_config.py +58 -0
- noah_code-0.1.0/tests/test_custom_commands.py +50 -0
- noah_code-0.1.0/tests/test_event_bridge_and_shell.py +65 -0
- noah_code-0.1.0/tests/test_host.py +113 -0
- noah_code-0.1.0/tests/test_installer.py +40 -0
- noah_code-0.1.0/tests/test_permissions.py +70 -0
- noah_code-0.1.0/tests/test_run_exit.py +57 -0
- noah_code-0.1.0/tests/test_sessions.py +82 -0
- noah_code-0.1.0/tests/test_snapshots.py +99 -0
- noah_code-0.1.0/tests/test_summarization.py +35 -0
- noah_code-0.1.0/tests/test_textual_tui.py +93 -0
- noah_code-0.1.0/tests/test_updates.py +82 -0
- noah_code-0.1.0/tests/test_workspace_tools.py +145 -0
- noah_code-0.1.0/uv.lock +1722 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches:
|
|
7
|
+
- main
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
quality:
|
|
14
|
+
name: Python ${{ matrix.python-version }} quality
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
strategy:
|
|
17
|
+
fail-fast: false
|
|
18
|
+
matrix:
|
|
19
|
+
python-version:
|
|
20
|
+
- "3.12"
|
|
21
|
+
- "3.13"
|
|
22
|
+
steps:
|
|
23
|
+
- name: Check out source
|
|
24
|
+
uses: actions/checkout@v7
|
|
25
|
+
with:
|
|
26
|
+
persist-credentials: false
|
|
27
|
+
|
|
28
|
+
- name: Install uv and Python
|
|
29
|
+
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
30
|
+
with:
|
|
31
|
+
enable-cache: true
|
|
32
|
+
python-version: ${{ matrix.python-version }}
|
|
33
|
+
|
|
34
|
+
- name: Install locked dependencies
|
|
35
|
+
run: uv sync --locked --all-extras --dev
|
|
36
|
+
|
|
37
|
+
- name: Check lock file
|
|
38
|
+
run: uv lock --check
|
|
39
|
+
|
|
40
|
+
- name: Lint
|
|
41
|
+
run: uv run ruff check src tests
|
|
42
|
+
|
|
43
|
+
- name: Test
|
|
44
|
+
run: uv run pytest tests
|
|
45
|
+
|
|
46
|
+
- name: Build distributions
|
|
47
|
+
run: uv build --out-dir build-dist
|
|
48
|
+
|
|
49
|
+
platform:
|
|
50
|
+
name: ${{ matrix.name }} smoke test
|
|
51
|
+
runs-on: ${{ matrix.runner }}
|
|
52
|
+
strategy:
|
|
53
|
+
fail-fast: false
|
|
54
|
+
matrix:
|
|
55
|
+
include:
|
|
56
|
+
- name: Linux x86_64
|
|
57
|
+
runner: ubuntu-latest
|
|
58
|
+
- name: Linux arm64
|
|
59
|
+
runner: ubuntu-24.04-arm
|
|
60
|
+
- name: macOS arm64
|
|
61
|
+
runner: macos-15
|
|
62
|
+
- name: macOS x86_64
|
|
63
|
+
runner: macos-15-intel
|
|
64
|
+
steps:
|
|
65
|
+
- name: Check out source
|
|
66
|
+
uses: actions/checkout@v7
|
|
67
|
+
with:
|
|
68
|
+
persist-credentials: false
|
|
69
|
+
|
|
70
|
+
- name: Install uv and Python
|
|
71
|
+
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
72
|
+
with:
|
|
73
|
+
enable-cache: true
|
|
74
|
+
python-version: "3.12"
|
|
75
|
+
|
|
76
|
+
- name: Install locked dependencies
|
|
77
|
+
run: uv sync --locked --all-extras --dev
|
|
78
|
+
|
|
79
|
+
- name: Run tests
|
|
80
|
+
run: uv run pytest tests
|
|
81
|
+
|
|
82
|
+
- name: Verify command entry point
|
|
83
|
+
run: uv run noah --version
|
|
84
|
+
|
|
85
|
+
- name: Verify binary-only public installation
|
|
86
|
+
env:
|
|
87
|
+
UV_TOOL_DIR: ${{ runner.temp }}/noah-tools
|
|
88
|
+
UV_TOOL_BIN_DIR: ${{ runner.temp }}/noah-bin
|
|
89
|
+
run: |
|
|
90
|
+
uv build --out-dir smoke-dist
|
|
91
|
+
uv tool install --managed-python --python 3.12 --no-build --with 'nooa[mcp,tracing]==0.0.8' smoke-dist/*.whl
|
|
92
|
+
"${UV_TOOL_BIN_DIR}/noah" --version
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
name: Build and verify distributions
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- name: Check out tagged source
|
|
17
|
+
uses: actions/checkout@v7
|
|
18
|
+
with:
|
|
19
|
+
persist-credentials: false
|
|
20
|
+
|
|
21
|
+
- name: Install uv and Python
|
|
22
|
+
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
23
|
+
with:
|
|
24
|
+
enable-cache: true
|
|
25
|
+
python-version: "3.13"
|
|
26
|
+
|
|
27
|
+
- name: Verify tag and package versions
|
|
28
|
+
env:
|
|
29
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
30
|
+
run: |
|
|
31
|
+
python - <<'PY'
|
|
32
|
+
import os
|
|
33
|
+
import pathlib
|
|
34
|
+
import tomllib
|
|
35
|
+
|
|
36
|
+
tag_version = os.environ["RELEASE_TAG"].removeprefix("v")
|
|
37
|
+
project_version = tomllib.loads(pathlib.Path("pyproject.toml").read_text())["project"]["version"]
|
|
38
|
+
namespace = {}
|
|
39
|
+
exec(pathlib.Path("src/noah_code/__init__.py").read_text(), namespace)
|
|
40
|
+
package_version = namespace["__version__"]
|
|
41
|
+
if tag_version != project_version or tag_version != package_version:
|
|
42
|
+
raise SystemExit(
|
|
43
|
+
f"version mismatch: tag={tag_version}, project={project_version}, package={package_version}"
|
|
44
|
+
)
|
|
45
|
+
PY
|
|
46
|
+
|
|
47
|
+
- name: Install locked dependencies
|
|
48
|
+
run: uv sync --locked --all-extras --dev
|
|
49
|
+
|
|
50
|
+
- name: Run release checks
|
|
51
|
+
run: |
|
|
52
|
+
uv run ruff check src tests
|
|
53
|
+
uv run pytest tests
|
|
54
|
+
uv lock --check
|
|
55
|
+
|
|
56
|
+
- name: Build wheel and source distribution
|
|
57
|
+
run: uv build
|
|
58
|
+
|
|
59
|
+
- name: Validate package metadata
|
|
60
|
+
run: uvx twine check dist/*
|
|
61
|
+
|
|
62
|
+
- name: Verify binary-only public installation
|
|
63
|
+
env:
|
|
64
|
+
UV_TOOL_DIR: ${{ runner.temp }}/noah-tools
|
|
65
|
+
UV_TOOL_BIN_DIR: ${{ runner.temp }}/noah-bin
|
|
66
|
+
run: |
|
|
67
|
+
uv tool install --managed-python --python 3.12 --no-build --with 'nooa[mcp,tracing]==0.0.8' dist/*.whl
|
|
68
|
+
"${UV_TOOL_BIN_DIR}/noah" --version
|
|
69
|
+
|
|
70
|
+
- name: Upload release distributions
|
|
71
|
+
uses: actions/upload-artifact@v5
|
|
72
|
+
with:
|
|
73
|
+
name: python-package-distributions
|
|
74
|
+
path: dist/
|
|
75
|
+
if-no-files-found: error
|
|
76
|
+
retention-days: 7
|
|
77
|
+
|
|
78
|
+
publish-pypi:
|
|
79
|
+
name: Publish to PyPI
|
|
80
|
+
needs: build
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
environment:
|
|
83
|
+
name: pypi
|
|
84
|
+
url: https://pypi.org/p/noah-code
|
|
85
|
+
permissions:
|
|
86
|
+
id-token: write
|
|
87
|
+
steps:
|
|
88
|
+
- name: Download release distributions
|
|
89
|
+
uses: actions/download-artifact@v6
|
|
90
|
+
with:
|
|
91
|
+
name: python-package-distributions
|
|
92
|
+
path: dist
|
|
93
|
+
|
|
94
|
+
- name: Publish with PyPI Trusted Publishing
|
|
95
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
96
|
+
|
|
97
|
+
github-release:
|
|
98
|
+
name: Create GitHub release
|
|
99
|
+
needs:
|
|
100
|
+
- build
|
|
101
|
+
- publish-pypi
|
|
102
|
+
runs-on: ubuntu-latest
|
|
103
|
+
permissions:
|
|
104
|
+
contents: write
|
|
105
|
+
id-token: write
|
|
106
|
+
attestations: write
|
|
107
|
+
steps:
|
|
108
|
+
- name: Download release distributions
|
|
109
|
+
uses: actions/download-artifact@v6
|
|
110
|
+
with:
|
|
111
|
+
name: python-package-distributions
|
|
112
|
+
path: dist
|
|
113
|
+
|
|
114
|
+
- name: Generate checksums
|
|
115
|
+
working-directory: dist
|
|
116
|
+
run: sha256sum * > SHA256SUMS
|
|
117
|
+
|
|
118
|
+
- name: Attest release artifacts
|
|
119
|
+
uses: actions/attest@v4
|
|
120
|
+
with:
|
|
121
|
+
subject-path: dist/*
|
|
122
|
+
|
|
123
|
+
- name: Create release and upload assets
|
|
124
|
+
env:
|
|
125
|
+
GH_TOKEN: ${{ github.token }}
|
|
126
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
127
|
+
run: gh release create "$RELEASE_TAG" dist/* --verify-tag --generate-notes --title "$RELEASE_TAG"
|
noah_code-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: noah-code
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Noah Code terminal coding agent, built on NVIDIA OO Agents (NOOA)
|
|
5
|
+
Project-URL: Homepage, https://github.com/skundu42/noah-code
|
|
6
|
+
Project-URL: Documentation, https://github.com/skundu42/noah-code#readme
|
|
7
|
+
Project-URL: Repository, https://github.com/skundu42/noah-code.git
|
|
8
|
+
Project-URL: Issues, https://github.com/skundu42/noah-code/issues
|
|
9
|
+
Project-URL: Releases, https://github.com/skundu42/noah-code/releases
|
|
10
|
+
Author: noah-code contributors
|
|
11
|
+
License: Apache-2.0
|
|
12
|
+
Keywords: agents,coding,nooa,terminal
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
17
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Software Development
|
|
21
|
+
Requires-Python: <3.14,>=3.12
|
|
22
|
+
Requires-Dist: click>=8.1.0
|
|
23
|
+
Requires-Dist: litellm<1.92.0,>=1.84.0
|
|
24
|
+
Requires-Dist: nooa-cli==0.0.8
|
|
25
|
+
Requires-Dist: nooa==0.0.8
|
|
26
|
+
Requires-Dist: packaging>=24.0
|
|
27
|
+
Requires-Dist: pydantic>=2.5.0
|
|
28
|
+
Requires-Dist: rich>=13.0.0
|
|
29
|
+
Requires-Dist: textual>=1.0.0
|
|
30
|
+
Requires-Dist: tomli>=2.0.0; python_version < '3.11'
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: pytest-asyncio>=0.24.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: ruff>=0.8.0; extra == 'dev'
|
|
35
|
+
Provides-Extra: mcp
|
|
36
|
+
Requires-Dist: nooa[mcp]==0.0.8; extra == 'mcp'
|
|
37
|
+
Provides-Extra: tracing
|
|
38
|
+
Requires-Dist: nooa[tracing]==0.0.8; extra == 'tracing'
|
|
39
|
+
Provides-Extra: tui
|
|
40
|
+
Requires-Dist: textual>=1.0.0; extra == 'tui'
|
|
41
|
+
Description-Content-Type: text/markdown
|
|
42
|
+
|
|
43
|
+
# Noah Code
|
|
44
|
+
|
|
45
|
+
[](https://pypi.org/project/noah-code/)
|
|
46
|
+
[](https://github.com/skundu42/noah-code/actions/workflows/ci.yml)
|
|
47
|
+
[](https://pypi.org/project/noah-code/)
|
|
48
|
+
|
|
49
|
+
**Noah Code** (`noah-code`) is a terminal coding agent for understanding repositories, planning
|
|
50
|
+
changes, editing files, running commands, and carrying work across persistent sessions. It is
|
|
51
|
+
built on the [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents) runtime.
|
|
52
|
+
|
|
53
|
+
## Install
|
|
54
|
+
|
|
55
|
+
Install Noah Code and its managed Python runtime with one command. No existing Python, Homebrew,
|
|
56
|
+
or system package setup is required.
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
curl -LsSf https://raw.githubusercontent.com/skundu42/noah-code/main/install.sh | sh
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The bootstrapper validates macOS/Linux support, installs the standalone uv package manager, and
|
|
63
|
+
downloads an isolated Python 3.12 runtime plus Noah Code. It does not modify a system Python.
|
|
64
|
+
|
|
65
|
+
Open a new terminal, move into a repository, and run:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
noah .
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Noah Code supports macOS on Apple Silicon and Intel, plus Linux on arm64 and x86_64 with Landlock
|
|
72
|
+
and seccomp support. You also need an LLM provider account such as OpenAI, Anthropic, OpenRouter or NVIDIA.
|
|
73
|
+
|
|
74
|
+
## Features
|
|
75
|
+
|
|
76
|
+
- Read files, search with ripgrep, and inspect Git status, diffs, and history.
|
|
77
|
+
- Edit files with anchored replacements, full rewrites, and concurrent-change detection.
|
|
78
|
+
- Run permission-gated shell commands with timeouts and streamed output.
|
|
79
|
+
- Follow repository instructions from `AGENTS.md`, `CLAUDE.md`, and `.noah-code/instructions.md`.
|
|
80
|
+
- Switch between implementation-focused **build** mode and read-only **plan** mode.
|
|
81
|
+
- Approve actions once or for a session with ordered `allow`, `ask`, and `deny` rules.
|
|
82
|
+
- Undo and redo journaled file edits across process restarts.
|
|
83
|
+
- Work in a full-screen TUI, a classic console, or one-shot non-interactive mode.
|
|
84
|
+
- Resume workspace-scoped sessions with todos and automatic context compaction.
|
|
85
|
+
- Extend workflows with slash commands, opt-in skills, MCP servers, model selection, and tracing.
|
|
86
|
+
|
|
87
|
+
## Quick start
|
|
88
|
+
|
|
89
|
+
Start the TUI in the current repository and describe the desired end state in plain language:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
noah .
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```text
|
|
96
|
+
Find the cause of the failing parser tests, implement the smallest safe fix, and run the
|
|
97
|
+
focused test file.
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Common commands:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# Open another workspace
|
|
104
|
+
noah /path/to/repository
|
|
105
|
+
|
|
106
|
+
# Use the line-oriented console
|
|
107
|
+
noah --console .
|
|
108
|
+
|
|
109
|
+
# Run one task and exit
|
|
110
|
+
noah run "Explain how authentication is wired" .
|
|
111
|
+
|
|
112
|
+
# Allow actions that would normally ask; explicit deny rules still apply
|
|
113
|
+
noah run --auto "Fix the failing unit test" .
|
|
114
|
+
|
|
115
|
+
# Inspect and plan without editing
|
|
116
|
+
noah --mode plan .
|
|
117
|
+
|
|
118
|
+
# Resume work
|
|
119
|
+
noah --continue .
|
|
120
|
+
noah --session SESSION_ID .
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Check the installation or inspect resolved configuration with:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
noah --version
|
|
127
|
+
noah doctor .
|
|
128
|
+
noah config show .
|
|
129
|
+
noah update --check
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
The package also installs `noah-code` and `nc` as equivalent entry points. Because `nc` commonly
|
|
133
|
+
refers to netcat, `noah` or `noah-code` is recommended. Keep provider API keys in the environment
|
|
134
|
+
or trusted NOOA user configuration, never in a repository or Noah Code session metadata.
|
|
135
|
+
|
|
136
|
+
## Documentation
|
|
137
|
+
|
|
138
|
+
- [Interactive interface and sessions](docs/interactive-reference.md)
|
|
139
|
+
- [Configuration, modes, permissions, and updates](docs/configuration.md)
|
|
140
|
+
- [Generated-code security](docs/security.md)
|
|
141
|
+
- [Custom commands, skills, MCP, and tracing](docs/extensions.md)
|
|
142
|
+
- [Development, CI, and releases](docs/development.md)
|
|
143
|
+
|
|
144
|
+
## Updates
|
|
145
|
+
|
|
146
|
+
Noah Code checks PyPI for new versions at most once every 24 hours and updates uv-managed
|
|
147
|
+
installations automatically. To check or update immediately:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
noah update --check
|
|
151
|
+
noah update
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Development
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
uv sync --extra dev
|
|
158
|
+
uv run ruff check src tests
|
|
159
|
+
uv run pytest tests
|
|
160
|
+
uv build
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
See the [development guide](docs/development.md) for platform checks and the release process.
|
|
164
|
+
|
|
165
|
+
## License
|
|
166
|
+
|
|
167
|
+
Apache-2.0, as declared in the project metadata. NOOA remains separately licensed by its upstream
|
|
168
|
+
project.
|
|
169
|
+
|
|
170
|
+
## Credits
|
|
171
|
+
|
|
172
|
+
Built on [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents). Thanks to the
|
|
173
|
+
NVIDIA NeMo team and NOOA contributors for the agent runtime that powers Noah Code.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Noah Code
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/noah-code/)
|
|
4
|
+
[](https://github.com/skundu42/noah-code/actions/workflows/ci.yml)
|
|
5
|
+
[](https://pypi.org/project/noah-code/)
|
|
6
|
+
|
|
7
|
+
**Noah Code** (`noah-code`) is a terminal coding agent for understanding repositories, planning
|
|
8
|
+
changes, editing files, running commands, and carrying work across persistent sessions. It is
|
|
9
|
+
built on the [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents) runtime.
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
Install Noah Code and its managed Python runtime with one command. No existing Python, Homebrew,
|
|
14
|
+
or system package setup is required.
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
curl -LsSf https://raw.githubusercontent.com/skundu42/noah-code/main/install.sh | sh
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The bootstrapper validates macOS/Linux support, installs the standalone uv package manager, and
|
|
21
|
+
downloads an isolated Python 3.12 runtime plus Noah Code. It does not modify a system Python.
|
|
22
|
+
|
|
23
|
+
Open a new terminal, move into a repository, and run:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
noah .
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Noah Code supports macOS on Apple Silicon and Intel, plus Linux on arm64 and x86_64 with Landlock
|
|
30
|
+
and seccomp support. You also need an LLM provider account such as OpenAI, Anthropic, OpenRouter or NVIDIA.
|
|
31
|
+
|
|
32
|
+
## Features
|
|
33
|
+
|
|
34
|
+
- Read files, search with ripgrep, and inspect Git status, diffs, and history.
|
|
35
|
+
- Edit files with anchored replacements, full rewrites, and concurrent-change detection.
|
|
36
|
+
- Run permission-gated shell commands with timeouts and streamed output.
|
|
37
|
+
- Follow repository instructions from `AGENTS.md`, `CLAUDE.md`, and `.noah-code/instructions.md`.
|
|
38
|
+
- Switch between implementation-focused **build** mode and read-only **plan** mode.
|
|
39
|
+
- Approve actions once or for a session with ordered `allow`, `ask`, and `deny` rules.
|
|
40
|
+
- Undo and redo journaled file edits across process restarts.
|
|
41
|
+
- Work in a full-screen TUI, a classic console, or one-shot non-interactive mode.
|
|
42
|
+
- Resume workspace-scoped sessions with todos and automatic context compaction.
|
|
43
|
+
- Extend workflows with slash commands, opt-in skills, MCP servers, model selection, and tracing.
|
|
44
|
+
|
|
45
|
+
## Quick start
|
|
46
|
+
|
|
47
|
+
Start the TUI in the current repository and describe the desired end state in plain language:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
noah .
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
Find the cause of the failing parser tests, implement the smallest safe fix, and run the
|
|
55
|
+
focused test file.
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Common commands:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Open another workspace
|
|
62
|
+
noah /path/to/repository
|
|
63
|
+
|
|
64
|
+
# Use the line-oriented console
|
|
65
|
+
noah --console .
|
|
66
|
+
|
|
67
|
+
# Run one task and exit
|
|
68
|
+
noah run "Explain how authentication is wired" .
|
|
69
|
+
|
|
70
|
+
# Allow actions that would normally ask; explicit deny rules still apply
|
|
71
|
+
noah run --auto "Fix the failing unit test" .
|
|
72
|
+
|
|
73
|
+
# Inspect and plan without editing
|
|
74
|
+
noah --mode plan .
|
|
75
|
+
|
|
76
|
+
# Resume work
|
|
77
|
+
noah --continue .
|
|
78
|
+
noah --session SESSION_ID .
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Check the installation or inspect resolved configuration with:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
noah --version
|
|
85
|
+
noah doctor .
|
|
86
|
+
noah config show .
|
|
87
|
+
noah update --check
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The package also installs `noah-code` and `nc` as equivalent entry points. Because `nc` commonly
|
|
91
|
+
refers to netcat, `noah` or `noah-code` is recommended. Keep provider API keys in the environment
|
|
92
|
+
or trusted NOOA user configuration, never in a repository or Noah Code session metadata.
|
|
93
|
+
|
|
94
|
+
## Documentation
|
|
95
|
+
|
|
96
|
+
- [Interactive interface and sessions](docs/interactive-reference.md)
|
|
97
|
+
- [Configuration, modes, permissions, and updates](docs/configuration.md)
|
|
98
|
+
- [Generated-code security](docs/security.md)
|
|
99
|
+
- [Custom commands, skills, MCP, and tracing](docs/extensions.md)
|
|
100
|
+
- [Development, CI, and releases](docs/development.md)
|
|
101
|
+
|
|
102
|
+
## Updates
|
|
103
|
+
|
|
104
|
+
Noah Code checks PyPI for new versions at most once every 24 hours and updates uv-managed
|
|
105
|
+
installations automatically. To check or update immediately:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
noah update --check
|
|
109
|
+
noah update
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Development
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
uv sync --extra dev
|
|
116
|
+
uv run ruff check src tests
|
|
117
|
+
uv run pytest tests
|
|
118
|
+
uv build
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
See the [development guide](docs/development.md) for platform checks and the release process.
|
|
122
|
+
|
|
123
|
+
## License
|
|
124
|
+
|
|
125
|
+
Apache-2.0, as declared in the project metadata. NOOA remains separately licensed by its upstream
|
|
126
|
+
project.
|
|
127
|
+
|
|
128
|
+
## Credits
|
|
129
|
+
|
|
130
|
+
Built on [NVIDIA OO Agents (NOOA)](https://github.com/NVIDIA-NeMo/labs-OO-Agents). Thanks to the
|
|
131
|
+
NVIDIA NeMo team and NOOA contributors for the agent runtime that powers Noah Code.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Configuration, permissions, and updates
|
|
2
|
+
|
|
3
|
+
## Configuration
|
|
4
|
+
|
|
5
|
+
Configuration is merged in this order, with later layers taking precedence:
|
|
6
|
+
|
|
7
|
+
1. Built-in defaults.
|
|
8
|
+
2. User config at `~/.config/noah-code/config.toml`.
|
|
9
|
+
3. Project config at `.noah-code/config.toml`.
|
|
10
|
+
4. `NOAH_CODE_*` environment variables.
|
|
11
|
+
5. CLI flags.
|
|
12
|
+
|
|
13
|
+
Example user configuration:
|
|
14
|
+
|
|
15
|
+
```toml
|
|
16
|
+
model = "gpt-4o-mini"
|
|
17
|
+
lightweight_model = "gpt-4o-mini"
|
|
18
|
+
mode = "build"
|
|
19
|
+
max_iterations = 40
|
|
20
|
+
cell_timeout = 120
|
|
21
|
+
command_timeout = 60
|
|
22
|
+
|
|
23
|
+
[ui]
|
|
24
|
+
frontend = "tui" # "tui" or "console"
|
|
25
|
+
markdown = true
|
|
26
|
+
stream_shell = true
|
|
27
|
+
show_reasoning = false
|
|
28
|
+
|
|
29
|
+
[summarization]
|
|
30
|
+
policy = "token_budget" # or "none"
|
|
31
|
+
preserve_recent = 10
|
|
32
|
+
target_chars = 4000
|
|
33
|
+
|
|
34
|
+
[tracing]
|
|
35
|
+
enabled = true
|
|
36
|
+
viewer = true
|
|
37
|
+
# jsonl_dir = "~/.local/share/noah-code/traces"
|
|
38
|
+
|
|
39
|
+
[updates]
|
|
40
|
+
auto_install = true
|
|
41
|
+
interval_hours = 24
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Supported environment overrides include:
|
|
45
|
+
|
|
46
|
+
- `NOAH_CODE_MODEL`
|
|
47
|
+
- `NOAH_CODE_LIGHTWEIGHT_MODEL`
|
|
48
|
+
- `NOAH_CODE_AUTO`
|
|
49
|
+
- `NOAH_CODE_SESSION_DIR`
|
|
50
|
+
- `NOAH_CODE_MODE`
|
|
51
|
+
- `NOAH_CODE_UNSAFE_INPROCESS`
|
|
52
|
+
- `NOAH_CODE_AUTO_UPDATE`
|
|
53
|
+
|
|
54
|
+
Repository-controlled configuration cannot weaken the host trust boundary. Project config is
|
|
55
|
+
ignored for `auto_approve`, `enabled_skills`, `mcp`, `permission_rules`, `session_dir`, `tracing`,
|
|
56
|
+
`updates`, and `unsafe_inprocess_code_execution`. Put those settings in trusted user config, the
|
|
57
|
+
environment, or an explicit CLI flag.
|
|
58
|
+
|
|
59
|
+
A user-configured `permission_rules` array replaces the default rule array. Copy forward every
|
|
60
|
+
default you still want before adding overrides. Hard secret, destructive-shell, and plan-mode
|
|
61
|
+
gates remain enforced in code.
|
|
62
|
+
|
|
63
|
+
Inspect the resolved configuration with:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
noah config show .
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Model and provider configuration follows NOOA conventions, including its model registry,
|
|
70
|
+
environment variables, and configuration under `~/.config/nooa/`.
|
|
71
|
+
|
|
72
|
+
## Modes and permissions
|
|
73
|
+
|
|
74
|
+
| Mode | Behavior |
|
|
75
|
+
|------|----------|
|
|
76
|
+
| `build` | Reads are allowed; edits and shell commands follow permission rules and ask by default |
|
|
77
|
+
| `plan` | Reads are allowed; file edits and mutating shell commands are denied |
|
|
78
|
+
|
|
79
|
+
Switch modes with `--mode`, `/mode build`, or `/mode plan`. The active mode is stored with the
|
|
80
|
+
session.
|
|
81
|
+
|
|
82
|
+
Permission rules are evaluated in order, and the last matching rule wins. The default policy:
|
|
83
|
+
|
|
84
|
+
- Allows ordinary reads.
|
|
85
|
+
- Denies likely secrets, including `.env` variants, private keys, `.git` internals, and session
|
|
86
|
+
databases. `.env.example` remains readable.
|
|
87
|
+
- Asks before workspace edits and shell commands.
|
|
88
|
+
- Denies `git push`, `git clean`, and `git reset --hard`.
|
|
89
|
+
- Keeps file tools inside the active workspace and asks before skill or MCP access.
|
|
90
|
+
- Denies plan-mode mutations regardless of broader allow rules.
|
|
91
|
+
|
|
92
|
+
`--auto` changes ask decisions to allow but never overrides an explicit deny. Compound shell
|
|
93
|
+
commands and mutating or unrecognized Git commands cannot be silently auto-approved.
|
|
94
|
+
|
|
95
|
+
## Installation and updates
|
|
96
|
+
|
|
97
|
+
The README executes the checked-in bootstrapper directly from GitHub. From a local clone, run the
|
|
98
|
+
same installer with:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
sh install.sh
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Installs created by the one-line command check PyPI at most once every 24 hours and install newer
|
|
105
|
+
Noah Code releases through uv. When an update is installed, Noah exits before starting the task
|
|
106
|
+
so it cannot mix old and new runtime modules. Rerun the command to continue on the new version.
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# Check without changing the installation
|
|
110
|
+
noah update --check
|
|
111
|
+
|
|
112
|
+
# Update immediately
|
|
113
|
+
noah update
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Disable automatic installation from trusted user configuration or the environment:
|
|
117
|
+
|
|
118
|
+
```toml
|
|
119
|
+
[updates]
|
|
120
|
+
auto_install = false
|
|
121
|
+
interval_hours = 24
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
export NOAH_CODE_AUTO_UPDATE=0
|
|
126
|
+
```
|