agent-recorder 0.0.9 → 0.0.10
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/package.json +1 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/configure-wrap.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/configure-wrap.js +5 -31
- package/vendor/node_modules/@agent-recorder/cli/commands/configure-wrap.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/configure.d.ts +2 -0
- package/vendor/node_modules/@agent-recorder/cli/commands/configure.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/configure.js +117 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/configure.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/doctor.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/doctor.js +113 -19
- package/vendor/node_modules/@agent-recorder/cli/commands/doctor.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/doctor.test.d.ts +5 -0
- package/vendor/node_modules/@agent-recorder/cli/commands/doctor.test.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/cli/commands/doctor.test.js +152 -0
- package/vendor/node_modules/@agent-recorder/cli/commands/doctor.test.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/cli/commands/install.d.ts +7 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/install.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/install.js +89 -14
- package/vendor/node_modules/@agent-recorder/cli/commands/install.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/install.test.d.ts +5 -0
- package/vendor/node_modules/@agent-recorder/cli/commands/install.test.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/cli/commands/install.test.js +173 -0
- package/vendor/node_modules/@agent-recorder/cli/commands/install.test.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/cli/config/hubify.d.ts +51 -0
- package/vendor/node_modules/@agent-recorder/cli/config/hubify.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/cli/config/hubify.js +125 -0
- package/vendor/node_modules/@agent-recorder/cli/config/hubify.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/cli/config/hubify.test.d.ts +5 -0
- package/vendor/node_modules/@agent-recorder/cli/config/hubify.test.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/cli/config/hubify.test.js +329 -0
- package/vendor/node_modules/@agent-recorder/cli/config/hubify.test.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/cli/index.js +7 -3
- package/vendor/node_modules/@agent-recorder/cli/index.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts +32 -0
- package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/claude-config.js +65 -0
- package/vendor/node_modules/@agent-recorder/core/claude-config.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/index.d.ts +3 -0
- package/vendor/node_modules/@agent-recorder/core/index.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/index.js +3 -0
- package/vendor/node_modules/@agent-recorder/core/index.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/providers/index.d.ts +9 -0
- package/vendor/node_modules/@agent-recorder/core/providers/index.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/providers/index.js +9 -0
- package/vendor/node_modules/@agent-recorder/core/providers/index.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/providers/io.d.ts +36 -0
- package/vendor/node_modules/@agent-recorder/core/providers/io.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/providers/io.js +88 -0
- package/vendor/node_modules/@agent-recorder/core/providers/io.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/providers/io.test.d.ts +5 -0
- package/vendor/node_modules/@agent-recorder/core/providers/io.test.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/providers/io.test.js +248 -0
- package/vendor/node_modules/@agent-recorder/core/providers/io.test.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/providers/types.d.ts +36 -0
- package/vendor/node_modules/@agent-recorder/core/providers/types.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/providers/types.js +6 -0
- package/vendor/node_modules/@agent-recorder/core/providers/types.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/wrap-utils.d.ts +42 -0
- package/vendor/node_modules/@agent-recorder/core/wrap-utils.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/wrap-utils.js +80 -0
- package/vendor/node_modules/@agent-recorder/core/wrap-utils.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/index.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/index.js +19 -0
- package/vendor/node_modules/@agent-recorder/service/index.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/auto-wrap-manager.d.ts +43 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/auto-wrap-manager.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/auto-wrap-manager.js +221 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/auto-wrap-manager.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/hub.test.d.ts +6 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/hub.test.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/hub.test.js +319 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/hub.test.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts +1 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js +239 -34
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/events.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/events.js +1 -0
- package/vendor/node_modules/@agent-recorder/service/routes/events.js.map +1 -1
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for doctor command hub mode integration.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
5
|
+
import { doctorCommand } from "./doctor.js";
|
|
6
|
+
import * as fs from "node:fs";
|
|
7
|
+
import * as os from "node:os";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
describe("Doctor Command - Hub Mode", () => {
|
|
10
|
+
let tempDir;
|
|
11
|
+
let originalHome;
|
|
12
|
+
let consoleLogSpy;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
// Create temp directory to act as home
|
|
15
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "ar-doctor-test-"));
|
|
16
|
+
originalHome = process.env.HOME || "";
|
|
17
|
+
process.env.HOME = tempDir;
|
|
18
|
+
// Spy on console.log to capture output
|
|
19
|
+
consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
20
|
+
// Create .agent-recorder directory
|
|
21
|
+
const dataDir = path.join(tempDir, ".agent-recorder");
|
|
22
|
+
fs.mkdirSync(dataDir, { recursive: true });
|
|
23
|
+
});
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
// Restore original HOME
|
|
26
|
+
process.env.HOME = originalHome;
|
|
27
|
+
// Restore console.log
|
|
28
|
+
consoleLogSpy.mockRestore();
|
|
29
|
+
// Cleanup temp directory
|
|
30
|
+
if (fs.existsSync(tempDir)) {
|
|
31
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
it("shows hub mode disabled when no providers exist", async () => {
|
|
35
|
+
// Run doctor command (will exit with error code, but we capture output)
|
|
36
|
+
try {
|
|
37
|
+
await doctorCommand();
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Expected to fail since daemon isn't running
|
|
41
|
+
}
|
|
42
|
+
// Get all console.log calls
|
|
43
|
+
const output = consoleLogSpy.mock.calls.map((call) => call[0]).join("\n");
|
|
44
|
+
// Verify hub mode section exists
|
|
45
|
+
expect(output).toContain("Hub Mode");
|
|
46
|
+
expect(output).toContain("Status: disabled");
|
|
47
|
+
expect(output).toContain("(no HTTP providers configured)");
|
|
48
|
+
});
|
|
49
|
+
it("shows hub mode enabled when HTTP providers exist", async () => {
|
|
50
|
+
// Create providers.json with HTTP providers
|
|
51
|
+
const dataDir = path.join(tempDir, ".agent-recorder");
|
|
52
|
+
const providersPath = path.join(dataDir, "providers.json");
|
|
53
|
+
const providersData = {
|
|
54
|
+
version: 1,
|
|
55
|
+
providers: [
|
|
56
|
+
{
|
|
57
|
+
id: "github",
|
|
58
|
+
type: "http",
|
|
59
|
+
url: "http://127.0.0.1:9999/",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: "playwright",
|
|
63
|
+
type: "stdio",
|
|
64
|
+
command: "npx",
|
|
65
|
+
args: ["-y", "@playwright/mcp"],
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
fs.writeFileSync(providersPath, JSON.stringify(providersData, null, 2));
|
|
70
|
+
// Run doctor command
|
|
71
|
+
try {
|
|
72
|
+
await doctorCommand();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Expected to fail since daemon isn't running
|
|
76
|
+
}
|
|
77
|
+
// Get all console.log calls
|
|
78
|
+
const output = consoleLogSpy.mock.calls.map((call) => call[0]).join("\n");
|
|
79
|
+
// Verify hub mode section shows enabled
|
|
80
|
+
expect(output).toContain("Hub Mode");
|
|
81
|
+
expect(output).toContain("Status: enabled");
|
|
82
|
+
expect(output).toContain("Total: 2");
|
|
83
|
+
expect(output).toContain("HTTP: 1");
|
|
84
|
+
expect(output).toContain("Reachable: 0/1"); // Provider not actually running
|
|
85
|
+
});
|
|
86
|
+
it("suggests hubify when Claude config exists but is not hubified", async () => {
|
|
87
|
+
// Create providers.json
|
|
88
|
+
const dataDir = path.join(tempDir, ".agent-recorder");
|
|
89
|
+
const providersPath = path.join(dataDir, "providers.json");
|
|
90
|
+
fs.writeFileSync(providersPath, JSON.stringify({
|
|
91
|
+
version: 1,
|
|
92
|
+
providers: [
|
|
93
|
+
{ id: "github", type: "http", url: "http://127.0.0.1:9999/" },
|
|
94
|
+
],
|
|
95
|
+
}));
|
|
96
|
+
// Create non-hubified Claude config
|
|
97
|
+
const claudeDir = path.join(tempDir, ".claude");
|
|
98
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
99
|
+
const claudeConfigPath = path.join(claudeDir, "settings.json");
|
|
100
|
+
fs.writeFileSync(claudeConfigPath, JSON.stringify({
|
|
101
|
+
mcpServers: {
|
|
102
|
+
github: { url: "http://127.0.0.1:3000/" },
|
|
103
|
+
playwright: { command: "npx", args: ["@playwright/mcp"] },
|
|
104
|
+
},
|
|
105
|
+
}));
|
|
106
|
+
// Run doctor command
|
|
107
|
+
try {
|
|
108
|
+
await doctorCommand();
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Expected to fail
|
|
112
|
+
}
|
|
113
|
+
// Get all console.log calls
|
|
114
|
+
const output = consoleLogSpy.mock.calls.map((call) => call[0]).join("\n");
|
|
115
|
+
// Verify it shows not hubified
|
|
116
|
+
expect(output).toContain("Claude Config: not hubified");
|
|
117
|
+
expect(output).toContain("Suggested Actions");
|
|
118
|
+
expect(output).toContain("install (or configure claude --hubify)");
|
|
119
|
+
});
|
|
120
|
+
it("does not suggest hubify when Claude config is hubified", async () => {
|
|
121
|
+
// Create providers.json
|
|
122
|
+
const dataDir = path.join(tempDir, ".agent-recorder");
|
|
123
|
+
const providersPath = path.join(dataDir, "providers.json");
|
|
124
|
+
fs.writeFileSync(providersPath, JSON.stringify({
|
|
125
|
+
version: 1,
|
|
126
|
+
providers: [
|
|
127
|
+
{ id: "github", type: "http", url: "http://127.0.0.1:9999/" },
|
|
128
|
+
],
|
|
129
|
+
}));
|
|
130
|
+
// Create hubified Claude config (only agent-recorder entry)
|
|
131
|
+
const claudeDir = path.join(tempDir, ".claude");
|
|
132
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
133
|
+
const claudeConfigPath = path.join(claudeDir, "settings.json");
|
|
134
|
+
fs.writeFileSync(claudeConfigPath, JSON.stringify({
|
|
135
|
+
mcpServers: {
|
|
136
|
+
"agent-recorder": { url: "http://127.0.0.1:8788/" },
|
|
137
|
+
},
|
|
138
|
+
}));
|
|
139
|
+
// Run doctor command
|
|
140
|
+
try {
|
|
141
|
+
await doctorCommand();
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Expected to fail
|
|
145
|
+
}
|
|
146
|
+
// Get all console.log calls
|
|
147
|
+
const output = consoleLogSpy.mock.calls.map((call) => call[0]).join("\n");
|
|
148
|
+
// Verify it does NOT show "not hubified"
|
|
149
|
+
expect(output).not.toContain("Claude Config: not hubified");
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=doctor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../src/commands/doctor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Install command - set up ~/.agent-recorder/ and print configuration.
|
|
3
3
|
* This command is idempotent - it won't overwrite existing files.
|
|
4
|
+
* Automatically configures Claude Code with hubify mode unless --no-configure is specified.
|
|
4
5
|
*/
|
|
6
|
+
export interface InstallOptions {
|
|
7
|
+
/** Skip automatic Claude Code configuration (default: false) */
|
|
8
|
+
noConfigure?: boolean;
|
|
9
|
+
}
|
|
5
10
|
/**
|
|
6
11
|
* Install Agent Recorder - create data directory and env file template.
|
|
7
12
|
* This command is idempotent:
|
|
8
13
|
* - Creates ~/.agent-recorder/ if it doesn't exist
|
|
9
14
|
* - Creates ~/.agent-recorder/.env ONLY if it doesn't exist
|
|
10
15
|
* - Never overwrites user files
|
|
16
|
+
* - Automatically configures Claude Code with hubify mode unless --no-configure
|
|
11
17
|
*/
|
|
12
|
-
export declare function installCommand(): Promise<void>;
|
|
18
|
+
export declare function installCommand(options?: InstallOptions): Promise<void>;
|
|
13
19
|
//# sourceMappingURL=install.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsCH,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAsDf"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Install command - set up ~/.agent-recorder/ and print configuration.
|
|
3
3
|
* This command is idempotent - it won't overwrite existing files.
|
|
4
|
+
* Automatically configures Claude Code with hubify mode unless --no-configure is specified.
|
|
4
5
|
*/
|
|
5
6
|
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
6
7
|
import { homedir } from "node:os";
|
|
7
8
|
import { join } from "node:path";
|
|
8
|
-
import { loadConfig } from "@agent-recorder/core";
|
|
9
|
+
import { loadConfig, readProvidersFile, writeProvidersFile, getDefaultProvidersPath, } from "@agent-recorder/core";
|
|
10
|
+
import { detectClaudeConfig, readJsonFile, writeJsonFileAtomic, createBackup, formatPath, } from "../config/claude-paths.js";
|
|
11
|
+
import { hubifyClaudeConfig, mergeProviders } from "../config/hubify.js";
|
|
9
12
|
/** Default .env file template */
|
|
10
13
|
const ENV_TEMPLATE = `# Agent Recorder Configuration
|
|
11
14
|
# See docs/bootstrap.md for more options
|
|
@@ -29,8 +32,9 @@ AR_MCP_PROXY_PORT=8788
|
|
|
29
32
|
* - Creates ~/.agent-recorder/ if it doesn't exist
|
|
30
33
|
* - Creates ~/.agent-recorder/.env ONLY if it doesn't exist
|
|
31
34
|
* - Never overwrites user files
|
|
35
|
+
* - Automatically configures Claude Code with hubify mode unless --no-configure
|
|
32
36
|
*/
|
|
33
|
-
export async function installCommand() {
|
|
37
|
+
export async function installCommand(options = {}) {
|
|
34
38
|
const config = loadConfig();
|
|
35
39
|
const dataDir = join(homedir(), ".agent-recorder");
|
|
36
40
|
const envFile = join(dataDir, ".env");
|
|
@@ -59,6 +63,17 @@ export async function installCommand() {
|
|
|
59
63
|
else {
|
|
60
64
|
console.log(`Already exists: ${upstreamsFile}`);
|
|
61
65
|
}
|
|
66
|
+
console.log("");
|
|
67
|
+
// Automatically configure Claude Code with hubify mode unless --no-configure
|
|
68
|
+
if (!options.noConfigure) {
|
|
69
|
+
await runAutoHubify(config);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.log("Skipped Claude Code configuration (--no-configure specified)");
|
|
73
|
+
console.log("");
|
|
74
|
+
console.log("To configure Claude Code manually, run:");
|
|
75
|
+
console.log(" agent-recorder configure claude --hubify");
|
|
76
|
+
}
|
|
62
77
|
// Print next steps
|
|
63
78
|
console.log(`
|
|
64
79
|
Agent Recorder installed!
|
|
@@ -66,21 +81,81 @@ Agent Recorder installed!
|
|
|
66
81
|
Data directory: ${dataDir}
|
|
67
82
|
Env file: ${envFile}
|
|
68
83
|
|
|
69
|
-
Claude Code v2 (recommended):
|
|
70
|
-
Add to ~/.claude/settings.json:
|
|
71
|
-
|
|
72
|
-
{
|
|
73
|
-
"mcpServers": {
|
|
74
|
-
"agent-recorder": {
|
|
75
|
-
"url": "http://127.0.0.1:${config.mcpProxyPort}/"
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
84
|
Next steps:
|
|
81
85
|
1. Edit ${envFile} if needed
|
|
82
86
|
2. Start the daemon: agent-recorder start --env-file ${envFile}
|
|
83
|
-
3. Restart Claude Code to
|
|
87
|
+
3. Restart Claude Code to apply changes
|
|
84
88
|
`);
|
|
85
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Automatically configure Claude Code with hubify mode.
|
|
92
|
+
* This is the equivalent of running: agent-recorder configure claude --hubify
|
|
93
|
+
*/
|
|
94
|
+
async function runAutoHubify(config) {
|
|
95
|
+
const expectedUrl = `http://127.0.0.1:${config.mcpProxyPort}/`;
|
|
96
|
+
// Detect Claude config
|
|
97
|
+
const detected = detectClaudeConfig();
|
|
98
|
+
if (detected.kind === "none" || !detected.path) {
|
|
99
|
+
console.log("No Claude Code config found.");
|
|
100
|
+
console.log("Claude Code will need to be configured manually.");
|
|
101
|
+
console.log("");
|
|
102
|
+
console.log("To configure later, run:");
|
|
103
|
+
console.log(" agent-recorder configure claude --hubify");
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const configPath = detected.path;
|
|
107
|
+
// Read existing config
|
|
108
|
+
const existingConfig = readJsonFile(configPath);
|
|
109
|
+
if (existingConfig === null) {
|
|
110
|
+
console.log(`Error: Could not read config at ${formatPath(configPath)}`);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// Transform config to hubify mode
|
|
114
|
+
const hubifyResult = hubifyClaudeConfig(existingConfig, expectedUrl);
|
|
115
|
+
// Get mcpServers keys before and after
|
|
116
|
+
const beforeKeys = Object.keys(existingConfig.mcpServers ?? {});
|
|
117
|
+
const afterKeys = ["agent-recorder"];
|
|
118
|
+
// Create backup
|
|
119
|
+
const backupPath = createBackup(configPath);
|
|
120
|
+
// Write updated Claude config
|
|
121
|
+
writeJsonFileAtomic(configPath, hubifyResult.newClaudeConfig);
|
|
122
|
+
// Merge providers into providers.json
|
|
123
|
+
const providersPath = getDefaultProvidersPath();
|
|
124
|
+
const existingProviders = readProvidersFile(providersPath);
|
|
125
|
+
const mergedProviders = mergeProviders(existingProviders, hubifyResult.providers);
|
|
126
|
+
writeProvidersFile(mergedProviders, providersPath);
|
|
127
|
+
// Report results
|
|
128
|
+
console.log("Configured Claude Code with hubify mode");
|
|
129
|
+
console.log("");
|
|
130
|
+
console.log(`Config file: ${formatPath(configPath)} (${detected.kind})`);
|
|
131
|
+
console.log(`Backup: ${formatPath(backupPath)}`);
|
|
132
|
+
console.log("");
|
|
133
|
+
console.log(`Imported ${hubifyResult.importedKeys.length} provider(s):`);
|
|
134
|
+
if (hubifyResult.importedKeys.length === 0) {
|
|
135
|
+
console.log(" (none - no existing MCP servers found)");
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
for (const key of hubifyResult.importedKeys) {
|
|
139
|
+
const provider = hubifyResult.providers.find((p) => p.id === key);
|
|
140
|
+
if (provider) {
|
|
141
|
+
console.log(` - ${key} (${provider.type}${provider.type === "http" ? `: ${provider.url}` : ""})`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (hubifyResult.skippedKeys.length > 0) {
|
|
146
|
+
console.log("");
|
|
147
|
+
console.log(`Skipped ${hubifyResult.skippedKeys.length} key(s):`);
|
|
148
|
+
for (const key of hubifyResult.skippedKeys) {
|
|
149
|
+
console.log(` - ${key} (already agent-recorder)`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
console.log("");
|
|
153
|
+
console.log("mcpServers updated:");
|
|
154
|
+
console.log(` Before: [${beforeKeys.join(", ") || "empty"}]`);
|
|
155
|
+
console.log(` After: [${afterKeys.join(", ")}]`);
|
|
156
|
+
console.log("");
|
|
157
|
+
console.log(`Providers file: ${formatPath(providersPath)}`);
|
|
158
|
+
console.log(`Total providers: ${mergedProviders.providers.length}`);
|
|
159
|
+
console.log("");
|
|
160
|
+
}
|
|
86
161
|
//# sourceMappingURL=install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.test.d.ts","sourceRoot":"","sources":["../../src/commands/install.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for install command with automatic hubify configuration.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
5
|
+
import { installCommand } from "./install.js";
|
|
6
|
+
import * as fs from "node:fs";
|
|
7
|
+
import * as os from "node:os";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
describe("Install Command", () => {
|
|
10
|
+
let tempDir;
|
|
11
|
+
let originalHome;
|
|
12
|
+
let mockClaudeConfigPath;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
// Create temp directory to act as home
|
|
15
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "ar-install-test-"));
|
|
16
|
+
originalHome = process.env.HOME || "";
|
|
17
|
+
process.env.HOME = tempDir;
|
|
18
|
+
// Create mock Claude config directory
|
|
19
|
+
const claudeDir = path.join(tempDir, ".claude");
|
|
20
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
21
|
+
mockClaudeConfigPath = path.join(claudeDir, "settings.json");
|
|
22
|
+
});
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
// Restore original HOME
|
|
25
|
+
process.env.HOME = originalHome;
|
|
26
|
+
// Cleanup temp directory
|
|
27
|
+
if (fs.existsSync(tempDir)) {
|
|
28
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
it("creates .agent-recorder directory and files", async () => {
|
|
32
|
+
await installCommand({ noConfigure: true });
|
|
33
|
+
const dataDir = path.join(tempDir, ".agent-recorder");
|
|
34
|
+
const envFile = path.join(dataDir, ".env");
|
|
35
|
+
const upstreamsFile = path.join(dataDir, "upstreams.json");
|
|
36
|
+
expect(fs.existsSync(dataDir)).toBe(true);
|
|
37
|
+
expect(fs.existsSync(envFile)).toBe(true);
|
|
38
|
+
expect(fs.existsSync(upstreamsFile)).toBe(true);
|
|
39
|
+
// Verify .env has expected content
|
|
40
|
+
const envContent = fs.readFileSync(envFile, "utf-8");
|
|
41
|
+
expect(envContent).toContain("AR_LISTEN_PORT=8787");
|
|
42
|
+
expect(envContent).toContain("AR_MCP_PROXY_PORT=8788");
|
|
43
|
+
// Verify upstreams.json is empty object
|
|
44
|
+
const upstreamsContent = fs.readFileSync(upstreamsFile, "utf-8");
|
|
45
|
+
expect(upstreamsContent.trim()).toBe("{}");
|
|
46
|
+
});
|
|
47
|
+
it("is idempotent - does not overwrite existing files", async () => {
|
|
48
|
+
const dataDir = path.join(tempDir, ".agent-recorder");
|
|
49
|
+
const envFile = path.join(dataDir, ".env");
|
|
50
|
+
// First run
|
|
51
|
+
await installCommand({ noConfigure: true });
|
|
52
|
+
// Modify .env file
|
|
53
|
+
fs.writeFileSync(envFile, "# Custom config\nAR_LISTEN_PORT=9999\n");
|
|
54
|
+
// Second run
|
|
55
|
+
await installCommand({ noConfigure: true });
|
|
56
|
+
// Verify .env was NOT overwritten
|
|
57
|
+
const envContent = fs.readFileSync(envFile, "utf-8");
|
|
58
|
+
expect(envContent).toContain("# Custom config");
|
|
59
|
+
expect(envContent).toContain("AR_LISTEN_PORT=9999");
|
|
60
|
+
expect(envContent).not.toContain("AR_LISTEN_PORT=8787");
|
|
61
|
+
});
|
|
62
|
+
it("automatically hubifies Claude config when Claude config exists", async () => {
|
|
63
|
+
// Create mock Claude config with existing MCP servers
|
|
64
|
+
const mockConfig = {
|
|
65
|
+
mcpServers: {
|
|
66
|
+
github: {
|
|
67
|
+
url: "https://api.github.com/mcp",
|
|
68
|
+
},
|
|
69
|
+
playwright: {
|
|
70
|
+
command: "npx",
|
|
71
|
+
args: ["@playwright/mcp"],
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
otherSetting: "preserved",
|
|
75
|
+
};
|
|
76
|
+
fs.writeFileSync(mockClaudeConfigPath, JSON.stringify(mockConfig, null, 2));
|
|
77
|
+
// Run install (hubify should run automatically)
|
|
78
|
+
await installCommand();
|
|
79
|
+
// Verify Claude config was updated
|
|
80
|
+
const updatedConfig = JSON.parse(fs.readFileSync(mockClaudeConfigPath, "utf-8"));
|
|
81
|
+
// Should only have agent-recorder entry
|
|
82
|
+
expect(Object.keys(updatedConfig.mcpServers)).toEqual(["agent-recorder"]);
|
|
83
|
+
expect(updatedConfig.mcpServers["agent-recorder"]).toEqual({
|
|
84
|
+
url: "http://127.0.0.1:8788/",
|
|
85
|
+
});
|
|
86
|
+
// Should preserve other settings
|
|
87
|
+
expect(updatedConfig.otherSetting).toBe("preserved");
|
|
88
|
+
// Verify backup was created
|
|
89
|
+
const backupFiles = fs
|
|
90
|
+
.readdirSync(path.join(tempDir, ".claude"))
|
|
91
|
+
.filter((f) => f.startsWith("settings.json") && f.includes(".bak"));
|
|
92
|
+
expect(backupFiles.length).toBeGreaterThan(0);
|
|
93
|
+
// Verify providers.json was created
|
|
94
|
+
const providersPath = path.join(tempDir, ".agent-recorder", "providers.json");
|
|
95
|
+
expect(fs.existsSync(providersPath)).toBe(true);
|
|
96
|
+
const providersFile = JSON.parse(fs.readFileSync(providersPath, "utf-8"));
|
|
97
|
+
// Should have 2 providers (github and playwright)
|
|
98
|
+
expect(providersFile.version).toBe(1);
|
|
99
|
+
expect(providersFile.providers).toHaveLength(2);
|
|
100
|
+
const providerIds = providersFile.providers.map((p) => p.id);
|
|
101
|
+
expect(providerIds).toContain("github");
|
|
102
|
+
expect(providerIds).toContain("playwright");
|
|
103
|
+
// Verify provider types
|
|
104
|
+
const githubProvider = providersFile.providers.find((p) => p.id === "github");
|
|
105
|
+
expect(githubProvider.type).toBe("http");
|
|
106
|
+
expect(githubProvider.url).toBe("https://api.github.com/mcp");
|
|
107
|
+
const playwrightProvider = providersFile.providers.find((p) => p.id === "playwright");
|
|
108
|
+
expect(playwrightProvider.type).toBe("stdio");
|
|
109
|
+
expect(playwrightProvider.command).toBe("npx");
|
|
110
|
+
expect(playwrightProvider.args).toEqual(["@playwright/mcp"]);
|
|
111
|
+
});
|
|
112
|
+
it("skips hubify when --no-configure is specified", async () => {
|
|
113
|
+
// Create mock Claude config
|
|
114
|
+
const mockConfig = {
|
|
115
|
+
mcpServers: {
|
|
116
|
+
github: {
|
|
117
|
+
url: "https://api.github.com/mcp",
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
fs.writeFileSync(mockClaudeConfigPath, JSON.stringify(mockConfig, null, 2));
|
|
122
|
+
// Run install with --no-configure
|
|
123
|
+
await installCommand({ noConfigure: true });
|
|
124
|
+
// Verify Claude config was NOT modified
|
|
125
|
+
const config = JSON.parse(fs.readFileSync(mockClaudeConfigPath, "utf-8"));
|
|
126
|
+
expect(config.mcpServers.github).toEqual({
|
|
127
|
+
url: "https://api.github.com/mcp",
|
|
128
|
+
});
|
|
129
|
+
// Should not have agent-recorder entry
|
|
130
|
+
expect(config.mcpServers["agent-recorder"]).toBeUndefined();
|
|
131
|
+
// Verify providers.json was NOT created
|
|
132
|
+
const providersPath = path.join(tempDir, ".agent-recorder", "providers.json");
|
|
133
|
+
expect(fs.existsSync(providersPath)).toBe(false);
|
|
134
|
+
// Verify no backup was created
|
|
135
|
+
const backupFiles = fs
|
|
136
|
+
.readdirSync(path.join(tempDir, ".claude"))
|
|
137
|
+
.filter((f) => f.includes(".bak"));
|
|
138
|
+
expect(backupFiles).toHaveLength(0);
|
|
139
|
+
});
|
|
140
|
+
it("handles case when Claude config does not exist", async () => {
|
|
141
|
+
// Don't create Claude config - it doesn't exist
|
|
142
|
+
// Run install (should handle gracefully)
|
|
143
|
+
await installCommand();
|
|
144
|
+
// Should still create .agent-recorder directory
|
|
145
|
+
const dataDir = path.join(tempDir, ".agent-recorder");
|
|
146
|
+
expect(fs.existsSync(dataDir)).toBe(true);
|
|
147
|
+
// Should not crash or create providers.json
|
|
148
|
+
const providersPath = path.join(dataDir, "providers.json");
|
|
149
|
+
expect(fs.existsSync(providersPath)).toBe(false);
|
|
150
|
+
});
|
|
151
|
+
it("skips already-agent-recorder entries during hubify", async () => {
|
|
152
|
+
// Create mock Claude config that already has agent-recorder
|
|
153
|
+
const mockConfig = {
|
|
154
|
+
mcpServers: {
|
|
155
|
+
"agent-recorder": {
|
|
156
|
+
url: "http://127.0.0.1:8788/",
|
|
157
|
+
},
|
|
158
|
+
github: {
|
|
159
|
+
url: "https://api.github.com/mcp",
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
fs.writeFileSync(mockClaudeConfigPath, JSON.stringify(mockConfig, null, 2));
|
|
164
|
+
// Run install
|
|
165
|
+
await installCommand();
|
|
166
|
+
// Verify providers.json has only github (not agent-recorder)
|
|
167
|
+
const providersPath = path.join(tempDir, ".agent-recorder", "providers.json");
|
|
168
|
+
const providersFile = JSON.parse(fs.readFileSync(providersPath, "utf-8"));
|
|
169
|
+
expect(providersFile.providers).toHaveLength(1);
|
|
170
|
+
expect(providersFile.providers[0].id).toBe("github");
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=install.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.test.js","sourceRoot":"","sources":["../../src/commands/install.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hubify transformation logic.
|
|
3
|
+
* Extracts MCP servers from Claude config and converts to providers.
|
|
4
|
+
*/
|
|
5
|
+
import type { Provider, ProvidersFile } from "@agent-recorder/core";
|
|
6
|
+
export interface McpServerEntry {
|
|
7
|
+
url?: string;
|
|
8
|
+
command?: string;
|
|
9
|
+
args?: string[];
|
|
10
|
+
env?: Record<string, string>;
|
|
11
|
+
headers?: Record<string, string>;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface HubifyResult {
|
|
15
|
+
/** New Claude config with only agent-recorder MCP entry */
|
|
16
|
+
newClaudeConfig: Record<string, unknown>;
|
|
17
|
+
/** Providers extracted from original config */
|
|
18
|
+
providers: Provider[];
|
|
19
|
+
/** Keys that were imported as providers */
|
|
20
|
+
importedKeys: string[];
|
|
21
|
+
/** Keys that were skipped (e.g., agent-recorder itself) */
|
|
22
|
+
skippedKeys: string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Extract providers from Claude config mcpServers.
|
|
26
|
+
* Converts each MCP server entry to a Provider.
|
|
27
|
+
*
|
|
28
|
+
* @param mcpServers - The mcpServers object from Claude config
|
|
29
|
+
* @returns Array of providers
|
|
30
|
+
*/
|
|
31
|
+
export declare function extractProviders(mcpServers: Record<string, unknown>): Provider[];
|
|
32
|
+
/**
|
|
33
|
+
* Transform Claude config for hubify mode.
|
|
34
|
+
* Replaces mcpServers with only agent-recorder entry.
|
|
35
|
+
* Preserves all other Claude config fields.
|
|
36
|
+
*
|
|
37
|
+
* @param claudeConfig - Original Claude config
|
|
38
|
+
* @param agentRecorderUrl - URL for agent-recorder MCP entry
|
|
39
|
+
* @returns Hubify transformation result
|
|
40
|
+
*/
|
|
41
|
+
export declare function hubifyClaudeConfig(claudeConfig: Record<string, unknown>, agentRecorderUrl: string): HubifyResult;
|
|
42
|
+
/**
|
|
43
|
+
* Merge providers into providers file.
|
|
44
|
+
* Upserts providers by ID.
|
|
45
|
+
*
|
|
46
|
+
* @param existingFile - Existing providers file
|
|
47
|
+
* @param newProviders - Providers to merge
|
|
48
|
+
* @returns Updated providers file
|
|
49
|
+
*/
|
|
50
|
+
export declare function mergeProviders(existingFile: ProvidersFile, newProviders: Provider[]): ProvidersFile;
|
|
51
|
+
//# sourceMappingURL=hubify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hubify.d.ts","sourceRoot":"","sources":["../../src/config/hubify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,+CAA+C;IAC/C,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,QAAQ,EAAE,CAqDZ;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,gBAAgB,EAAE,MAAM,GACvB,YAAY,CAwCd;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,aAAa,EAC3B,YAAY,EAAE,QAAQ,EAAE,GACvB,aAAa,CAiBf"}
|