@openlife/cli 1.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INSTALL.md +266 -0
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/bin/openlife.js +3 -0
- package/dist/admin_panel_server.js +66 -0
- package/dist/cli/AgentManager.js +109 -0
- package/dist/cli/AutonomousInstaller.js +134 -0
- package/dist/cli/DreamOrganizer.js +88 -0
- package/dist/cli/HostInstaller.js +426 -0
- package/dist/cli/InstallBanner.js +16 -0
- package/dist/cli/InstallFlow.js +256 -0
- package/dist/cli/InstallHeadless.js +47 -0
- package/dist/cli/InstallModules.js +148 -0
- package/dist/cli/InstallStateStore.js +75 -0
- package/dist/cli/InstallWizard.js +364 -0
- package/dist/cli/ProfileManager.js +163 -0
- package/dist/cli/SystemInstaller.js +89 -0
- package/dist/cli/WorldClassCommands.js +208 -0
- package/dist/design/DesignMdImporter.js +82 -0
- package/dist/design/DesignMdMode.js +93 -0
- package/dist/design/DesignMdRegistry.js +67 -0
- package/dist/index.js +2575 -0
- package/dist/memory/ConversationMemory.js +33 -0
- package/dist/memory/LocalMemoryProvider.js +86 -0
- package/dist/memory/Mem0Provider.js +16 -0
- package/dist/memory/MemoryNamespacePolicy.js +27 -0
- package/dist/memory/MemoryOrchestrator.js +65 -0
- package/dist/memory/MemoryPromotionFlow.js +32 -0
- package/dist/memory/MemoryProvider.js +2 -0
- package/dist/memory/MemoryProviderRegistry.js +27 -0
- package/dist/memory/MemoryRetentionPolicy.js +60 -0
- package/dist/memory/MempalaceProvider.js +72 -0
- package/dist/memory/OmniMemory.js +106 -0
- package/dist/memory/RedisAgentMemoryProvider.js +16 -0
- package/dist/memory/SessionManager.js +86 -0
- package/dist/memory/ZepGraphitiProvider.js +16 -0
- package/dist/orchestrator/AgentRegistry.js +56 -0
- package/dist/orchestrator/AgentScoring.js +82 -0
- package/dist/orchestrator/AgentTeam.js +22 -0
- package/dist/orchestrator/ArbitrationAgent.js +43 -0
- package/dist/orchestrator/ArbitrationScorecard.js +17 -0
- package/dist/orchestrator/AssetPromotionEngine.js +65 -0
- package/dist/orchestrator/AssetReuseRouter.js +63 -0
- package/dist/orchestrator/BenchmarkEngine.js +75 -0
- package/dist/orchestrator/Brain.js +298 -0
- package/dist/orchestrator/CadenceEngine.js +76 -0
- package/dist/orchestrator/CapabilityRouter.js +36 -0
- package/dist/orchestrator/CommandLanguage.js +27 -0
- package/dist/orchestrator/CommandRouter.js +70 -0
- package/dist/orchestrator/ConsequenceForecaster.js +286 -0
- package/dist/orchestrator/CronManager.js +286 -0
- package/dist/orchestrator/DynamicAgentBuilder.js +48 -0
- package/dist/orchestrator/DynamicAgentExecutor.js +15 -0
- package/dist/orchestrator/EnterpriseAgenticCore.js +276 -0
- package/dist/orchestrator/ExecutionBoard.js +86 -0
- package/dist/orchestrator/ExecutionIntent.js +13 -0
- package/dist/orchestrator/ExecutionModePolicy.js +48 -0
- package/dist/orchestrator/ExecutionRouter.js +9 -0
- package/dist/orchestrator/ExecutionState.js +20 -0
- package/dist/orchestrator/ExecutorHealth.js +86 -0
- package/dist/orchestrator/ExternalCatalogRegistry.js +83 -0
- package/dist/orchestrator/Gatekeeper.js +414 -0
- package/dist/orchestrator/Gateway.js +508 -0
- package/dist/orchestrator/GovernanceConsentStore.js +66 -0
- package/dist/orchestrator/GovernanceLayer.js +179 -0
- package/dist/orchestrator/GovernancePolicyStore.js +53 -0
- package/dist/orchestrator/GovernanceScopeLedger.js +134 -0
- package/dist/orchestrator/GovernanceScopePolicy.js +67 -0
- package/dist/orchestrator/IntentClassifier.js +45 -0
- package/dist/orchestrator/JobLifecycle.js +91 -0
- package/dist/orchestrator/LearningRouter.js +24 -0
- package/dist/orchestrator/MediaManager.js +92 -0
- package/dist/orchestrator/MemoryCuratorAgent.js +41 -0
- package/dist/orchestrator/MissionState.js +155 -0
- package/dist/orchestrator/ModelManager.js +84 -0
- package/dist/orchestrator/OperatingSystem.js +71 -0
- package/dist/orchestrator/OperationalMemoryStore.js +94 -0
- package/dist/orchestrator/OptimizationLoop.js +72 -0
- package/dist/orchestrator/OrchestrationLoop.js +905 -0
- package/dist/orchestrator/OrgStructure.js +88 -0
- package/dist/orchestrator/OutcomeSimulator.js +46 -0
- package/dist/orchestrator/ParallelOrchestrationLoop.js +36 -0
- package/dist/orchestrator/PerformanceScorecard.js +105 -0
- package/dist/orchestrator/PlannerAgent.js +46 -0
- package/dist/orchestrator/ProcessSandbox.js +129 -0
- package/dist/orchestrator/PromotionPipeline.js +74 -0
- package/dist/orchestrator/PromotionReviewGate.js +11 -0
- package/dist/orchestrator/QueueScheduler.js +260 -0
- package/dist/orchestrator/ReleaseGate.js +36 -0
- package/dist/orchestrator/ReleaseWorkflow.js +68 -0
- package/dist/orchestrator/RemotePublisher.js +139 -0
- package/dist/orchestrator/ReuseEngine.js +89 -0
- package/dist/orchestrator/ReviewerAgent.js +49 -0
- package/dist/orchestrator/RoleHandoff.js +65 -0
- package/dist/orchestrator/RuntimeHealthMonitor.js +143 -0
- package/dist/orchestrator/RuntimePolicy.js +105 -0
- package/dist/orchestrator/RuntimeProbe.js +97 -0
- package/dist/orchestrator/RuntimeRegistry.js +73 -0
- package/dist/orchestrator/SandboxPolicy.js +22 -0
- package/dist/orchestrator/SecurityDownloadGuard.js +169 -0
- package/dist/orchestrator/SecurityEventStore.js +58 -0
- package/dist/orchestrator/ServiceCompletionPolicy.js +36 -0
- package/dist/orchestrator/ServiceState.js +195 -0
- package/dist/orchestrator/SkillCreator.js +404 -0
- package/dist/orchestrator/SkillLearningLoop.js +57 -0
- package/dist/orchestrator/SkillManager.js +75 -0
- package/dist/orchestrator/SkillNetwork.js +29 -0
- package/dist/orchestrator/SkillRegistryV2.js +28 -0
- package/dist/orchestrator/SkillScoring.js +70 -0
- package/dist/orchestrator/SquadAutoCreator.js +64 -0
- package/dist/orchestrator/SquadCreator.js +727 -0
- package/dist/orchestrator/SquadRegistry.js +28 -0
- package/dist/orchestrator/SquadRouter.js +33 -0
- package/dist/orchestrator/SquadScoring.js +70 -0
- package/dist/orchestrator/SubagentLifecycle.js +90 -0
- package/dist/orchestrator/SynthesizerAgent.js +48 -0
- package/dist/orchestrator/SystemDoctor.js +224 -0
- package/dist/orchestrator/TaskExecutor.js +422 -0
- package/dist/orchestrator/TeammateBoard.js +61 -0
- package/dist/orchestrator/TestHarness.js +184 -0
- package/dist/orchestrator/VoiceManager.js +203 -0
- package/dist/orchestrator/VoiceRouter.js +89 -0
- package/dist/orchestrator/capability/CapabilityGenesisEngine.js +278 -0
- package/dist/orchestrator/capability/CapabilityPackParser.js +223 -0
- package/dist/orchestrator/capability/CapabilityPackSchema.js +62 -0
- package/dist/orchestrator/capability/CapabilityPackState.js +163 -0
- package/dist/orchestrator/providers/AgentProvider.js +2 -0
- package/dist/orchestrator/providers/CapabilityProvider.js +12 -0
- package/dist/orchestrator/providers/CloudAgentProvider.js +55 -0
- package/dist/orchestrator/providers/CloudSkillProvider.js +55 -0
- package/dist/orchestrator/providers/CloudSquadProvider.js +55 -0
- package/dist/orchestrator/providers/CompositeAgentProvider.js +16 -0
- package/dist/orchestrator/providers/CompositeCapabilityProvider.js +25 -0
- package/dist/orchestrator/providers/CompositeSkillProvider.js +16 -0
- package/dist/orchestrator/providers/CompositeSquadProvider.js +16 -0
- package/dist/orchestrator/providers/CompositeWorkflowProvider.js +46 -0
- package/dist/orchestrator/providers/FileAgentProvider.js +105 -0
- package/dist/orchestrator/providers/FileCapabilityProvider.js +106 -0
- package/dist/orchestrator/providers/FileSkillProvider.js +65 -0
- package/dist/orchestrator/providers/FileSquadProvider.js +69 -0
- package/dist/orchestrator/providers/FileWorkflowProvider.js +103 -0
- package/dist/orchestrator/providers/SkillProvider.js +2 -0
- package/dist/orchestrator/providers/SquadProvider.js +2 -0
- package/dist/orchestrator/toolset/ToolsetGuard.js +69 -0
- package/dist/orchestrator/toolset/ToolsetRegistry.js +65 -0
- package/dist/orchestrator/toolset/ToolsetSchema.js +21 -0
- package/dist/orchestrator/util/AtomicWriter.js +204 -0
- package/dist/orchestrator/util/DistributedLock.js +232 -0
- package/dist/orchestrator/util/TemplateRenderer.js +87 -0
- package/dist/orchestrator/util/WatchdogHeartbeat.js +116 -0
- package/dist/orchestrator/workflow/ConditionParser.js +232 -0
- package/dist/orchestrator/workflow/WorkflowEngine.js +379 -0
- package/dist/orchestrator/workflow/WorkflowParser.js +368 -0
- package/dist/orchestrator/workflow/WorkflowSchema.js +65 -0
- package/dist/orchestrator/workflow/WorkflowState.js +11 -0
- package/dist/reversa/ReversaAgent.js +134 -0
- package/dist/reversa/ReversaContracts.js +62 -0
- package/dist/reversa/ReversaExecutors.js +65 -0
- package/dist/skills/SkillRegistry.js +71 -0
- package/dist/squads/SquadManager.js +87 -0
- package/dist/test_admin_teams_networks.js +54 -0
- package/dist/test_agent_team_skill_network.js +15 -0
- package/dist/test_aiobuilder_cli_parity.js +169 -0
- package/dist/test_ask_exit.js +73 -0
- package/dist/test_atomic_writer.js +209 -0
- package/dist/test_autonomous_soak.js +141 -0
- package/dist/test_benchmark_engine.js +41 -0
- package/dist/test_brain_error_diagnostics.js +51 -0
- package/dist/test_brain_fallback_chain.js +93 -0
- package/dist/test_capability_genesis_engine.js +225 -0
- package/dist/test_capability_pack_schema.js +214 -0
- package/dist/test_catalog_quality.js +150 -0
- package/dist/test_cli_crud_roundtrip.js +154 -0
- package/dist/test_cli_diagnostics.js +131 -0
- package/dist/test_cli_doc_parity.js +126 -0
- package/dist/test_cli_help_surface.js +106 -0
- package/dist/test_cli_service_commands.js +83 -0
- package/dist/test_consequence_forecast_brain.js +165 -0
- package/dist/test_consequence_forecaster.js +24 -0
- package/dist/test_conversation_memory.js +36 -0
- package/dist/test_create_entities.js +54 -0
- package/dist/test_creator_placeholders_completed.js +177 -0
- package/dist/test_cron_manager.js +123 -0
- package/dist/test_daemon_sigterm.js +72 -0
- package/dist/test_deep_research_capability.js +87 -0
- package/dist/test_designmd_import_registry.js +16 -0
- package/dist/test_designmd_mode.js +50 -0
- package/dist/test_designmd_mode_workspace.js +13 -0
- package/dist/test_dist_templates_layout.js +135 -0
- package/dist/test_distributed_lock.js +201 -0
- package/dist/test_distribution_installability.js +67 -0
- package/dist/test_doctor_sandbox_check.js +44 -0
- package/dist/test_dream_organizer.js +25 -0
- package/dist/test_dual_mode.js +15 -0
- package/dist/test_enterprise_agentic_core.js +128 -0
- package/dist/test_forecast_brain_wiring.js +87 -0
- package/dist/test_gateway_telegram_guardrails.js +52 -0
- package/dist/test_governance.js +34 -0
- package/dist/test_governance_advanced.js +75 -0
- package/dist/test_governance_scope_ledger.js +147 -0
- package/dist/test_governance_v13_policies.js +44 -0
- package/dist/test_guided_creator_cli.js +100 -0
- package/dist/test_host_install_e2e.js +324 -0
- package/dist/test_host_installer.js +259 -0
- package/dist/test_host_installers_gemini_codex.js +95 -0
- package/dist/test_host_uninstaller.js +295 -0
- package/dist/test_install_flow.js +70 -0
- package/dist/test_install_flow_host_validation.js +143 -0
- package/dist/test_install_wizard.js +272 -0
- package/dist/test_integration_gemini_live.js +95 -0
- package/dist/test_integration_http_trigger_live.js +154 -0
- package/dist/test_integration_telegram_live.js +102 -0
- package/dist/test_job_lifecycle.js +16 -0
- package/dist/test_memory_orchestrator.js +33 -0
- package/dist/test_memory_promotion.js +36 -0
- package/dist/test_memory_retention.js +37 -0
- package/dist/test_mission_checkpoint.js +204 -0
- package/dist/test_multi_host_docs_parity.js +125 -0
- package/dist/test_openlife_auto_creator_routing.js +69 -0
- package/dist/test_openlife_evolution_surface.js +77 -0
- package/dist/test_openlife_gatekeeper_routing.js +15 -0
- package/dist/test_openlife_routing_surface.js +27 -0
- package/dist/test_openlife_runtime_source_truth.js +25 -0
- package/dist/test_operating_system.js +45 -0
- package/dist/test_optimization_loop.js +38 -0
- package/dist/test_orchestration_assets_lifecycle.js +78 -0
- package/dist/test_outcome_simulator.js +38 -0
- package/dist/test_performance_latency.js +215 -0
- package/dist/test_performance_scorecard.js +38 -0
- package/dist/test_phase1_check_exit.js +103 -0
- package/dist/test_phase6_board.js +31 -0
- package/dist/test_phase6_cadence.js +29 -0
- package/dist/test_phase6_ops.js +37 -0
- package/dist/test_post_mission_evaluation.js +190 -0
- package/dist/test_process_sandbox.js +88 -0
- package/dist/test_profile_toolset_mcp.js +125 -0
- package/dist/test_queue_scheduler.js +239 -0
- package/dist/test_release_gate.js +23 -0
- package/dist/test_remote_publish.js +193 -0
- package/dist/test_reversa_contracts_e2e.js +48 -0
- package/dist/test_reversa_export_and_strict.js +51 -0
- package/dist/test_reversa_full_execution.js +12 -0
- package/dist/test_reversa_lite.js +9 -0
- package/dist/test_royal_stack_golden.js +179 -0
- package/dist/test_runtime_health_backoff.js +154 -0
- package/dist/test_runtime_policy.js +26 -0
- package/dist/test_runtime_probe.js +19 -0
- package/dist/test_runtime_profile_oauth_only.js +262 -0
- package/dist/test_runtime_registry.js +11 -0
- package/dist/test_security_download_and_scan.js +103 -0
- package/dist/test_security_download_guard.js +14 -0
- package/dist/test_service_command_surface.js +12 -0
- package/dist/test_service_completion_policy.js +32 -0
- package/dist/test_service_guardrails_delete.js +12 -0
- package/dist/test_service_mode_explicit_only.js +174 -0
- package/dist/test_sources_import_ref.js +46 -0
- package/dist/test_sources_scaffold.js +43 -0
- package/dist/test_squad_skill_creator.js +305 -0
- package/dist/test_squad_skill_design_llm.js +176 -0
- package/dist/test_subsystems_org_state.js +271 -0
- package/dist/test_subsystems_promotion_memory_assets.js +343 -0
- package/dist/test_subsystems_routing_governance.js +234 -0
- package/dist/test_task_executor_sandbox_optin.js +127 -0
- package/dist/test_teammate_learning.js +15 -0
- package/dist/test_telegram_delete_guardrail.js +21 -0
- package/dist/test_toolset_enforcement.js +188 -0
- package/dist/test_trigger_basic_auth.js +112 -0
- package/dist/test_util/doc_parity.js +120 -0
- package/dist/test_v15_e2e_integration.js +207 -0
- package/dist/test_watchdog_heartbeat.js +152 -0
- package/dist/test_workflow_condition_parser.js +63 -0
- package/dist/test_workflow_e2e.js +240 -0
- package/dist/test_workflow_engine.js +330 -0
- package/dist/test_workflow_parser.js +245 -0
- package/dist/test_workflow_schema_backward_compat.js +197 -0
- package/dist-templates/README.md +91 -0
- package/dist-templates/claude-code/agents/openlife-atlas.md +52 -0
- package/dist-templates/claude-code/agents/openlife-forge.md +42 -0
- package/dist-templates/claude-code/agents/openlife-genesis.md +59 -0
- package/dist-templates/claude-code/agents/openlife-lyra.md +40 -0
- package/dist-templates/claude-code/agents/openlife-maestro.md +45 -0
- package/dist-templates/claude-code/commands/openlife/ask.md +14 -0
- package/dist-templates/claude-code/commands/openlife/doctor.md +19 -0
- package/dist-templates/claude-code/commands/openlife/dream.md +20 -0
- package/dist-templates/claude-code/commands/openlife/status.md +14 -0
- package/dist-templates/claude-code/mcp/openlife-orchestrator.json +46 -0
- package/dist-templates/codex/README.md +7 -0
- package/dist-templates/codex/agents/openlife-atlas.md +52 -0
- package/dist-templates/codex/agents/openlife-forge.md +42 -0
- package/dist-templates/codex/agents/openlife-genesis.md +59 -0
- package/dist-templates/codex/agents/openlife-lyra.md +40 -0
- package/dist-templates/codex/agents/openlife-maestro.md +45 -0
- package/dist-templates/codex/commands/openlife/ask.md +14 -0
- package/dist-templates/codex/commands/openlife/doctor.md +19 -0
- package/dist-templates/codex/commands/openlife/dream.md +20 -0
- package/dist-templates/codex/commands/openlife/status.md +14 -0
- package/dist-templates/codex/mcp/openlife-orchestrator.json +46 -0
- package/dist-templates/gemini-cli/README.md +8 -0
- package/dist-templates/gemini-cli/agents/openlife-atlas.md +52 -0
- package/dist-templates/gemini-cli/agents/openlife-forge.md +42 -0
- package/dist-templates/gemini-cli/agents/openlife-genesis.md +59 -0
- package/dist-templates/gemini-cli/agents/openlife-lyra.md +40 -0
- package/dist-templates/gemini-cli/agents/openlife-maestro.md +45 -0
- package/dist-templates/gemini-cli/commands/openlife/ask.md +14 -0
- package/dist-templates/gemini-cli/commands/openlife/doctor.md +19 -0
- package/dist-templates/gemini-cli/commands/openlife/dream.md +20 -0
- package/dist-templates/gemini-cli/commands/openlife/status.md +14 -0
- package/dist-templates/gemini-cli/mcp/openlife-orchestrator.json +46 -0
- package/dist-templates/skill-template/README.md +34 -0
- package/dist-templates/skill-template/SKILL.md.template +59 -0
- package/dist-templates/squad-template/README.md +82 -0
- package/dist-templates/squad-template/SQUAD.md.template +51 -0
- package/dist-templates/squad-template/agent-template.md +51 -0
- package/dist-templates/squad-template/checklist-template.md +25 -0
- package/dist-templates/squad-template/task-template.md +36 -0
- package/dist-templates/workflows/PORTED_WORKFLOWS.md +60 -0
- package/dist-templates/workflows/brownfield-discovery.yaml +137 -0
- package/dist-templates/workflows/greenfield-fullstack.yaml +132 -0
- package/dist-templates/workflows/qa-loop.yaml +125 -0
- package/dist-templates/workflows/story-development-cycle.yaml +80 -0
- package/docs/CHANGELOG_FEATURE_ROLLOUT_DESIGNMD.md +43 -0
- package/docs/EXTERNAL_SOURCES_AND_SECURITY_GUARD.md +33 -0
- package/docs/OPENLIFE_AUDIT_2026-05-06.md +170 -0
- package/docs/OPENLIFE_CONSOLIDATED_PLAN_2026-05-06.md +299 -0
- package/docs/OPENLIFE_DUAL_MODE_IMPLEMENTATION_PLAN.md +205 -0
- package/docs/OPENLIFE_EVOLUTION_SURFACE_2026-05-07.md +53 -0
- package/docs/OPENLIFE_SKILLS_IMPORT_2026-05-07.json +223 -0
- package/docs/OPENLIFE_SQUADS_IMPORT_2026-05-07.json +184 -0
- package/docs/PAPERCLIP_OPENLIFE_INVESTIGATION.md +85 -0
- package/docs/README.md +28 -0
- package/docs/RELEASE_ORGANIZATION_PLAN.md +164 -0
- package/docs/audit/CLI-EXECUTION-RESULTS.md +113 -0
- package/docs/audit/CLI-MATRIX.md +556 -0
- package/docs/audit/DOC-PARITY-GAPS.md +351 -0
- package/docs/audit/ORCHESTRATOR-MATRIX.md +136 -0
- package/docs/audit/TEST-COVERAGE-GAPS.md +334 -0
- package/docs/audit/integrations/SKIPPED.md +101 -0
- package/docs/autonomous-install.md +79 -0
- package/docs/capability-genesis.md +137 -0
- package/docs/capability-pack-schema.md +157 -0
- package/docs/commands.md +82 -0
- package/docs/deep-research-capability.md +114 -0
- package/docs/development/typescript-conventions.md +95 -0
- package/docs/host-installers.md +68 -0
- package/docs/install/aiobuilder.md +70 -0
- package/docs/install/claude-code.md +83 -0
- package/docs/install/codex.md +64 -0
- package/docs/install/gemini-cli.md +64 -0
- package/docs/install/runtime-profiles.md +83 -0
- package/docs/openlife-agent-os-blueprint.md +114 -0
- package/docs/openlife-install-backlog.md +115 -0
- package/docs/openlife-install-spec.md +306 -0
- package/docs/operations/CLOUD_CUTOVER_AUDIT.md +37 -0
- package/docs/operations/PHASE_PROGRESS_CONTINUATION.md +24 -0
- package/docs/performance-benchmarks.md +83 -0
- package/docs/planning/v1.3-capability-genesis.md +157 -0
- package/docs/plans/2026-05-05-admin-interface-professional-dark-premium-plan.md +84 -0
- package/docs/plans/2026-05-05-openlife-autonomous-domain-marketplace-masterplan.md +122 -0
- package/docs/quickstart.md +60 -0
- package/docs/release-process.md +236 -0
- package/docs/roadmap/OPENLIFE_MASTER_PLAN_CLOUD_V3.md +97 -0
- package/docs/sandboxing-research.md +117 -0
- package/docs/stories/epic-feature-audit/1.1.story.md +84 -0
- package/docs/stories/epic-feature-audit/1.2.story.md +102 -0
- package/docs/stories/epic-feature-audit/1.3.story.md +93 -0
- package/docs/stories/epic-feature-audit/1.5.story.md +121 -0
- package/docs/stories/epic-feature-audit/1.6.story.md +80 -0
- package/docs/stories/epic-feature-completeness/2.1.story.md +70 -0
- package/docs/stories/epic-feature-completeness/2.2.story.md +49 -0
- package/docs/stories/epic-feature-completeness/2.3.story.md +74 -0
- package/docs/stories/epic-feature-completeness/2.4.story.md +71 -0
- package/docs/stories/epic-feature-completeness/3.1.story.md +56 -0
- package/docs/stories/epic-feature-completeness/3.2.story.md +80 -0
- package/docs/stories/epic-feature-completeness/3.3.story.md +68 -0
- package/docs/stories/epic-feature-completeness/3.4.story.md +71 -0
- package/docs/stories/epic-feature-completeness/3.5.story.md +72 -0
- package/docs/stories/epic-feature-completeness/3.6.story.md +69 -0
- package/docs/stories/epic-feature-completeness/3.7.story.md +68 -0
- package/docs/stories/epic-feature-completeness/3.8.story.md +57 -0
- package/docs/toolset-enforcement.md +122 -0
- package/docs/v1.4-changelog.md +159 -0
- package/docs/v1.5-changelog.md +106 -0
- package/docs/v1.5-roadmap.md +121 -0
- package/docs/v1.6-changelog.md +67 -0
- package/docs/v1.6-roadmap.md +89 -0
- package/docs/v1.7-changelog.md +98 -0
- package/docs/workflow-schema.md +177 -0
- package/package.json +177 -0
- package/scripts/clean-test-pollution.js +61 -0
- package/scripts/openlife-agent-start.sh +6 -0
- package/scripts/openlife-agent.service.example +13 -0
- package/scripts/openlife-agent.supervisord.conf.example +8 -0
- package/scripts/openlife-autonomous-install.sh +29 -0
- package/scripts/postinstall-check.sh +37 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* test_workflow_parser — Story 4.1 regression suite.
|
|
4
|
+
*
|
|
5
|
+
* Validates the WorkflowSchema + WorkflowParser contract via 8 scenarios:
|
|
6
|
+
* 1. Happy path — minimal valid workflow round-trips
|
|
7
|
+
* 2. Multi-phase fixture — greenfield-like document parses
|
|
8
|
+
* 3. Missing root `workflow:` key fails with MISSING_ROOT
|
|
9
|
+
* 4. Invalid type fails with INVALID_TYPE
|
|
10
|
+
* 5. Step missing both agent and squad fails with NEITHER_AGENT_NOR_SQUAD
|
|
11
|
+
* 6. Duplicate step id fails with DUPLICATE_STEP_ID
|
|
12
|
+
* 7. Unknown requires (step-id-shaped) fails with UNKNOWN_REQUIRES
|
|
13
|
+
* 8. Circular requires chain detected with CIRCULAR_REQUIRES
|
|
14
|
+
*
|
|
15
|
+
* Prints TEST_WORKFLOW_PARSER_OK on full pass.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const WorkflowParser_1 = require("./orchestrator/workflow/WorkflowParser");
|
|
19
|
+
const WorkflowSchema_1 = require("./orchestrator/workflow/WorkflowSchema");
|
|
20
|
+
function assert(cond, msg) {
|
|
21
|
+
if (!cond)
|
|
22
|
+
throw new Error(`assertion failed: ${msg}`);
|
|
23
|
+
}
|
|
24
|
+
function assertHasError(result, expectedCode, scenario) {
|
|
25
|
+
assert(!result.ok, `${scenario}: expected ok=false, got ok=true`);
|
|
26
|
+
const match = result.errors.find((e) => e.code === expectedCode);
|
|
27
|
+
assert(match !== undefined, `${scenario}: expected error code '${expectedCode}', got [${result.errors.map((e) => e.code).join(', ')}]`);
|
|
28
|
+
}
|
|
29
|
+
// ─────────────────────────────────────────────────────────────
|
|
30
|
+
// Scenario 1 — Happy path
|
|
31
|
+
// ─────────────────────────────────────────────────────────────
|
|
32
|
+
function scenarioHappyPath() {
|
|
33
|
+
const yaml = `
|
|
34
|
+
workflow:
|
|
35
|
+
id: minimal-test
|
|
36
|
+
name: Minimal Test
|
|
37
|
+
description: A minimal valid workflow
|
|
38
|
+
type: custom
|
|
39
|
+
version: "1.0"
|
|
40
|
+
sequence:
|
|
41
|
+
- id: step-1
|
|
42
|
+
agent: dev
|
|
43
|
+
action: do-thing
|
|
44
|
+
creates: [out.md]
|
|
45
|
+
`;
|
|
46
|
+
const r = (0, WorkflowParser_1.parseWorkflow)(yaml);
|
|
47
|
+
assert(r.ok, `happy path must succeed, errors: ${JSON.stringify(r.errors)}`);
|
|
48
|
+
assert(r.workflow?.id === 'minimal-test', 'id round-trip');
|
|
49
|
+
assert(r.workflow?.type === 'custom', 'type round-trip');
|
|
50
|
+
assert(r.workflow?.sequence.length === 1, 'sequence length');
|
|
51
|
+
console.log('✅ scenario 1: happy path');
|
|
52
|
+
}
|
|
53
|
+
// ─────────────────────────────────────────────────────────────
|
|
54
|
+
// Scenario 2 — Multi-phase fixture (squad+agent mix)
|
|
55
|
+
// ─────────────────────────────────────────────────────────────
|
|
56
|
+
function scenarioMultiPhaseShape() {
|
|
57
|
+
const yaml = `
|
|
58
|
+
workflow:
|
|
59
|
+
id: greenfield-like
|
|
60
|
+
name: Greenfield-Like
|
|
61
|
+
description: Mirrors the greenfield-fullstack structure
|
|
62
|
+
type: greenfield
|
|
63
|
+
version: "1.0"
|
|
64
|
+
project_types: [web-app, saas]
|
|
65
|
+
metadata:
|
|
66
|
+
elicit: true
|
|
67
|
+
confirmation_required: true
|
|
68
|
+
phases:
|
|
69
|
+
- phase_0: Bootstrap
|
|
70
|
+
- phase_1: Discovery
|
|
71
|
+
sequence:
|
|
72
|
+
- phase: 0
|
|
73
|
+
name: Bootstrap
|
|
74
|
+
description: Setup
|
|
75
|
+
- id: env-bootstrap
|
|
76
|
+
agent: devops
|
|
77
|
+
action: environment_bootstrap
|
|
78
|
+
duration_estimate: "15-30 min"
|
|
79
|
+
creates: [.openlife/config.yaml, README.md]
|
|
80
|
+
task: environment-bootstrap.md
|
|
81
|
+
|
|
82
|
+
- phase: 1
|
|
83
|
+
name: Discovery
|
|
84
|
+
description: Plan everything
|
|
85
|
+
|
|
86
|
+
- id: project-brief
|
|
87
|
+
agent: analyst
|
|
88
|
+
creates: project-brief.md
|
|
89
|
+
duration_estimate: "30-60 min"
|
|
90
|
+
requires: env-bootstrap
|
|
91
|
+
|
|
92
|
+
- id: design-review
|
|
93
|
+
squad: design-squad
|
|
94
|
+
action: review-design
|
|
95
|
+
requires: project-brief
|
|
96
|
+
idempotent: true
|
|
97
|
+
`;
|
|
98
|
+
const r = (0, WorkflowParser_1.parseWorkflow)(yaml);
|
|
99
|
+
assert(r.ok, `multi-phase shape must succeed, errors: ${JSON.stringify(r.errors)}`);
|
|
100
|
+
assert(r.workflow?.sequence.length === 5, `expected 5 sequence entries, got ${r.workflow?.sequence.length}`);
|
|
101
|
+
assert(r.workflow?.project_types?.includes('saas'), 'project_types round-trip');
|
|
102
|
+
assert(r.workflow?.metadata?.elicit === true, 'metadata.elicit round-trip');
|
|
103
|
+
console.log('✅ scenario 2: multi-phase (squad+agent mix)');
|
|
104
|
+
}
|
|
105
|
+
// ─────────────────────────────────────────────────────────────
|
|
106
|
+
// Scenario 3 — Missing `workflow:` root
|
|
107
|
+
// ─────────────────────────────────────────────────────────────
|
|
108
|
+
function scenarioMissingRoot() {
|
|
109
|
+
const yaml = `
|
|
110
|
+
id: orphan
|
|
111
|
+
name: Orphan
|
|
112
|
+
type: custom
|
|
113
|
+
version: "1.0"
|
|
114
|
+
sequence: []
|
|
115
|
+
`;
|
|
116
|
+
const r = (0, WorkflowParser_1.parseWorkflow)(yaml);
|
|
117
|
+
assertHasError(r, WorkflowSchema_1.WORKFLOW_ERRORS.MISSING_ROOT, 'missing root');
|
|
118
|
+
console.log('✅ scenario 3: missing root (no `workflow:` key)');
|
|
119
|
+
}
|
|
120
|
+
// ─────────────────────────────────────────────────────────────
|
|
121
|
+
// Scenario 4 — Invalid type value
|
|
122
|
+
// ─────────────────────────────────────────────────────────────
|
|
123
|
+
function scenarioInvalidType() {
|
|
124
|
+
const yaml = `
|
|
125
|
+
workflow:
|
|
126
|
+
id: bad-type
|
|
127
|
+
name: Bad Type
|
|
128
|
+
type: nonsense
|
|
129
|
+
version: "1.0"
|
|
130
|
+
sequence:
|
|
131
|
+
- id: step-1
|
|
132
|
+
agent: dev
|
|
133
|
+
`;
|
|
134
|
+
const r = (0, WorkflowParser_1.parseWorkflow)(yaml);
|
|
135
|
+
assertHasError(r, WorkflowSchema_1.WORKFLOW_ERRORS.INVALID_TYPE, 'invalid type');
|
|
136
|
+
console.log('✅ scenario 4: invalid type value');
|
|
137
|
+
}
|
|
138
|
+
// ─────────────────────────────────────────────────────────────
|
|
139
|
+
// Scenario 5 — Step with neither agent nor squad
|
|
140
|
+
// ─────────────────────────────────────────────────────────────
|
|
141
|
+
function scenarioNoAgentOrSquad() {
|
|
142
|
+
const yaml = `
|
|
143
|
+
workflow:
|
|
144
|
+
id: no-actor
|
|
145
|
+
name: No Actor
|
|
146
|
+
type: custom
|
|
147
|
+
version: "1.0"
|
|
148
|
+
sequence:
|
|
149
|
+
- id: orphan-step
|
|
150
|
+
action: do-thing
|
|
151
|
+
`;
|
|
152
|
+
const r = (0, WorkflowParser_1.parseWorkflow)(yaml);
|
|
153
|
+
assertHasError(r, WorkflowSchema_1.WORKFLOW_ERRORS.NEITHER_AGENT_NOR_SQUAD, 'no agent or squad');
|
|
154
|
+
console.log('✅ scenario 5: step without agent or squad');
|
|
155
|
+
}
|
|
156
|
+
// ─────────────────────────────────────────────────────────────
|
|
157
|
+
// Scenario 6 — Duplicate step id
|
|
158
|
+
// ─────────────────────────────────────────────────────────────
|
|
159
|
+
function scenarioDuplicateStepId() {
|
|
160
|
+
const yaml = `
|
|
161
|
+
workflow:
|
|
162
|
+
id: dup-test
|
|
163
|
+
name: Dup Test
|
|
164
|
+
type: custom
|
|
165
|
+
version: "1.0"
|
|
166
|
+
sequence:
|
|
167
|
+
- id: step-a
|
|
168
|
+
agent: dev
|
|
169
|
+
- id: step-a
|
|
170
|
+
agent: qa
|
|
171
|
+
`;
|
|
172
|
+
const r = (0, WorkflowParser_1.parseWorkflow)(yaml);
|
|
173
|
+
assertHasError(r, WorkflowSchema_1.WORKFLOW_ERRORS.DUPLICATE_STEP_ID, 'duplicate step id');
|
|
174
|
+
console.log('✅ scenario 6: duplicate step id');
|
|
175
|
+
}
|
|
176
|
+
// ─────────────────────────────────────────────────────────────
|
|
177
|
+
// Scenario 7 — Unknown requires (step-id-shaped)
|
|
178
|
+
// ─────────────────────────────────────────────────────────────
|
|
179
|
+
function scenarioUnknownRequires() {
|
|
180
|
+
const yaml = `
|
|
181
|
+
workflow:
|
|
182
|
+
id: req-test
|
|
183
|
+
name: Req Test
|
|
184
|
+
type: custom
|
|
185
|
+
version: "1.0"
|
|
186
|
+
sequence:
|
|
187
|
+
- id: step-a
|
|
188
|
+
agent: dev
|
|
189
|
+
requires: ghost-step
|
|
190
|
+
`;
|
|
191
|
+
const r = (0, WorkflowParser_1.parseWorkflow)(yaml);
|
|
192
|
+
assertHasError(r, WorkflowSchema_1.WORKFLOW_ERRORS.UNKNOWN_REQUIRES, 'unknown requires');
|
|
193
|
+
console.log('✅ scenario 7: unknown requires (step-id-shaped)');
|
|
194
|
+
}
|
|
195
|
+
// ─────────────────────────────────────────────────────────────
|
|
196
|
+
// Scenario 8 — Circular requires chain
|
|
197
|
+
// ─────────────────────────────────────────────────────────────
|
|
198
|
+
function scenarioCircularRequires() {
|
|
199
|
+
const yaml = `
|
|
200
|
+
workflow:
|
|
201
|
+
id: cycle-test
|
|
202
|
+
name: Cycle Test
|
|
203
|
+
type: custom
|
|
204
|
+
version: "1.0"
|
|
205
|
+
sequence:
|
|
206
|
+
- id: step-a
|
|
207
|
+
agent: dev
|
|
208
|
+
requires: step-b
|
|
209
|
+
- id: step-b
|
|
210
|
+
agent: dev
|
|
211
|
+
requires: step-c
|
|
212
|
+
- id: step-c
|
|
213
|
+
agent: dev
|
|
214
|
+
requires: step-a
|
|
215
|
+
`;
|
|
216
|
+
const r = (0, WorkflowParser_1.parseWorkflow)(yaml);
|
|
217
|
+
assertHasError(r, WorkflowSchema_1.WORKFLOW_ERRORS.CIRCULAR_REQUIRES, 'circular requires');
|
|
218
|
+
console.log('✅ scenario 8: circular requires chain');
|
|
219
|
+
}
|
|
220
|
+
// ─────────────────────────────────────────────────────────────
|
|
221
|
+
// Driver
|
|
222
|
+
// ─────────────────────────────────────────────────────────────
|
|
223
|
+
function main() {
|
|
224
|
+
console.log('🧪 test_workflow_parser — Story 4.1 regression suite');
|
|
225
|
+
scenarioHappyPath();
|
|
226
|
+
scenarioMultiPhaseShape();
|
|
227
|
+
scenarioMissingRoot();
|
|
228
|
+
scenarioInvalidType();
|
|
229
|
+
scenarioNoAgentOrSquad();
|
|
230
|
+
scenarioDuplicateStepId();
|
|
231
|
+
scenarioUnknownRequires();
|
|
232
|
+
scenarioCircularRequires();
|
|
233
|
+
// Smoke-check the file loader exists and reports missing files cleanly
|
|
234
|
+
const r = (0, WorkflowParser_1.parseWorkflowFile)('/nonexistent/path/to/workflow.yaml');
|
|
235
|
+
assert(!r.ok, 'parseWorkflowFile must return ok=false for missing path');
|
|
236
|
+
console.log('');
|
|
237
|
+
console.log('TEST_WORKFLOW_PARSER_OK');
|
|
238
|
+
}
|
|
239
|
+
try {
|
|
240
|
+
main();
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
console.error('❌ test_workflow_parser FAILED:', err instanceof Error ? err.message : err);
|
|
244
|
+
process.exit(1);
|
|
245
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* test_workflow_schema_backward_compat.ts — Stories 2.1 + 2.2
|
|
4
|
+
*
|
|
5
|
+
* The Workflow schema gained 15 new optional fields in v1.3. This test
|
|
6
|
+
* proves the v1.2 fixtures (the 4 ported workflows shipped in
|
|
7
|
+
* dist-templates/workflows/) still parse cleanly with the v2 parser.
|
|
8
|
+
*
|
|
9
|
+
* Also asserts the new v1.3 error codes fire on invalid values for
|
|
10
|
+
* mode / status / triggers / tools / success_criteria.
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const WorkflowParser_1 = require("./orchestrator/workflow/WorkflowParser");
|
|
49
|
+
const WorkflowSchema_1 = require("./orchestrator/workflow/WorkflowSchema");
|
|
50
|
+
function assertTrue(cond, label) {
|
|
51
|
+
if (!cond)
|
|
52
|
+
throw new Error(`ASSERT_FAILED[${label}]`);
|
|
53
|
+
}
|
|
54
|
+
function assertErrorCode(errors, code, label) {
|
|
55
|
+
if (!errors.some((e) => e.code === code)) {
|
|
56
|
+
throw new Error(`ASSERT_FAILED[${label}]: expected ${code}, got ${JSON.stringify(errors.map((e) => e.code))}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// ─── v1.2 backward-compat: all 4 ported workflows must still parse ───
|
|
60
|
+
const wfDir = path.join(process.cwd(), 'dist-templates', 'workflows');
|
|
61
|
+
const yamls = fs.readdirSync(wfDir).filter((f) => f.endsWith('.yaml'));
|
|
62
|
+
assertTrue(yamls.length >= 4, `at least 4 fixtures present (found ${yamls.length})`);
|
|
63
|
+
for (const f of yamls) {
|
|
64
|
+
const r = (0, WorkflowParser_1.parseWorkflowFile)(path.join(wfDir, f));
|
|
65
|
+
assertTrue(r.ok, `v1.2 fixture parses: ${f}`);
|
|
66
|
+
}
|
|
67
|
+
console.log(`[2.1/2.2] backward-compat: ${yamls.length}/${yamls.length} v1.2 fixtures parse cleanly ✓`);
|
|
68
|
+
// ─── v1.3 minimum field set still works ──────────────────────────────
|
|
69
|
+
const minimalV2 = `
|
|
70
|
+
workflow:
|
|
71
|
+
id: v2-minimal
|
|
72
|
+
name: v2 Minimal
|
|
73
|
+
type: custom
|
|
74
|
+
version: "1.0"
|
|
75
|
+
sequence:
|
|
76
|
+
- id: only-step
|
|
77
|
+
agent: dev
|
|
78
|
+
action: do-the-thing
|
|
79
|
+
`;
|
|
80
|
+
const m = (0, WorkflowParser_1.parseWorkflow)(minimalV2);
|
|
81
|
+
assertTrue(m.ok, 'minimal v2 parses');
|
|
82
|
+
assertTrue(m.workflow?.mode === undefined, 'mode defaults to undefined (engine reads as task)');
|
|
83
|
+
console.log('[2.1] minimal v2 parses ✓');
|
|
84
|
+
// ─── v1.3 full field set parses ──────────────────────────────────────
|
|
85
|
+
const fullV2 = `
|
|
86
|
+
workflow:
|
|
87
|
+
id: v2-full
|
|
88
|
+
name: Full v2
|
|
89
|
+
type: custom
|
|
90
|
+
version: "1.0"
|
|
91
|
+
status: tested
|
|
92
|
+
mode: service
|
|
93
|
+
triggers: [manual, cron]
|
|
94
|
+
objective: "demonstrate every v1.3 field round-trip"
|
|
95
|
+
success_criteria:
|
|
96
|
+
- { id: complete-no-error, description: "all steps reach completion" }
|
|
97
|
+
inputs:
|
|
98
|
+
- { id: brief, type: string, required: true, description: "the brief" }
|
|
99
|
+
outputs:
|
|
100
|
+
- { id: report, type: string, description: "final report path" }
|
|
101
|
+
required_context: ["docs/research-policy.md"]
|
|
102
|
+
squads: ["design-squad"]
|
|
103
|
+
skills: ["analysis"]
|
|
104
|
+
tools:
|
|
105
|
+
allowed: [file, web]
|
|
106
|
+
forbidden: [terminal]
|
|
107
|
+
policies: ["no-uncited-claims"]
|
|
108
|
+
validation:
|
|
109
|
+
- { id: report-exists, description: "report must exist", kind: artifact_exists }
|
|
110
|
+
evidence: ["report.md"]
|
|
111
|
+
failure_handling:
|
|
112
|
+
on_step_failure: retry
|
|
113
|
+
max_retries: 2
|
|
114
|
+
audit_events: ["workflow.completed"]
|
|
115
|
+
learning_rules:
|
|
116
|
+
- { id: store-success, trigger: on_success, description: "remember this pattern" }
|
|
117
|
+
sequence:
|
|
118
|
+
- id: step-1
|
|
119
|
+
agent: dev
|
|
120
|
+
action: build
|
|
121
|
+
`;
|
|
122
|
+
const f2 = (0, WorkflowParser_1.parseWorkflow)(fullV2);
|
|
123
|
+
assertTrue(f2.ok, `full v2 parses (errors=${JSON.stringify(f2.errors)})`);
|
|
124
|
+
assertTrue(f2.workflow?.mode === 'service', 'mode round-trip');
|
|
125
|
+
assertTrue(f2.workflow?.status === 'tested', 'status round-trip');
|
|
126
|
+
assertTrue(f2.workflow?.triggers?.length === 2, 'triggers round-trip');
|
|
127
|
+
assertTrue(f2.workflow?.tools?.forbidden?.[0] === 'terminal', 'tools.forbidden round-trip');
|
|
128
|
+
assertTrue(f2.workflow?.success_criteria?.[0].id === 'complete-no-error', 'success_criteria round-trip');
|
|
129
|
+
console.log('[2.1] full v2 round-trip ✓');
|
|
130
|
+
// ─── v1.3 error codes ────────────────────────────────────────────────
|
|
131
|
+
const badMode = `
|
|
132
|
+
workflow:
|
|
133
|
+
id: bad
|
|
134
|
+
name: Bad
|
|
135
|
+
type: custom
|
|
136
|
+
version: "1.0"
|
|
137
|
+
mode: forever
|
|
138
|
+
sequence:
|
|
139
|
+
- id: x
|
|
140
|
+
agent: y
|
|
141
|
+
action: z
|
|
142
|
+
`;
|
|
143
|
+
const bm = (0, WorkflowParser_1.parseWorkflow)(badMode);
|
|
144
|
+
assertTrue(!bm.ok, 'invalid mode fails');
|
|
145
|
+
assertErrorCode(bm.errors, WorkflowSchema_1.WORKFLOW_ERRORS.INVALID_MODE, 'INVALID_MODE');
|
|
146
|
+
console.log('[2.2] INVALID_MODE ✓');
|
|
147
|
+
const badTrig = `
|
|
148
|
+
workflow:
|
|
149
|
+
id: bad
|
|
150
|
+
name: Bad
|
|
151
|
+
type: custom
|
|
152
|
+
version: "1.0"
|
|
153
|
+
triggers: [supernova]
|
|
154
|
+
sequence:
|
|
155
|
+
- id: x
|
|
156
|
+
agent: y
|
|
157
|
+
action: z
|
|
158
|
+
`;
|
|
159
|
+
const bt = (0, WorkflowParser_1.parseWorkflow)(badTrig);
|
|
160
|
+
assertTrue(!bt.ok, 'invalid trigger fails');
|
|
161
|
+
assertErrorCode(bt.errors, WorkflowSchema_1.WORKFLOW_ERRORS.INVALID_TRIGGERS, 'INVALID_TRIGGERS');
|
|
162
|
+
console.log('[2.2] INVALID_TRIGGERS ✓');
|
|
163
|
+
const badTools = `
|
|
164
|
+
workflow:
|
|
165
|
+
id: bad
|
|
166
|
+
name: Bad
|
|
167
|
+
type: custom
|
|
168
|
+
version: "1.0"
|
|
169
|
+
tools:
|
|
170
|
+
forbidden: "everything"
|
|
171
|
+
sequence:
|
|
172
|
+
- id: x
|
|
173
|
+
agent: y
|
|
174
|
+
action: z
|
|
175
|
+
`;
|
|
176
|
+
const btools = (0, WorkflowParser_1.parseWorkflow)(badTools);
|
|
177
|
+
assertTrue(!btools.ok, 'invalid tools.forbidden fails');
|
|
178
|
+
assertErrorCode(btools.errors, WorkflowSchema_1.WORKFLOW_ERRORS.INVALID_TOOLS_POLICY, 'INVALID_TOOLS_POLICY');
|
|
179
|
+
console.log('[2.2] INVALID_TOOLS_POLICY ✓');
|
|
180
|
+
const badCrit = `
|
|
181
|
+
workflow:
|
|
182
|
+
id: bad
|
|
183
|
+
name: Bad
|
|
184
|
+
type: custom
|
|
185
|
+
version: "1.0"
|
|
186
|
+
success_criteria:
|
|
187
|
+
- "just a string, not an object"
|
|
188
|
+
sequence:
|
|
189
|
+
- id: x
|
|
190
|
+
agent: y
|
|
191
|
+
action: z
|
|
192
|
+
`;
|
|
193
|
+
const bc = (0, WorkflowParser_1.parseWorkflow)(badCrit);
|
|
194
|
+
assertTrue(!bc.ok, 'invalid success_criteria fails');
|
|
195
|
+
assertErrorCode(bc.errors, WorkflowSchema_1.WORKFLOW_ERRORS.INVALID_SUCCESS_CRITERIA, 'INVALID_SUCCESS_CRITERIA');
|
|
196
|
+
console.log('[2.2] INVALID_SUCCESS_CRITERIA ✓');
|
|
197
|
+
console.log('TEST_WORKFLOW_SCHEMA_BACKWARD_COMPAT_OK');
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# dist-templates/
|
|
2
|
+
|
|
3
|
+
Templates that OpenLife installs into a host CLI when the user runs `openlife system setup --host <host>`.
|
|
4
|
+
|
|
5
|
+
This directory is **part of the npm distribution** (see the `files` array in `package.json`) — it ships to consumers of `@open-life/cli` so the installer can copy artifacts into the host without needing network access.
|
|
6
|
+
|
|
7
|
+
## Layout
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
dist-templates/
|
|
11
|
+
└── claude-code/ # Host: claude-code (Story 3.2 — Claude Code first)
|
|
12
|
+
├── agents/ # Copied to <project>/.claude/agents/
|
|
13
|
+
├── commands/ # Copied to <project>/.claude/commands/
|
|
14
|
+
└── mcp/ # Merged into ~/.claude.json mcpServers section
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Future hosts (Story 3.3+):
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
dist-templates/
|
|
21
|
+
├── claude-code/ # ← shipped now
|
|
22
|
+
├── gemini-cli/ # ← Story 3.3
|
|
23
|
+
└── codex/ # ← Story 3.3
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Claude Code starter roster (5 of 21 named vault agents)
|
|
27
|
+
|
|
28
|
+
| Agent | Role | File |
|
|
29
|
+
|-----------|-----------------------------------------------------------------|-----------------------------|
|
|
30
|
+
| MAESTRO | Meta-orchestrator — routes work to the right specialist | `openlife-maestro.md` |
|
|
31
|
+
| LYRA | Research synthesis + narrative writing | `openlife-lyra.md` |
|
|
32
|
+
| FORGE | Artifact creation (agents, skills, slash commands, MCP configs) | `openlife-forge.md` |
|
|
33
|
+
| ATLAS | Codebase mapping + architectural analysis | `openlife-atlas.md` |
|
|
34
|
+
| GENESIS | New-project bootstrap + install/scaffold | `openlife-genesis.md` |
|
|
35
|
+
|
|
36
|
+
Remaining 16 (VEIN, FLUX, VECTOR, PRISM, AXIOM, TEMPO, AURA, JONHY, HORMOZI, DARIO, PANTHEON, LOKI, QUILL, VISION, PEPPER, VOID) are scheduled for population in v1.1+ stories once each role has a verified runtime catalog counterpart in `.catalog/agents/`.
|
|
37
|
+
|
|
38
|
+
## Starter slash commands
|
|
39
|
+
|
|
40
|
+
| Command | Purpose |
|
|
41
|
+
|--------------------|------------------------------------------------------------|
|
|
42
|
+
| `/openlife:status` | Show profile, host, catalog counts, daemon state |
|
|
43
|
+
| `/openlife:ask` | Run a question through the OpenLife Brain |
|
|
44
|
+
| `/openlife:doctor` | Health checks (API keys, model chain, catalogs) |
|
|
45
|
+
| `/openlife:dream` | Run the Dream Organizer over accumulated context |
|
|
46
|
+
|
|
47
|
+
## MCP
|
|
48
|
+
|
|
49
|
+
`dist-templates/claude-code/mcp/openlife-orchestrator.json` is the MCP manifest the installer merges into `~/.claude.json`. The actual MCP server (`bin/openlife-mcp.js`) is **stubbed** in Story 3.2 — Story 3.3+ wires it up. The manifest ships now so install is a single atomic operation.
|
|
50
|
+
|
|
51
|
+
## Format notes
|
|
52
|
+
|
|
53
|
+
**Claude Code subagent format** (lean):
|
|
54
|
+
|
|
55
|
+
```yaml
|
|
56
|
+
---
|
|
57
|
+
name: <kebab-case>
|
|
58
|
+
description: <when-to-use this agent>
|
|
59
|
+
tools: <comma-separated tools, or omit for default>
|
|
60
|
+
model: sonnet
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
<system prompt body>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Claude Code slash command format**:
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
---
|
|
70
|
+
description: <one-line summary>
|
|
71
|
+
argument-hint: <optional ARG description>
|
|
72
|
+
allowed-tools: <restricted tool list, optional>
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
<command instructions>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
These formats are stable per Claude Code's published spec — **do not invent extra frontmatter fields**.
|
|
79
|
+
|
|
80
|
+
## Why these aren't in `.catalog/`
|
|
81
|
+
|
|
82
|
+
`.catalog/` is the OpenLife **runtime** catalog (rich YAML with `commands:`, `dependencies:`, `persona_profile:` — loaded by `AgentRegistry`, `SkillRegistryV2`, `SquadRegistry`).
|
|
83
|
+
|
|
84
|
+
`dist-templates/` is what gets **installed into a host CLI** so the host can invoke OpenLife capabilities natively. Lean Claude Code format ≠ heavy runtime catalog format. Both can co-exist for the same logical agent.
|
|
85
|
+
|
|
86
|
+
## Adding a new agent to dist-templates
|
|
87
|
+
|
|
88
|
+
1. Create `dist-templates/claude-code/agents/openlife-<name>.md` with the format above.
|
|
89
|
+
2. Add the matching runtime entry under `.catalog/agents/<name>/AGENT.md` (heavy format) — FORGE owns this.
|
|
90
|
+
3. Update this README's roster table.
|
|
91
|
+
4. Add the regression test (see `src/test_dist_templates_layout.ts`).
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: openlife-atlas
|
|
3
|
+
description: Codebase mapping and architectural analysis specialist. Use for dependency tracing, identifying which files/classes own a behavior, mapping subsystems, surfacing architectural drift, or producing the architecture section of a planning doc. Not for writing new code — that's the default flow. Not for prose writeups — that's LYRA.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are **ATLAS**, the codebase mapping specialist for OpenLife.
|
|
9
|
+
|
|
10
|
+
## What you own
|
|
11
|
+
|
|
12
|
+
- **Subsystem mapping**: Given a feature, identify every file/class involved
|
|
13
|
+
- **Dependency tracing**: Where is X imported? What does Y depend on?
|
|
14
|
+
- **Drift detection**: Compare current code structure to documented architecture (`.planning/codebase/ARCHITECTURE.md`, CLAUDE.md)
|
|
15
|
+
- **Impact analysis**: If we change file A, what else breaks?
|
|
16
|
+
|
|
17
|
+
## What you don't own
|
|
18
|
+
|
|
19
|
+
- Writing application code → default Claude Code flow
|
|
20
|
+
- Prose synthesis or PRDs → LYRA
|
|
21
|
+
- Creating new agents/skills → FORGE
|
|
22
|
+
- Project scaffolding → GENESIS
|
|
23
|
+
|
|
24
|
+
## OpenLife architecture map (memorize)
|
|
25
|
+
|
|
26
|
+
- **Entry**: `bin/openlife.js` → `dist/index.js` ← compiled from `src/index.ts` (lazy imports!)
|
|
27
|
+
- **Orchestrator (80+ classes)**: `src/orchestrator/` — Brain, Gateway, IntentClassifier, GovernanceLayer, ...
|
|
28
|
+
- **CLI/install**: `src/cli/` — SystemInstaller, InstallFlow (host-aware), AutonomousInstaller
|
|
29
|
+
- **Memory**: `src/memory/` — multi-provider chain (LocalMemoryProvider SQLite/FTS5 + mempalace + mem0 + ...)
|
|
30
|
+
- **Reversa**: `src/reversa/` — autonomous sub-agent with contract/strict modes
|
|
31
|
+
- **Design**: `src/design/` — DesignMd mode (NL UI generation)
|
|
32
|
+
- **Runtime catalogs**: `.catalog/agents/`, `.catalog/skills/`, `.catalog/squads/`, `.catalog/mcps/`
|
|
33
|
+
- **Runtime state**: `.openlife/` (overridable via `OPENLIFE_STATE_DIR`)
|
|
34
|
+
|
|
35
|
+
## How you work
|
|
36
|
+
|
|
37
|
+
1. **Start with a hypothesis.** "I think feature X lives in Brain + Gateway." Then verify with `grep`.
|
|
38
|
+
2. **Read entry points first.** `src/index.ts` is the command registry — find the handler before tracing deeper.
|
|
39
|
+
3. **Map, don't narrate.** Output: a table or tree, not paragraphs. The user can re-read code; they can't re-read your prose easily.
|
|
40
|
+
4. **Cite `file:line` for every claim.** "Brain.think() at `src/orchestrator/Brain.ts:142` calls ModelManager.runChain()."
|
|
41
|
+
|
|
42
|
+
## Principles
|
|
43
|
+
|
|
44
|
+
- **No fabrication.** If you didn't read it, don't claim it exists. Grep first.
|
|
45
|
+
- **Architectural decisions need evidence.** Don't say "this violates separation of concerns" without showing the violation.
|
|
46
|
+
- **Recognize lazy imports.** OpenLife uses lazy `require()` inside command handlers — module-scope imports would hang `--help`. Don't propose moves that break this.
|
|
47
|
+
|
|
48
|
+
## Anti-patterns
|
|
49
|
+
|
|
50
|
+
- Recommending a refactor you can't justify from the code
|
|
51
|
+
- Stopping at the first match — `grep` shows 1, but there might be 5
|
|
52
|
+
- Confusing the runtime catalog (`.catalog/`) with documentation (`docs/`)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: openlife-forge
|
|
3
|
+
description: Artifact creation specialist. Use when creating new OpenLife agents, skills, slash commands, MCP configurations, or catalog entries. Knows the OpenLife `.catalog/` layout, the `dist-templates/` distribution format, and the Claude Code subagent format. Not for editing existing code — that's the default flow.
|
|
4
|
+
tools: Read, Write, Edit, Grep, Glob, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are **FORGE**, the artifact creation specialist for OpenLife.
|
|
9
|
+
|
|
10
|
+
## What you create
|
|
11
|
+
|
|
12
|
+
- **OpenLife runtime agents** in `.catalog/agents/<name>/AGENT.md` (rich YAML format)
|
|
13
|
+
- **Claude Code subagents** in `dist-templates/claude-code/agents/openlife-*.md` (lean frontmatter)
|
|
14
|
+
- **Slash commands** in `dist-templates/claude-code/commands/openlife/*.md`
|
|
15
|
+
- **MCP manifests** in `dist-templates/claude-code/mcp/*.json`
|
|
16
|
+
- **Skills** in `.catalog/skills/<name>/SKILL.md`
|
|
17
|
+
- **Squads** in `.catalog/squads/<name>/SQUAD.md`
|
|
18
|
+
|
|
19
|
+
## What you don't create
|
|
20
|
+
|
|
21
|
+
- Application logic (`src/orchestrator/*`, `src/cli/*`) — that's normal dev work
|
|
22
|
+
- New host integrations (gemini-cli, codex) — that's a story-level decision, not an artifact
|
|
23
|
+
- Documentation outside catalog/templates — that's LYRA
|
|
24
|
+
|
|
25
|
+
## How you work
|
|
26
|
+
|
|
27
|
+
1. **Find the closest analog first.** Grep `.catalog/` for an existing artifact of the same kind. Read it. Copy the structure exactly.
|
|
28
|
+
2. **Respect the format.** OpenLife runtime catalog = heavy YAML with `agent:`, `persona:`, `commands:`, `dependencies:`. Claude Code dist-templates = lean frontmatter + system prompt. Don't mix.
|
|
29
|
+
3. **Single file per artifact.** Don't split an agent across multiple files.
|
|
30
|
+
4. **Register on creation.** New runtime catalog entries must appear in the right registry (AgentRegistry, SkillRegistryV2, SquadRegistry) — verify the loader picks them up.
|
|
31
|
+
|
|
32
|
+
## Principles
|
|
33
|
+
|
|
34
|
+
- **REUSE > ADAPT > CREATE.** If a 90% match exists, suggest reusing it instead.
|
|
35
|
+
- **Format conformance is non-negotiable.** A new agent that breaks the registry parser is a regression.
|
|
36
|
+
- **Atomic changes.** One PR = one new artifact + its registration + its test.
|
|
37
|
+
|
|
38
|
+
## Anti-patterns
|
|
39
|
+
|
|
40
|
+
- Inventing new YAML fields not present in sibling artifacts
|
|
41
|
+
- Creating an "openlife-X" Claude Code agent without an underlying `.catalog/agents/X/` runtime entry (unless explicitly host-only)
|
|
42
|
+
- Skipping the regression test
|