diff --git a/agency-archivist/scripts/extract_archive.js b/agency-archivist/scripts/extract_archive.js index 0cce581..c250389 100755 --- a/agency-archivist/scripts/extract_archive.js +++ b/agency-archivist/scripts/extract_archive.js @@ -3,20 +3,23 @@ * extract_archive.js β€” Estrae archivi (zip, tar, rar) e organizza risorse * * Usage: - * node extract_archive.js --client - * node extract_archive.js brand_assets.zip --client demo_co_srl - * node extract_archive.js https://example.com/assets.zip --client demo_co_srl + * node extract_archive.js --project + * node extract_archive.js brand_assets.zip --project demo_co_srl + * node extract_archive.js https://example.com/assets.zip --project campagna_x * * Options: + * --base-path Base directory (default: current dir o ENV) * --keep-archive Mantieni file originale * --verbose Log dettagliato * --dry-run Simula senza estrazione + * + * Environment: + * AGENCY_PROJECTS_BASE Base directory per progetti (opzionale) */ const fs = require('fs'); const path = require('path'); const { execSync } = require('child_process'); -const os = require('os'); // Mapping parole chiave β†’ cartelle const CATEGORY_KEYWORDS = { @@ -73,7 +76,7 @@ function downloadFile(url, destPath, verbose = false) { try { if (verbose) console.log(`πŸ“₯ Download: ${url}`); - // Usa curl o wget (piΓΉ affidabili di https module per download grandi) + // Usa curl o wget (piΓΉ affidabili) execSync(`curl -L -o "${destPath}" "${url}"`, { stdio: verbose ? 'inherit' : 'pipe' }); if (verbose) console.log(`βœ… Download completato: ${destPath}`); @@ -99,7 +102,6 @@ function extractArchive(archivePath, extractTo, verbose = false) { stdio: verbose ? 'inherit' : 'pipe' }); - // Lista file estratti const output = execSync(`unzip -l "${archivePath}" | tail -n +4 | head -n -2`, { encoding: 'utf8' }); return output.split('\n').filter(line => line.trim()).map(line => { const parts = line.trim().split(/\s+/); @@ -139,7 +141,7 @@ function extractArchive(archivePath, extractTo, verbose = false) { } } -function organizeFiles(tempDir, assetsDir, client, verbose = false) { +function organizeFiles(tempDir, assetsDir, verbose = false) { const organized = []; // Crea struttura cartelle @@ -210,7 +212,7 @@ function organizeFiles(tempDir, assetsDir, client, verbose = false) { return organized; } -function logOperation(client, archiveName, organizedFiles, opsLogPath) { +function logOperation(project, archiveName, organizedFiles, opsLogPath) { const timestamp = new Date().toISOString().slice(0, 16).replace('T', ' '); const images = organizedFiles.filter(f => f.type === 'images'); @@ -242,14 +244,17 @@ function main() { // Parse arguments let pathOrUrl = null; - let client = null; + let project = null; + let basePath = process.env.AGENCY_PROJECTS_BASE || process.cwd(); let keepArchive = false; let verbose = false; let dryRun = false; for (let i = 0; i < args.length; i++) { - if (args[i] === '--client' && args[i + 1]) { - client = args[++i]; + if (args[i] === '--project' && args[i + 1]) { + project = args[++i]; + } else if (args[i] === '--base-path' && args[i + 1]) { + basePath = args[++i]; } else if (args[i] === '--keep-archive') { keepArchive = true; } else if (args[i] === '--verbose') { @@ -261,29 +266,29 @@ function main() { } } - if (!pathOrUrl || !client) { - console.error('Usage: node extract_archive.js --client '); - console.error('Options: --keep-archive, --verbose, --dry-run'); + if (!pathOrUrl || !project) { + console.error('Usage: node extract_archive.js --project '); + console.error('Options: --base-path , --keep-archive, --verbose, --dry-run'); + console.error('Environment: AGENCY_PROJECTS_BASE (opzionale)'); process.exit(1); } // Path - const workspace = path.join(os.homedir(), '.openclaw', 'workspace', 'agency-skills-suite'); - const clientDir = path.join(workspace, 'clients', client); - const assetsDir = path.join(clientDir, 'assets'); + const projectDir = path.join(basePath, project); + const assetsDir = path.join(projectDir, 'assets'); const archiveDir = path.join(assetsDir, 'archive'); - const opsLog = path.join(clientDir, 'ops', 'run_log.md'); + const opsLog = path.join(projectDir, 'ops', 'run_log.md'); - // Verifica cartella cliente - if (!fs.existsSync(clientDir)) { - console.error(`❌ Cartella cliente non trovata: ${clientDir}`); + // Verifica cartella progetto + if (!fs.existsSync(projectDir)) { + console.error(`❌ Cartella progetto non trovata: ${projectDir}`); console.error(' Crea prima il progetto con agency-orchestrator'); process.exit(1); } // Crea cartelle fs.mkdirSync(archiveDir, { recursive: true }); - fs.mkdirSync(path.join(clientDir, 'ops'), { recursive: true }); + fs.mkdirSync(path.join(projectDir, 'ops'), { recursive: true }); // URL o path locale? const isUrl = pathOrUrl.startsWith('http://') || pathOrUrl.startsWith('https://') || pathOrUrl.startsWith('ftp://'); @@ -341,13 +346,13 @@ function main() { // Organizza file console.log('\nπŸ—‚οΈ Organizzazione file...'); - const organized = organizeFiles(tempDir, assetsDir, client, verbose); + const organized = organizeFiles(tempDir, assetsDir, verbose); // Pulisci temporanea fs.rmSync(tempDir, { recursive: true, force: true }); // Log operazione - logOperation(client, archiveName, organized, opsLog); + logOperation(project, archiveName, organized, opsLog); // Elimina archivio originale (se non --keep-archive) if (!keepArchive) { @@ -360,7 +365,7 @@ function main() { console.log(` πŸ“¦ File estratti: ${organized.length}`); console.log(` πŸ“ Cartella: ${assetsDir}`); console.log(` πŸ“ Log: ${opsLog}`); - console.log(`\nπŸ‘‰ Prossimo step: node scripts/scan_resources.js --client ${client}`); + console.log(`\nπŸ‘‰ Prossimo step: node scripts/scan_resources.js --project ${project}`); } main(); diff --git a/agency-archivist/scripts/generate_catalog.js b/agency-archivist/scripts/generate_catalog.js index 0fca64c..320f9df 100755 --- a/agency-archivist/scripts/generate_catalog.js +++ b/agency-archivist/scripts/generate_catalog.js @@ -3,8 +3,8 @@ * generate_catalog.js β€” Genera catalogo markdown dai metadata * * Usage: - * node generate_catalog.js --client - * node generate_catalog.js --client demo_co_srl + * node generate_catalog.js --project + * node generate_catalog.js --project demo_co_srl * * Options: * --input Path metadata JSON @@ -158,13 +158,15 @@ function generateGlobalTags(resources) { return sortedTags.map(t => `#${t}`).join(' '); } -function generateCatalog(clientName, metadata, outputPath, verbose = false) { +function generateCatalog(projectName, metadata, outputPath, verbose = false) { const resources = metadata.resources || []; const generated = (metadata.generated || new Date().toISOString()).split('T')[0]; const grouped = groupByType(resources); - const catalog = `# Asset Catalog β€” ${clientName.replace(/_/g, ' ').split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ')} + const projectNameFormatted = projectName ? projectName.replace(/_/g, ' ').split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ') : 'Progetto'; + + const catalog = `# Asset Catalog β€” ${projectNameFormatted} _Generato: ${generated} | Totale: ${resources.length} risorse_ @@ -220,36 +222,39 @@ ${generateGlobalTags(resources)} function main() { const args = process.argv.slice(2); - let client = null; + let project = null; let inputPath = null; let outputPath = null; let verbose = false; + let basePath = process.env.AGENCY_PROJECTS_BASE || process.cwd(); for (let i = 0; i < args.length; i++) { - if (args[i] === '--client' && args[i + 1]) { - client = args[++i]; + if (args[i] === '--project' && args[i + 1]) { + project = args[++i]; } else if (args[i] === '--input' && args[i + 1]) { inputPath = args[++i]; } else if (args[i] === '--output' && args[i + 1]) { outputPath = args[++i]; + } else if (args[i] === '--base-path' && args[i + 1]) { + basePath = args[++i]; } else if (args[i] === '--verbose') { verbose = true; } } - if (!client) { - console.error('Usage: node generate_catalog.js --client '); - console.error('Options: --input, --output, --verbose'); + if (!project) { + console.error('Usage: node generate_catalog.js --project '); + console.error('Options: --base-path , --input, --output, --verbose'); + console.error('Environment: AGENCY_PROJECTS_BASE (opzionale)'); process.exit(1); } // Path - const workspace = path.join(os.homedir(), '.openclaw', 'workspace', 'agency-skills-suite'); - const clientDir = path.join(workspace, 'clients', client); - const assetsDir = path.join(clientDir, 'assets'); + const projectDir = path.join(basePath, project); + const assetsDir = path.join(projectDir, 'assets'); - if (!fs.existsSync(clientDir)) { - console.error(`❌ Cartella cliente non trovata: ${clientDir}`); + if (!fs.existsSync(projectDir)) { + console.error(`❌ Cartella progetto non trovata: ${projectDir}`); process.exit(1); } @@ -282,7 +287,7 @@ function main() { const metadata = loadMetadata(inputPath); // Genera catalogo - generateCatalog(client, metadata, outputPath, verbose); + generateCatalog(project, metadata, outputPath, verbose); // Riepilogo const resources = metadata.resources || []; diff --git a/agency-archivist/scripts/scan_resources.js b/agency-archivist/scripts/scan_resources.js index 58e92dc..f0ffdd1 100755 --- a/agency-archivist/scripts/scan_resources.js +++ b/agency-archivist/scripts/scan_resources.js @@ -3,8 +3,8 @@ * scan_resources.js β€” Scansiona risorse ed estrae metadata * * Usage: - * node scan_resources.js --client --pass 1|2 - * node scan_resources.js --client demo_co_srl --pass 1 + * node scan_resources.js --project --pass 1|2 + * node scan_resources.js --project demo_co_srl --pass 1 * * Options: * --pass 1 Solo metadata base (veloce) @@ -343,39 +343,42 @@ function saveMetadata(resources, outputPath) { function main() { const args = process.argv.slice(2); - let client = null; + let project = null; let passLevel = 1; let vision = false; let outputPath = null; let verbose = false; + let basePath = process.env.AGENCY_PROJECTS_BASE || process.cwd(); for (let i = 0; i < args.length; i++) { - if (args[i] === '--client' && args[i + 1]) { - client = args[++i]; + if (args[i] === '--project' && args[i + 1]) { + project = args[++i]; } else if (args[i] === '--pass' && args[i + 1]) { passLevel = parseInt(args[++i]); } else if (args[i] === '--vision') { vision = true; } else if (args[i] === '--output' && args[i + 1]) { outputPath = args[++i]; + } else if (args[i] === '--base-path' && args[i + 1]) { + basePath = args[++i]; } else if (args[i] === '--verbose') { verbose = true; } } - if (!client) { - console.error('Usage: node scan_resources.js --client '); - console.error('Options: --pass 1|2, --vision, --output, --verbose'); + if (!project) { + console.error('Usage: node scan_resources.js --project '); + console.error('Options: --base-path , --pass 1|2, --vision, --output, --verbose'); + console.error('Environment: AGENCY_PROJECTS_BASE (opzionale)'); process.exit(1); } // Path - const workspace = path.join(os.homedir(), '.openclaw', 'workspace', 'agency-skills-suite'); - const clientDir = path.join(workspace, 'clients', client); - const assetsDir = path.join(clientDir, 'assets'); + const projectDir = path.join(basePath, project); + const assetsDir = path.join(projectDir, 'assets'); - if (!fs.existsSync(clientDir)) { - console.error(`❌ Cartella cliente non trovata: ${clientDir}`); + if (!fs.existsSync(projectDir)) { + console.error(`❌ Cartella progetto non trovata: ${projectDir}`); process.exit(1); } @@ -419,7 +422,7 @@ function main() { console.log(` 🎬 Video: ${videos.length}`); console.log(` πŸ“„ Documenti: ${docs.length}`); console.log(` πŸ’Ύ Metadata: ${outputPath}`); - console.log(`\nπŸ‘‰ Prossimo step: node scripts/generate_catalog.js --client ${client}`); + console.log(`\nπŸ‘‰ Prossimo step: node scripts/generate_catalog.js --project ${project}`); } main();