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.
Files changed (55) hide show
  1. noah_code-0.1.0/.github/workflows/ci.yml +92 -0
  2. noah_code-0.1.0/.github/workflows/release.yml +127 -0
  3. noah_code-0.1.0/.gitignore +13 -0
  4. noah_code-0.1.0/PKG-INFO +173 -0
  5. noah_code-0.1.0/README.md +131 -0
  6. noah_code-0.1.0/docs/configuration.md +126 -0
  7. noah_code-0.1.0/docs/development.md +45 -0
  8. noah_code-0.1.0/docs/extensions.md +58 -0
  9. noah_code-0.1.0/docs/interactive-reference.md +55 -0
  10. noah_code-0.1.0/docs/security.md +36 -0
  11. noah_code-0.1.0/install.sh +79 -0
  12. noah_code-0.1.0/pyproject.toml +90 -0
  13. noah_code-0.1.0/src/noah_code/__init__.py +3 -0
  14. noah_code-0.1.0/src/noah_code/__main__.py +6 -0
  15. noah_code-0.1.0/src/noah_code/agent.py +378 -0
  16. noah_code-0.1.0/src/noah_code/approvals.py +105 -0
  17. noah_code-0.1.0/src/noah_code/cli.py +422 -0
  18. noah_code-0.1.0/src/noah_code/commands.py +70 -0
  19. noah_code-0.1.0/src/noah_code/config.py +279 -0
  20. noah_code-0.1.0/src/noah_code/custom_commands.py +103 -0
  21. noah_code-0.1.0/src/noah_code/event_bridge.py +132 -0
  22. noah_code-0.1.0/src/noah_code/events.py +27 -0
  23. noah_code-0.1.0/src/noah_code/host.py +662 -0
  24. noah_code-0.1.0/src/noah_code/macos_sandbox.py +142 -0
  25. noah_code-0.1.0/src/noah_code/mcp_setup.py +91 -0
  26. noah_code-0.1.0/src/noah_code/permissions.py +400 -0
  27. noah_code-0.1.0/src/noah_code/sessions.py +157 -0
  28. noah_code-0.1.0/src/noah_code/skills_setup.py +51 -0
  29. noah_code-0.1.0/src/noah_code/snapshots.py +313 -0
  30. noah_code-0.1.0/src/noah_code/tools/__init__.py +6 -0
  31. noah_code-0.1.0/src/noah_code/tools/git_tools.py +44 -0
  32. noah_code-0.1.0/src/noah_code/tools/workspace_tools.py +269 -0
  33. noah_code-0.1.0/src/noah_code/ui/__init__.py +6 -0
  34. noah_code-0.1.0/src/noah_code/ui/console.py +88 -0
  35. noah_code-0.1.0/src/noah_code/ui/protocol.py +33 -0
  36. noah_code-0.1.0/src/noah_code/ui/textual.css +9 -0
  37. noah_code-0.1.0/src/noah_code/ui/textual_app.py +435 -0
  38. noah_code-0.1.0/src/noah_code/updates.py +184 -0
  39. noah_code-0.1.0/src/noah_code/workspace.py +49 -0
  40. noah_code-0.1.0/tests/test_agent_security.py +88 -0
  41. noah_code-0.1.0/tests/test_cli.py +64 -0
  42. noah_code-0.1.0/tests/test_config.py +58 -0
  43. noah_code-0.1.0/tests/test_custom_commands.py +50 -0
  44. noah_code-0.1.0/tests/test_event_bridge_and_shell.py +65 -0
  45. noah_code-0.1.0/tests/test_host.py +113 -0
  46. noah_code-0.1.0/tests/test_installer.py +40 -0
  47. noah_code-0.1.0/tests/test_permissions.py +70 -0
  48. noah_code-0.1.0/tests/test_run_exit.py +57 -0
  49. noah_code-0.1.0/tests/test_sessions.py +82 -0
  50. noah_code-0.1.0/tests/test_snapshots.py +99 -0
  51. noah_code-0.1.0/tests/test_summarization.py +35 -0
  52. noah_code-0.1.0/tests/test_textual_tui.py +93 -0
  53. noah_code-0.1.0/tests/test_updates.py +82 -0
  54. noah_code-0.1.0/tests/test_workspace_tools.py +145 -0
  55. 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"
@@ -0,0 +1,13 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.py[cod]
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ .mypy_cache/
7
+ dist/
8
+ build/
9
+ *.egg-info/
10
+ .coverage
11
+ htmlcov/
12
+ traces/
13
+ .DS_Store
@@ -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
+ [![PyPI](https://img.shields.io/pypi/v/noah-code.svg)](https://pypi.org/project/noah-code/)
46
+ [![CI](https://github.com/skundu42/noah-code/actions/workflows/ci.yml/badge.svg)](https://github.com/skundu42/noah-code/actions/workflows/ci.yml)
47
+ [![Python](https://img.shields.io/pypi/pyversions/noah-code.svg)](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
+ [![PyPI](https://img.shields.io/pypi/v/noah-code.svg)](https://pypi.org/project/noah-code/)
4
+ [![CI](https://github.com/skundu42/noah-code/actions/workflows/ci.yml/badge.svg)](https://github.com/skundu42/noah-code/actions/workflows/ci.yml)
5
+ [![Python](https://img.shields.io/pypi/pyversions/noah-code.svg)](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
+ ```