@patchen0518/agentbrew 1.2.5 → 1.3.0
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/dist/agent-registry.d.ts +23 -0
- package/dist/agent-registry.js +101 -0
- package/dist/agent-registry.js.map +1 -0
- package/dist/cli.js +5 -17
- package/dist/cli.js.map +1 -1
- package/dist/registry.js +29 -0
- package/dist/registry.js.map +1 -1
- package/dist/sync-instructions.d.ts +50 -0
- package/dist/sync-instructions.js +214 -0
- package/dist/sync-instructions.js.map +1 -0
- package/dist/sync-mcp.d.ts +31 -0
- package/dist/sync-mcp.js +317 -0
- package/dist/sync-mcp.js.map +1 -0
- package/dist/sync-state.d.ts +15 -0
- package/dist/sync-state.js +45 -0
- package/dist/sync-state.js.map +1 -0
- package/dist/sync.d.ts +10 -116
- package/dist/sync.js +123 -687
- package/dist/sync.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.INSTRUCTIONS_FILE = exports.MARKER_END = exports.MARKER_START = void 0;
|
|
7
|
+
exports.getDefaultTargets = getDefaultTargets;
|
|
8
|
+
exports.getInstructionsPath = getInstructionsPath;
|
|
9
|
+
exports.buildInjectedSection = buildInjectedSection;
|
|
10
|
+
exports.injectIntoFile = injectIntoFile;
|
|
11
|
+
exports.removeFromFile = removeFromFile;
|
|
12
|
+
exports.syncInstructions = syncInstructions;
|
|
13
|
+
exports.unsyncInstructions = unsyncInstructions;
|
|
14
|
+
const fs_1 = __importDefault(require("fs"));
|
|
15
|
+
const os_1 = __importDefault(require("os"));
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const config_1 = require("./config");
|
|
18
|
+
// ─── Instruction sync (unchanged) ───────────────────────────────────────────
|
|
19
|
+
exports.MARKER_START = '<!-- agentbrew:shared:start -->';
|
|
20
|
+
exports.MARKER_END = '<!-- agentbrew:shared:end -->';
|
|
21
|
+
exports.INSTRUCTIONS_FILE = 'INSTRUCTIONS.md';
|
|
22
|
+
const EXAMPLE_INSTRUCTIONS = `# AgentBrew Shared Instructions
|
|
23
|
+
|
|
24
|
+
These instructions are shared across all your AI agents via AgentBrew.
|
|
25
|
+
Edit this file and run \`agentbrew sync\` to push updates to all agent configs.
|
|
26
|
+
|
|
27
|
+
## Example: API Usage Policy
|
|
28
|
+
- Always use Context7 (the \`context7\` MCP tool) to fetch live API documentation
|
|
29
|
+
before writing code that calls an external library. This prevents using stale or
|
|
30
|
+
hallucinated function signatures.
|
|
31
|
+
|
|
32
|
+
## Notes
|
|
33
|
+
- This file is global. For project-specific context, add it directly to the
|
|
34
|
+
project's CLAUDE.md or GEMINI.md — or reference project docs from within this file.
|
|
35
|
+
`;
|
|
36
|
+
function getDefaultTargets() {
|
|
37
|
+
const home = os_1.default.homedir();
|
|
38
|
+
return [
|
|
39
|
+
{
|
|
40
|
+
name: 'Claude Code',
|
|
41
|
+
configPath: path_1.default.join(home, '.claude', 'CLAUDE.md'),
|
|
42
|
+
isFileOwned: false,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'Gemini CLI',
|
|
46
|
+
configPath: path_1.default.join(home, '.gemini', 'GEMINI.md'),
|
|
47
|
+
isFileOwned: false,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'OpenAI Codex CLI',
|
|
51
|
+
// Codex CLI's canonical instruction file is AGENTS.md (instructions.md is a legacy fallback)
|
|
52
|
+
configPath: path_1.default.join(home, '.codex', 'AGENTS.md'),
|
|
53
|
+
isFileOwned: false,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'Cursor',
|
|
57
|
+
// Cursor "User Rules" directory (Cursor 0.47+): each .md file in this dir is a global rule.
|
|
58
|
+
// We own this specific file entirely — no markers needed.
|
|
59
|
+
configPath: path_1.default.join(home, '.cursor', 'rules', 'agentbrew-shared.md'),
|
|
60
|
+
isFileOwned: true,
|
|
61
|
+
agentRootDir: path_1.default.join(home, '.cursor'),
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: 'Windsurf',
|
|
65
|
+
configPath: path_1.default.join(home, '.codeium', 'windsurf', 'memories', 'global_rules.md'),
|
|
66
|
+
isFileOwned: false,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'Kiro',
|
|
70
|
+
// Steering files in ~/.kiro/steering/ are auto-loaded in every Kiro interaction.
|
|
71
|
+
// We own this file entirely and must place the frontmatter at the very top.
|
|
72
|
+
configPath: path_1.default.join(home, '.kiro', 'steering', 'agentbrew-shared.md'),
|
|
73
|
+
isFileOwned: true,
|
|
74
|
+
frontmatter: '---\ninclusion: always\n---',
|
|
75
|
+
agentRootDir: path_1.default.join(home, '.kiro'),
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
function getInstructionsPath(brewRoot) {
|
|
80
|
+
return path_1.default.join(brewRoot ?? (0, config_1.getBrewRoot)(), exports.INSTRUCTIONS_FILE);
|
|
81
|
+
}
|
|
82
|
+
function buildInjectedSection(content) {
|
|
83
|
+
const warning = `> ⚠️ Managed by AgentBrew. Edit \`~/.agentbrew/INSTRUCTIONS.md\` and run \`agentbrew sync\` to update.`;
|
|
84
|
+
return `${exports.MARKER_START}\n${warning}\n\n${content.trim()}\n${exports.MARKER_END}`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Injects (or updates) the agentbrew section in a file.
|
|
88
|
+
* Creates the file and any parent directories if they don't exist.
|
|
89
|
+
*/
|
|
90
|
+
function injectIntoFile(filePath, content) {
|
|
91
|
+
const section = buildInjectedSection(content);
|
|
92
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
93
|
+
fs_1.default.mkdirSync(path_1.default.dirname(filePath), { recursive: true });
|
|
94
|
+
fs_1.default.writeFileSync(filePath, section + '\n', 'utf-8');
|
|
95
|
+
return 'created';
|
|
96
|
+
}
|
|
97
|
+
const existing = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
98
|
+
const startIdx = existing.indexOf(exports.MARKER_START);
|
|
99
|
+
const endIdx = existing.indexOf(exports.MARKER_END);
|
|
100
|
+
if (startIdx !== -1 && endIdx !== -1) {
|
|
101
|
+
const replaced = existing.substring(0, startIdx) +
|
|
102
|
+
section +
|
|
103
|
+
existing.substring(endIdx + exports.MARKER_END.length);
|
|
104
|
+
if (replaced === existing)
|
|
105
|
+
return 'unchanged';
|
|
106
|
+
fs_1.default.writeFileSync(filePath, replaced, 'utf-8');
|
|
107
|
+
return 'updated';
|
|
108
|
+
}
|
|
109
|
+
// No markers yet — append to end
|
|
110
|
+
const appended = existing.trimEnd() + '\n\n' + section + '\n';
|
|
111
|
+
fs_1.default.writeFileSync(filePath, appended, 'utf-8');
|
|
112
|
+
return 'updated';
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Removes the agentbrew section from a file, leaving surrounding content intact.
|
|
116
|
+
*/
|
|
117
|
+
function removeFromFile(filePath) {
|
|
118
|
+
if (!fs_1.default.existsSync(filePath))
|
|
119
|
+
return 'not_found';
|
|
120
|
+
const existing = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
121
|
+
const startIdx = existing.indexOf(exports.MARKER_START);
|
|
122
|
+
const endIdx = existing.indexOf(exports.MARKER_END);
|
|
123
|
+
if (startIdx === -1 || endIdx === -1)
|
|
124
|
+
return 'no_section';
|
|
125
|
+
const before = existing.substring(0, startIdx).trimEnd();
|
|
126
|
+
const after = existing.substring(endIdx + exports.MARKER_END.length).trimStart();
|
|
127
|
+
let result = before;
|
|
128
|
+
if (after)
|
|
129
|
+
result += '\n\n' + after;
|
|
130
|
+
result = result.trimEnd() + '\n';
|
|
131
|
+
fs_1.default.writeFileSync(filePath, result, 'utf-8');
|
|
132
|
+
return 'removed';
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Syncs ~/.agentbrew/INSTRUCTIONS.md into each target agent's global config file.
|
|
136
|
+
* Accepts an optional `targets` override (used in tests).
|
|
137
|
+
*/
|
|
138
|
+
function syncInstructions(targets, brewRoot) {
|
|
139
|
+
const instructionsPath = getInstructionsPath(brewRoot);
|
|
140
|
+
if (!fs_1.default.existsSync(instructionsPath)) {
|
|
141
|
+
fs_1.default.mkdirSync(path_1.default.dirname(instructionsPath), { recursive: true });
|
|
142
|
+
fs_1.default.writeFileSync(instructionsPath, EXAMPLE_INSTRUCTIONS, 'utf-8');
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
const content = fs_1.default.readFileSync(instructionsPath, 'utf-8');
|
|
146
|
+
const resolvedTargets = targets ?? getDefaultTargets();
|
|
147
|
+
const results = [];
|
|
148
|
+
for (const target of resolvedTargets) {
|
|
149
|
+
if (target.configPath === null) {
|
|
150
|
+
results.push({ agent: target.name, status: 'manual', note: target.manualInstructions });
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (target.isFileOwned) {
|
|
154
|
+
// Skip if the agent's root directory doesn't exist (agent not installed).
|
|
155
|
+
// Without this guard, mkdirSync below would create the directory unconditionally.
|
|
156
|
+
if (target.agentRootDir && !fs_1.default.existsSync(target.agentRootDir)) {
|
|
157
|
+
results.push({ agent: target.name, status: 'skipped', note: 'Agent not installed (config directory not found)' });
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
// We own this file entirely — write raw content, no markers needed.
|
|
161
|
+
// unsync deletes the file; there is no surrounding user content to delimit around.
|
|
162
|
+
const header = `> ⚠️ Managed by AgentBrew. Edit \`~/.agentbrew/INSTRUCTIONS.md\` and run \`agentbrew sync\` to update.\n`;
|
|
163
|
+
const prefix = target.frontmatter ? target.frontmatter + '\n' : '';
|
|
164
|
+
const fileContent = prefix + header + '\n' + content.trim() + '\n';
|
|
165
|
+
fs_1.default.mkdirSync(path_1.default.dirname(target.configPath), { recursive: true });
|
|
166
|
+
const existing = fs_1.default.existsSync(target.configPath)
|
|
167
|
+
? fs_1.default.readFileSync(target.configPath, 'utf-8')
|
|
168
|
+
: null;
|
|
169
|
+
if (existing === fileContent) {
|
|
170
|
+
results.push({ agent: target.name, status: 'unchanged', path: target.configPath });
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
fs_1.default.writeFileSync(target.configPath, fileContent, 'utf-8');
|
|
174
|
+
results.push({ agent: target.name, status: existing !== null ? 'updated' : 'created', path: target.configPath });
|
|
175
|
+
}
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
// Skip agents that aren't installed (config parent dir absent)
|
|
179
|
+
if (!fs_1.default.existsSync(path_1.default.dirname(target.configPath))) {
|
|
180
|
+
results.push({ agent: target.name, status: 'skipped', note: 'Agent not installed (config directory not found)' });
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const status = injectIntoFile(target.configPath, content);
|
|
184
|
+
results.push({ agent: target.name, status, path: target.configPath });
|
|
185
|
+
}
|
|
186
|
+
return results;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Removes the agentbrew section from all target agent config files.
|
|
190
|
+
*/
|
|
191
|
+
function unsyncInstructions(targets) {
|
|
192
|
+
const resolvedTargets = targets ?? getDefaultTargets();
|
|
193
|
+
const results = [];
|
|
194
|
+
for (const target of resolvedTargets) {
|
|
195
|
+
if (target.configPath === null) {
|
|
196
|
+
results.push({ agent: target.name, status: 'manual', note: 'Remove manually from your agent UI settings.' });
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (target.isFileOwned) {
|
|
200
|
+
if (fs_1.default.existsSync(target.configPath)) {
|
|
201
|
+
fs_1.default.rmSync(target.configPath);
|
|
202
|
+
results.push({ agent: target.name, status: 'removed', path: target.configPath });
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
results.push({ agent: target.name, status: 'not_found', path: target.configPath });
|
|
206
|
+
}
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
const status = removeFromFile(target.configPath);
|
|
210
|
+
results.push({ agent: target.name, status, path: target.configPath });
|
|
211
|
+
}
|
|
212
|
+
return results;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=sync-instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-instructions.js","sourceRoot":"","sources":["../src/sync-instructions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { SkillSyncResult } from './sync';
|
|
2
|
+
/**
|
|
3
|
+
* Adds agentbrew to ~/.cursor/mcp.json so Cursor can discover MCP tools directly.
|
|
4
|
+
* Merges into any existing config without disturbing other servers.
|
|
5
|
+
*/
|
|
6
|
+
export declare function syncMcpServerToCursor(brewRoot?: string): SkillSyncResult[];
|
|
7
|
+
/**
|
|
8
|
+
* Removes the agentbrew entry from ~/.cursor/mcp.json.
|
|
9
|
+
* Leaves other servers intact; removes the file only if it becomes empty.
|
|
10
|
+
*/
|
|
11
|
+
export declare function unsyncMcpServerFromCursor(brewRoot?: string): SkillSyncResult[];
|
|
12
|
+
/**
|
|
13
|
+
* Adds agentbrew to ~/.codex/config.toml so Codex CLI can discover MCP tools directly.
|
|
14
|
+
* Appends the [mcp_servers.agentbrew] section without disturbing existing content.
|
|
15
|
+
*/
|
|
16
|
+
export declare function syncMcpServerToCodex(brewRoot?: string): SkillSyncResult[];
|
|
17
|
+
/**
|
|
18
|
+
* Removes the agentbrew entry from ~/.codex/config.toml.
|
|
19
|
+
* Leaves the file in place; other sections are untouched.
|
|
20
|
+
*/
|
|
21
|
+
export declare function unsyncMcpServerFromCodex(brewRoot?: string): SkillSyncResult[];
|
|
22
|
+
/**
|
|
23
|
+
* Adds agentbrew to ~/.kiro/settings/mcp.json so Kiro can discover MCP tools directly.
|
|
24
|
+
* Merges into any existing config without disturbing other servers.
|
|
25
|
+
*/
|
|
26
|
+
export declare function syncMcpServerToKiro(brewRoot?: string): SkillSyncResult[];
|
|
27
|
+
/**
|
|
28
|
+
* Removes the agentbrew entry from ~/.kiro/settings/mcp.json.
|
|
29
|
+
* Leaves other servers intact; removes the file only if it becomes empty.
|
|
30
|
+
*/
|
|
31
|
+
export declare function unsyncMcpServerFromKiro(brewRoot?: string): SkillSyncResult[];
|
package/dist/sync-mcp.js
ADDED
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.syncMcpServerToCursor = syncMcpServerToCursor;
|
|
40
|
+
exports.unsyncMcpServerFromCursor = unsyncMcpServerFromCursor;
|
|
41
|
+
exports.syncMcpServerToCodex = syncMcpServerToCodex;
|
|
42
|
+
exports.unsyncMcpServerFromCodex = unsyncMcpServerFromCodex;
|
|
43
|
+
exports.syncMcpServerToKiro = syncMcpServerToKiro;
|
|
44
|
+
exports.unsyncMcpServerFromKiro = unsyncMcpServerFromKiro;
|
|
45
|
+
const fs_1 = __importDefault(require("fs"));
|
|
46
|
+
const os_1 = __importDefault(require("os"));
|
|
47
|
+
const path_1 = __importDefault(require("path"));
|
|
48
|
+
const toml = __importStar(require("smol-toml"));
|
|
49
|
+
const logger_1 = require("./logger");
|
|
50
|
+
const sync_state_1 = require("./sync-state");
|
|
51
|
+
// ─── Cursor MCP server registration ─────────────────────────────────────────
|
|
52
|
+
const CURSOR_MCP_ENTRY = 'agentbrew';
|
|
53
|
+
/**
|
|
54
|
+
* Adds agentbrew to ~/.cursor/mcp.json so Cursor can discover MCP tools directly.
|
|
55
|
+
* Merges into any existing config without disturbing other servers.
|
|
56
|
+
*/
|
|
57
|
+
function syncMcpServerToCursor(brewRoot) {
|
|
58
|
+
const cursorDir = path_1.default.join(os_1.default.homedir(), '.cursor');
|
|
59
|
+
if (!fs_1.default.existsSync(cursorDir))
|
|
60
|
+
return [];
|
|
61
|
+
const mcpJsonPath = path_1.default.join(cursorDir, 'mcp.json');
|
|
62
|
+
const entryName = 'agentbrew (Cursor MCP)';
|
|
63
|
+
let config = {};
|
|
64
|
+
try {
|
|
65
|
+
config = JSON.parse(fs_1.default.readFileSync(mcpJsonPath, 'utf-8'));
|
|
66
|
+
}
|
|
67
|
+
catch { }
|
|
68
|
+
const mcpServers = config.mcpServers ?? {};
|
|
69
|
+
const existing = mcpServers[CURSOR_MCP_ENTRY];
|
|
70
|
+
if (existing?.command === 'agentbrew') {
|
|
71
|
+
const state = (0, sync_state_1.loadSyncedState)(brewRoot);
|
|
72
|
+
state.cursorMcp = true;
|
|
73
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
74
|
+
return [{ entryName, status: 'already_exists', path: mcpJsonPath }];
|
|
75
|
+
}
|
|
76
|
+
config.mcpServers = { ...mcpServers, [CURSOR_MCP_ENTRY]: { command: 'agentbrew' } };
|
|
77
|
+
try {
|
|
78
|
+
fs_1.default.writeFileSync(mcpJsonPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
79
|
+
const state = (0, sync_state_1.loadSyncedState)(brewRoot);
|
|
80
|
+
state.cursorMcp = true;
|
|
81
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
82
|
+
return [{ entryName, status: 'linked', path: mcpJsonPath }];
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
return [{ entryName, status: 'error', note: e.message }];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Removes the agentbrew entry from ~/.cursor/mcp.json.
|
|
90
|
+
* Leaves other servers intact; removes the file only if it becomes empty.
|
|
91
|
+
*/
|
|
92
|
+
function unsyncMcpServerFromCursor(brewRoot) {
|
|
93
|
+
const state = (0, sync_state_1.loadSyncedState)(brewRoot);
|
|
94
|
+
if (!state.cursorMcp)
|
|
95
|
+
return [];
|
|
96
|
+
const mcpJsonPath = path_1.default.join(os_1.default.homedir(), '.cursor', 'mcp.json');
|
|
97
|
+
const entryName = 'agentbrew (Cursor MCP)';
|
|
98
|
+
let config = {};
|
|
99
|
+
try {
|
|
100
|
+
config = JSON.parse(fs_1.default.readFileSync(mcpJsonPath, 'utf-8'));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
state.cursorMcp = false;
|
|
104
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
105
|
+
return [{ entryName, status: 'skipped', note: 'Not found' }];
|
|
106
|
+
}
|
|
107
|
+
if (!config.mcpServers?.[CURSOR_MCP_ENTRY]) {
|
|
108
|
+
state.cursorMcp = false;
|
|
109
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
110
|
+
return [{ entryName, status: 'skipped', note: 'Not found' }];
|
|
111
|
+
}
|
|
112
|
+
delete config.mcpServers[CURSOR_MCP_ENTRY];
|
|
113
|
+
if (Object.keys(config.mcpServers).length === 0)
|
|
114
|
+
delete config.mcpServers;
|
|
115
|
+
try {
|
|
116
|
+
if (Object.keys(config).length === 0) {
|
|
117
|
+
fs_1.default.rmSync(mcpJsonPath, { force: true });
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
fs_1.default.writeFileSync(mcpJsonPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
121
|
+
}
|
|
122
|
+
state.cursorMcp = false;
|
|
123
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
124
|
+
return [{ entryName, status: 'removed', path: mcpJsonPath }];
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
return [{ entryName, status: 'error', note: e.message }];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// ─── Codex MCP server registration ──────────────────────────────────────────
|
|
131
|
+
function _removeTomlSection(content, sectionHeader) {
|
|
132
|
+
const normalised = content.replace(/\r\n/g, '\n');
|
|
133
|
+
const lines = normalised.split('\n');
|
|
134
|
+
const headerLine = `[${sectionHeader}]`;
|
|
135
|
+
const subHeaderPrefix = `[${sectionHeader}.`;
|
|
136
|
+
const startIdx = lines.findIndex(l => {
|
|
137
|
+
const stripped = l.replace(/#.*$/, '').trim();
|
|
138
|
+
return stripped === headerLine;
|
|
139
|
+
});
|
|
140
|
+
if (startIdx === -1)
|
|
141
|
+
return content;
|
|
142
|
+
let endIdx = lines.length;
|
|
143
|
+
for (let i = startIdx + 1; i < lines.length; i++) {
|
|
144
|
+
const trimmed = lines[i].trim();
|
|
145
|
+
// Stop at sibling or parent sections, but continue through subsections of this section
|
|
146
|
+
if (trimmed.startsWith('[') && !trimmed.startsWith(subHeaderPrefix)) {
|
|
147
|
+
endIdx = i;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Also absorb a preceding blank line
|
|
152
|
+
let removeFrom = startIdx;
|
|
153
|
+
if (removeFrom > 0 && lines[removeFrom - 1].trim() === '')
|
|
154
|
+
removeFrom--;
|
|
155
|
+
return [...lines.slice(0, removeFrom), ...lines.slice(endIdx)].join('\n');
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Adds agentbrew to ~/.codex/config.toml so Codex CLI can discover MCP tools directly.
|
|
159
|
+
* Appends the [mcp_servers.agentbrew] section without disturbing existing content.
|
|
160
|
+
*/
|
|
161
|
+
function syncMcpServerToCodex(brewRoot) {
|
|
162
|
+
const codexDir = path_1.default.join(os_1.default.homedir(), '.codex');
|
|
163
|
+
if (!fs_1.default.existsSync(codexDir))
|
|
164
|
+
return [];
|
|
165
|
+
const configPath = path_1.default.join(codexDir, 'config.toml');
|
|
166
|
+
const entryName = 'agentbrew (Codex MCP)';
|
|
167
|
+
let raw = '';
|
|
168
|
+
try {
|
|
169
|
+
raw = fs_1.default.readFileSync(configPath, 'utf-8');
|
|
170
|
+
}
|
|
171
|
+
catch { }
|
|
172
|
+
// Check if already registered with the right command
|
|
173
|
+
try {
|
|
174
|
+
const parsed = toml.parse(raw);
|
|
175
|
+
if (parsed?.mcp_servers?.agentbrew?.command === 'agentbrew') {
|
|
176
|
+
const state = (0, sync_state_1.loadSyncedState)(brewRoot);
|
|
177
|
+
state.codexMcp = true;
|
|
178
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
179
|
+
return [{ entryName, status: 'already_exists', path: configPath }];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
logger_1.Logger.warn(`config.toml at ${configPath} has invalid TOML syntax: ${e.message}. Attempting text-based repair.`);
|
|
184
|
+
}
|
|
185
|
+
// Remove any stale entry (e.g. wrong command) before re-adding to avoid duplicate TOML table headers
|
|
186
|
+
const cleaned = _removeTomlSection(raw, 'mcp_servers.agentbrew');
|
|
187
|
+
const sep = cleaned.length > 0 && !cleaned.endsWith('\n') ? '\n' : '';
|
|
188
|
+
const newContent = cleaned + sep + '\n[mcp_servers.agentbrew]\ncommand = "agentbrew"\n';
|
|
189
|
+
try {
|
|
190
|
+
fs_1.default.writeFileSync(configPath, newContent, 'utf-8');
|
|
191
|
+
const state = (0, sync_state_1.loadSyncedState)(brewRoot);
|
|
192
|
+
state.codexMcp = true;
|
|
193
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
194
|
+
return [{ entryName, status: 'linked', path: configPath }];
|
|
195
|
+
}
|
|
196
|
+
catch (e) {
|
|
197
|
+
return [{ entryName, status: 'error', note: e.message }];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Removes the agentbrew entry from ~/.codex/config.toml.
|
|
202
|
+
* Leaves the file in place; other sections are untouched.
|
|
203
|
+
*/
|
|
204
|
+
function unsyncMcpServerFromCodex(brewRoot) {
|
|
205
|
+
const state = (0, sync_state_1.loadSyncedState)(brewRoot);
|
|
206
|
+
if (!state.codexMcp)
|
|
207
|
+
return [];
|
|
208
|
+
const configPath = path_1.default.join(os_1.default.homedir(), '.codex', 'config.toml');
|
|
209
|
+
const entryName = 'agentbrew (Codex MCP)';
|
|
210
|
+
let raw;
|
|
211
|
+
try {
|
|
212
|
+
raw = fs_1.default.readFileSync(configPath, 'utf-8');
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
state.codexMcp = false;
|
|
216
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
217
|
+
return [{ entryName, status: 'skipped', note: 'Not found' }];
|
|
218
|
+
}
|
|
219
|
+
const cleaned = _removeTomlSection(raw, 'mcp_servers.agentbrew');
|
|
220
|
+
if (cleaned === raw) {
|
|
221
|
+
state.codexMcp = false;
|
|
222
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
223
|
+
return [{ entryName, status: 'skipped', note: 'Not found' }];
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
const trimmed = cleaned.trimEnd();
|
|
227
|
+
fs_1.default.writeFileSync(configPath, trimmed ? trimmed + '\n' : '', 'utf-8');
|
|
228
|
+
state.codexMcp = false;
|
|
229
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
230
|
+
return [{ entryName, status: 'removed', path: configPath }];
|
|
231
|
+
}
|
|
232
|
+
catch (e) {
|
|
233
|
+
return [{ entryName, status: 'error', note: e.message }];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// ─── Kiro MCP server registration ────────────────────────────────────────────
|
|
237
|
+
const KIRO_MCP_ENTRY = 'agentbrew';
|
|
238
|
+
/**
|
|
239
|
+
* Adds agentbrew to ~/.kiro/settings/mcp.json so Kiro can discover MCP tools directly.
|
|
240
|
+
* Merges into any existing config without disturbing other servers.
|
|
241
|
+
*/
|
|
242
|
+
function syncMcpServerToKiro(brewRoot) {
|
|
243
|
+
const kiroDir = path_1.default.join(os_1.default.homedir(), '.kiro');
|
|
244
|
+
if (!fs_1.default.existsSync(kiroDir))
|
|
245
|
+
return [];
|
|
246
|
+
const settingsDir = path_1.default.join(kiroDir, 'settings');
|
|
247
|
+
fs_1.default.mkdirSync(settingsDir, { recursive: true });
|
|
248
|
+
const mcpJsonPath = path_1.default.join(settingsDir, 'mcp.json');
|
|
249
|
+
const entryName = 'agentbrew (Kiro MCP)';
|
|
250
|
+
let config = {};
|
|
251
|
+
try {
|
|
252
|
+
config = JSON.parse(fs_1.default.readFileSync(mcpJsonPath, 'utf-8'));
|
|
253
|
+
}
|
|
254
|
+
catch { }
|
|
255
|
+
const mcpServers = config.mcpServers ?? {};
|
|
256
|
+
const existing = mcpServers[KIRO_MCP_ENTRY];
|
|
257
|
+
if (existing?.command === 'agentbrew') {
|
|
258
|
+
const state = (0, sync_state_1.loadSyncedState)(brewRoot);
|
|
259
|
+
state.kiroMcp = true;
|
|
260
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
261
|
+
return [{ entryName, status: 'already_exists', path: mcpJsonPath }];
|
|
262
|
+
}
|
|
263
|
+
config.mcpServers = { ...mcpServers, [KIRO_MCP_ENTRY]: { command: 'agentbrew' } };
|
|
264
|
+
try {
|
|
265
|
+
fs_1.default.writeFileSync(mcpJsonPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
266
|
+
const state = (0, sync_state_1.loadSyncedState)(brewRoot);
|
|
267
|
+
state.kiroMcp = true;
|
|
268
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
269
|
+
return [{ entryName, status: 'linked', path: mcpJsonPath }];
|
|
270
|
+
}
|
|
271
|
+
catch (e) {
|
|
272
|
+
return [{ entryName, status: 'error', note: e.message }];
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Removes the agentbrew entry from ~/.kiro/settings/mcp.json.
|
|
277
|
+
* Leaves other servers intact; removes the file only if it becomes empty.
|
|
278
|
+
*/
|
|
279
|
+
function unsyncMcpServerFromKiro(brewRoot) {
|
|
280
|
+
const state = (0, sync_state_1.loadSyncedState)(brewRoot);
|
|
281
|
+
if (!state.kiroMcp)
|
|
282
|
+
return [];
|
|
283
|
+
const mcpJsonPath = path_1.default.join(os_1.default.homedir(), '.kiro', 'settings', 'mcp.json');
|
|
284
|
+
const entryName = 'agentbrew (Kiro MCP)';
|
|
285
|
+
let config = {};
|
|
286
|
+
try {
|
|
287
|
+
config = JSON.parse(fs_1.default.readFileSync(mcpJsonPath, 'utf-8'));
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
state.kiroMcp = false;
|
|
291
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
292
|
+
return [{ entryName, status: 'skipped', note: 'Not found' }];
|
|
293
|
+
}
|
|
294
|
+
if (!config.mcpServers?.[KIRO_MCP_ENTRY]) {
|
|
295
|
+
state.kiroMcp = false;
|
|
296
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
297
|
+
return [{ entryName, status: 'skipped', note: 'Not found' }];
|
|
298
|
+
}
|
|
299
|
+
delete config.mcpServers[KIRO_MCP_ENTRY];
|
|
300
|
+
if (Object.keys(config.mcpServers).length === 0)
|
|
301
|
+
delete config.mcpServers;
|
|
302
|
+
try {
|
|
303
|
+
if (Object.keys(config).length === 0) {
|
|
304
|
+
fs_1.default.rmSync(mcpJsonPath, { force: true });
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
fs_1.default.writeFileSync(mcpJsonPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
308
|
+
}
|
|
309
|
+
state.kiroMcp = false;
|
|
310
|
+
(0, sync_state_1.saveSyncedState)(state, brewRoot);
|
|
311
|
+
return [{ entryName, status: 'removed', path: mcpJsonPath }];
|
|
312
|
+
}
|
|
313
|
+
catch (e) {
|
|
314
|
+
return [{ entryName, status: 'error', note: e.message }];
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=sync-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-mcp.js","sourceRoot":"","sources":["../src/sync-mcp.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,sDA6BC;AAMD,8DAmCC;AAkCD,oDAqCC;AAMD,4DA8BC;AAUD,kDAgCC;AAMD,0DAmCC;AApRD,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AACxB,gDAAkC;AAClC,qCAAkC;AAClC,6CAAgE;AAGhE,+EAA+E;AAE/E,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAErC;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,QAAiB;IACrD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IAEzC,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,wBAAwB,CAAC;IAE3C,IAAI,MAAM,GAAwB,EAAE,CAAC;IACrC,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAE5E,MAAM,UAAU,GAAwB,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAChE,MAAM,QAAQ,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC9C,IAAI,QAAQ,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAA,4BAAe,EAAC,QAAQ,CAAC,CAAC;QACxC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;IACpF,IAAI,CAAC;QACH,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,IAAA,4BAAe,EAAC,QAAQ,CAAC,CAAC;QACxC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,yBAAyB,CAAC,QAAiB;IACzD,MAAM,KAAK,GAAG,IAAA,4BAAe,EAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,wBAAwB,CAAC;IAE3C,IAAI,MAAM,GAAwB,EAAE,CAAC;IACrC,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QACzE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;QACxB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;QACxB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,UAAU,CAAC;IAE1E,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,YAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,CAAC;QACD,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;QACxB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,SAAS,kBAAkB,CAAC,OAAe,EAAE,aAAqB;IAChE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,aAAa,GAAG,CAAC;IACxC,MAAM,eAAe,GAAG,IAAI,aAAa,GAAG,CAAC;IAE7C,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;QACnC,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,OAAO,QAAQ,KAAK,UAAU,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,IAAI,QAAQ,KAAK,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAEpC,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,uFAAuF;QACvF,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAAC,MAAM,GAAG,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;IAC7F,CAAC;IAED,qCAAqC;IACrC,IAAI,UAAU,GAAG,QAAQ,CAAC;IAC1B,IAAI,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,UAAU,EAAE,CAAC;IAExE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,QAAiB;IACpD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,uBAAuB,CAAC;IAE1C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC;QAAC,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAE5D,qDAAqD;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAQ,CAAC;QACtC,IAAI,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;YAC5D,MAAM,KAAK,GAAG,IAAA,4BAAe,EAAC,QAAQ,CAAC,CAAC;YACxC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;YACtB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,kBAAkB,UAAU,6BAA6B,CAAC,CAAC,OAAO,iCAAiC,CAAC,CAAC;IACnH,CAAC;IAED,qGAAqG;IACrG,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,UAAU,GAAG,OAAO,GAAG,GAAG,GAAG,oDAAoD,CAAC;IAExF,IAAI,CAAC;QACH,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,IAAA,4BAAe,EAAC,QAAQ,CAAC,CAAC;QACxC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,wBAAwB,CAAC,QAAiB;IACxD,MAAM,KAAK,GAAG,IAAA,4BAAe,EAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAE/B,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,uBAAuB,CAAC;IAE1C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QAAC,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QACzD,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;QACvB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IACjE,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QACpB,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;QACvB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAClC,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACrE,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;QACvB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,MAAM,cAAc,GAAG,WAAW,CAAC;AAEnC;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,QAAiB;IACnD,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnD,YAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,sBAAsB,CAAC;IAEzC,IAAI,MAAM,GAAwB,EAAE,CAAC;IACrC,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAE5E,MAAM,UAAU,GAAwB,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAChE,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,QAAQ,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAA,4BAAe,EAAC,QAAQ,CAAC,CAAC;QACxC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;IAClF,IAAI,CAAC;QACH,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,IAAA,4BAAe,EAAC,QAAQ,CAAC,CAAC;QACxC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,QAAiB;IACvD,MAAM,KAAK,GAAG,IAAA,4BAAe,EAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAE9B,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,sBAAsB,CAAC;IAEzC,IAAI,MAAM,GAAwB,EAAE,CAAC;IACrC,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QACzE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACtB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACtB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,UAAU,CAAC;IAE1E,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,YAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,CAAC;QACD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACtB,IAAA,4BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const SYNCED_SKILLS_FILE = "synced-skills.json";
|
|
2
|
+
export interface SyncedState {
|
|
3
|
+
claude: string[];
|
|
4
|
+
gemini: string[];
|
|
5
|
+
windsurf: string[];
|
|
6
|
+
cursor: boolean;
|
|
7
|
+
cursorMcp: boolean;
|
|
8
|
+
antigravity: string[];
|
|
9
|
+
codexMcp: boolean;
|
|
10
|
+
kiro: string[];
|
|
11
|
+
kiroMcp: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function getSyncedSkillsPath(brewRoot?: string): string;
|
|
14
|
+
export declare function loadSyncedState(brewRoot?: string): SyncedState;
|
|
15
|
+
export declare function saveSyncedState(state: SyncedState, brewRoot?: string): void;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SYNCED_SKILLS_FILE = void 0;
|
|
7
|
+
exports.getSyncedSkillsPath = getSyncedSkillsPath;
|
|
8
|
+
exports.loadSyncedState = loadSyncedState;
|
|
9
|
+
exports.saveSyncedState = saveSyncedState;
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const config_1 = require("./config");
|
|
13
|
+
exports.SYNCED_SKILLS_FILE = 'synced-skills.json';
|
|
14
|
+
function getSyncedSkillsPath(brewRoot) {
|
|
15
|
+
return path_1.default.join(brewRoot ?? (0, config_1.getBrewRoot)(), exports.SYNCED_SKILLS_FILE);
|
|
16
|
+
}
|
|
17
|
+
function loadSyncedState(brewRoot) {
|
|
18
|
+
try {
|
|
19
|
+
const raw = JSON.parse(fs_1.default.readFileSync(getSyncedSkillsPath(brewRoot), 'utf-8'));
|
|
20
|
+
// Migrate old flat format: { skills: [...] } → { claude: [...] }
|
|
21
|
+
if (raw.skills && !raw.claude) {
|
|
22
|
+
return { claude: raw.skills, gemini: [], windsurf: [], cursor: false, cursorMcp: false, antigravity: [], codexMcp: false, kiro: [], kiroMcp: false };
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
claude: raw.claude ?? [],
|
|
26
|
+
gemini: raw.gemini ?? [],
|
|
27
|
+
windsurf: raw.windsurf ?? [],
|
|
28
|
+
cursor: raw.cursor ?? false,
|
|
29
|
+
cursorMcp: raw.cursorMcp ?? false,
|
|
30
|
+
antigravity: raw.antigravity ?? [],
|
|
31
|
+
codexMcp: raw.codexMcp ?? false,
|
|
32
|
+
kiro: raw.kiro ?? [],
|
|
33
|
+
kiroMcp: raw.kiroMcp ?? false,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { claude: [], gemini: [], windsurf: [], cursor: false, cursorMcp: false, antigravity: [], codexMcp: false, kiro: [], kiroMcp: false };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function saveSyncedState(state, brewRoot) {
|
|
41
|
+
const p = getSyncedSkillsPath(brewRoot);
|
|
42
|
+
fs_1.default.mkdirSync(path_1.default.dirname(p), { recursive: true });
|
|
43
|
+
fs_1.default.writeFileSync(p, JSON.stringify(state, null, 2), 'utf-8');
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=sync-state.js.map
|