nx-claude-sessions-intelligence
Version:
The first NX-native intelligent AI development orchestration system with persistent decision storage, pattern recognition, and cross-session knowledge accumulation. Transform forgetful Claude sessions into intelligent, context-aware development workflows.
273 lines (224 loc) • 7.79 kB
JavaScript
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
/**
* Manual Initialization for nx-claude-sessions-intelligence
*
* This script bypasses NX generators and manually sets up intelligent session management
* when NX lockfile parsing fails.
*/
async function manualInit() {
console.log('🧠 Manual Initialization: nx-claude-sessions-intelligence');
console.log('================================================');
console.log('');
try {
// Check if we're in an NX workspace
const nxJsonPath = path.join(process.cwd(), 'nx.json');
if (!fs.existsSync(nxJsonPath)) {
console.error('❌ Not an NX workspace - nx.json not found');
process.exit(1);
}
console.log('✅ NX workspace detected');
// 1. Update nx.json with plugin configuration
await updateNxConfig();
// 2. Create .claude directories for existing libraries
await setupClaudeDirectories();
// 3. Create session storage directory
await setupSessionStorage();
// 4. Update .gitignore
await updateGitignore();
console.log('');
console.log('🎉 Manual initialization complete!');
console.log('');
console.log('📋 Next Steps:');
console.log('1. Install MCP server: npm install -g claude-session-intelligence-mcp@latest');
console.log('2. Configure Claude Desktop (see documentation)');
console.log('3. Start your first intelligent session:');
console.log(' npx nx start-claude-session <library> --task="Your task"');
console.log('');
} catch (error) {
console.error('❌ Manual initialization failed:', error.message);
console.log('');
console.log('🛠️ Manual steps to complete setup:');
console.log('1. Add to nx.json:');
console.log(JSON.stringify({
plugins: [{
plugin: "nx-claude-sessions-intelligence",
options: {
maxConcurrency: 5,
sessionTimeout: "30m",
orchestrationStrategy: "dependency-aware"
}
}]
}, null, 2));
console.log('');
console.log('2. Create .claude directories in each library');
console.log('3. Install MCP server globally');
process.exit(1);
}
}
async function updateNxConfig() {
console.log('📝 Updating nx.json configuration...');
const nxJsonPath = path.join(process.cwd(), 'nx.json');
let nxConfig;
try {
const content = fs.readFileSync(nxJsonPath, 'utf-8');
nxConfig = JSON.parse(content);
} catch (error) {
throw new Error(`Failed to read nx.json: ${error.message}`);
}
// Initialize plugins array if it doesn't exist
if (!nxConfig.plugins) {
nxConfig.plugins = [];
}
// Check if plugin is already configured
const existingPlugin = nxConfig.plugins.find(p =>
p === 'nx-claude-sessions-intelligence' ||
(typeof p === 'object' && p.plugin === 'nx-claude-sessions-intelligence')
);
if (existingPlugin) {
console.log(' ⚠️ Plugin already configured in nx.json');
} else {
// Add plugin configuration
nxConfig.plugins.push({
plugin: 'nx-claude-sessions-intelligence',
options: {
maxConcurrency: 5,
sessionTimeout: '30m',
orchestrationStrategy: 'dependency-aware',
autoTransitions: {
enabled: true,
crossLibraryThreshold: 3,
topicShiftConfidence: 0.7
}
}
});
// Write back to nx.json
fs.writeFileSync(nxJsonPath, JSON.stringify(nxConfig, null, 2) + '\n');
console.log(' ✅ Plugin configuration added to nx.json');
}
}
async function setupClaudeDirectories() {
console.log('📁 Setting up .claude directories...');
const dirsToCheck = ['libs', 'packages', 'apps'];
let librariesFound = 0;
for (const dir of dirsToCheck) {
const dirPath = path.join(process.cwd(), dir);
if (fs.existsSync(dirPath)) {
const entries = fs.readdirSync(dirPath);
for (const entry of entries) {
const entryPath = path.join(dirPath, entry);
const stat = fs.statSync(entryPath);
if (stat.isDirectory()) {
await createClaudeDirectory(entry, entryPath);
librariesFound++;
}
}
}
}
console.log(` ✅ Created .claude directories for ${librariesFound} libraries`);
}
async function createClaudeDirectory(libraryName, libraryPath) {
const claudeDir = path.join(libraryPath, '.claude');
if (!fs.existsSync(claudeDir)) {
fs.mkdirSync(claudeDir, { recursive: true });
}
// Create context.md
const contextFile = path.join(claudeDir, 'context.md');
if (!fs.existsSync(contextFile)) {
const contextContent = `# ${libraryName} Library Context
## Purpose
[Describe what this library does]
## Architecture
[Key architectural patterns and design decisions]
## Dependencies
- [List key dependencies and their purposes]
## Established Patterns
- [Document coding conventions and patterns]
## Integration Points
- [How this library integrates with others]
## Known Issues & Solutions
- [Common problems and their solutions]
## Testing Strategy
- [How this library should be tested]
`;
fs.writeFileSync(contextFile, contextContent);
}
// Create empty JSON files
const files = [
{ name: 'decisions.json', content: { decisions: [] } },
{ name: 'patterns.json', content: { patterns: [] } },
{ name: 'session-history.json', content: { sessions: [] } },
{ name: 'dependencies.json', content: {} }
];
for (const file of files) {
const filePath = path.join(claudeDir, file.name);
if (!fs.existsSync(filePath)) {
fs.writeFileSync(filePath, JSON.stringify(file.content, null, 2));
}
}
// Create metadata
const metaFile = path.join(claudeDir, 'meta.json');
if (!fs.existsSync(metaFile)) {
const meta = {
library_name: libraryName,
intelligence_version: '1.0.0',
created: new Date().toISOString(),
last_updated: new Date().toISOString(),
session_count: 0,
decision_count: 0,
pattern_count: 0,
maturity_level: 'experimental',
expertise_areas: [],
complexity_metrics: {
files_managed: 0,
dependency_depth: 0,
pattern_reuse: 0.0
}
};
fs.writeFileSync(metaFile, JSON.stringify(meta, null, 2));
}
}
async function setupSessionStorage() {
console.log('🗄️ Setting up session storage...');
const sessionDir = path.join(process.cwd(), '.nx-claude-sessions');
const subdirs = ['active', 'archives', 'coordination'];
for (const subdir of subdirs) {
const dirPath = path.join(sessionDir, subdir);
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath, { recursive: true });
}
}
console.log(' ✅ Session storage directories created');
}
async function updateGitignore() {
console.log('📝 Updating .gitignore...');
const gitignorePath = path.join(process.cwd(), '.gitignore');
const linesToAdd = [
'',
'# Claude Session Intelligence',
'.nx-claude-sessions/active/',
'.nx-claude-sessions/coordination/'
];
let gitignoreContent = '';
if (fs.existsSync(gitignorePath)) {
gitignoreContent = fs.readFileSync(gitignorePath, 'utf-8');
}
// Check if lines are already present
const hasIntelligenceSection = gitignoreContent.includes('Claude Session Intelligence');
if (!hasIntelligenceSection) {
gitignoreContent += linesToAdd.join('\n') + '\n';
fs.writeFileSync(gitignorePath, gitignoreContent);
console.log(' ✅ .gitignore updated');
} else {
console.log(' ⚠️ .gitignore already configured');
}
}
// Run if called directly
if (require.main === module) {
manualInit().catch(error => {
console.error('Fatal error:', error);
process.exit(1);
});
}
module.exports = { manualInit };