genesis-ai-cli 7.4.5
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.
- package/.env.example +78 -0
- package/README.md +282 -0
- package/dist/src/active-inference/actions.d.ts +75 -0
- package/dist/src/active-inference/actions.js +250 -0
- package/dist/src/active-inference/autonomous-loop.d.ts +103 -0
- package/dist/src/active-inference/autonomous-loop.js +289 -0
- package/dist/src/active-inference/core.d.ts +85 -0
- package/dist/src/active-inference/core.js +555 -0
- package/dist/src/active-inference/demo-autonomous-loop.d.ts +8 -0
- package/dist/src/active-inference/demo-autonomous-loop.js +338 -0
- package/dist/src/active-inference/demo-value-integration.d.ts +8 -0
- package/dist/src/active-inference/demo-value-integration.js +174 -0
- package/dist/src/active-inference/index.d.ts +32 -0
- package/dist/src/active-inference/index.js +88 -0
- package/dist/src/active-inference/integration.d.ts +114 -0
- package/dist/src/active-inference/integration.js +698 -0
- package/dist/src/active-inference/memory-integration.d.ts +51 -0
- package/dist/src/active-inference/memory-integration.js +232 -0
- package/dist/src/active-inference/observations.d.ts +67 -0
- package/dist/src/active-inference/observations.js +147 -0
- package/dist/src/active-inference/test-active-inference.d.ts +8 -0
- package/dist/src/active-inference/test-active-inference.js +320 -0
- package/dist/src/active-inference/test-value-integration.d.ts +6 -0
- package/dist/src/active-inference/test-value-integration.js +168 -0
- package/dist/src/active-inference/types.d.ts +150 -0
- package/dist/src/active-inference/types.js +59 -0
- package/dist/src/active-inference/value-integration.d.ts +164 -0
- package/dist/src/active-inference/value-integration.js +459 -0
- package/dist/src/agents/base-agent.d.ts +53 -0
- package/dist/src/agents/base-agent.js +178 -0
- package/dist/src/agents/builder.d.ts +67 -0
- package/dist/src/agents/builder.js +537 -0
- package/dist/src/agents/critic.d.ts +35 -0
- package/dist/src/agents/critic.js +322 -0
- package/dist/src/agents/ethicist.d.ts +54 -0
- package/dist/src/agents/ethicist.js +393 -0
- package/dist/src/agents/explorer.d.ts +26 -0
- package/dist/src/agents/explorer.js +216 -0
- package/dist/src/agents/feeling.d.ts +41 -0
- package/dist/src/agents/feeling.js +320 -0
- package/dist/src/agents/index.d.ts +111 -0
- package/dist/src/agents/index.js +222 -0
- package/dist/src/agents/memory.d.ts +69 -0
- package/dist/src/agents/memory.js +404 -0
- package/dist/src/agents/message-bus.d.ts +88 -0
- package/dist/src/agents/message-bus.js +267 -0
- package/dist/src/agents/narrator.d.ts +90 -0
- package/dist/src/agents/narrator.js +473 -0
- package/dist/src/agents/planner.d.ts +38 -0
- package/dist/src/agents/planner.js +341 -0
- package/dist/src/agents/predictor.d.ts +73 -0
- package/dist/src/agents/predictor.js +506 -0
- package/dist/src/agents/sensor.d.ts +88 -0
- package/dist/src/agents/sensor.js +377 -0
- package/dist/src/agents/test-agents.d.ts +6 -0
- package/dist/src/agents/test-agents.js +73 -0
- package/dist/src/agents/types.d.ts +194 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/brain/index.d.ts +185 -0
- package/dist/src/brain/index.js +843 -0
- package/dist/src/brain/trace.d.ts +91 -0
- package/dist/src/brain/trace.js +327 -0
- package/dist/src/brain/types.d.ts +165 -0
- package/dist/src/brain/types.js +51 -0
- package/dist/src/cli/chat.d.ts +237 -0
- package/dist/src/cli/chat.js +1959 -0
- package/dist/src/cli/dispatcher.d.ts +182 -0
- package/dist/src/cli/dispatcher.js +718 -0
- package/dist/src/cli/human-loop.d.ts +170 -0
- package/dist/src/cli/human-loop.js +543 -0
- package/dist/src/cli/index.d.ts +12 -0
- package/dist/src/cli/index.js +28 -0
- package/dist/src/cli/interactive.d.ts +141 -0
- package/dist/src/cli/interactive.js +757 -0
- package/dist/src/cli/ui.d.ts +205 -0
- package/dist/src/cli/ui.js +632 -0
- package/dist/src/consciousness/attention-schema.d.ts +154 -0
- package/dist/src/consciousness/attention-schema.js +432 -0
- package/dist/src/consciousness/global-workspace.d.ts +149 -0
- package/dist/src/consciousness/global-workspace.js +422 -0
- package/dist/src/consciousness/index.d.ts +186 -0
- package/dist/src/consciousness/index.js +476 -0
- package/dist/src/consciousness/phi-calculator.d.ts +119 -0
- package/dist/src/consciousness/phi-calculator.js +445 -0
- package/dist/src/consciousness/phi-decisions.d.ts +169 -0
- package/dist/src/consciousness/phi-decisions.js +383 -0
- package/dist/src/consciousness/phi-monitor.d.ts +153 -0
- package/dist/src/consciousness/phi-monitor.js +465 -0
- package/dist/src/consciousness/types.d.ts +260 -0
- package/dist/src/consciousness/types.js +44 -0
- package/dist/src/daemon/dream-mode.d.ts +115 -0
- package/dist/src/daemon/dream-mode.js +470 -0
- package/dist/src/daemon/index.d.ts +162 -0
- package/dist/src/daemon/index.js +542 -0
- package/dist/src/daemon/maintenance.d.ts +139 -0
- package/dist/src/daemon/maintenance.js +549 -0
- package/dist/src/daemon/process.d.ts +82 -0
- package/dist/src/daemon/process.js +442 -0
- package/dist/src/daemon/scheduler.d.ts +90 -0
- package/dist/src/daemon/scheduler.js +494 -0
- package/dist/src/daemon/types.d.ts +213 -0
- package/dist/src/daemon/types.js +50 -0
- package/dist/src/epistemic/index.d.ts +74 -0
- package/dist/src/epistemic/index.js +225 -0
- package/dist/src/grounding/epistemic-stack.d.ts +100 -0
- package/dist/src/grounding/epistemic-stack.js +408 -0
- package/dist/src/grounding/feedback.d.ts +98 -0
- package/dist/src/grounding/feedback.js +276 -0
- package/dist/src/grounding/index.d.ts +123 -0
- package/dist/src/grounding/index.js +224 -0
- package/dist/src/grounding/verifier.d.ts +149 -0
- package/dist/src/grounding/verifier.js +484 -0
- package/dist/src/healing/detector.d.ts +110 -0
- package/dist/src/healing/detector.js +436 -0
- package/dist/src/healing/fixer.d.ts +138 -0
- package/dist/src/healing/fixer.js +572 -0
- package/dist/src/healing/index.d.ts +23 -0
- package/dist/src/healing/index.js +43 -0
- package/dist/src/hooks/index.d.ts +135 -0
- package/dist/src/hooks/index.js +317 -0
- package/dist/src/index.d.ts +23 -0
- package/dist/src/index.js +1266 -0
- package/dist/src/kernel/index.d.ts +155 -0
- package/dist/src/kernel/index.js +795 -0
- package/dist/src/kernel/invariants.d.ts +153 -0
- package/dist/src/kernel/invariants.js +355 -0
- package/dist/src/kernel/test-kernel.d.ts +6 -0
- package/dist/src/kernel/test-kernel.js +108 -0
- package/dist/src/kernel/test-real-mcp.d.ts +10 -0
- package/dist/src/kernel/test-real-mcp.js +295 -0
- package/dist/src/llm/index.d.ts +146 -0
- package/dist/src/llm/index.js +428 -0
- package/dist/src/llm/router.d.ts +136 -0
- package/dist/src/llm/router.js +510 -0
- package/dist/src/mcp/index.d.ts +85 -0
- package/dist/src/mcp/index.js +657 -0
- package/dist/src/mcp/resilient.d.ts +139 -0
- package/dist/src/mcp/resilient.js +417 -0
- package/dist/src/memory/cache.d.ts +118 -0
- package/dist/src/memory/cache.js +356 -0
- package/dist/src/memory/cognitive-workspace.d.ts +231 -0
- package/dist/src/memory/cognitive-workspace.js +521 -0
- package/dist/src/memory/consolidation.d.ts +99 -0
- package/dist/src/memory/consolidation.js +443 -0
- package/dist/src/memory/episodic.d.ts +114 -0
- package/dist/src/memory/episodic.js +394 -0
- package/dist/src/memory/forgetting.d.ts +134 -0
- package/dist/src/memory/forgetting.js +324 -0
- package/dist/src/memory/index.d.ts +211 -0
- package/dist/src/memory/index.js +367 -0
- package/dist/src/memory/indexer.d.ts +123 -0
- package/dist/src/memory/indexer.js +479 -0
- package/dist/src/memory/procedural.d.ts +136 -0
- package/dist/src/memory/procedural.js +479 -0
- package/dist/src/memory/semantic.d.ts +132 -0
- package/dist/src/memory/semantic.js +497 -0
- package/dist/src/memory/types.d.ts +193 -0
- package/dist/src/memory/types.js +15 -0
- package/dist/src/orchestrator.d.ts +65 -0
- package/dist/src/orchestrator.js +317 -0
- package/dist/src/persistence/index.d.ts +257 -0
- package/dist/src/persistence/index.js +763 -0
- package/dist/src/pipeline/executor.d.ts +51 -0
- package/dist/src/pipeline/executor.js +695 -0
- package/dist/src/pipeline/index.d.ts +7 -0
- package/dist/src/pipeline/index.js +11 -0
- package/dist/src/self-production.d.ts +67 -0
- package/dist/src/self-production.js +205 -0
- package/dist/src/subagents/executor.d.ts +58 -0
- package/dist/src/subagents/executor.js +283 -0
- package/dist/src/subagents/index.d.ts +37 -0
- package/dist/src/subagents/index.js +53 -0
- package/dist/src/subagents/registry.d.ts +23 -0
- package/dist/src/subagents/registry.js +167 -0
- package/dist/src/subagents/types.d.ts +79 -0
- package/dist/src/subagents/types.js +14 -0
- package/dist/src/tools/bash.d.ts +139 -0
- package/dist/src/tools/bash.js +583 -0
- package/dist/src/tools/edit.d.ts +125 -0
- package/dist/src/tools/edit.js +424 -0
- package/dist/src/tools/git.d.ts +179 -0
- package/dist/src/tools/git.js +504 -0
- package/dist/src/tools/index.d.ts +21 -0
- package/dist/src/tools/index.js +163 -0
- package/dist/src/types.d.ts +145 -0
- package/dist/src/types.js +7 -0
- package/dist/src/world-model/decoder.d.ts +163 -0
- package/dist/src/world-model/decoder.js +517 -0
- package/dist/src/world-model/digital-twin.d.ts +219 -0
- package/dist/src/world-model/digital-twin.js +695 -0
- package/dist/src/world-model/encoder.d.ts +141 -0
- package/dist/src/world-model/encoder.js +564 -0
- package/dist/src/world-model/index.d.ts +221 -0
- package/dist/src/world-model/index.js +772 -0
- package/dist/src/world-model/predictor.d.ts +161 -0
- package/dist/src/world-model/predictor.js +681 -0
- package/dist/src/world-model/test-value-jepa.d.ts +8 -0
- package/dist/src/world-model/test-value-jepa.js +430 -0
- package/dist/src/world-model/types.d.ts +341 -0
- package/dist/src/world-model/types.js +69 -0
- package/dist/src/world-model/value-jepa.d.ts +247 -0
- package/dist/src/world-model/value-jepa.js +622 -0
- package/dist/test/brain.test.d.ts +11 -0
- package/dist/test/brain.test.js +358 -0
- package/dist/test/cli/dispatcher.test.d.ts +4 -0
- package/dist/test/cli/dispatcher.test.js +332 -0
- package/dist/test/cli/human-loop.test.d.ts +4 -0
- package/dist/test/cli/human-loop.test.js +270 -0
- package/dist/test/grounding/feedback.test.d.ts +4 -0
- package/dist/test/grounding/feedback.test.js +462 -0
- package/dist/test/grounding/verifier.test.d.ts +4 -0
- package/dist/test/grounding/verifier.test.js +442 -0
- package/dist/test/grounding.test.d.ts +6 -0
- package/dist/test/grounding.test.js +246 -0
- package/dist/test/healing/detector.test.d.ts +4 -0
- package/dist/test/healing/detector.test.js +266 -0
- package/dist/test/healing/fixer.test.d.ts +4 -0
- package/dist/test/healing/fixer.test.js +369 -0
- package/dist/test/integration.test.d.ts +5 -0
- package/dist/test/integration.test.js +290 -0
- package/dist/test/tools/bash.test.d.ts +4 -0
- package/dist/test/tools/bash.test.js +348 -0
- package/dist/test/tools/edit.test.d.ts +4 -0
- package/dist/test/tools/edit.test.js +350 -0
- package/dist/test/tools/git.test.d.ts +4 -0
- package/dist/test/tools/git.test.js +350 -0
- package/package.json +60 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for Genesis Diff-Based File Editor
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
const node_test_1 = require("node:test");
|
|
43
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const edit_js_1 = require("../../src/tools/edit.js");
|
|
47
|
+
// Test directory
|
|
48
|
+
const TEST_DIR = '/tmp/genesis-edit-test-' + Date.now();
|
|
49
|
+
(0, node_test_1.describe)('EditTool', () => {
|
|
50
|
+
(0, node_test_1.before)(() => {
|
|
51
|
+
fs.mkdirSync(TEST_DIR, { recursive: true });
|
|
52
|
+
(0, edit_js_1.resetEditTool)();
|
|
53
|
+
});
|
|
54
|
+
(0, node_test_1.after)(() => {
|
|
55
|
+
fs.rmSync(TEST_DIR, { recursive: true, force: true });
|
|
56
|
+
(0, edit_js_1.resetEditTool)();
|
|
57
|
+
});
|
|
58
|
+
(0, node_test_1.beforeEach)(() => {
|
|
59
|
+
// Clean test directory before each test
|
|
60
|
+
const files = fs.readdirSync(TEST_DIR);
|
|
61
|
+
for (const file of files) {
|
|
62
|
+
fs.rmSync(path.join(TEST_DIR, file), { force: true, recursive: true });
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// ==========================================================================
|
|
66
|
+
// Path Validation Tests
|
|
67
|
+
// ==========================================================================
|
|
68
|
+
(0, node_test_1.describe)('Path Validation', () => {
|
|
69
|
+
(0, node_test_1.it)('should accept absolute paths', () => {
|
|
70
|
+
const result = (0, edit_js_1.validatePath)('/tmp/test.txt');
|
|
71
|
+
node_assert_1.default.strictEqual(result.valid, true);
|
|
72
|
+
});
|
|
73
|
+
(0, node_test_1.it)('should reject relative paths', () => {
|
|
74
|
+
const result = (0, edit_js_1.validatePath)('relative/path.txt');
|
|
75
|
+
node_assert_1.default.strictEqual(result.valid, false);
|
|
76
|
+
node_assert_1.default.ok(result.reason?.includes('absolute'));
|
|
77
|
+
});
|
|
78
|
+
(0, node_test_1.it)('should block .git directory', () => {
|
|
79
|
+
const result = (0, edit_js_1.validatePath)('/project/.git/config');
|
|
80
|
+
node_assert_1.default.strictEqual(result.valid, false);
|
|
81
|
+
node_assert_1.default.ok(result.reason?.includes('blocked'));
|
|
82
|
+
});
|
|
83
|
+
(0, node_test_1.it)('should block node_modules', () => {
|
|
84
|
+
const result = (0, edit_js_1.validatePath)('/project/node_modules/package/index.js');
|
|
85
|
+
node_assert_1.default.strictEqual(result.valid, false);
|
|
86
|
+
});
|
|
87
|
+
(0, node_test_1.it)('should block .env files', () => {
|
|
88
|
+
const result = (0, edit_js_1.validatePath)('/project/.env');
|
|
89
|
+
node_assert_1.default.strictEqual(result.valid, false);
|
|
90
|
+
});
|
|
91
|
+
(0, node_test_1.it)('should block secrets files', () => {
|
|
92
|
+
const result = (0, edit_js_1.validatePath)('/project/secrets.json');
|
|
93
|
+
node_assert_1.default.strictEqual(result.valid, false);
|
|
94
|
+
});
|
|
95
|
+
(0, node_test_1.it)('should allow normal project files', () => {
|
|
96
|
+
node_assert_1.default.strictEqual((0, edit_js_1.validatePath)('/project/src/index.ts').valid, true);
|
|
97
|
+
node_assert_1.default.strictEqual((0, edit_js_1.validatePath)('/project/package.json').valid, true);
|
|
98
|
+
node_assert_1.default.strictEqual((0, edit_js_1.validatePath)('/project/README.md').valid, true);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
// ==========================================================================
|
|
102
|
+
// Edit Tests
|
|
103
|
+
// ==========================================================================
|
|
104
|
+
(0, node_test_1.describe)('Edit Operations', () => {
|
|
105
|
+
(0, node_test_1.it)('should replace unique string', async () => {
|
|
106
|
+
const filePath = path.join(TEST_DIR, 'test1.txt');
|
|
107
|
+
fs.writeFileSync(filePath, 'Hello World');
|
|
108
|
+
const result = await (0, edit_js_1.edit)({
|
|
109
|
+
file_path: filePath,
|
|
110
|
+
old_string: 'World',
|
|
111
|
+
new_string: 'Genesis',
|
|
112
|
+
});
|
|
113
|
+
node_assert_1.default.strictEqual(result.success, true);
|
|
114
|
+
node_assert_1.default.strictEqual(result.replacements, 1);
|
|
115
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
116
|
+
node_assert_1.default.strictEqual(content, 'Hello Genesis');
|
|
117
|
+
});
|
|
118
|
+
(0, node_test_1.it)('should fail when old_string not found', async () => {
|
|
119
|
+
const filePath = path.join(TEST_DIR, 'test2.txt');
|
|
120
|
+
fs.writeFileSync(filePath, 'Hello World');
|
|
121
|
+
const result = await (0, edit_js_1.edit)({
|
|
122
|
+
file_path: filePath,
|
|
123
|
+
old_string: 'NotFound',
|
|
124
|
+
new_string: 'Replacement',
|
|
125
|
+
});
|
|
126
|
+
node_assert_1.default.strictEqual(result.success, false);
|
|
127
|
+
node_assert_1.default.ok(result.error?.includes('not found'));
|
|
128
|
+
});
|
|
129
|
+
(0, node_test_1.it)('should fail when old_string is not unique without replace_all', async () => {
|
|
130
|
+
const filePath = path.join(TEST_DIR, 'test3.txt');
|
|
131
|
+
fs.writeFileSync(filePath, 'Hello Hello Hello');
|
|
132
|
+
const result = await (0, edit_js_1.edit)({
|
|
133
|
+
file_path: filePath,
|
|
134
|
+
old_string: 'Hello',
|
|
135
|
+
new_string: 'Hi',
|
|
136
|
+
});
|
|
137
|
+
node_assert_1.default.strictEqual(result.success, false);
|
|
138
|
+
node_assert_1.default.ok(result.error?.includes('3 times'));
|
|
139
|
+
});
|
|
140
|
+
(0, node_test_1.it)('should replace all when replace_all is true', async () => {
|
|
141
|
+
const filePath = path.join(TEST_DIR, 'test4.txt');
|
|
142
|
+
fs.writeFileSync(filePath, 'Hello Hello Hello');
|
|
143
|
+
const result = await (0, edit_js_1.edit)({
|
|
144
|
+
file_path: filePath,
|
|
145
|
+
old_string: 'Hello',
|
|
146
|
+
new_string: 'Hi',
|
|
147
|
+
replace_all: true,
|
|
148
|
+
});
|
|
149
|
+
node_assert_1.default.strictEqual(result.success, true);
|
|
150
|
+
node_assert_1.default.strictEqual(result.replacements, 3);
|
|
151
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
152
|
+
node_assert_1.default.strictEqual(content, 'Hi Hi Hi');
|
|
153
|
+
});
|
|
154
|
+
(0, node_test_1.it)('should preserve indentation', async () => {
|
|
155
|
+
const filePath = path.join(TEST_DIR, 'test5.txt');
|
|
156
|
+
const original = ' function hello() {\n console.log("hi");\n }';
|
|
157
|
+
fs.writeFileSync(filePath, original);
|
|
158
|
+
const result = await (0, edit_js_1.edit)({
|
|
159
|
+
file_path: filePath,
|
|
160
|
+
old_string: 'console.log("hi");',
|
|
161
|
+
new_string: 'console.log("hello world!");',
|
|
162
|
+
});
|
|
163
|
+
node_assert_1.default.strictEqual(result.success, true);
|
|
164
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
165
|
+
node_assert_1.default.ok(content.includes(' console.log("hello world!");'));
|
|
166
|
+
});
|
|
167
|
+
(0, node_test_1.it)('should create backup', async () => {
|
|
168
|
+
const filePath = path.join(TEST_DIR, 'test6.txt');
|
|
169
|
+
fs.writeFileSync(filePath, 'Original content');
|
|
170
|
+
const result = await (0, edit_js_1.edit)({
|
|
171
|
+
file_path: filePath,
|
|
172
|
+
old_string: 'Original',
|
|
173
|
+
new_string: 'Modified',
|
|
174
|
+
});
|
|
175
|
+
node_assert_1.default.strictEqual(result.success, true);
|
|
176
|
+
node_assert_1.default.ok(result.backup);
|
|
177
|
+
node_assert_1.default.ok(fs.existsSync(result.backup));
|
|
178
|
+
const backupContent = fs.readFileSync(result.backup, 'utf-8');
|
|
179
|
+
node_assert_1.default.strictEqual(backupContent, 'Original content');
|
|
180
|
+
});
|
|
181
|
+
(0, node_test_1.it)('should fail when old_string equals new_string', async () => {
|
|
182
|
+
const filePath = path.join(TEST_DIR, 'test7.txt');
|
|
183
|
+
fs.writeFileSync(filePath, 'Hello World');
|
|
184
|
+
const result = await (0, edit_js_1.edit)({
|
|
185
|
+
file_path: filePath,
|
|
186
|
+
old_string: 'Hello',
|
|
187
|
+
new_string: 'Hello',
|
|
188
|
+
});
|
|
189
|
+
node_assert_1.default.strictEqual(result.success, false);
|
|
190
|
+
node_assert_1.default.ok(result.error?.includes('different'));
|
|
191
|
+
});
|
|
192
|
+
(0, node_test_1.it)('should fail for non-existent file', async () => {
|
|
193
|
+
const result = await (0, edit_js_1.edit)({
|
|
194
|
+
file_path: path.join(TEST_DIR, 'nonexistent.txt'),
|
|
195
|
+
old_string: 'test',
|
|
196
|
+
new_string: 'replacement',
|
|
197
|
+
});
|
|
198
|
+
node_assert_1.default.strictEqual(result.success, false);
|
|
199
|
+
node_assert_1.default.ok(result.error?.includes('not found'));
|
|
200
|
+
});
|
|
201
|
+
(0, node_test_1.it)('should handle multi-line replacements', async () => {
|
|
202
|
+
const filePath = path.join(TEST_DIR, 'test8.txt');
|
|
203
|
+
fs.writeFileSync(filePath, 'function hello() {\n return 1;\n}');
|
|
204
|
+
const result = await (0, edit_js_1.edit)({
|
|
205
|
+
file_path: filePath,
|
|
206
|
+
old_string: 'function hello() {\n return 1;\n}',
|
|
207
|
+
new_string: 'const hello = () => 2;',
|
|
208
|
+
});
|
|
209
|
+
node_assert_1.default.strictEqual(result.success, true);
|
|
210
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
211
|
+
node_assert_1.default.strictEqual(content, 'const hello = () => 2;');
|
|
212
|
+
});
|
|
213
|
+
(0, node_test_1.it)('should generate diff preview', async () => {
|
|
214
|
+
const filePath = path.join(TEST_DIR, 'test9.txt');
|
|
215
|
+
fs.writeFileSync(filePath, 'Hello World');
|
|
216
|
+
const result = await (0, edit_js_1.edit)({
|
|
217
|
+
file_path: filePath,
|
|
218
|
+
old_string: 'World',
|
|
219
|
+
new_string: 'Genesis',
|
|
220
|
+
});
|
|
221
|
+
node_assert_1.default.strictEqual(result.success, true);
|
|
222
|
+
node_assert_1.default.ok(result.diff);
|
|
223
|
+
node_assert_1.default.ok(result.diff.includes('- World'));
|
|
224
|
+
node_assert_1.default.ok(result.diff.includes('+ Genesis'));
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
// ==========================================================================
|
|
228
|
+
// Write Tests
|
|
229
|
+
// ==========================================================================
|
|
230
|
+
(0, node_test_1.describe)('Write Operations', () => {
|
|
231
|
+
(0, node_test_1.it)('should write new file', async () => {
|
|
232
|
+
const filePath = path.join(TEST_DIR, 'new-file.txt');
|
|
233
|
+
const result = await (0, edit_js_1.writeFile)({
|
|
234
|
+
file_path: filePath,
|
|
235
|
+
content: 'New content',
|
|
236
|
+
});
|
|
237
|
+
node_assert_1.default.strictEqual(result.success, true);
|
|
238
|
+
node_assert_1.default.ok(result.bytes_written > 0);
|
|
239
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
240
|
+
node_assert_1.default.strictEqual(content, 'New content');
|
|
241
|
+
});
|
|
242
|
+
(0, node_test_1.it)('should overwrite existing file with backup', async () => {
|
|
243
|
+
const filePath = path.join(TEST_DIR, 'existing.txt');
|
|
244
|
+
fs.writeFileSync(filePath, 'Old content');
|
|
245
|
+
const result = await (0, edit_js_1.writeFile)({
|
|
246
|
+
file_path: filePath,
|
|
247
|
+
content: 'New content',
|
|
248
|
+
backup: true,
|
|
249
|
+
});
|
|
250
|
+
node_assert_1.default.strictEqual(result.success, true);
|
|
251
|
+
node_assert_1.default.ok(result.backup);
|
|
252
|
+
node_assert_1.default.ok(fs.existsSync(result.backup));
|
|
253
|
+
const backupContent = fs.readFileSync(result.backup, 'utf-8');
|
|
254
|
+
node_assert_1.default.strictEqual(backupContent, 'Old content');
|
|
255
|
+
});
|
|
256
|
+
(0, node_test_1.it)('should create parent directories', async () => {
|
|
257
|
+
const filePath = path.join(TEST_DIR, 'deep', 'nested', 'dir', 'file.txt');
|
|
258
|
+
const result = await (0, edit_js_1.writeFile)({
|
|
259
|
+
file_path: filePath,
|
|
260
|
+
content: 'Nested content',
|
|
261
|
+
});
|
|
262
|
+
node_assert_1.default.strictEqual(result.success, true);
|
|
263
|
+
node_assert_1.default.ok(fs.existsSync(filePath));
|
|
264
|
+
});
|
|
265
|
+
(0, node_test_1.it)('should reject blocked paths', async () => {
|
|
266
|
+
const result = await (0, edit_js_1.writeFile)({
|
|
267
|
+
file_path: '/project/.env',
|
|
268
|
+
content: 'SECRET=value',
|
|
269
|
+
});
|
|
270
|
+
node_assert_1.default.strictEqual(result.success, false);
|
|
271
|
+
node_assert_1.default.ok(result.error?.includes('blocked'));
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
// ==========================================================================
|
|
275
|
+
// Utility Tests
|
|
276
|
+
// ==========================================================================
|
|
277
|
+
(0, node_test_1.describe)('Utilities', () => {
|
|
278
|
+
(0, node_test_1.it)('isUnique should return true for unique string', () => {
|
|
279
|
+
const filePath = path.join(TEST_DIR, 'unique.txt');
|
|
280
|
+
fs.writeFileSync(filePath, 'Hello World');
|
|
281
|
+
node_assert_1.default.strictEqual((0, edit_js_1.isUnique)(filePath, 'World'), true);
|
|
282
|
+
});
|
|
283
|
+
(0, node_test_1.it)('isUnique should return false for repeated string', () => {
|
|
284
|
+
const filePath = path.join(TEST_DIR, 'repeated.txt');
|
|
285
|
+
fs.writeFileSync(filePath, 'Hello Hello');
|
|
286
|
+
node_assert_1.default.strictEqual((0, edit_js_1.isUnique)(filePath, 'Hello'), false);
|
|
287
|
+
});
|
|
288
|
+
(0, node_test_1.it)('isUnique should return false for non-existent file', () => {
|
|
289
|
+
node_assert_1.default.strictEqual((0, edit_js_1.isUnique)('/nonexistent.txt', 'test'), false);
|
|
290
|
+
});
|
|
291
|
+
(0, node_test_1.it)('findOccurrences should return correct positions', () => {
|
|
292
|
+
const tool = (0, edit_js_1.getEditTool)();
|
|
293
|
+
const content = 'line1 test\nline2 test\nline3';
|
|
294
|
+
const occurrences = tool.findOccurrences(content, 'test');
|
|
295
|
+
node_assert_1.default.strictEqual(occurrences.length, 2);
|
|
296
|
+
node_assert_1.default.strictEqual(occurrences[0].line, 1);
|
|
297
|
+
node_assert_1.default.strictEqual(occurrences[1].line, 2);
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
// ==========================================================================
|
|
301
|
+
// Configuration Tests
|
|
302
|
+
// ==========================================================================
|
|
303
|
+
(0, node_test_1.describe)('Configuration', () => {
|
|
304
|
+
(0, node_test_1.it)('should have sensible defaults', () => {
|
|
305
|
+
node_assert_1.default.strictEqual(edit_js_1.DEFAULT_EDIT_CONFIG.createBackups, true);
|
|
306
|
+
node_assert_1.default.strictEqual(edit_js_1.DEFAULT_EDIT_CONFIG.backupSuffix, '.bak');
|
|
307
|
+
node_assert_1.default.strictEqual(edit_js_1.DEFAULT_EDIT_CONFIG.maxFileSize, 10 * 1024 * 1024);
|
|
308
|
+
});
|
|
309
|
+
(0, node_test_1.it)('should allow custom configuration', () => {
|
|
310
|
+
const tool = new edit_js_1.EditTool({ createBackups: false });
|
|
311
|
+
const config = tool.getConfig();
|
|
312
|
+
node_assert_1.default.strictEqual(config.createBackups, false);
|
|
313
|
+
});
|
|
314
|
+
(0, node_test_1.it)('should update configuration', () => {
|
|
315
|
+
const tool = (0, edit_js_1.getEditTool)();
|
|
316
|
+
tool.updateConfig({ backupSuffix: '.backup' });
|
|
317
|
+
const config = tool.getConfig();
|
|
318
|
+
node_assert_1.default.strictEqual(config.backupSuffix, '.backup');
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
// ==========================================================================
|
|
322
|
+
// Integration Tests
|
|
323
|
+
// ==========================================================================
|
|
324
|
+
(0, node_test_1.describe)('Integration', () => {
|
|
325
|
+
(0, node_test_1.it)('should be in tool registry', async () => {
|
|
326
|
+
const { toolRegistry } = await import('../../src/tools/index.js');
|
|
327
|
+
node_assert_1.default.ok(toolRegistry.has('edit'));
|
|
328
|
+
node_assert_1.default.ok(toolRegistry.has('write'));
|
|
329
|
+
const editTool = toolRegistry.get('edit');
|
|
330
|
+
node_assert_1.default.ok(editTool);
|
|
331
|
+
node_assert_1.default.strictEqual(editTool.name, 'edit');
|
|
332
|
+
const writeTool = toolRegistry.get('write');
|
|
333
|
+
node_assert_1.default.ok(writeTool);
|
|
334
|
+
node_assert_1.default.strictEqual(writeTool.name, 'write');
|
|
335
|
+
});
|
|
336
|
+
(0, node_test_1.it)('should execute via tool registry', async () => {
|
|
337
|
+
const { toolRegistry } = await import('../../src/tools/index.js');
|
|
338
|
+
const filePath = path.join(TEST_DIR, 'registry-test.txt');
|
|
339
|
+
fs.writeFileSync(filePath, 'Hello Registry');
|
|
340
|
+
const editTool = toolRegistry.get('edit');
|
|
341
|
+
const result = await editTool?.execute({
|
|
342
|
+
file_path: filePath,
|
|
343
|
+
old_string: 'Registry',
|
|
344
|
+
new_string: 'World',
|
|
345
|
+
});
|
|
346
|
+
node_assert_1.default.ok(result);
|
|
347
|
+
node_assert_1.default.strictEqual(result.success, true);
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
});
|