Delete workspace-utils-fixed directory
This commit is contained in:
parent
587344b624
commit
c51b66c101
|
|
@ -1,141 +0,0 @@
|
||||||
#!/usr/bin/env node
|
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
function ensureDir(dirPath) {
|
|
||||||
if (!fs.existsSync(dirPath)) {
|
|
||||||
fs.mkdirSync(dirPath, { recursive: true });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeFile(filePath) {
|
|
||||||
try {
|
|
||||||
fs.unlinkSync(filePath);
|
|
||||||
return true;
|
|
||||||
} catch (e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function moveFile(sourcePath, targetPath) {
|
|
||||||
try {
|
|
||||||
const data = fs.readFileSync(sourcePath);
|
|
||||||
fs.writeFileSync(targetPath, data);
|
|
||||||
fs.unlinkSync(sourcePath);
|
|
||||||
return true;
|
|
||||||
} catch (e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function cleanupWorkspace() {
|
|
||||||
try {
|
|
||||||
const workspacePath = path.join(process.cwd(), '.workspace');
|
|
||||||
|
|
||||||
if (!fs.existsSync(workspacePath)) {
|
|
||||||
console.error('❌ Workspace directory not found.');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('🧹 Starting workspace cleanup...');
|
|
||||||
|
|
||||||
// Repair directory structure
|
|
||||||
const directories = ['sessions', 'context', 'handoffs', 'decisions', 'progress', 'quality', 'archive'];
|
|
||||||
let repairedDirs = 0;
|
|
||||||
|
|
||||||
for (const dir of directories) {
|
|
||||||
const dirPath = path.join(workspacePath, dir);
|
|
||||||
if (!fs.existsSync(dirPath)) {
|
|
||||||
ensureDir(dirPath);
|
|
||||||
repairedDirs++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (repairedDirs > 0) {
|
|
||||||
console.log(`✅ Repaired ${repairedDirs} missing directories`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clean up expired sessions (older than 2 hours)
|
|
||||||
const sessionsPath = path.join(workspacePath, 'sessions');
|
|
||||||
let sessionFiles = [];
|
|
||||||
if (fs.existsSync(sessionsPath)) {
|
|
||||||
sessionFiles = fs.readdirSync(sessionsPath);
|
|
||||||
}
|
|
||||||
const twoHoursAgo = Date.now() - (2 * 60 * 60 * 1000);
|
|
||||||
|
|
||||||
let cleanedSessions = 0;
|
|
||||||
for (const file of sessionFiles) {
|
|
||||||
if (file.endsWith('.json')) {
|
|
||||||
try {
|
|
||||||
const sessionPath = path.join(sessionsPath, file);
|
|
||||||
const sessionContent = fs.readFileSync(sessionPath, 'utf8');
|
|
||||||
const sessionData = JSON.parse(sessionContent);
|
|
||||||
const lastHeartbeat = new Date(sessionData.lastHeartbeat).getTime();
|
|
||||||
|
|
||||||
if (lastHeartbeat < twoHoursAgo) {
|
|
||||||
if (removeFile(sessionPath)) {
|
|
||||||
cleanedSessions++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
// Remove corrupted session files
|
|
||||||
if (removeFile(path.join(sessionsPath, file))) {
|
|
||||||
cleanedSessions++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cleanedSessions > 0) {
|
|
||||||
console.log(`✅ Cleaned up ${cleanedSessions} expired sessions`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Archive old context files (older than 30 days)
|
|
||||||
const contextPath = path.join(workspacePath, 'context');
|
|
||||||
const archivePath = path.join(workspacePath, 'archive');
|
|
||||||
const thirtyDaysAgo = Date.now() - (30 * 24 * 60 * 60 * 1000);
|
|
||||||
|
|
||||||
if (fs.existsSync(contextPath)) {
|
|
||||||
let contextFiles = [];
|
|
||||||
try {
|
|
||||||
contextFiles = fs.readdirSync(contextPath);
|
|
||||||
} catch (e) {
|
|
||||||
contextFiles = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
let archivedFiles = 0;
|
|
||||||
|
|
||||||
for (const file of contextFiles) {
|
|
||||||
const filePath = path.join(contextPath, file);
|
|
||||||
try {
|
|
||||||
const stats = fs.statSync(filePath);
|
|
||||||
|
|
||||||
if (stats.mtime.getTime() < thirtyDaysAgo) {
|
|
||||||
const archiveFile = path.join(archivePath, `archived-${Date.now()}-${file}`);
|
|
||||||
if (moveFile(filePath, archiveFile)) {
|
|
||||||
archivedFiles++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
// Skip files that can't be processed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (archivedFiles > 0) {
|
|
||||||
console.log(`✅ Archived ${archivedFiles} old context files`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('✅ Workspace cleanup completed successfully');
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error('❌ Failed to cleanup workspace:', error.message);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (require.main === module) {
|
|
||||||
cleanupWorkspace();
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = { cleanupWorkspace };
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
||||||
#!/usr/bin/env node
|
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
async function createHandoff(fromAgent, toAgent, context = '') {
|
|
||||||
try {
|
|
||||||
const workspacePath = path.join(process.cwd(), '.workspace');
|
|
||||||
const handoffsPath = path.join(workspacePath, 'handoffs');
|
|
||||||
|
|
||||||
if (!fs.existsSync(handoffsPath)) {
|
|
||||||
console.error('❌ Workspace handoffs directory not found.');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
||||||
const handoffId = `${fromAgent}-to-${toAgent}-${timestamp}`;
|
|
||||||
const handoffFile = path.join(handoffsPath, `${handoffId}.md`);
|
|
||||||
|
|
||||||
const handoffContent = `# Agent Handoff: ${fromAgent} → ${toAgent}
|
|
||||||
|
|
||||||
**Created:** ${new Date().toISOString()}
|
|
||||||
**Handoff ID:** ${handoffId}
|
|
||||||
**Source Agent:** ${fromAgent}
|
|
||||||
**Target Agent:** ${toAgent}
|
|
||||||
|
|
||||||
## Context Summary
|
|
||||||
${context || 'No additional context provided.'}
|
|
||||||
|
|
||||||
## Key Decisions Made
|
|
||||||
[To be filled by source agent]
|
|
||||||
|
|
||||||
## Current Progress
|
|
||||||
[To be filled by source agent]
|
|
||||||
|
|
||||||
## Next Actions for ${toAgent}
|
|
||||||
- [ ] [Action item 1]
|
|
||||||
- [ ] [Action item 2]
|
|
||||||
- [ ] [Action item 3]
|
|
||||||
|
|
||||||
## Files and References
|
|
||||||
[List of relevant files and documentation]
|
|
||||||
|
|
||||||
## Blockers and Dependencies
|
|
||||||
[Any blockers or dependencies the target agent should be aware of]
|
|
||||||
|
|
||||||
## Handoff Validation
|
|
||||||
- [ ] Context completeness verified
|
|
||||||
- [ ] Decisions documented
|
|
||||||
- [ ] Next actions clearly defined
|
|
||||||
- [ ] References included
|
|
||||||
`;
|
|
||||||
|
|
||||||
fs.writeFileSync(handoffFile, handoffContent);
|
|
||||||
|
|
||||||
console.log('✅ Handoff package created successfully');
|
|
||||||
console.log(`📦 Handoff ID: ${handoffId}`);
|
|
||||||
console.log(`📁 File: ${handoffFile}`);
|
|
||||||
|
|
||||||
return handoffId;
|
|
||||||
} catch (error) {
|
|
||||||
console.error('❌ Failed to create handoff:', error.message);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Command line usage
|
|
||||||
if (require.main === module) {
|
|
||||||
const args = process.argv.slice(2);
|
|
||||||
if (args.length < 2) {
|
|
||||||
console.log('Usage: node handoff.js <from-agent> <to-agent> [context]');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
createHandoff(args[0], args[1], args[2] || '');
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = { createHandoff };
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
#!/usr/bin/env node
|
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
const crypto = require('crypto');
|
|
||||||
|
|
||||||
async function initWorkspace() {
|
|
||||||
try {
|
|
||||||
const workspacePath = path.join(process.cwd(), '.workspace');
|
|
||||||
|
|
||||||
if (!fs.existsSync(workspacePath)) {
|
|
||||||
console.error('❌ Workspace directory not found. Run `npx bmad-method install` first.');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate session ID
|
|
||||||
const sessionId = crypto.randomBytes(8).toString('hex');
|
|
||||||
const timestamp = new Date().toISOString();
|
|
||||||
|
|
||||||
// Create session file
|
|
||||||
const sessionData = {
|
|
||||||
id: sessionId,
|
|
||||||
created: timestamp,
|
|
||||||
lastHeartbeat: timestamp,
|
|
||||||
ide: process.env.IDE_TYPE || 'unknown',
|
|
||||||
pid: process.pid,
|
|
||||||
user: process.env.USER || process.env.USERNAME || 'unknown'
|
|
||||||
};
|
|
||||||
|
|
||||||
const sessionsPath = path.join(workspacePath, 'sessions');
|
|
||||||
if (!fs.existsSync(sessionsPath)) {
|
|
||||||
fs.mkdirSync(sessionsPath, { recursive: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
const sessionFile = path.join(sessionsPath, `${sessionId}.json`);
|
|
||||||
fs.writeFileSync(sessionFile, JSON.stringify(sessionData, null, 2));
|
|
||||||
|
|
||||||
console.log('✅ Workspace initialized successfully');
|
|
||||||
console.log(`📍 Session ID: ${sessionId}`);
|
|
||||||
console.log(`🕐 Created: ${timestamp}`);
|
|
||||||
|
|
||||||
return sessionId;
|
|
||||||
} catch (error) {
|
|
||||||
console.error('❌ Failed to initialize workspace:', error.message);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (require.main === module) {
|
|
||||||
initWorkspace();
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = { initWorkspace };
|
|
||||||
|
|
@ -1,87 +0,0 @@
|
||||||
#!/usr/bin/env node
|
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
async function getWorkspaceStatus() {
|
|
||||||
try {
|
|
||||||
const workspacePath = path.join(process.cwd(), '.workspace');
|
|
||||||
|
|
||||||
if (!fs.existsSync(workspacePath)) {
|
|
||||||
console.error('❌ Workspace directory not found.');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read workspace config
|
|
||||||
const configPath = path.join(workspacePath, 'workspace-config.json');
|
|
||||||
let config = {};
|
|
||||||
if (fs.existsSync(configPath)) {
|
|
||||||
const configContent = fs.readFileSync(configPath, 'utf8');
|
|
||||||
config = JSON.parse(configContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get active sessions
|
|
||||||
const sessionsPath = path.join(workspacePath, 'sessions');
|
|
||||||
let sessionFiles = [];
|
|
||||||
if (fs.existsSync(sessionsPath)) {
|
|
||||||
sessionFiles = fs.readdirSync(sessionsPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
const activeSessions = [];
|
|
||||||
for (const file of sessionFiles) {
|
|
||||||
if (file.endsWith('.json')) {
|
|
||||||
try {
|
|
||||||
const sessionPath = path.join(sessionsPath, file);
|
|
||||||
const sessionContent = fs.readFileSync(sessionPath, 'utf8');
|
|
||||||
const sessionData = JSON.parse(sessionContent);
|
|
||||||
activeSessions.push(sessionData);
|
|
||||||
} catch (e) {
|
|
||||||
// Skip corrupted session files
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Display status
|
|
||||||
console.log('🤝 BMAD Collaborative Workspace Status');
|
|
||||||
console.log('=====================================');
|
|
||||||
console.log(`📁 Workspace: ${workspacePath}`);
|
|
||||||
console.log(`⚙️ Version: ${config.version || 'Unknown'}`);
|
|
||||||
console.log(`🕐 Created: ${config.created || 'Unknown'}`);
|
|
||||||
console.log(`👥 Active Sessions: ${activeSessions.length}`);
|
|
||||||
|
|
||||||
if (activeSessions.length > 0) {
|
|
||||||
console.log('\n📍 Session Details:');
|
|
||||||
activeSessions.forEach((session, index) => {
|
|
||||||
console.log(` ${index + 1}. ${session.id} (${session.ide}) - ${session.user}`);
|
|
||||||
console.log(` Created: ${new Date(session.created).toLocaleString()}`);
|
|
||||||
console.log(` Last Heartbeat: ${new Date(session.lastHeartbeat).toLocaleString()}`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check directory structure
|
|
||||||
const directories = ['context', 'handoffs', 'decisions', 'progress', 'quality', 'archive'];
|
|
||||||
const missingDirs = [];
|
|
||||||
|
|
||||||
for (const dir of directories) {
|
|
||||||
if (!fs.existsSync(path.join(workspacePath, dir))) {
|
|
||||||
missingDirs.push(dir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (missingDirs.length > 0) {
|
|
||||||
console.log(`\n⚠️ Missing directories: ${missingDirs.join(', ')}`);
|
|
||||||
console.log(' Run `node workspace-utils/cleanup.js` to repair.');
|
|
||||||
} else {
|
|
||||||
console.log('\n✅ Workspace structure is healthy');
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error('❌ Failed to get workspace status:', error.message);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (require.main === module) {
|
|
||||||
getWorkspaceStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = { getWorkspaceStatus };
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
#!/usr/bin/env node
|
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
async function syncWorkspace() {
|
|
||||||
try {
|
|
||||||
const workspacePath = path.join(process.cwd(), '.workspace');
|
|
||||||
|
|
||||||
if (!fs.existsSync(workspacePath)) {
|
|
||||||
console.error('❌ Workspace directory not found.');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('🔄 Synchronizing workspace context...');
|
|
||||||
|
|
||||||
// Update session heartbeat
|
|
||||||
const sessionsPath = path.join(workspacePath, 'sessions');
|
|
||||||
let sessionFiles = [];
|
|
||||||
if (fs.existsSync(sessionsPath)) {
|
|
||||||
try {
|
|
||||||
sessionFiles = fs.readdirSync(sessionsPath);
|
|
||||||
} catch (e) {
|
|
||||||
sessionFiles = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// For simplicity, update the most recent session
|
|
||||||
let latestSession = null;
|
|
||||||
let latestTime = 0;
|
|
||||||
|
|
||||||
for (const file of sessionFiles) {
|
|
||||||
if (file.endsWith('.json')) {
|
|
||||||
try {
|
|
||||||
const sessionPath = path.join(sessionsPath, file);
|
|
||||||
const sessionContent = fs.readFileSync(sessionPath, 'utf8');
|
|
||||||
const sessionData = JSON.parse(sessionContent);
|
|
||||||
const created = new Date(sessionData.created).getTime();
|
|
||||||
|
|
||||||
if (created > latestTime) {
|
|
||||||
latestTime = created;
|
|
||||||
latestSession = { path: sessionPath, data: sessionData };
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
// Skip corrupted files
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (latestSession) {
|
|
||||||
latestSession.data.lastHeartbeat = new Date().toISOString();
|
|
||||||
fs.writeFileSync(latestSession.path, JSON.stringify(latestSession.data, null, 2));
|
|
||||||
console.log(`✅ Updated session heartbeat: ${latestSession.data.id}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load and display recent context
|
|
||||||
const contextPath = path.join(workspacePath, 'context');
|
|
||||||
const sharedContext = path.join(contextPath, 'shared-context.md');
|
|
||||||
|
|
||||||
if (fs.existsSync(sharedContext)) {
|
|
||||||
try {
|
|
||||||
const content = fs.readFileSync(sharedContext, 'utf8');
|
|
||||||
console.log('\n📄 Current Shared Context:');
|
|
||||||
console.log('='.repeat(50));
|
|
||||||
console.log(content.substring(0, 500) + (content.length > 500 ? '...' : ''));
|
|
||||||
} catch (e) {
|
|
||||||
console.log('\n📄 Shared context file exists but could not be read.');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
console.log('\n📄 No shared context available yet.');
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('\n✅ Workspace synchronization completed');
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error('❌ Failed to sync workspace:', error.message);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (require.main === module) {
|
|
||||||
syncWorkspace();
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = { syncWorkspace };
|
|
||||||
Loading…
Reference in New Issue