aem-tools.ts•6.58 kB
import { AEMClient, AEMConfig } from './aem-client.js';
export class AEMTools {
constructor(private aemClient: AEMClient) {}
private getConfig(args: any): AEMConfig {
return {
host: args.host || 'localhost',
port: args.port || 4506,
username: args.username || 'admin',
password: args.password || 'admin',
};
}
async checkStatus(args: any) {
const config = this.getConfig(args);
const status = await this.aemClient.checkStatus(config);
return {
content: [
{
type: 'text',
text: `AEM Instance Status:
Host: ${config.host}:${config.port}
Status: ${status.status}
${status.version ? `Version: ${status.version}` : ''}
${status.totalBundles ? `Total Bundles: ${status.totalBundles}` : ''}
${status.activeBundles ? `Active Bundles: ${status.activeBundles}` : ''}
${status.message ? `Message: ${status.message}` : ''}`,
},
],
};
}
async installPackage(args: any) {
const config = this.getConfig(args);
const { packagePath, force = false } = args;
if (!packagePath) {
throw new Error('Package path is required');
}
const result = await this.aemClient.installPackage(config, packagePath, force);
return {
content: [
{
type: 'text',
text: `Package Installation Result:
Success: ${result.success}
Message: ${result.message}
Package: ${packagePath}
Force: ${force}`,
},
],
};
}
async listPackages(args: any) {
const config = this.getConfig(args);
const result = await this.aemClient.listPackages(config);
let packagesText = 'Installed Packages:\n';
if (result.success && result.packages) {
if (typeof result.packages === 'string') {
// Parse HTML response if needed
packagesText += result.packages;
} else {
packagesText += JSON.stringify(result.packages, null, 2);
}
} else {
packagesText += result.message || 'Failed to retrieve packages';
}
return {
content: [
{
type: 'text',
text: packagesText,
},
],
};
}
async createPage(args: any) {
const config = this.getConfig(args);
const { parentPath, pageName, pageTitle, template } = args;
if (!parentPath || !pageName || !pageTitle || !template) {
throw new Error('parentPath, pageName, pageTitle, and template are required');
}
const result = await this.aemClient.createPage(config, parentPath, pageName, pageTitle, template);
return {
content: [
{
type: 'text',
text: `Page Creation Result:
Success: ${result.success}
Message: ${result.message}
${result.path ? `Path: ${result.path}` : ''}
Parent: ${parentPath}
Name: ${pageName}
Title: ${pageTitle}
Template: ${template}`,
},
],
};
}
async replicateContent(args: any) {
const config = this.getConfig(args);
const { path, action = 'activate' } = args;
if (!path) {
throw new Error('Content path is required');
}
const result = await this.aemClient.replicateContent(config, path, action);
return {
content: [
{
type: 'text',
text: `Content Replication Result:
Success: ${result.success}
Message: ${result.message}
Path: ${path}
Action: ${action}`,
},
],
};
}
async queryContent(args: any) {
const config = this.getConfig(args);
const { query, type = 'JCR-SQL2', limit = 20 } = args;
if (!query) {
throw new Error('Query is required');
}
const result = await this.aemClient.queryContent(config, query, type, limit);
let queryText = `Content Query Result:
Query: ${query}
Type: ${type}
Limit: ${limit}
Success: ${result.success}
`;
if (result.success && result.results) {
queryText += `Results:\n${JSON.stringify(result.results, null, 2)}`;
} else {
queryText += `Message: ${result.message || 'Query failed'}`;
}
return {
content: [
{
type: 'text',
text: queryText,
},
],
};
}
async getBundleStatus(args: any) {
const config = this.getConfig(args);
const { bundleId } = args;
const result = await this.aemClient.getBundleStatus(config, bundleId);
let bundleText = `OSGi Bundle Status:
${bundleId ? `Bundle ID: ${bundleId}` : 'All Bundles'}
Success: ${result.success}
`;
if (result.success && result.bundles) {
if (bundleId) {
// Single bundle
bundleText += `Bundle Details:\n${JSON.stringify(result.bundles, null, 2)}`;
} else {
// All bundles summary
const bundles = result.bundles;
if (bundles.s && Array.isArray(bundles.s)) {
const totalBundles = bundles.s.length;
const activeBundles = bundles.s.filter((bundle: any) => bundle.state === 'Active').length;
const resolvedBundles = bundles.s.filter((bundle: any) => bundle.state === 'Resolved').length;
const installedBundles = bundles.s.filter((bundle: any) => bundle.state === 'Installed').length;
bundleText += `Total Bundles: ${totalBundles}
Active Bundles: ${activeBundles}
Resolved Bundles: ${resolvedBundles}
Installed Bundles: ${installedBundles}
Bundle Summary:
${bundles.s.slice(0, 10).map((bundle: any) =>
`- ${bundle.name} (${bundle.symbolicName}): ${bundle.state}`
).join('\n')}
${totalBundles > 10 ? `\n... and ${totalBundles - 10} more bundles` : ''}`;
} else {
bundleText += `Bundle Data:\n${JSON.stringify(bundles, null, 2)}`;
}
}
} else {
bundleText += `Message: ${result.message || 'Failed to get bundle status'}`;
}
return {
content: [
{
type: 'text',
text: bundleText,
},
],
};
}
async clearCache(args: any) {
const config = this.getConfig(args);
const { cacheType = 'all' } = args;
const result = await this.aemClient.clearCache(config, cacheType);
let cacheText = `Cache Clear Result:
Cache Type: ${cacheType}
Success: ${result.success}
`;
if (result.success && result.results) {
cacheText += `\nResults:\n`;
result.results.forEach((res: any) => {
cacheText += `- ${res.type}: ${res.success ? 'Success' : 'Failed'} - ${res.message}\n`;
});
} else {
cacheText += `Message: Failed to clear cache`;
}
return {
content: [
{
type: 'text',
text: cacheText,
},
],
};
}
}