UNPKG

aios-core

Version:

Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework

325 lines (263 loc) 12.4 kB
#!/usr/bin/env node /** * SYNAPSE Package Builder — Creates a distributable ZIP for collaborators. * * Usage: node scripts/package-synapse.js * Output: synapse-package.zip in project root * * The ZIP contains all SYNAPSE files organized by category with a * README-INSTALL.md tutorial for setting up SYNAPSE in a new project. */ 'use strict'; const fs = require('fs'); const path = require('path'); const { execSync } = require('child_process'); const ROOT = path.resolve(__dirname, '..'); const OUT_DIR = path.join(ROOT, '.synapse-package'); const ZIP_NAME = 'synapse-package.zip'; // ── File manifest ────────────────────────────────────────────────────────── const FILES = { // Core Engine 'core/engine.js': '.aios-core/core/synapse/engine.js', 'core/context/context-tracker.js': '.aios-core/core/synapse/context/context-tracker.js', 'core/domain/domain-loader.js': '.aios-core/core/synapse/domain/domain-loader.js', 'core/layers/layer-processor.js': '.aios-core/core/synapse/layers/layer-processor.js', 'core/layers/l0-constitution.js': '.aios-core/core/synapse/layers/l0-constitution.js', 'core/layers/l1-global.js': '.aios-core/core/synapse/layers/l1-global.js', 'core/layers/l2-agent.js': '.aios-core/core/synapse/layers/l2-agent.js', 'core/layers/l3-workflow.js': '.aios-core/core/synapse/layers/l3-workflow.js', 'core/layers/l4-task.js': '.aios-core/core/synapse/layers/l4-task.js', 'core/layers/l5-squad.js': '.aios-core/core/synapse/layers/l5-squad.js', 'core/layers/l6-keyword.js': '.aios-core/core/synapse/layers/l6-keyword.js', 'core/layers/l7-star-command.js': '.aios-core/core/synapse/layers/l7-star-command.js', 'core/memory/memory-bridge.js': '.aios-core/core/synapse/memory/memory-bridge.js', 'core/output/formatter.js': '.aios-core/core/synapse/output/formatter.js', 'core/session/session-manager.js': '.aios-core/core/synapse/session/session-manager.js', 'core/scripts/generate-constitution.js': '.aios-core/core/synapse/scripts/generate-constitution.js', 'core/utils/paths.js': '.aios-core/core/synapse/utils/paths.js', 'core/utils/tokens.js': '.aios-core/core/synapse/utils/tokens.js', // Diagnostics 'core/diagnostics/synapse-diagnostics.js': '.aios-core/core/synapse/diagnostics/synapse-diagnostics.js', 'core/diagnostics/report-formatter.js': '.aios-core/core/synapse/diagnostics/report-formatter.js', 'core/diagnostics/collectors/safe-read-json.js': '.aios-core/core/synapse/diagnostics/collectors/safe-read-json.js', 'core/diagnostics/collectors/hook-collector.js': '.aios-core/core/synapse/diagnostics/collectors/hook-collector.js', 'core/diagnostics/collectors/session-collector.js': '.aios-core/core/synapse/diagnostics/collectors/session-collector.js', 'core/diagnostics/collectors/manifest-collector.js': '.aios-core/core/synapse/diagnostics/collectors/manifest-collector.js', 'core/diagnostics/collectors/pipeline-collector.js': '.aios-core/core/synapse/diagnostics/collectors/pipeline-collector.js', 'core/diagnostics/collectors/uap-collector.js': '.aios-core/core/synapse/diagnostics/collectors/uap-collector.js', 'core/diagnostics/collectors/timing-collector.js': '.aios-core/core/synapse/diagnostics/collectors/timing-collector.js', 'core/diagnostics/collectors/quality-collector.js': '.aios-core/core/synapse/diagnostics/collectors/quality-collector.js', 'core/diagnostics/collectors/consistency-collector.js': '.aios-core/core/synapse/diagnostics/collectors/consistency-collector.js', 'core/diagnostics/collectors/output-analyzer.js': '.aios-core/core/synapse/diagnostics/collectors/output-analyzer.js', 'core/diagnostics/collectors/relevance-matrix.js': '.aios-core/core/synapse/diagnostics/collectors/relevance-matrix.js', // Hook Entry Point 'hook/synapse-engine.cjs': '.claude/hooks/synapse-engine.cjs', // Commands 'commands/manager.md': '.claude/commands/synapse/manager.md', 'commands/tasks/add-rule.md': '.claude/commands/synapse/tasks/add-rule.md', 'commands/tasks/create-command.md': '.claude/commands/synapse/tasks/create-command.md', 'commands/tasks/create-domain.md': '.claude/commands/synapse/tasks/create-domain.md', 'commands/tasks/diagnose-synapse.md': '.claude/commands/synapse/tasks/diagnose-synapse.md', 'commands/tasks/edit-rule.md': '.claude/commands/synapse/tasks/edit-rule.md', 'commands/tasks/suggest-domain.md': '.claude/commands/synapse/tasks/suggest-domain.md', 'commands/tasks/toggle-domain.md': '.claude/commands/synapse/tasks/toggle-domain.md', 'commands/templates/domain-template': '.claude/commands/synapse/templates/domain-template', 'commands/templates/manifest-entry-template': '.claude/commands/synapse/templates/manifest-entry-template', 'commands/utils/manifest-parser-reference.md': '.claude/commands/synapse/utils/manifest-parser-reference.md', // Skills 'skills/SKILL.md': '.claude/skills/synapse/SKILL.md', 'skills/references/brackets.md': '.claude/skills/synapse/references/brackets.md', 'skills/references/commands.md': '.claude/skills/synapse/references/commands.md', 'skills/references/domains.md': '.claude/skills/synapse/references/domains.md', 'skills/references/layers.md': '.claude/skills/synapse/references/layers.md', 'skills/references/manifest.md': '.claude/skills/synapse/references/manifest.md', 'skills/assets/README.md': '.claude/skills/synapse/assets/README.md', // Documentation 'docs/SYNAPSE-FLOWCHARTS.md': 'docs/architecture/SYNAPSE/SYNAPSE-FLOWCHARTS.md', 'docs/DESIGN-SYNAPSE-ENGINE.md': 'docs/architecture/SYNAPSE/docs/DESIGN-SYNAPSE-ENGINE.md', }; // Runtime domain files to copy from .synapse/ const RUNTIME_DOMAINS = [ 'manifest', 'constitution', 'global', 'context', 'commands', 'agent-dev', 'agent-qa', 'agent-architect', 'agent-pm', 'agent-po', 'agent-sm', 'agent-devops', 'agent-analyst', 'agent-data-engineer', 'agent-ux', 'agent-aios-master', 'agent-squad-creator', 'workflow-story-dev', 'workflow-epic-create', 'workflow-arch-review', ]; // ── Build ────────────────────────────────────────────────────────────────── function main() { console.log('Building SYNAPSE package...\n'); // Clean if (fs.existsSync(OUT_DIR)) fs.rmSync(OUT_DIR, { recursive: true }); fs.mkdirSync(OUT_DIR, { recursive: true }); // Copy files let copied = 0; let missing = 0; for (const [dest, src] of Object.entries(FILES)) { const srcPath = path.join(ROOT, src); const destPath = path.join(OUT_DIR, dest); if (!fs.existsSync(srcPath)) { console.warn(` SKIP (missing): ${src}`); missing++; continue; } fs.mkdirSync(path.dirname(destPath), { recursive: true }); fs.copyFileSync(srcPath, destPath); copied++; } // Copy runtime domains const runtimeDir = path.join(OUT_DIR, 'runtime'); fs.mkdirSync(runtimeDir, { recursive: true }); for (const domain of RUNTIME_DOMAINS) { const srcPath = path.join(ROOT, '.synapse', domain); if (fs.existsSync(srcPath)) { fs.copyFileSync(srcPath, path.join(runtimeDir, domain)); copied++; } else { console.warn(` SKIP (runtime): .synapse/${domain}`); missing++; } } // Copy tests const testsDir = path.join(OUT_DIR, 'tests'); copyDirRecursive(path.join(ROOT, 'tests', 'synapse'), testsDir); // Generate README-INSTALL.md generateReadme(OUT_DIR); console.log(`\nCopied: ${copied} files | Missing: ${missing} files`); // Create ZIP const zipPath = path.join(ROOT, ZIP_NAME); if (fs.existsSync(zipPath)) fs.unlinkSync(zipPath); try { // Use PowerShell Compress-Archive on Windows execSync( `powershell -Command "Compress-Archive -Path '${OUT_DIR}\\*' -DestinationPath '${zipPath}' -Force"`, { stdio: 'inherit' }, ); console.log(`\nZIP created: ${ZIP_NAME}`); console.log(`Size: ${(fs.statSync(zipPath).size / 1024).toFixed(1)} KB`); } catch (err) { console.error('Failed to create ZIP:', err.message); console.log(`Package directory still available at: ${OUT_DIR}`); } // Cleanup temp dir if (fs.existsSync(zipPath) && fs.existsSync(OUT_DIR)) { fs.rmSync(OUT_DIR, { recursive: true }); } } function copyDirRecursive(src, dest) { if (!fs.existsSync(src)) return; fs.mkdirSync(dest, { recursive: true }); for (const entry of fs.readdirSync(src, { withFileTypes: true })) { const srcPath = path.join(src, entry.name); const destPath = path.join(dest, entry.name); if (entry.isDirectory()) { copyDirRecursive(srcPath, destPath); } else { fs.copyFileSync(srcPath, destPath); } } } function generateReadme(outDir) { const content = `# SYNAPSE Context Engine — Installation Guide ## What is SYNAPSE? SYNAPSE (Synkra Adaptive Processing & State Engine) is the JIT context injection engine for AIOS. On every user prompt, it injects \`<synapse-rules>\` with adaptive contextual rules through an 8-layer pipeline. ## Prerequisites - **Node.js** 18+ - **Claude Code** CLI with hook support - **AIOS Core** installed (\`npx aios-core install\`) ## Quick Install ### 1. Copy Core Engine Copy the \`core/\` directory to your project: \`\`\` cp -r core/ <your-project>/.aios-core/core/synapse/ \`\`\` ### 2. Copy Hook Entry Point \`\`\` cp hook/synapse-engine.cjs <your-project>/.claude/hooks/ \`\`\` ### 3. Register the Hook Add to \`.claude/settings.local.json\`: \`\`\`json { "hooks": { "UserPromptSubmit": [ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/synapse-engine.cjs\"", "timeout": 10 } ] } } \`\`\` ### 4. Copy Runtime Domains \`\`\` cp -r runtime/ <your-project>/.synapse/ mkdir -p <your-project>/.synapse/sessions mkdir -p <your-project>/.synapse/metrics mkdir -p <your-project>/.synapse/cache \`\`\` ### 5. Copy Commands & Skills (Optional) \`\`\` cp -r commands/ <your-project>/.claude/commands/synapse/ cp -r skills/ <your-project>/.claude/skills/synapse/ \`\`\` ### 6. Update .gitignore Add these lines: \`\`\` .synapse/sessions/ .synapse/metrics/ .synapse/cache/ !.claude/hooks/synapse-engine.cjs \`\`\` ## Verification After installation, activate any agent and run: \`\`\` /synapse:tasks:diagnose-synapse \`\`\` Expected: All checks PASS, Context Quality grade B or higher. ## Architecture See \`docs/SYNAPSE-FLOWCHARTS.md\` for complete visual architecture including: - 8-layer pipeline flow - Context brackets (FRESH/MODERATE/DEPLETED/CRITICAL) - Domain system - Session management - Diagnostics pipeline (10 collectors) - Metrics persistence ## Tests Copy \`tests/\` to your project and run: \`\`\`bash npx jest synapse \`\`\` Expected: 749+ tests passing. ## File Structure \`\`\` synapse-package/ ├── README-INSTALL.md # This file ├── core/ # Engine source (.aios-core/core/synapse/) │ ├── engine.js # Main orchestrator │ ├── context/ # Bracket tracker │ ├── domain/ # Manifest + domain loader │ ├── layers/ # L0-L7 layer processors │ ├── memory/ # MIS bridge (Pro) │ ├── output/ # XML formatter │ ├── session/ # Session manager │ ├── diagnostics/ # Observability (10 collectors) │ ├── scripts/ # Constitution generator │ └── utils/ # Path + token helpers ├── hook/ # .claude/hooks/synapse-engine.cjs ├── commands/ # .claude/commands/synapse/ ├── skills/ # .claude/skills/synapse/ ├── runtime/ # .synapse/ domain files (manifest, domains) ├── docs/ # Architecture documentation └── tests/ # Full test suite (749+ tests) \`\`\` --- *SYNAPSE Context Engine v2.0 — Synkra AIOS* *Generated: ${new Date().toISOString().split('T')[0]}* `; fs.writeFileSync(path.join(outDir, 'README-INSTALL.md'), content, 'utf8'); } main();