{"_id":"@aaarc/recursivelearnmcp","_rev":"4-d4ffcf98aadced8b73bd35739a2fda05","name":"@aaarc/recursivelearnmcp","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@aaarc/recursivelearnmcp","version":"0.1.0","license":"UNLICENSED","_id":"@aaarc/recursivelearnmcp@0.1.0","maintainers":[{"name":"aaarc","email":"ironboxplus@gmail.com"}],"homepage":"https://github.com/Ironboxplus/RecursiveLearningwithLLM#readme","bugs":{"url":"https://github.com/Ironboxplus/RecursiveLearningwithLLM/issues"},"bin":{"incursion":"dist/bin.js"},"dist":{"shasum":"b544a77064b8826d85b64360dd66505d430ddd58","tarball":"https://registry.npmjs.org/@aaarc/recursivelearnmcp/-/recursivelearnmcp-0.1.0.tgz","fileCount":55,"integrity":"sha512-Xq9m8Rjwi5OCkHYBH6/esUhrTjgEKTqSSUYUsWGQWrRoP3CYBnrmmwWQzkG5KmmwVxMsMzz0KQOkC5A7Ze6qtw==","signatures":[{"sig":"MEUCIB3RlF1Y+1YANLdyMyDHHkgVH5reSiAxDmG/k1TX0hKmAiEA+j1khoupbJTfqGDaZofldYZk8LxKjX8OWX4ioMIa/Ro=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5080514},"type":"module","_from":"file:E:/JETB/pythons/playground/incubator/incursion/artifacts/npm/aaarc-recursivelearnmcp-0.1.0.tgz","engines":{"node":">=22.5.0"},"_npmUser":{"name":"aaarc","email":"ironboxplus@gmail.com"},"_resolved":"E:\\JETB\\pythons\\playground\\incubator\\incursion\\artifacts\\npm\\aaarc-recursivelearnmcp-0.1.0.tgz","_integrity":"sha512-Xq9m8Rjwi5OCkHYBH6/esUhrTjgEKTqSSUYUsWGQWrRoP3CYBnrmmwWQzkG5KmmwVxMsMzz0KQOkC5A7Ze6qtw==","repository":{"url":"git+https://github.com/Ironboxplus/RecursiveLearningwithLLM.git","type":"git"},"_npmVersion":"11.16.0","description":"A recoverable recursive-learning tree with MCP, HTTP/SSE, and an embedded web UI.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.23.8","hono":"4.12.32","ulid":"^2.4.0","yaml":"^2.9.0","gray-matter":"^4.0.3","@hono/node-server":"2.0.12","@automerge/automerge":"^3.3.2","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/recursivelearnmcp_0.1.0_1785569018430_0.0026647334342209117","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aaarc/recursivelearnmcp","version":"0.1.1","license":"UNLICENSED","_id":"@aaarc/recursivelearnmcp@0.1.1","maintainers":[{"name":"aaarc","email":"ironboxplus@gmail.com"}],"homepage":"https://github.com/Ironboxplus/RecursiveLearningwithLLM#readme","bugs":{"url":"https://github.com/Ironboxplus/RecursiveLearningwithLLM/issues"},"bin":{"incursion":"dist/bin.js"},"dist":{"shasum":"5bc3a12320d09cadc0bb2b86cf971449370a6f20","tarball":"https://registry.npmjs.org/@aaarc/recursivelearnmcp/-/recursivelearnmcp-0.1.1.tgz","fileCount":55,"integrity":"sha512-5hxerSU5pwNurVXMokpzWKbElVk3w7TVCHtTW5xQB9N+uUzpFVQKU72XIza1OplLQofvhWwWJujMY5IRczKdPw==","signatures":[{"sig":"MEYCIQDvLvZu7/Dy8Vk7ZQ7fkeLctRHk/HAZ2Q9f7KB2RST3gQIhAKPiXVAQ8rFhYQ4EzqZpxRNztFGN0rjNT6mUabEG08KA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5083284},"type":"module","_from":"file:artifacts/npm/aaarc-recursivelearnmcp-0.1.1.tgz","engines":{"node":">=22.5.0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:efff8cdb-bb7d-40a3-bcb2-7bb7d38c3090"}},"_resolved":"/home/runner/work/RecursiveLearningwithLLM/RecursiveLearningwithLLM/artifacts/npm/aaarc-recursivelearnmcp-0.1.1.tgz","_integrity":"sha512-5hxerSU5pwNurVXMokpzWKbElVk3w7TVCHtTW5xQB9N+uUzpFVQKU72XIza1OplLQofvhWwWJujMY5IRczKdPw==","repository":{"url":"git+https://github.com/Ironboxplus/RecursiveLearningwithLLM.git","type":"git"},"_npmVersion":"11.19.0","description":"A recoverable recursive-learning tree with MCP, HTTP/SSE, and an embedded web UI.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.23.8","hono":"4.12.32","ulid":"^2.4.0","yaml":"^2.9.0","gray-matter":"^4.0.3","@hono/node-server":"2.0.12","@automerge/automerge":"^3.3.2","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/recursivelearnmcp_0.1.1_1785570761708_0.40723396821306146","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aaarc/recursivelearnmcp","version":"0.1.2","license":"UNLICENSED","_id":"@aaarc/recursivelearnmcp@0.1.2","maintainers":[{"name":"aaarc","email":"ironboxplus@gmail.com"}],"homepage":"https://github.com/Ironboxplus/RecursiveLearningwithLLM#readme","bugs":{"url":"https://github.com/Ironboxplus/RecursiveLearningwithLLM/issues"},"bin":{"incursion":"dist/bin.js"},"dist":{"shasum":"ad244524a709788284223004d6fbfd24e06cc4d0","tarball":"https://registry.npmjs.org/@aaarc/recursivelearnmcp/-/recursivelearnmcp-0.1.2.tgz","fileCount":55,"integrity":"sha512-99BjmfQVozg2spdfoIDXQEC7v9ec/+3gUlj75UsYi7ralOXGd5sIcwMAcreZ+LqCjA++4agco6D8phiWatMzmQ==","signatures":[{"sig":"MEUCICLXboBRUHGVaQWDbhq7dx/zlNAYVC4WcKFRuvSP1DdZAiEAq2kj0JKyAlkr9kKlPsDeinXnYlSf6Yupu6aQ/jJEpOY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5094510},"type":"module","_from":"file:artifacts/npm/aaarc-recursivelearnmcp-0.1.2.tgz","engines":{"node":">=22.5.0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:efff8cdb-bb7d-40a3-bcb2-7bb7d38c3090"}},"_resolved":"/home/runner/work/RecursiveLearningwithLLM/RecursiveLearningwithLLM/artifacts/npm/aaarc-recursivelearnmcp-0.1.2.tgz","_integrity":"sha512-99BjmfQVozg2spdfoIDXQEC7v9ec/+3gUlj75UsYi7ralOXGd5sIcwMAcreZ+LqCjA++4agco6D8phiWatMzmQ==","repository":{"url":"git+https://github.com/Ironboxplus/RecursiveLearningwithLLM.git","type":"git"},"_npmVersion":"11.19.0","description":"A recoverable recursive-learning tree with MCP, HTTP/SSE, and an embedded web UI.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.23.8","hono":"4.12.32","ulid":"^2.4.0","yaml":"^2.9.0","gray-matter":"^4.0.3","@hono/node-server":"2.0.12","@automerge/automerge":"^3.3.2","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/recursivelearnmcp_0.1.2_1785577810364_0.04700327856586495","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@aaarc/recursivelearnmcp","version":"0.1.3","description":"A recoverable recursive-learning tree with MCP, HTTP/SSE, and an embedded web UI.","license":"UNLICENSED","type":"module","bin":{"incursion":"dist/bin.js"},"engines":{"node":">=22.5.0"},"repository":{"type":"git","url":"git+https://github.com/Ironboxplus/RecursiveLearningwithLLM.git"},"homepage":"https://github.com/Ironboxplus/RecursiveLearningwithLLM#readme","bugs":{"url":"https://github.com/Ironboxplus/RecursiveLearningwithLLM/issues"},"publishConfig":{"access":"public"},"dependencies":{"ulid":"^2.4.0","zod":"^3.23.8","gray-matter":"^4.0.3","yaml":"^2.9.0","@automerge/automerge":"^3.3.2","@modelcontextprotocol/sdk":"^1.30.0","hono":"4.12.32","@hono/node-server":"2.0.12"},"_id":"@aaarc/recursivelearnmcp@0.1.3","_integrity":"sha512-7n/IqY2ubN6fh4VikhMd3zz97k/jCtFb42gDOh2fxt0RvonQMJZvYdtuxiNU+gtN0B+CyV07s8K6txdGJh5hLg==","_resolved":"/home/runner/work/RecursiveLearningwithLLM/RecursiveLearningwithLLM/artifacts/npm/aaarc-recursivelearnmcp-0.1.3.tgz","_from":"file:artifacts/npm/aaarc-recursivelearnmcp-0.1.3.tgz","_nodeVersion":"24.18.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-7n/IqY2ubN6fh4VikhMd3zz97k/jCtFb42gDOh2fxt0RvonQMJZvYdtuxiNU+gtN0B+CyV07s8K6txdGJh5hLg==","shasum":"4a7c6e298a6ec91ffd2b2087ea158877ddce0535","tarball":"https://registry.npmjs.org/@aaarc/recursivelearnmcp/-/recursivelearnmcp-0.1.3.tgz","fileCount":55,"unpackedSize":5095091,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICcF+7avbQpLUij2Kk6Y7esplPCw5IKvq3S49RkA6XKTAiEA15ysz8uoaFW2lYkdpWIvXgh7p2S+i1qV4dHhPfeRHsg="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:efff8cdb-bb7d-40a3-bcb2-7bb7d38c3090"}},"directories":{},"maintainers":[{"name":"aaarc","email":"ironboxplus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/recursivelearnmcp_0.1.3_1785580183539_0.34647513852138556"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-01T07:23:38.279Z","modified":"2026-08-01T10:29:43.879Z","0.1.0":"2026-08-01T07:23:38.627Z","0.1.1":"2026-08-01T07:52:41.905Z","0.1.2":"2026-08-01T09:50:10.555Z","0.1.3":"2026-08-01T10:29:43.725Z"},"bugs":{"url":"https://github.com/Ironboxplus/RecursiveLearningwithLLM/issues"},"license":"UNLICENSED","homepage":"https://github.com/Ironboxplus/RecursiveLearningwithLLM#readme","repository":{"type":"git","url":"git+https://github.com/Ironboxplus/RecursiveLearningwithLLM.git"},"description":"A recoverable recursive-learning tree with MCP, HTTP/SSE, and an embedded web UI.","maintainers":[{"name":"aaarc","email":"ironboxplus@gmail.com"}],"readme":"# @incursion/cli\n\nThe `incursion` command: `new`, `ls`, `show`, `focus`, `rebuild`, `undo`, `orphans`,\n`serve` (embedded web UI + HTTP/SSE), `mcp` (the complete entrypoint — the same UI\nand HTTP/SSE surface plus MCP over stdio), and `registry` (the deployable public-forest\nHTTP gateway backed by built-in SQLite). Run `incursion` with no arguments (or\n`--help`) for the full usage text.\n\nThe release tarball embeds `apps/web` under `dist/web`, so users do not need to install,\nstart, or deploy Next.js separately. Both long-running commands print their resolved\nendpoints on startup. `mcp` prints them to stderr because stdout is reserved exclusively\nfor JSON-RPC.\n\nThe production runtime also opens one Automerge-backed history repository beside the\nhuman-readable tree projection. Every real mutation is committed as a complete-forest\ncheckpoint before the projection and SSE notification are published. The embedded UI's\n`检查点` tab can restore any checkpoint append-only; a stale HEAD or manually modified\nworktree is rejected instead of being silently overwritten.\n\n## Public forest deployment\n\n`incursion registry --port=7780 --db=/path/public-forest.sqlite` is the self-contained\nreference deployment. Public reads require no credential. Writes are disabled unless\n`INCURSION_REGISTRY_TOKEN` is set, and then require `Authorization: Bearer <token>`.\nThe registry validates the narrow `PublishableNode` schema and computes its SHA-256\nserver-side, so attempts, notes, verification/mastery and caller-supplied hashes cannot\ncross the publishing boundary. Local `serve`/`mcp` processes connect through\n`INCURSION_REMOTE_URL`; that replaceable HTTP boundary allows a later PostgreSQL or\nhosted-database implementation without changing MCP tools or mounted snapshot semantics.\n\n## `incursion mcp`: one owner, any number of Codex instances\n\n`@incursion/mcp`'s own `bin.ts` is deliberately stdio-only (see that package's README —\nit exists for its own subprocess tests and for hosts that only want MCP). The task\nbrief's \"MCP server 启动时默认同时起 HTTP\" behavior lives here instead. `incursion mcp`\nreuses or starts one detached owner for the selected forest. The owner alone opens the\nAutomerge writer, embedded UI, HTTP/SSE, and an authenticated local MCP-over-HTTP\nendpoint. Each Codex process exposes stdio by proxying to that endpoint. Many Codex\nwindows therefore share one `Engine`; closing the first window does not kill the UI,\nand no second process can overwrite the projection. A requested port collision falls\nback to an OS-assigned free port recorded in `runtime.json`.\n\n**Because each proxy's stdout is the MCP JSON-RPC wire protocol, every informational\nmessage (including the owner PID and actual HTTP endpoint) goes to stderr, never\nstdout.** Writing anything else to stdout would corrupt the host connection.\n\n## Color coding\n\n`show` colors each rendered line by the node's most specific state: green for `verified`,\nblue for `asserted`, yellow for `provisional`, gray for `pruned`; everything else is\nprinted uncolored (`src/tree-view.ts`). Two independent opt-outs are honored, checked in\n`src/color.ts`:\n\n- `NO_COLOR` (https://no-color.org) — presence of the variable disables color regardless\n  of its value, even on a real TTY.\n- Non-TTY stdout — anything piped, redirected, or captured by a test's `execFile`/`spawn`\n  auto-disables color. This isn't just a nicety: it's what makes `test/cli.test.ts`'s\n  output assertions byte-stable without stripping ANSI codes in every test.\n\nColoring is layered on top of core's own plain-text `render()` rather than folding color\ninto `@incursion/core` itself — core's `render()` output is also what MCP's `tree_render`\ntool hands to a model, where ANSI escape codes would just be extra tokens to parse around\nfor no benefit.\n\n## A core gap found while building `rebuild`\n\n`rebuild [tree]` is meant to verify that a tree's on-disk archive is recoverable purely\nfrom `(tree, nodes)`, by comparing every node's persisted `rollup` against what core's\n`rebuildAllRollups()` recomputes from scratch. In practice this needed one carve-out:\n`recomputeRollup()`'s composer always returns a string (`defaultComposer(\"\", [])` is\n`\"\"`, not `null`), so it can never reproduce `rollup: null` — the value every node\nactually starts at (`algebra.ts`'s `createTree`) and keeps until the first `close()`\nanywhere bubbles a value into it. A freshly created, never-closed tree's root would\ntherefore always show up as a false-positive \"mismatch\" (`null` on disk vs. `\"\"`\nrecomputed) if compared naively. `rebuildAllRollups()`'s own doc comment scopes its\ninvariant to \"for any sequence of closes\"; `cmdRebuild` (`src/commands.ts`) follows that\nsame scope and skips nodes whose on-disk `rollup` is still `null`, rather than silently\nloosening the comparison or reporting a mismatch that core's own invariant never claimed\nto cover.\n\n## Testing\n\nEvery test spawns the actual built `dist/bin.js` — via `execFile` for commands that exit\n(`test/cli.test.ts`) and via `spawn` + a line-matching wait for the two long-running\ncommands, `serve` and `mcp` (`test/long-running.test.ts`, which kills the child process in\n`afterEach` rather than waiting for it to exit on its own). No command is ever called\nin-process through `run()` directly — the point is to exercise the real binary a user\nwould actually invoke, including argv parsing and process exit codes.\n","readmeFilename":"README.md"}