Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 11 additions & 72 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,16 @@ Code, Cursor, OpenCode, Copilot CLI, and other coding agents.
New chats do not require another `init`. Ordinary questions need no Noxroot task. Noxroot stays in
the background until code-changing work needs it.

When Noxroot owns the lifecycle, the workflow is:
Inspect the relevant files and checks before the agent starts editing:

<p align="center">
<img src="docs/assets/noxroot-workflow.svg" alt="When Noxroot owns the lifecycle, it reuses repository knowledge, prepares focused context, supports your coding agent, checks the change, and keeps useful project knowledge" width="900">
<img src="docs/assets/noxroot-terminal.png" alt="Noxroot terminal example: preserve project filters on back navigation, with likely source files, a navigation test, and checks to run" width="594">
</p>

Output excerpt with illustrative project paths and checks, not a captured test run. The brief
identifies likely source files, related tests, and commands to run. It does not claim those checks
have passed.

## Project memory, not chat history

Project memory is the versioned repository knowledge future agents should reuse: architecture,
Expand Down Expand Up @@ -73,14 +77,14 @@ npx noxroot@latest init
Then keep talking to your coding agent normally:

```text
Add a page where users can save favourite restaurants.
Fix project filters resetting on back navigation.
```

For a code-changing task, compatible agents are instructed to use the pinned repository commands
behind the scenes:

```bash
npx --yes noxroot@0.1.0 start "add a page where users can save favourite restaurants"
npx --yes noxroot@0.1.0 start "fix project filters resetting on back navigation"
# your existing coding agent builds the change
npx --yes noxroot@0.1.0 finish
```
Expand Down Expand Up @@ -127,74 +131,9 @@ Skills do not prove that code works. The actual tests, type checks, builds, eval
results do. An incomplete result can be handed off locally, but it cannot become approved or qualify
for a future automatic merge. Noxroot does not push, merge, publish, or deploy.

## See what the agent gets

This tested example comes from Noxroot's own repository:

```text
$ noxroot context "improve reviewer decision safety"

NOXROOT task brief

Outcome
improve reviewer decision safety

Confidence High

Task context
6 files · ~3,344 tokens
src/adapters/agents.ts
src/orchestration/review.ts
.noxroot/skills/independent-review/SKILL.md
.noxroot/knowledge/INDEX.md
AGENTS.md
.noxroot/config.yml

Likely owner
src/adapters/agents.ts

Likely tests
tests/agent-review.test.ts (+2 related)

Checks
npm run format:check
npm run lint
npm run typecheck
npm run test
npm run build

Excluded
20 files left out

Next
Build the requested change.
```

Selection is advisory, not permission to edit. "Do not deploy" remains an exclusion; it never
activates deployment work.

Completion stays compact:

```text
Changed
3 navigation files

Checked
TypeScript passed
Navigation tests passed

Review
Not required for this bounded change

Learning
No reusable project-knowledge candidate

Next
Review the resulting change.
```

This transcript illustrates the stable information hierarchy; repository-specific commands and
counts come from the recorded run rather than fixed example data.
`context "<task>"` is read-only. It does not start a task or run checks. Selection is advisory, not
permission to edit. "Do not deploy" remains an exclusion; it never activates deployment work. Use
`start` to record the task baseline and `finish` to check the resulting change.

## Try the read-only diagnosis

Expand Down
12 changes: 9 additions & 3 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ uses bounded filesystem APIs, groups repeated monorepo evidence, and never runs
LLM. Proposal generation produces complete file contents and unified creation patches.
Initialization is the only component that applies those proposals.

Root `AGENTS.md` and `CLAUDE.md` remain instruction evidence when Git ignores them. Explicit
sensitive-path exclusions and symlink protections still apply. Ordinary ignored files stay excluded.

Mature-repository adoption follows explicit repository-relative references from agent instructions.
It recognizes thin forwarding files, existing Agent Skills, documented verification wrappers, and
clear repository-development coordinator overlap. Behavioral ownership determines the boundary: a
Expand All @@ -16,7 +19,8 @@ name, filename, or implementation language. Proposal decisions are deliberately
proven gap, reuse explicit evidence, disable an overlapping capability, or preserve a capability
that could not be assessed. An existing coordinator keeps lifecycle, review, and learning authority
while Noxroot may add only non-overlapping context and verification support. Noxroot does not
interpret arbitrary route schemas or integrate coordinators.
interpret arbitrary route schemas or integrate coordinators. Task-route reuse requires a
repository-work context in the reference, not merely API documentation containing the word "routes".

Generated knowledge indexes link at most twelve high-signal documents. Additional documentation
stays in its original location and remains available through repository instructions and task
Expand Down Expand Up @@ -62,8 +66,10 @@ semantic modules are deferred.
Controlled learning consumes deterministic verification evidence or already parsed structured
reviewer candidates. Deterministic signatures deduplicate Noxroot-owned knowledge; first creation
also updates the index. Every proposed entry names its confirmation date and source task. Per-file
and total corpus bounds prevent accumulated Markdown from silently consuming future context; a full
destination requires deliberate consolidation before another write. Canonical
and total corpus bounds prevent accumulated Markdown from silently consuming future context.
Learning writes are capped at 1,000,000 bytes across Markdown files, including nested files and
index growth. The limit is rechecked when a proposal is applied. Symbolic-link destinations are
refused. A full destination requires deliberate consolidation before another write. Canonical
`.noxroot/skills/*/SKILL.md` files are short, standards-compatible procedures selected through
ordinary routing, not a new skill runtime or vendor-specific tree.

Expand Down
Binary file added docs/assets/noxroot-terminal.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
110 changes: 0 additions & 110 deletions docs/assets/noxroot-workflow.svg

This file was deleted.

1 change: 1 addition & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export default tseslint.config(
"eslint.config.js",
"tests/built-safety.mjs",
"tests/package-smoke.mjs",
"tests/acceptance/*.mjs",
"tests/fixtures/**",
],
},
Expand Down
4 changes: 3 additions & 1 deletion src/detection/adoption.ts
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,9 @@ export async function inspectRepositoryAdoption(
].map((file): RepositoryDocument => ({ path: file, kind: "ordinary", authoritative: true }));
const routeReferences = references.filter(
(item) =>
/\broutes?\b/i.test(item.context) && !INSTRUCTION_NAME.test(path.posix.basename(item.path)),
/\broutes?\b/i.test(item.context) &&
/\b(?:tasks?|agents?|context|project|repository|knowledge|memory)\b/i.test(item.context) &&
!INSTRUCTION_NAME.test(path.posix.basename(item.path)),
);
const missingRouteReferences = missing.filter((item) => /\broutes?\b/i.test(item.context));
const knowledgeReferences = references.filter(
Expand Down
3 changes: 3 additions & 0 deletions src/detection/scan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -818,6 +818,9 @@ export async function scanRepository(
const absolute = path.join(current.absolute, entry.name);
if (
entry.name !== ".gitignore" &&
// Local root instructions remain authoritative even when not versioned.
// Sensitive-path exclusions and symlink checks below still take precedence.
!["AGENTS.md", "CLAUDE.md"].includes(relative) &&
ignoredByGit(relative, entry.isDirectory(), ignorePatterns)
) {
continue;
Expand Down
Loading