Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e933489fb5 | ||
|
|
31b0a2ba99 | ||
|
|
0c0e2b8a1e | ||
|
|
3d0ad799c4 | ||
|
|
29d92cac5a |
@@ -1,3 +1,3 @@
|
||||
{
|
||||
".": "1.0.0"
|
||||
".": "1.1.0"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,26 @@
|
||||
# Changelog
|
||||
|
||||
## [1.1.0](https://github.com/morluto/rea/compare/rea-agents-1.0.0...rea-agents-1.1.0) (2026-07-13)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **setup:** make installation explicit and safe ([29d92ca](https://github.com/morluto/rea/commit/29d92cac5ab23a4e6a5286b0871224abbe705642))
|
||||
* **setup:** make installation explicit and safe ([3793889](https://github.com/morluto/rea/commit/3793889ce8662ca8e1e92af1bb5c6ee854848467))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* preserve requested evidence paths on macOS ([0c0e2b8](https://github.com/morluto/rea/commit/0c0e2b8a1efb3f56672b9c95fda5c5ab5746284b))
|
||||
* preserve requested evidence paths on macOS ([3d0ad79](https://github.com/morluto/rea/commit/3d0ad799c4deb1d3627d8721c31bc76be3f3abd2))
|
||||
|
||||
|
||||
### Documentation
|
||||
|
||||
* **api:** regenerate TypeDoc reference ([0a66cae](https://github.com/morluto/rea/commit/0a66cae16ef8e2a243bbed502bbb7cdbd12a965f))
|
||||
* define REA contributor priorities ([5df4ef6](https://github.com/morluto/rea/commit/5df4ef67a4676f46900aa6022c1af2224efa8761))
|
||||
* explain the installation workflow ([1c83263](https://github.com/morluto/rea/commit/1c83263bbb79aa050d1e560d17da66557afdbad2))
|
||||
|
||||
## [1.0.0](https://github.com/morluto/rea/compare/rea-agents-0.5.0...rea-agents-1.0.0) (2026-07-13)
|
||||
|
||||
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "rea-agents",
|
||||
"version": "1.0.0",
|
||||
"version": "1.1.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "rea-agents",
|
||||
"version": "1.0.0",
|
||||
"version": "1.1.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/parser": "8.0.4",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "rea-agents",
|
||||
"version": "1.0.0",
|
||||
"version": "1.1.0",
|
||||
"description": "Reverse engineer anything from your terminal or coding agent with one CLI and MCP server.",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
|
||||
@@ -83,8 +83,9 @@ export const writeEvidenceBundle = async (
|
||||
if (bytes > policy.maxBytes)
|
||||
return err(new EvidenceFileError("write", "too-large"));
|
||||
try {
|
||||
const canonicalParent = await realpath(dirname(resolve(path)));
|
||||
const destination = resolve(canonicalParent, basename(resolve(path)));
|
||||
const requestedPath = resolve(path);
|
||||
const canonicalParent = await realpath(dirname(requestedPath));
|
||||
const destination = resolve(canonicalParent, basename(requestedPath));
|
||||
if (!(await isApproved(destination, policy.roots)))
|
||||
return err(new EvidenceFileError("write", "outside-root"));
|
||||
const existing = await lstat(destination).catch((cause: unknown) => {
|
||||
@@ -101,7 +102,7 @@ export const writeEvidenceBundle = async (
|
||||
mode: 0o600,
|
||||
fsync: true,
|
||||
});
|
||||
return ok({ path: destination, bytes });
|
||||
return ok({ path: requestedPath, bytes });
|
||||
} catch (cause: unknown) {
|
||||
return err(new EvidenceFileError("write", "io", { cause }));
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join } from "node:path";
|
||||
import { dirname, join } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { Client, InMemoryTransport } from "@modelcontextprotocol/client";
|
||||
import type { CallToolResult } from "@modelcontextprotocol/server";
|
||||
import { afterEach, describe, expect, it } from "vitest";
|
||||
@@ -8,12 +9,16 @@ import { z } from "zod";
|
||||
|
||||
import { BinarySession } from "../src/application/BinarySession.js";
|
||||
import type { AnalysisClient } from "../src/application/AnalysisProvider.js";
|
||||
import { probeProcessCaptureCapability } from "../src/application/ProcessHarness.js";
|
||||
import { observed as ok } from "./fixtures/analysisExecution.js";
|
||||
import { createServer } from "../src/server/createServer.js";
|
||||
import { evidenceBundleSchema } from "../src/domain/evidenceBundle.js";
|
||||
import { silentLogger } from "../src/logger.js";
|
||||
|
||||
const resources: Array<{ close(): Promise<unknown> }> = [];
|
||||
const processFixture = fileURLToPath(
|
||||
new URL("./fixtures/processFidelity.mjs", import.meta.url),
|
||||
);
|
||||
let directory: string | undefined;
|
||||
afterEach(async () => {
|
||||
await Promise.all(resources.splice(0).map((resource) => resource.close()));
|
||||
@@ -173,13 +178,14 @@ describe("target-free MCP lifecycle", () => {
|
||||
}, 10_000);
|
||||
|
||||
it("records approved process residuals in the unknown registry", async () => {
|
||||
if (!(await probeProcessCaptureCapability()).available) return;
|
||||
const session = new BinarySession(() => client("fixture", []));
|
||||
const server = createServer(session, session, {
|
||||
logger: silentLogger,
|
||||
processPolicy: {
|
||||
enabled: true,
|
||||
executableRoots: ["/usr/bin"],
|
||||
workingRoots: ["/tmp"],
|
||||
executableRoots: [dirname(process.execPath)],
|
||||
workingRoots: [dirname(processFixture)],
|
||||
allowedEnvironment: [],
|
||||
allowExternalNetwork: true,
|
||||
},
|
||||
@@ -196,13 +202,13 @@ describe("target-free MCP lifecycle", () => {
|
||||
arguments: {
|
||||
approved: true,
|
||||
unknown_registry_approved: true,
|
||||
executable: "/usr/bin/printf",
|
||||
arguments: ["abcdef"],
|
||||
working_directory: "/tmp",
|
||||
executable: process.execPath,
|
||||
arguments: [processFixture, "partial"],
|
||||
working_directory: dirname(processFixture),
|
||||
limits: { output_bytes: 1 },
|
||||
},
|
||||
});
|
||||
expect(captured.isError).not.toBe(true);
|
||||
expect(captured.isError, text(captured)).not.toBe(true);
|
||||
const listed = z
|
||||
.object({
|
||||
result: z.array(z.object({ question: z.string(), domain: z.string() })),
|
||||
|
||||
Reference in New Issue
Block a user