sqlew 3.6.2 → 3.6.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/CHANGELOG.md +489 -403
- package/README.md +44 -3
- package/assets/config.example.toml +69 -0
- package/assets/sample-agents/README.md +38 -0
- package/assets/sample-agents/sqlew-architect.md +431 -0
- package/assets/sample-agents/sqlew-researcher.md +339 -0
- package/assets/sample-agents/sqlew-scrum-master.md +239 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +13 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/minimal-generator.d.ts +25 -0
- package/dist/config/minimal-generator.d.ts.map +1 -0
- package/dist/config/minimal-generator.js +103 -0
- package/dist/config/minimal-generator.js.map +1 -0
- package/dist/config/types.d.ts +13 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -1
- package/dist/database.d.ts +6 -9
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +30 -106
- package/dist/database.js.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/init-agents.d.ts +7 -0
- package/dist/init-agents.d.ts.map +1 -0
- package/dist/init-agents.js +207 -0
- package/dist/init-agents.js.map +1 -0
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.d.ts +23 -0
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +1 -0
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.js +44 -0
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.js.map +1 -0
- package/dist/sync-agents.d.ts +13 -0
- package/dist/sync-agents.d.ts.map +1 -0
- package/dist/sync-agents.js +112 -0
- package/dist/sync-agents.js.map +1 -0
- package/dist/tests/migrations/test-all-versions.js +210 -210
- package/dist/tools/messaging.d.ts +4 -0
- package/dist/tools/messaging.d.ts.map +1 -1
- package/dist/tools/messaging.js +38 -0
- package/dist/tools/messaging.js.map +1 -1
- package/dist/tools/tasks.js +2 -2
- package/dist/tools/tasks.js.map +1 -1
- package/dist/utils/task-stale-detection.d.ts.map +1 -1
- package/dist/utils/task-stale-detection.js +79 -4
- package/dist/utils/task-stale-detection.js.map +1 -1
- package/dist/watcher/file-watcher.d.ts +11 -5
- package/dist/watcher/file-watcher.d.ts.map +1 -1
- package/dist/watcher/file-watcher.js +43 -10
- package/dist/watcher/file-watcher.js.map +1 -1
- package/docs/MIGRATION_CHAIN.md +293 -293
- package/docs/SPECIALIZED_AGENTS.md +576 -0
- package/package.json +86 -85
- package/dist/tests/agent-reuse.test.d.ts +0 -6
- package/dist/tests/agent-reuse.test.d.ts.map +0 -1
- package/dist/tests/agent-reuse.test.js +0 -242
- package/dist/tests/agent-reuse.test.js.map +0 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI tool to initialize sqlew specialized agents
|
|
4
|
+
* Usage: npx mcp-sqlew init-agents [--path <custom-path>]
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { createMinimalConfigIfNotExists } from './config/minimal-generator.js';
|
|
10
|
+
import { loadConfigFile } from './config/loader.js';
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = path.dirname(__filename);
|
|
13
|
+
function parseArgs() {
|
|
14
|
+
const args = process.argv.slice(2);
|
|
15
|
+
const options = {};
|
|
16
|
+
for (let i = 0; i < args.length; i++) {
|
|
17
|
+
switch (args[i]) {
|
|
18
|
+
case '--path':
|
|
19
|
+
options.targetPath = args[++i];
|
|
20
|
+
break;
|
|
21
|
+
case '--project':
|
|
22
|
+
case '--local':
|
|
23
|
+
options.projectLocal = true;
|
|
24
|
+
break;
|
|
25
|
+
case '--help':
|
|
26
|
+
case '-h':
|
|
27
|
+
printHelp();
|
|
28
|
+
process.exit(0);
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return options;
|
|
33
|
+
}
|
|
34
|
+
function printHelp() {
|
|
35
|
+
console.log(`
|
|
36
|
+
mcp-sqlew init-agents - Initialize specialized agents for mcp-sqlew
|
|
37
|
+
|
|
38
|
+
USAGE:
|
|
39
|
+
npx mcp-sqlew init-agents [OPTIONS]
|
|
40
|
+
|
|
41
|
+
OPTIONS:
|
|
42
|
+
--path <path> Custom target directory (default: ~/.claude/agents)
|
|
43
|
+
--project, --local Install to current project (.claude/agents)
|
|
44
|
+
--help, -h Show this help message
|
|
45
|
+
|
|
46
|
+
EXAMPLES:
|
|
47
|
+
# Install to global Claude Code agents directory
|
|
48
|
+
npx mcp-sqlew init-agents
|
|
49
|
+
|
|
50
|
+
# Install to current project
|
|
51
|
+
npx mcp-sqlew init-agents --project
|
|
52
|
+
|
|
53
|
+
# Install to custom location
|
|
54
|
+
npx mcp-sqlew init-agents --path /path/to/agents
|
|
55
|
+
|
|
56
|
+
AGENT FILES:
|
|
57
|
+
- sqlew-scrum-master.md Multi-agent coordination, task management
|
|
58
|
+
- sqlew-researcher.md Query decisions, analyze patterns
|
|
59
|
+
- sqlew-architect.md Document decisions, enforce constraints
|
|
60
|
+
- QUICK_START.md Usage guide with examples
|
|
61
|
+
- README.md Overview and best practices
|
|
62
|
+
`);
|
|
63
|
+
}
|
|
64
|
+
function getDefaultTargetPath() {
|
|
65
|
+
const home = process.env.HOME || process.env.USERPROFILE;
|
|
66
|
+
if (!home) {
|
|
67
|
+
throw new Error('Could not determine home directory');
|
|
68
|
+
}
|
|
69
|
+
return path.join(home, '.claude', 'agents');
|
|
70
|
+
}
|
|
71
|
+
function getSourcePath() {
|
|
72
|
+
// When running from npm package: node_modules/mcp-sqlew/dist/init-agents.js
|
|
73
|
+
// Source files are in: node_modules/mcp-sqlew/assets/sample-agents/
|
|
74
|
+
const distDir = __dirname; // .../dist
|
|
75
|
+
const packageRoot = path.dirname(distDir); // .../mcp-sqlew
|
|
76
|
+
return path.join(packageRoot, 'assets', 'sample-agents');
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Ensure config.toml exists, create if missing
|
|
80
|
+
*/
|
|
81
|
+
function ensureConfigExists() {
|
|
82
|
+
const projectRoot = process.cwd();
|
|
83
|
+
const created = createMinimalConfigIfNotExists(projectRoot);
|
|
84
|
+
if (created) {
|
|
85
|
+
console.log('✓ Created: .sqlew/config.toml (minimal defaults)');
|
|
86
|
+
console.log(' Edit [agents] section to customize agent selection\n');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get list of agent files to install based on config
|
|
91
|
+
*/
|
|
92
|
+
function getAgentsToInstall() {
|
|
93
|
+
const config = loadConfigFile();
|
|
94
|
+
const agentConfig = config.agents || {};
|
|
95
|
+
const files = [];
|
|
96
|
+
const installed = [];
|
|
97
|
+
// Add agents based on config (default: true)
|
|
98
|
+
if (agentConfig.scrum_master !== false) {
|
|
99
|
+
files.push('sqlew-scrum-master.md');
|
|
100
|
+
installed.push('Scrum Master (12KB)');
|
|
101
|
+
}
|
|
102
|
+
if (agentConfig.researcher !== false) {
|
|
103
|
+
files.push('sqlew-researcher.md');
|
|
104
|
+
installed.push('Researcher (14KB)');
|
|
105
|
+
}
|
|
106
|
+
if (agentConfig.architect !== false) {
|
|
107
|
+
files.push('sqlew-architect.md');
|
|
108
|
+
installed.push('Architect (20KB)');
|
|
109
|
+
}
|
|
110
|
+
// NOTE: Documentation is now centralized in docs/SPECIALIZED_AGENTS.md
|
|
111
|
+
// No longer installing README/QUICK_START to agent directories
|
|
112
|
+
const summary = installed.length > 0 ? installed.join(', ') : 'None';
|
|
113
|
+
return { files, summary };
|
|
114
|
+
}
|
|
115
|
+
function copyAgentFiles(sourcePath, targetPath, filesToCopy) {
|
|
116
|
+
// Ensure target directory exists
|
|
117
|
+
if (!fs.existsSync(targetPath)) {
|
|
118
|
+
fs.mkdirSync(targetPath, { recursive: true });
|
|
119
|
+
console.log(`✓ Created directory: ${targetPath}`);
|
|
120
|
+
}
|
|
121
|
+
// Copy only specified files
|
|
122
|
+
const copiedFiles = [];
|
|
123
|
+
for (const file of filesToCopy) {
|
|
124
|
+
const sourceFile = path.join(sourcePath, file);
|
|
125
|
+
const targetFile = path.join(targetPath, file);
|
|
126
|
+
// Skip if source file doesn't exist
|
|
127
|
+
if (!fs.existsSync(sourceFile)) {
|
|
128
|
+
console.warn(`⚠ Skipping missing file: ${file}`);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// Copy file
|
|
132
|
+
fs.copyFileSync(sourceFile, targetFile);
|
|
133
|
+
copiedFiles.push(file);
|
|
134
|
+
}
|
|
135
|
+
console.log(`\n✓ Copied ${copiedFiles.length} files to: ${targetPath}\n`);
|
|
136
|
+
// List copied files
|
|
137
|
+
console.log('Files installed:');
|
|
138
|
+
copiedFiles.forEach(file => {
|
|
139
|
+
console.log(` • ${file}`);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
function main() {
|
|
143
|
+
try {
|
|
144
|
+
console.log('mcp-sqlew Agent Installer\n');
|
|
145
|
+
// STEP 1: Ensure minimal config.toml exists
|
|
146
|
+
ensureConfigExists();
|
|
147
|
+
// STEP 2: Parse arguments
|
|
148
|
+
const options = parseArgs();
|
|
149
|
+
// STEP 3: Get agents to install based on config
|
|
150
|
+
const { files, summary } = getAgentsToInstall();
|
|
151
|
+
if (files.length === 0) {
|
|
152
|
+
console.log('⚠ No agents enabled in .sqlew/config.toml\n');
|
|
153
|
+
console.log('To enable agents, edit .sqlew/config.toml:');
|
|
154
|
+
console.log('[agents]');
|
|
155
|
+
console.log('scrum_master = true');
|
|
156
|
+
console.log('researcher = true');
|
|
157
|
+
console.log('architect = true\n');
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
console.log(`Installing agents: ${summary}\n`);
|
|
161
|
+
// STEP 4: Determine target path
|
|
162
|
+
let targetPath;
|
|
163
|
+
if (options.targetPath) {
|
|
164
|
+
targetPath = path.resolve(options.targetPath);
|
|
165
|
+
}
|
|
166
|
+
else if (options.projectLocal) {
|
|
167
|
+
targetPath = path.join(process.cwd(), '.claude', 'agents');
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
targetPath = getDefaultTargetPath();
|
|
171
|
+
}
|
|
172
|
+
// STEP 5: Get source path
|
|
173
|
+
const sourcePath = getSourcePath();
|
|
174
|
+
// Verify source exists
|
|
175
|
+
if (!fs.existsSync(sourcePath)) {
|
|
176
|
+
throw new Error(`Source directory not found: ${sourcePath}\nThis may indicate an installation issue.`);
|
|
177
|
+
}
|
|
178
|
+
console.log(`Source: ${sourcePath}`);
|
|
179
|
+
console.log(`Target: ${targetPath}\n`);
|
|
180
|
+
// STEP 6: Copy selected files
|
|
181
|
+
copyAgentFiles(sourcePath, targetPath, files);
|
|
182
|
+
// STEP 7: Success message
|
|
183
|
+
console.log(`\n✓ Installation complete!\n`);
|
|
184
|
+
console.log('NEXT STEPS:');
|
|
185
|
+
console.log(' 1. Restart Claude Code (if running)');
|
|
186
|
+
console.log(' 2. Use agents with @ prefix:');
|
|
187
|
+
if (files.includes('sqlew-scrum-master.md')) {
|
|
188
|
+
console.log(' @sqlew-scrum-master "Plan the sprint"');
|
|
189
|
+
}
|
|
190
|
+
if (files.includes('sqlew-researcher.md')) {
|
|
191
|
+
console.log(' @sqlew-researcher "Query past decisions"');
|
|
192
|
+
}
|
|
193
|
+
if (files.includes('sqlew-architect.md')) {
|
|
194
|
+
console.log(' @sqlew-architect "Document architecture"');
|
|
195
|
+
}
|
|
196
|
+
console.log('\n 3. Customize agent selection:');
|
|
197
|
+
console.log(' Edit .sqlew/config.toml → [agents] section');
|
|
198
|
+
console.log(' Disable unused agents to reduce token consumption\n');
|
|
199
|
+
console.log('For more info: https://github.com/sin5ddd/mcp-sqlew\n');
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
console.error(`\n❌ Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
main();
|
|
207
|
+
//# sourceMappingURL=init-agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-agents.js","sourceRoot":"","sources":["../src/init-agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Migration: Simplify Agent System (v3.6.5)
|
|
4
|
+
*
|
|
5
|
+
* Removes unused messaging system. Agent pooling columns (in_use, is_reusable)
|
|
6
|
+
* are left in schema but ignored by application code for backward compatibility.
|
|
7
|
+
*
|
|
8
|
+
* Changes:
|
|
9
|
+
* - Drops t_agent_messages table (messaging system unused)
|
|
10
|
+
* - Code no longer uses in_use/is_reusable columns (but columns remain in DB)
|
|
11
|
+
*
|
|
12
|
+
* Benefits:
|
|
13
|
+
* - Eliminates agent pooling race conditions
|
|
14
|
+
* - Removes UNIQUE constraint errors
|
|
15
|
+
* - Simplifies agent management to basic name registry
|
|
16
|
+
* - Maintains cross-RDBMS compatibility without raw SQL
|
|
17
|
+
*
|
|
18
|
+
* Note: Columns in_use and is_reusable are deprecated but left in m_agents table
|
|
19
|
+
* for backward compatibility and to avoid complex SQLite FK constraint handling.
|
|
20
|
+
*/
|
|
21
|
+
export declare function up(knex: Knex): Promise<void>;
|
|
22
|
+
export declare function down(knex: Knex): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=20251028000000_simplify_agent_system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20251028000000_simplify_agent_system.d.ts","sourceRoot":"","sources":["../../../../src/migrations/knex/enhancements/20251028000000_simplify_agent_system.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlD;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBpD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration: Simplify Agent System (v3.6.5)
|
|
3
|
+
*
|
|
4
|
+
* Removes unused messaging system. Agent pooling columns (in_use, is_reusable)
|
|
5
|
+
* are left in schema but ignored by application code for backward compatibility.
|
|
6
|
+
*
|
|
7
|
+
* Changes:
|
|
8
|
+
* - Drops t_agent_messages table (messaging system unused)
|
|
9
|
+
* - Code no longer uses in_use/is_reusable columns (but columns remain in DB)
|
|
10
|
+
*
|
|
11
|
+
* Benefits:
|
|
12
|
+
* - Eliminates agent pooling race conditions
|
|
13
|
+
* - Removes UNIQUE constraint errors
|
|
14
|
+
* - Simplifies agent management to basic name registry
|
|
15
|
+
* - Maintains cross-RDBMS compatibility without raw SQL
|
|
16
|
+
*
|
|
17
|
+
* Note: Columns in_use and is_reusable are deprecated but left in m_agents table
|
|
18
|
+
* for backward compatibility and to avoid complex SQLite FK constraint handling.
|
|
19
|
+
*/
|
|
20
|
+
export async function up(knex) {
|
|
21
|
+
// Drop t_agent_messages table (messaging system not used)
|
|
22
|
+
await knex.schema.dropTableIfExists('t_agent_messages');
|
|
23
|
+
// Note: in_use and is_reusable columns remain in m_agents table but are ignored by code
|
|
24
|
+
// Dropping these columns would require complex table recreation on SQLite due to FK constraints
|
|
25
|
+
// This approach maintains cross-RDBMS compatibility without raw SQL
|
|
26
|
+
}
|
|
27
|
+
export async function down(knex) {
|
|
28
|
+
// Recreate t_agent_messages table
|
|
29
|
+
await knex.schema.createTable('t_agent_messages', (table) => {
|
|
30
|
+
table.increments('id').primary();
|
|
31
|
+
table.integer('from_agent_id').references('id').inTable('m_agents');
|
|
32
|
+
table.integer('to_agent_id').references('id').inTable('m_agents');
|
|
33
|
+
table.integer('msg_type').notNullable();
|
|
34
|
+
table.integer('priority').defaultTo(2);
|
|
35
|
+
table.text('message').notNullable();
|
|
36
|
+
table.text('payload');
|
|
37
|
+
table.boolean('read').defaultTo(false);
|
|
38
|
+
table.integer('ts').notNullable();
|
|
39
|
+
table.index('ts', 'idx_agent_messages_ts');
|
|
40
|
+
table.index(['to_agent_id', 'read'], 'idx_agent_messages_to_unread');
|
|
41
|
+
});
|
|
42
|
+
// Note: in_use and is_reusable columns were not dropped, so no need to restore
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=20251028000000_simplify_agent_system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20251028000000_simplify_agent_system.js","sourceRoot":"","sources":["../../../../src/migrations/knex/enhancements/20251028000000_simplify_agent_system.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,IAAU;IACjC,0DAA0D;IAC1D,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IAExD,wFAAwF;IACxF,gGAAgG;IAChG,oEAAoE;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAU;IACnC,kCAAkC;IAClC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1D,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACjC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACpE,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAClE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACxC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;QAC3C,KAAK,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,8BAA8B,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,+EAA+E;AACjF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent synchronization module
|
|
3
|
+
* Syncs specialized agents with config.toml on startup
|
|
4
|
+
* - Copies enabled agents (if missing)
|
|
5
|
+
* - Deletes disabled agents (if present)
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Synchronize agents with config.toml
|
|
9
|
+
* - Copy enabled agents if missing
|
|
10
|
+
* - Delete disabled agents if present
|
|
11
|
+
*/
|
|
12
|
+
export declare function syncAgentsWithConfig(): void;
|
|
13
|
+
//# sourceMappingURL=sync-agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-agents.d.ts","sourceRoot":"","sources":["../src/sync-agents.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwCH;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAgF3C"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent synchronization module
|
|
3
|
+
* Syncs specialized agents with config.toml on startup
|
|
4
|
+
* - Copies enabled agents (if missing)
|
|
5
|
+
* - Deletes disabled agents (if present)
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import { createMinimalConfigIfNotExists } from './config/minimal-generator.js';
|
|
11
|
+
import { loadConfigFile } from './config/loader.js';
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = path.dirname(__filename);
|
|
14
|
+
const AGENTS = [
|
|
15
|
+
{ filename: 'sqlew-scrum-master.md', configKey: 'scrum_master', displayName: 'Scrum Master' },
|
|
16
|
+
{ filename: 'sqlew-researcher.md', configKey: 'researcher', displayName: 'Researcher' },
|
|
17
|
+
{ filename: 'sqlew-architect.md', configKey: 'architect', displayName: 'Architect' },
|
|
18
|
+
];
|
|
19
|
+
/**
|
|
20
|
+
* Get source path for agent files
|
|
21
|
+
*/
|
|
22
|
+
function getSourcePath() {
|
|
23
|
+
const distDir = __dirname; // .../dist
|
|
24
|
+
const packageRoot = path.dirname(distDir); // .../mcp-sqlew
|
|
25
|
+
return path.join(packageRoot, 'assets', 'sample-agents');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get target path for agents (project-local .claude/agents)
|
|
29
|
+
*/
|
|
30
|
+
function getTargetPath() {
|
|
31
|
+
const projectRoot = process.cwd();
|
|
32
|
+
return path.join(projectRoot, '.claude', 'agents');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Synchronize agents with config.toml
|
|
36
|
+
* - Copy enabled agents if missing
|
|
37
|
+
* - Delete disabled agents if present
|
|
38
|
+
*/
|
|
39
|
+
export function syncAgentsWithConfig() {
|
|
40
|
+
try {
|
|
41
|
+
// Ensure minimal config.toml exists
|
|
42
|
+
const projectRoot = process.cwd();
|
|
43
|
+
createMinimalConfigIfNotExists(projectRoot);
|
|
44
|
+
// Load config
|
|
45
|
+
const config = loadConfigFile();
|
|
46
|
+
const agentConfig = config.agents || {};
|
|
47
|
+
const sourcePath = getSourcePath();
|
|
48
|
+
const targetPath = getTargetPath();
|
|
49
|
+
// Verify source directory exists
|
|
50
|
+
if (!fs.existsSync(sourcePath)) {
|
|
51
|
+
console.error(`⚠ Agent source directory not found: ${sourcePath}`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Ensure target directory exists
|
|
55
|
+
if (!fs.existsSync(targetPath)) {
|
|
56
|
+
fs.mkdirSync(targetPath, { recursive: true });
|
|
57
|
+
}
|
|
58
|
+
const copied = [];
|
|
59
|
+
const deleted = [];
|
|
60
|
+
const skipped = [];
|
|
61
|
+
// Process each agent
|
|
62
|
+
for (const agent of AGENTS) {
|
|
63
|
+
const sourceFile = path.join(sourcePath, agent.filename);
|
|
64
|
+
const targetFile = path.join(targetPath, agent.filename);
|
|
65
|
+
// Check if agent is enabled in config (default: true)
|
|
66
|
+
const isEnabled = agentConfig[agent.configKey] !== false;
|
|
67
|
+
if (isEnabled) {
|
|
68
|
+
// Agent enabled: ensure file exists
|
|
69
|
+
if (!fs.existsSync(targetFile)) {
|
|
70
|
+
// File missing, copy it
|
|
71
|
+
if (fs.existsSync(sourceFile)) {
|
|
72
|
+
fs.copyFileSync(sourceFile, targetFile);
|
|
73
|
+
copied.push(agent.displayName);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.error(`⚠ Source file not found: ${sourceFile}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// File already exists, skip
|
|
81
|
+
skipped.push(agent.displayName);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Agent disabled: ensure file doesn't exist
|
|
86
|
+
if (fs.existsSync(targetFile)) {
|
|
87
|
+
// File exists, delete it
|
|
88
|
+
fs.unlinkSync(targetFile);
|
|
89
|
+
deleted.push(agent.displayName);
|
|
90
|
+
}
|
|
91
|
+
// else: file doesn't exist, nothing to do
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Report changes
|
|
95
|
+
if (copied.length > 0) {
|
|
96
|
+
console.log(`✓ Installed agents: ${copied.join(', ')}`);
|
|
97
|
+
console.log(` Location: ${targetPath}`);
|
|
98
|
+
}
|
|
99
|
+
if (deleted.length > 0) {
|
|
100
|
+
console.log(`✓ Removed agents: ${deleted.join(', ')}`);
|
|
101
|
+
}
|
|
102
|
+
// Show usage hint if any agents were copied
|
|
103
|
+
if (copied.length > 0) {
|
|
104
|
+
console.log(` Use agents with @ prefix: @sqlew-scrum-master, @sqlew-researcher, @sqlew-architect`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
// Don't fail startup if sync fails
|
|
109
|
+
console.error(`⚠ Failed to sync agents: ${error instanceof Error ? error.message : String(error)}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=sync-agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-agents.js","sourceRoot":"","sources":["../src/sync-agents.ts"],"names":[],"mappings":"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"}
|