@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.
Files changed (394) hide show
  1. package/INSTALL.md +266 -0
  2. package/LICENSE +21 -0
  3. package/README.md +142 -0
  4. package/bin/openlife.js +3 -0
  5. package/dist/admin_panel_server.js +66 -0
  6. package/dist/cli/AgentManager.js +109 -0
  7. package/dist/cli/AutonomousInstaller.js +134 -0
  8. package/dist/cli/DreamOrganizer.js +88 -0
  9. package/dist/cli/HostInstaller.js +426 -0
  10. package/dist/cli/InstallBanner.js +16 -0
  11. package/dist/cli/InstallFlow.js +256 -0
  12. package/dist/cli/InstallHeadless.js +47 -0
  13. package/dist/cli/InstallModules.js +148 -0
  14. package/dist/cli/InstallStateStore.js +75 -0
  15. package/dist/cli/InstallWizard.js +364 -0
  16. package/dist/cli/ProfileManager.js +163 -0
  17. package/dist/cli/SystemInstaller.js +89 -0
  18. package/dist/cli/WorldClassCommands.js +208 -0
  19. package/dist/design/DesignMdImporter.js +82 -0
  20. package/dist/design/DesignMdMode.js +93 -0
  21. package/dist/design/DesignMdRegistry.js +67 -0
  22. package/dist/index.js +2575 -0
  23. package/dist/memory/ConversationMemory.js +33 -0
  24. package/dist/memory/LocalMemoryProvider.js +86 -0
  25. package/dist/memory/Mem0Provider.js +16 -0
  26. package/dist/memory/MemoryNamespacePolicy.js +27 -0
  27. package/dist/memory/MemoryOrchestrator.js +65 -0
  28. package/dist/memory/MemoryPromotionFlow.js +32 -0
  29. package/dist/memory/MemoryProvider.js +2 -0
  30. package/dist/memory/MemoryProviderRegistry.js +27 -0
  31. package/dist/memory/MemoryRetentionPolicy.js +60 -0
  32. package/dist/memory/MempalaceProvider.js +72 -0
  33. package/dist/memory/OmniMemory.js +106 -0
  34. package/dist/memory/RedisAgentMemoryProvider.js +16 -0
  35. package/dist/memory/SessionManager.js +86 -0
  36. package/dist/memory/ZepGraphitiProvider.js +16 -0
  37. package/dist/orchestrator/AgentRegistry.js +56 -0
  38. package/dist/orchestrator/AgentScoring.js +82 -0
  39. package/dist/orchestrator/AgentTeam.js +22 -0
  40. package/dist/orchestrator/ArbitrationAgent.js +43 -0
  41. package/dist/orchestrator/ArbitrationScorecard.js +17 -0
  42. package/dist/orchestrator/AssetPromotionEngine.js +65 -0
  43. package/dist/orchestrator/AssetReuseRouter.js +63 -0
  44. package/dist/orchestrator/BenchmarkEngine.js +75 -0
  45. package/dist/orchestrator/Brain.js +298 -0
  46. package/dist/orchestrator/CadenceEngine.js +76 -0
  47. package/dist/orchestrator/CapabilityRouter.js +36 -0
  48. package/dist/orchestrator/CommandLanguage.js +27 -0
  49. package/dist/orchestrator/CommandRouter.js +70 -0
  50. package/dist/orchestrator/ConsequenceForecaster.js +286 -0
  51. package/dist/orchestrator/CronManager.js +286 -0
  52. package/dist/orchestrator/DynamicAgentBuilder.js +48 -0
  53. package/dist/orchestrator/DynamicAgentExecutor.js +15 -0
  54. package/dist/orchestrator/EnterpriseAgenticCore.js +276 -0
  55. package/dist/orchestrator/ExecutionBoard.js +86 -0
  56. package/dist/orchestrator/ExecutionIntent.js +13 -0
  57. package/dist/orchestrator/ExecutionModePolicy.js +48 -0
  58. package/dist/orchestrator/ExecutionRouter.js +9 -0
  59. package/dist/orchestrator/ExecutionState.js +20 -0
  60. package/dist/orchestrator/ExecutorHealth.js +86 -0
  61. package/dist/orchestrator/ExternalCatalogRegistry.js +83 -0
  62. package/dist/orchestrator/Gatekeeper.js +414 -0
  63. package/dist/orchestrator/Gateway.js +508 -0
  64. package/dist/orchestrator/GovernanceConsentStore.js +66 -0
  65. package/dist/orchestrator/GovernanceLayer.js +179 -0
  66. package/dist/orchestrator/GovernancePolicyStore.js +53 -0
  67. package/dist/orchestrator/GovernanceScopeLedger.js +134 -0
  68. package/dist/orchestrator/GovernanceScopePolicy.js +67 -0
  69. package/dist/orchestrator/IntentClassifier.js +45 -0
  70. package/dist/orchestrator/JobLifecycle.js +91 -0
  71. package/dist/orchestrator/LearningRouter.js +24 -0
  72. package/dist/orchestrator/MediaManager.js +92 -0
  73. package/dist/orchestrator/MemoryCuratorAgent.js +41 -0
  74. package/dist/orchestrator/MissionState.js +155 -0
  75. package/dist/orchestrator/ModelManager.js +84 -0
  76. package/dist/orchestrator/OperatingSystem.js +71 -0
  77. package/dist/orchestrator/OperationalMemoryStore.js +94 -0
  78. package/dist/orchestrator/OptimizationLoop.js +72 -0
  79. package/dist/orchestrator/OrchestrationLoop.js +905 -0
  80. package/dist/orchestrator/OrgStructure.js +88 -0
  81. package/dist/orchestrator/OutcomeSimulator.js +46 -0
  82. package/dist/orchestrator/ParallelOrchestrationLoop.js +36 -0
  83. package/dist/orchestrator/PerformanceScorecard.js +105 -0
  84. package/dist/orchestrator/PlannerAgent.js +46 -0
  85. package/dist/orchestrator/ProcessSandbox.js +129 -0
  86. package/dist/orchestrator/PromotionPipeline.js +74 -0
  87. package/dist/orchestrator/PromotionReviewGate.js +11 -0
  88. package/dist/orchestrator/QueueScheduler.js +260 -0
  89. package/dist/orchestrator/ReleaseGate.js +36 -0
  90. package/dist/orchestrator/ReleaseWorkflow.js +68 -0
  91. package/dist/orchestrator/RemotePublisher.js +139 -0
  92. package/dist/orchestrator/ReuseEngine.js +89 -0
  93. package/dist/orchestrator/ReviewerAgent.js +49 -0
  94. package/dist/orchestrator/RoleHandoff.js +65 -0
  95. package/dist/orchestrator/RuntimeHealthMonitor.js +143 -0
  96. package/dist/orchestrator/RuntimePolicy.js +105 -0
  97. package/dist/orchestrator/RuntimeProbe.js +97 -0
  98. package/dist/orchestrator/RuntimeRegistry.js +73 -0
  99. package/dist/orchestrator/SandboxPolicy.js +22 -0
  100. package/dist/orchestrator/SecurityDownloadGuard.js +169 -0
  101. package/dist/orchestrator/SecurityEventStore.js +58 -0
  102. package/dist/orchestrator/ServiceCompletionPolicy.js +36 -0
  103. package/dist/orchestrator/ServiceState.js +195 -0
  104. package/dist/orchestrator/SkillCreator.js +404 -0
  105. package/dist/orchestrator/SkillLearningLoop.js +57 -0
  106. package/dist/orchestrator/SkillManager.js +75 -0
  107. package/dist/orchestrator/SkillNetwork.js +29 -0
  108. package/dist/orchestrator/SkillRegistryV2.js +28 -0
  109. package/dist/orchestrator/SkillScoring.js +70 -0
  110. package/dist/orchestrator/SquadAutoCreator.js +64 -0
  111. package/dist/orchestrator/SquadCreator.js +727 -0
  112. package/dist/orchestrator/SquadRegistry.js +28 -0
  113. package/dist/orchestrator/SquadRouter.js +33 -0
  114. package/dist/orchestrator/SquadScoring.js +70 -0
  115. package/dist/orchestrator/SubagentLifecycle.js +90 -0
  116. package/dist/orchestrator/SynthesizerAgent.js +48 -0
  117. package/dist/orchestrator/SystemDoctor.js +224 -0
  118. package/dist/orchestrator/TaskExecutor.js +422 -0
  119. package/dist/orchestrator/TeammateBoard.js +61 -0
  120. package/dist/orchestrator/TestHarness.js +184 -0
  121. package/dist/orchestrator/VoiceManager.js +203 -0
  122. package/dist/orchestrator/VoiceRouter.js +89 -0
  123. package/dist/orchestrator/capability/CapabilityGenesisEngine.js +278 -0
  124. package/dist/orchestrator/capability/CapabilityPackParser.js +223 -0
  125. package/dist/orchestrator/capability/CapabilityPackSchema.js +62 -0
  126. package/dist/orchestrator/capability/CapabilityPackState.js +163 -0
  127. package/dist/orchestrator/providers/AgentProvider.js +2 -0
  128. package/dist/orchestrator/providers/CapabilityProvider.js +12 -0
  129. package/dist/orchestrator/providers/CloudAgentProvider.js +55 -0
  130. package/dist/orchestrator/providers/CloudSkillProvider.js +55 -0
  131. package/dist/orchestrator/providers/CloudSquadProvider.js +55 -0
  132. package/dist/orchestrator/providers/CompositeAgentProvider.js +16 -0
  133. package/dist/orchestrator/providers/CompositeCapabilityProvider.js +25 -0
  134. package/dist/orchestrator/providers/CompositeSkillProvider.js +16 -0
  135. package/dist/orchestrator/providers/CompositeSquadProvider.js +16 -0
  136. package/dist/orchestrator/providers/CompositeWorkflowProvider.js +46 -0
  137. package/dist/orchestrator/providers/FileAgentProvider.js +105 -0
  138. package/dist/orchestrator/providers/FileCapabilityProvider.js +106 -0
  139. package/dist/orchestrator/providers/FileSkillProvider.js +65 -0
  140. package/dist/orchestrator/providers/FileSquadProvider.js +69 -0
  141. package/dist/orchestrator/providers/FileWorkflowProvider.js +103 -0
  142. package/dist/orchestrator/providers/SkillProvider.js +2 -0
  143. package/dist/orchestrator/providers/SquadProvider.js +2 -0
  144. package/dist/orchestrator/toolset/ToolsetGuard.js +69 -0
  145. package/dist/orchestrator/toolset/ToolsetRegistry.js +65 -0
  146. package/dist/orchestrator/toolset/ToolsetSchema.js +21 -0
  147. package/dist/orchestrator/util/AtomicWriter.js +204 -0
  148. package/dist/orchestrator/util/DistributedLock.js +232 -0
  149. package/dist/orchestrator/util/TemplateRenderer.js +87 -0
  150. package/dist/orchestrator/util/WatchdogHeartbeat.js +116 -0
  151. package/dist/orchestrator/workflow/ConditionParser.js +232 -0
  152. package/dist/orchestrator/workflow/WorkflowEngine.js +379 -0
  153. package/dist/orchestrator/workflow/WorkflowParser.js +368 -0
  154. package/dist/orchestrator/workflow/WorkflowSchema.js +65 -0
  155. package/dist/orchestrator/workflow/WorkflowState.js +11 -0
  156. package/dist/reversa/ReversaAgent.js +134 -0
  157. package/dist/reversa/ReversaContracts.js +62 -0
  158. package/dist/reversa/ReversaExecutors.js +65 -0
  159. package/dist/skills/SkillRegistry.js +71 -0
  160. package/dist/squads/SquadManager.js +87 -0
  161. package/dist/test_admin_teams_networks.js +54 -0
  162. package/dist/test_agent_team_skill_network.js +15 -0
  163. package/dist/test_aiobuilder_cli_parity.js +169 -0
  164. package/dist/test_ask_exit.js +73 -0
  165. package/dist/test_atomic_writer.js +209 -0
  166. package/dist/test_autonomous_soak.js +141 -0
  167. package/dist/test_benchmark_engine.js +41 -0
  168. package/dist/test_brain_error_diagnostics.js +51 -0
  169. package/dist/test_brain_fallback_chain.js +93 -0
  170. package/dist/test_capability_genesis_engine.js +225 -0
  171. package/dist/test_capability_pack_schema.js +214 -0
  172. package/dist/test_catalog_quality.js +150 -0
  173. package/dist/test_cli_crud_roundtrip.js +154 -0
  174. package/dist/test_cli_diagnostics.js +131 -0
  175. package/dist/test_cli_doc_parity.js +126 -0
  176. package/dist/test_cli_help_surface.js +106 -0
  177. package/dist/test_cli_service_commands.js +83 -0
  178. package/dist/test_consequence_forecast_brain.js +165 -0
  179. package/dist/test_consequence_forecaster.js +24 -0
  180. package/dist/test_conversation_memory.js +36 -0
  181. package/dist/test_create_entities.js +54 -0
  182. package/dist/test_creator_placeholders_completed.js +177 -0
  183. package/dist/test_cron_manager.js +123 -0
  184. package/dist/test_daemon_sigterm.js +72 -0
  185. package/dist/test_deep_research_capability.js +87 -0
  186. package/dist/test_designmd_import_registry.js +16 -0
  187. package/dist/test_designmd_mode.js +50 -0
  188. package/dist/test_designmd_mode_workspace.js +13 -0
  189. package/dist/test_dist_templates_layout.js +135 -0
  190. package/dist/test_distributed_lock.js +201 -0
  191. package/dist/test_distribution_installability.js +67 -0
  192. package/dist/test_doctor_sandbox_check.js +44 -0
  193. package/dist/test_dream_organizer.js +25 -0
  194. package/dist/test_dual_mode.js +15 -0
  195. package/dist/test_enterprise_agentic_core.js +128 -0
  196. package/dist/test_forecast_brain_wiring.js +87 -0
  197. package/dist/test_gateway_telegram_guardrails.js +52 -0
  198. package/dist/test_governance.js +34 -0
  199. package/dist/test_governance_advanced.js +75 -0
  200. package/dist/test_governance_scope_ledger.js +147 -0
  201. package/dist/test_governance_v13_policies.js +44 -0
  202. package/dist/test_guided_creator_cli.js +100 -0
  203. package/dist/test_host_install_e2e.js +324 -0
  204. package/dist/test_host_installer.js +259 -0
  205. package/dist/test_host_installers_gemini_codex.js +95 -0
  206. package/dist/test_host_uninstaller.js +295 -0
  207. package/dist/test_install_flow.js +70 -0
  208. package/dist/test_install_flow_host_validation.js +143 -0
  209. package/dist/test_install_wizard.js +272 -0
  210. package/dist/test_integration_gemini_live.js +95 -0
  211. package/dist/test_integration_http_trigger_live.js +154 -0
  212. package/dist/test_integration_telegram_live.js +102 -0
  213. package/dist/test_job_lifecycle.js +16 -0
  214. package/dist/test_memory_orchestrator.js +33 -0
  215. package/dist/test_memory_promotion.js +36 -0
  216. package/dist/test_memory_retention.js +37 -0
  217. package/dist/test_mission_checkpoint.js +204 -0
  218. package/dist/test_multi_host_docs_parity.js +125 -0
  219. package/dist/test_openlife_auto_creator_routing.js +69 -0
  220. package/dist/test_openlife_evolution_surface.js +77 -0
  221. package/dist/test_openlife_gatekeeper_routing.js +15 -0
  222. package/dist/test_openlife_routing_surface.js +27 -0
  223. package/dist/test_openlife_runtime_source_truth.js +25 -0
  224. package/dist/test_operating_system.js +45 -0
  225. package/dist/test_optimization_loop.js +38 -0
  226. package/dist/test_orchestration_assets_lifecycle.js +78 -0
  227. package/dist/test_outcome_simulator.js +38 -0
  228. package/dist/test_performance_latency.js +215 -0
  229. package/dist/test_performance_scorecard.js +38 -0
  230. package/dist/test_phase1_check_exit.js +103 -0
  231. package/dist/test_phase6_board.js +31 -0
  232. package/dist/test_phase6_cadence.js +29 -0
  233. package/dist/test_phase6_ops.js +37 -0
  234. package/dist/test_post_mission_evaluation.js +190 -0
  235. package/dist/test_process_sandbox.js +88 -0
  236. package/dist/test_profile_toolset_mcp.js +125 -0
  237. package/dist/test_queue_scheduler.js +239 -0
  238. package/dist/test_release_gate.js +23 -0
  239. package/dist/test_remote_publish.js +193 -0
  240. package/dist/test_reversa_contracts_e2e.js +48 -0
  241. package/dist/test_reversa_export_and_strict.js +51 -0
  242. package/dist/test_reversa_full_execution.js +12 -0
  243. package/dist/test_reversa_lite.js +9 -0
  244. package/dist/test_royal_stack_golden.js +179 -0
  245. package/dist/test_runtime_health_backoff.js +154 -0
  246. package/dist/test_runtime_policy.js +26 -0
  247. package/dist/test_runtime_probe.js +19 -0
  248. package/dist/test_runtime_profile_oauth_only.js +262 -0
  249. package/dist/test_runtime_registry.js +11 -0
  250. package/dist/test_security_download_and_scan.js +103 -0
  251. package/dist/test_security_download_guard.js +14 -0
  252. package/dist/test_service_command_surface.js +12 -0
  253. package/dist/test_service_completion_policy.js +32 -0
  254. package/dist/test_service_guardrails_delete.js +12 -0
  255. package/dist/test_service_mode_explicit_only.js +174 -0
  256. package/dist/test_sources_import_ref.js +46 -0
  257. package/dist/test_sources_scaffold.js +43 -0
  258. package/dist/test_squad_skill_creator.js +305 -0
  259. package/dist/test_squad_skill_design_llm.js +176 -0
  260. package/dist/test_subsystems_org_state.js +271 -0
  261. package/dist/test_subsystems_promotion_memory_assets.js +343 -0
  262. package/dist/test_subsystems_routing_governance.js +234 -0
  263. package/dist/test_task_executor_sandbox_optin.js +127 -0
  264. package/dist/test_teammate_learning.js +15 -0
  265. package/dist/test_telegram_delete_guardrail.js +21 -0
  266. package/dist/test_toolset_enforcement.js +188 -0
  267. package/dist/test_trigger_basic_auth.js +112 -0
  268. package/dist/test_util/doc_parity.js +120 -0
  269. package/dist/test_v15_e2e_integration.js +207 -0
  270. package/dist/test_watchdog_heartbeat.js +152 -0
  271. package/dist/test_workflow_condition_parser.js +63 -0
  272. package/dist/test_workflow_e2e.js +240 -0
  273. package/dist/test_workflow_engine.js +330 -0
  274. package/dist/test_workflow_parser.js +245 -0
  275. package/dist/test_workflow_schema_backward_compat.js +197 -0
  276. package/dist-templates/README.md +91 -0
  277. package/dist-templates/claude-code/agents/openlife-atlas.md +52 -0
  278. package/dist-templates/claude-code/agents/openlife-forge.md +42 -0
  279. package/dist-templates/claude-code/agents/openlife-genesis.md +59 -0
  280. package/dist-templates/claude-code/agents/openlife-lyra.md +40 -0
  281. package/dist-templates/claude-code/agents/openlife-maestro.md +45 -0
  282. package/dist-templates/claude-code/commands/openlife/ask.md +14 -0
  283. package/dist-templates/claude-code/commands/openlife/doctor.md +19 -0
  284. package/dist-templates/claude-code/commands/openlife/dream.md +20 -0
  285. package/dist-templates/claude-code/commands/openlife/status.md +14 -0
  286. package/dist-templates/claude-code/mcp/openlife-orchestrator.json +46 -0
  287. package/dist-templates/codex/README.md +7 -0
  288. package/dist-templates/codex/agents/openlife-atlas.md +52 -0
  289. package/dist-templates/codex/agents/openlife-forge.md +42 -0
  290. package/dist-templates/codex/agents/openlife-genesis.md +59 -0
  291. package/dist-templates/codex/agents/openlife-lyra.md +40 -0
  292. package/dist-templates/codex/agents/openlife-maestro.md +45 -0
  293. package/dist-templates/codex/commands/openlife/ask.md +14 -0
  294. package/dist-templates/codex/commands/openlife/doctor.md +19 -0
  295. package/dist-templates/codex/commands/openlife/dream.md +20 -0
  296. package/dist-templates/codex/commands/openlife/status.md +14 -0
  297. package/dist-templates/codex/mcp/openlife-orchestrator.json +46 -0
  298. package/dist-templates/gemini-cli/README.md +8 -0
  299. package/dist-templates/gemini-cli/agents/openlife-atlas.md +52 -0
  300. package/dist-templates/gemini-cli/agents/openlife-forge.md +42 -0
  301. package/dist-templates/gemini-cli/agents/openlife-genesis.md +59 -0
  302. package/dist-templates/gemini-cli/agents/openlife-lyra.md +40 -0
  303. package/dist-templates/gemini-cli/agents/openlife-maestro.md +45 -0
  304. package/dist-templates/gemini-cli/commands/openlife/ask.md +14 -0
  305. package/dist-templates/gemini-cli/commands/openlife/doctor.md +19 -0
  306. package/dist-templates/gemini-cli/commands/openlife/dream.md +20 -0
  307. package/dist-templates/gemini-cli/commands/openlife/status.md +14 -0
  308. package/dist-templates/gemini-cli/mcp/openlife-orchestrator.json +46 -0
  309. package/dist-templates/skill-template/README.md +34 -0
  310. package/dist-templates/skill-template/SKILL.md.template +59 -0
  311. package/dist-templates/squad-template/README.md +82 -0
  312. package/dist-templates/squad-template/SQUAD.md.template +51 -0
  313. package/dist-templates/squad-template/agent-template.md +51 -0
  314. package/dist-templates/squad-template/checklist-template.md +25 -0
  315. package/dist-templates/squad-template/task-template.md +36 -0
  316. package/dist-templates/workflows/PORTED_WORKFLOWS.md +60 -0
  317. package/dist-templates/workflows/brownfield-discovery.yaml +137 -0
  318. package/dist-templates/workflows/greenfield-fullstack.yaml +132 -0
  319. package/dist-templates/workflows/qa-loop.yaml +125 -0
  320. package/dist-templates/workflows/story-development-cycle.yaml +80 -0
  321. package/docs/CHANGELOG_FEATURE_ROLLOUT_DESIGNMD.md +43 -0
  322. package/docs/EXTERNAL_SOURCES_AND_SECURITY_GUARD.md +33 -0
  323. package/docs/OPENLIFE_AUDIT_2026-05-06.md +170 -0
  324. package/docs/OPENLIFE_CONSOLIDATED_PLAN_2026-05-06.md +299 -0
  325. package/docs/OPENLIFE_DUAL_MODE_IMPLEMENTATION_PLAN.md +205 -0
  326. package/docs/OPENLIFE_EVOLUTION_SURFACE_2026-05-07.md +53 -0
  327. package/docs/OPENLIFE_SKILLS_IMPORT_2026-05-07.json +223 -0
  328. package/docs/OPENLIFE_SQUADS_IMPORT_2026-05-07.json +184 -0
  329. package/docs/PAPERCLIP_OPENLIFE_INVESTIGATION.md +85 -0
  330. package/docs/README.md +28 -0
  331. package/docs/RELEASE_ORGANIZATION_PLAN.md +164 -0
  332. package/docs/audit/CLI-EXECUTION-RESULTS.md +113 -0
  333. package/docs/audit/CLI-MATRIX.md +556 -0
  334. package/docs/audit/DOC-PARITY-GAPS.md +351 -0
  335. package/docs/audit/ORCHESTRATOR-MATRIX.md +136 -0
  336. package/docs/audit/TEST-COVERAGE-GAPS.md +334 -0
  337. package/docs/audit/integrations/SKIPPED.md +101 -0
  338. package/docs/autonomous-install.md +79 -0
  339. package/docs/capability-genesis.md +137 -0
  340. package/docs/capability-pack-schema.md +157 -0
  341. package/docs/commands.md +82 -0
  342. package/docs/deep-research-capability.md +114 -0
  343. package/docs/development/typescript-conventions.md +95 -0
  344. package/docs/host-installers.md +68 -0
  345. package/docs/install/aiobuilder.md +70 -0
  346. package/docs/install/claude-code.md +83 -0
  347. package/docs/install/codex.md +64 -0
  348. package/docs/install/gemini-cli.md +64 -0
  349. package/docs/install/runtime-profiles.md +83 -0
  350. package/docs/openlife-agent-os-blueprint.md +114 -0
  351. package/docs/openlife-install-backlog.md +115 -0
  352. package/docs/openlife-install-spec.md +306 -0
  353. package/docs/operations/CLOUD_CUTOVER_AUDIT.md +37 -0
  354. package/docs/operations/PHASE_PROGRESS_CONTINUATION.md +24 -0
  355. package/docs/performance-benchmarks.md +83 -0
  356. package/docs/planning/v1.3-capability-genesis.md +157 -0
  357. package/docs/plans/2026-05-05-admin-interface-professional-dark-premium-plan.md +84 -0
  358. package/docs/plans/2026-05-05-openlife-autonomous-domain-marketplace-masterplan.md +122 -0
  359. package/docs/quickstart.md +60 -0
  360. package/docs/release-process.md +236 -0
  361. package/docs/roadmap/OPENLIFE_MASTER_PLAN_CLOUD_V3.md +97 -0
  362. package/docs/sandboxing-research.md +117 -0
  363. package/docs/stories/epic-feature-audit/1.1.story.md +84 -0
  364. package/docs/stories/epic-feature-audit/1.2.story.md +102 -0
  365. package/docs/stories/epic-feature-audit/1.3.story.md +93 -0
  366. package/docs/stories/epic-feature-audit/1.5.story.md +121 -0
  367. package/docs/stories/epic-feature-audit/1.6.story.md +80 -0
  368. package/docs/stories/epic-feature-completeness/2.1.story.md +70 -0
  369. package/docs/stories/epic-feature-completeness/2.2.story.md +49 -0
  370. package/docs/stories/epic-feature-completeness/2.3.story.md +74 -0
  371. package/docs/stories/epic-feature-completeness/2.4.story.md +71 -0
  372. package/docs/stories/epic-feature-completeness/3.1.story.md +56 -0
  373. package/docs/stories/epic-feature-completeness/3.2.story.md +80 -0
  374. package/docs/stories/epic-feature-completeness/3.3.story.md +68 -0
  375. package/docs/stories/epic-feature-completeness/3.4.story.md +71 -0
  376. package/docs/stories/epic-feature-completeness/3.5.story.md +72 -0
  377. package/docs/stories/epic-feature-completeness/3.6.story.md +69 -0
  378. package/docs/stories/epic-feature-completeness/3.7.story.md +68 -0
  379. package/docs/stories/epic-feature-completeness/3.8.story.md +57 -0
  380. package/docs/toolset-enforcement.md +122 -0
  381. package/docs/v1.4-changelog.md +159 -0
  382. package/docs/v1.5-changelog.md +106 -0
  383. package/docs/v1.5-roadmap.md +121 -0
  384. package/docs/v1.6-changelog.md +67 -0
  385. package/docs/v1.6-roadmap.md +89 -0
  386. package/docs/v1.7-changelog.md +98 -0
  387. package/docs/workflow-schema.md +177 -0
  388. package/package.json +177 -0
  389. package/scripts/clean-test-pollution.js +61 -0
  390. package/scripts/openlife-agent-start.sh +6 -0
  391. package/scripts/openlife-agent.service.example +13 -0
  392. package/scripts/openlife-agent.supervisord.conf.example +8 -0
  393. package/scripts/openlife-autonomous-install.sh +29 -0
  394. package/scripts/postinstall-check.sh +37 -0
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.VoiceManager = void 0;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const child_process = __importStar(require("child_process"));
43
+ const util_1 = require("util");
44
+ const openai_1 = __importDefault(require("openai"));
45
+ const VoiceRouter_1 = require("./VoiceRouter");
46
+ const ToolsetGuard_1 = require("./toolset/ToolsetGuard");
47
+ const execFile = (0, util_1.promisify)(child_process.execFile);
48
+ class VoiceManager {
49
+ elevenLabsApiKey;
50
+ voiceRouter;
51
+ openai = null;
52
+ constructor() {
53
+ this.elevenLabsApiKey = process.env.ELEVENLABS_API_KEY;
54
+ this.voiceRouter = new VoiceRouter_1.VoiceRouter();
55
+ const openAIKey = process.env.OPENAI_API_KEY;
56
+ if (openAIKey && openAIKey.trim() !== '') {
57
+ this.openai = new openai_1.default({ apiKey: openAIKey });
58
+ }
59
+ }
60
+ async processAudioInput(fileLink) {
61
+ const sttOrder = this.voiceRouter.getSttOrder();
62
+ let lastError = null;
63
+ for (const provider of sttOrder) {
64
+ try {
65
+ switch (provider) {
66
+ case 'gemini':
67
+ return await this.transcribeWithGemini(fileLink);
68
+ case 'openai':
69
+ return await this.transcribeWithOpenAI(fileLink);
70
+ default:
71
+ throw new Error(`[VOICE] Provider de STT desconhecido: ${provider}`);
72
+ }
73
+ }
74
+ catch (error) {
75
+ lastError = error instanceof Error ? error : new Error(String(error));
76
+ const msg = lastError.message;
77
+ console.log(`[VOICE] Falha no provider STT ${provider}:`, msg);
78
+ this.logMediaRoute('stt', provider, 'failed', msg);
79
+ }
80
+ }
81
+ throw lastError || new Error('[VOICE] Nenhum provider de STT disponível.');
82
+ }
83
+ async generateSpeech(text, voiceId) {
84
+ (0, ToolsetGuard_1.assertToolsetAllowed)('tts', 'VoiceManager.generateSpeech');
85
+ const ttsOrder = this.voiceRouter.getTtsOrder();
86
+ const selectedVoice = voiceId || this.voiceRouter.getDefaultVoice() || 'EXAVITQu4vr4xnSDxMaL';
87
+ let lastError = null;
88
+ for (const provider of ttsOrder) {
89
+ try {
90
+ switch (provider) {
91
+ case 'gemini':
92
+ return await this.generateSpeechWithGemini(text);
93
+ case 'elevenlabs':
94
+ return await this.generateSpeechWithElevenLabs(text, selectedVoice);
95
+ case 'piper':
96
+ throw new Error('[VOICE] Piper ainda não implementado no runtime atual.');
97
+ case 'openai':
98
+ return await this.generateSpeechWithOpenAI(text, selectedVoice);
99
+ default:
100
+ throw new Error(`[VOICE] Provider de TTS desconhecido: ${provider}`);
101
+ }
102
+ }
103
+ catch (error) {
104
+ lastError = error instanceof Error ? error : new Error(String(error));
105
+ const msg = lastError.message;
106
+ console.log(`[VOICE] Falha no provider ${provider}:`, msg);
107
+ this.logMediaRoute('tts', provider, 'failed', msg);
108
+ }
109
+ }
110
+ throw lastError || new Error('[VOICE] Nenhum provider de TTS disponível.');
111
+ }
112
+ async transcribeWithGemini(fileLink) {
113
+ const candidates = ['gemini-3.1-flash-lite-preview', 'gemini-2.5-flash', 'gemini-3.1-pro-preview'];
114
+ let lastError = null;
115
+ for (const model of candidates) {
116
+ try {
117
+ const args = ['-o', 'json', '-m', model, '-p', `Transcreva fielmente este áudio em português do Brasil: @${fileLink}`, '-y'];
118
+ const { stdout } = await execFile('gemini', args, { maxBuffer: 1024 * 1024 * 10, timeout: 120000 });
119
+ const jsonStart = stdout.indexOf('{');
120
+ if (jsonStart === -1)
121
+ throw new Error('Resposta Gemini inválida para STT.');
122
+ const parsed = JSON.parse(stdout.slice(jsonStart));
123
+ const text = String(parsed.response || parsed.text || '').trim();
124
+ if (!text)
125
+ throw new Error('Transcrição vazia no Gemini STT.');
126
+ this.logMediaRoute('stt', `gemini:${model}`, 'success');
127
+ return text;
128
+ }
129
+ catch (error) {
130
+ lastError = error instanceof Error ? error : new Error(String(error));
131
+ const reason = lastError.message.toLowerCase();
132
+ this.logMediaRoute('stt', `gemini:${model}`, 'failed', lastError.message);
133
+ if (!/429|resource_exhausted|capacity|rate limit|quota/.test(reason))
134
+ break;
135
+ }
136
+ }
137
+ throw new Error(`Falha STT Gemini fallback-chain: ${lastError?.message || 'unknown error'}`);
138
+ }
139
+ async transcribeWithOpenAI(_fileLink) {
140
+ throw new Error('OpenAI STT fallback ainda não implementado neste runtime.');
141
+ }
142
+ async generateSpeechWithGemini(_text) {
143
+ throw new Error('Gemini TTS indisponível neste runtime; acionando fallback controlado.');
144
+ }
145
+ async generateSpeechWithOpenAI(text, voiceId = 'nova') {
146
+ if (!this.openai) {
147
+ throw new Error('[VOICE] OPENAI_API_KEY não configurada.');
148
+ }
149
+ const response = await this.openai.audio.speech.create({
150
+ model: 'gpt-4o-mini-tts',
151
+ voice: voiceId,
152
+ input: text
153
+ });
154
+ const buffer = Buffer.from(await response.arrayBuffer());
155
+ const outputDir = path.join(process.cwd(), '.temp_audio');
156
+ if (!fs.existsSync(outputDir)) {
157
+ fs.mkdirSync(outputDir, { recursive: true });
158
+ }
159
+ const fileName = `speech_openai_${Date.now()}.mp3`;
160
+ const filePath = path.join(outputDir, fileName);
161
+ fs.writeFileSync(filePath, buffer);
162
+ this.logMediaRoute('tts', 'openai', 'success');
163
+ return filePath;
164
+ }
165
+ async generateSpeechWithElevenLabs(text, voiceId) {
166
+ if (!this.elevenLabsApiKey) {
167
+ throw new Error('[VOICE] ELEVENLABS_API_KEY não configurada.');
168
+ }
169
+ const url = `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`;
170
+ const response = await fetch(url, {
171
+ method: 'POST',
172
+ headers: {
173
+ 'Accept': 'audio/mpeg',
174
+ 'Content-Type': 'application/json',
175
+ 'xi-api-key': this.elevenLabsApiKey
176
+ },
177
+ body: JSON.stringify({
178
+ text,
179
+ model_id: 'eleven_multilingual_v2',
180
+ voice_settings: { stability: 0.5, similarity_boost: 0.75 }
181
+ })
182
+ });
183
+ if (!response.ok) {
184
+ throw new Error(`[VOICE] Erro ElevenLabs: ${response.statusText}`);
185
+ }
186
+ const buffer = await response.arrayBuffer();
187
+ const outputDir = path.join(process.cwd(), '.temp_audio');
188
+ if (!fs.existsSync(outputDir)) {
189
+ fs.mkdirSync(outputDir, { recursive: true });
190
+ }
191
+ const fileName = `speech_${Date.now()}.mp3`;
192
+ const filePath = path.join(outputDir, fileName);
193
+ fs.writeFileSync(filePath, Buffer.from(buffer));
194
+ this.logMediaRoute('tts', 'elevenlabs', 'success');
195
+ return filePath;
196
+ }
197
+ logMediaRoute(kind, provider, status, detail) {
198
+ const file = path.join(process.cwd(), '.openlife', 'media-routing.log.jsonl');
199
+ fs.mkdirSync(path.dirname(file), { recursive: true });
200
+ fs.appendFileSync(file, JSON.stringify({ ts: new Date().toISOString(), kind, provider, status, detail: detail || '' }) + '\n', 'utf-8');
201
+ }
202
+ }
203
+ exports.VoiceManager = VoiceManager;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.VoiceRouter = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ class VoiceRouter {
40
+ configPath;
41
+ constructor() {
42
+ this.configPath = path.join(process.cwd(), 'voice.config.json');
43
+ }
44
+ isGeminiPreferredForMedia() {
45
+ return (process.env.OPENLIFE_PREFER_GEMINI_FOR_MEDIA || 'true').toLowerCase() === 'true';
46
+ }
47
+ getConfig() {
48
+ const fallbackConfig = {
49
+ defaultProfile: 'default',
50
+ profiles: {
51
+ default: {
52
+ stt: { order: ['gemini', 'openai'], mode: 'fallback' },
53
+ tts: { order: ['gemini', 'openai', 'elevenlabs'], mode: 'fallback', defaultVoice: 'nova' }
54
+ }
55
+ }
56
+ };
57
+ if (!fs.existsSync(this.configPath)) {
58
+ return this.applyGeminiPreference(fallbackConfig);
59
+ }
60
+ const raw = fs.readFileSync(this.configPath, 'utf-8');
61
+ return this.applyGeminiPreference(JSON.parse(raw));
62
+ }
63
+ applyGeminiPreference(config) {
64
+ if (!this.isGeminiPreferredForMedia())
65
+ return config;
66
+ const profileName = config.defaultProfile;
67
+ const profile = config.profiles[profileName];
68
+ if (!profile)
69
+ return config;
70
+ profile.stt.order = ['gemini', ...profile.stt.order.filter(p => p !== 'gemini')];
71
+ profile.tts.order = ['gemini', ...profile.tts.order.filter(p => p !== 'gemini')];
72
+ return config;
73
+ }
74
+ getProfile(profileName) {
75
+ const config = this.getConfig();
76
+ const selected = profileName || config.defaultProfile;
77
+ return config.profiles[selected] || config.profiles[config.defaultProfile];
78
+ }
79
+ getTtsOrder(profileName) {
80
+ return this.getProfile(profileName).tts.order;
81
+ }
82
+ getSttOrder(profileName) {
83
+ return this.getProfile(profileName).stt.order;
84
+ }
85
+ getDefaultVoice(profileName) {
86
+ return this.getProfile(profileName).tts.defaultVoice;
87
+ }
88
+ }
89
+ exports.VoiceRouter = VoiceRouter;
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ /**
3
+ * CapabilityGenesisEngine — orchestrates existing creators to produce a
4
+ * draft Capability Pack from a free-form brief.
5
+ *
6
+ * Story 1.5 — OpenLife v1.3 Agent OS Integration.
7
+ *
8
+ * Reuse-first contract (Rafa-locked decision, 2026-05-12):
9
+ * 1. Call AssetReuseRouter.find(brief) — if existing asset covers the
10
+ * brief, the pack references it (`source: 'referenced'`) instead of
11
+ * creating a duplicate.
12
+ * 2. Only when no reusable asset is found does Genesis call the
13
+ * relevant creator (SkillCreator, SquadCreator) and embed the new
14
+ * asset under the pack directory (`source: 'embedded'`).
15
+ *
16
+ * Never auto-promotes. Always produces a `status: 'draft'` pack. Caller
17
+ * (CLI handler or operator) is responsible for promote → tested → active
18
+ * via CapabilityPackStateStore.
19
+ *
20
+ * Brain integration: when called with a Brain instance, Genesis asks for
21
+ * a structured proposal (which skills/squads/workflows the pack should
22
+ * contain). When Brain is omitted (test/offline mode), Genesis falls back
23
+ * to a heuristic that produces a single-skill pack from the brief.
24
+ */
25
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ var desc = Object.getOwnPropertyDescriptor(m, k);
28
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
29
+ desc = { enumerable: true, get: function() { return m[k]; } };
30
+ }
31
+ Object.defineProperty(o, k2, desc);
32
+ }) : (function(o, m, k, k2) {
33
+ if (k2 === undefined) k2 = k;
34
+ o[k2] = m[k];
35
+ }));
36
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
37
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
38
+ }) : function(o, v) {
39
+ o["default"] = v;
40
+ });
41
+ var __importStar = (this && this.__importStar) || (function () {
42
+ var ownKeys = function(o) {
43
+ ownKeys = Object.getOwnPropertyNames || function (o) {
44
+ var ar = [];
45
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
46
+ return ar;
47
+ };
48
+ return ownKeys(o);
49
+ };
50
+ return function (mod) {
51
+ if (mod && mod.__esModule) return mod;
52
+ var result = {};
53
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
54
+ __setModuleDefault(result, mod);
55
+ return result;
56
+ };
57
+ })();
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.CapabilityGenesisEngine = void 0;
60
+ const fs = __importStar(require("fs"));
61
+ const path = __importStar(require("path"));
62
+ const AtomicWriter_1 = require("../util/AtomicWriter");
63
+ const yaml = __importStar(require("js-yaml"));
64
+ const CapabilityPackState_1 = require("./CapabilityPackState");
65
+ const AssetReuseRouter_1 = require("../AssetReuseRouter");
66
+ const SkillCreator_1 = require("../SkillCreator");
67
+ const SquadCreator_1 = require("../SquadCreator");
68
+ class CapabilityGenesisEngine {
69
+ catalogRoot;
70
+ skillCreator;
71
+ squadCreator;
72
+ assetReuseRouter;
73
+ stateStore;
74
+ constructor(opts = {}) {
75
+ this.catalogRoot = opts.catalogRoot
76
+ || path.join(process.cwd(), '.catalog', 'capabilities');
77
+ this.skillCreator = opts.skillCreator || new SkillCreator_1.SkillCreator();
78
+ this.squadCreator = opts.squadCreator || new SquadCreator_1.SquadCreator();
79
+ this.assetReuseRouter = opts.assetReuseRouter || new AssetReuseRouter_1.AssetReuseRouter();
80
+ this.stateStore = opts.stateStore || new CapabilityPackState_1.CapabilityPackStateStore();
81
+ }
82
+ generate(brief) {
83
+ const packId = brief.packId || slugify(brief.description).slice(0, 60);
84
+ if (!/^[a-z0-9][a-z0-9._-]+$/i.test(packId)) {
85
+ return { ok: false, error: 'invalid_pack_id', detail: packId };
86
+ }
87
+ const packDir = path.join(this.catalogRoot, packId);
88
+ if (fs.existsSync(packDir)) {
89
+ return { ok: false, error: 'pack_already_exists', detail: packDir };
90
+ }
91
+ // Reuse-first: find existing promoted assets that match the brief
92
+ const reusedRaw = this.assetReuseRouter.find(brief.description);
93
+ const reusedAssets = reusedRaw.map((a) => a.id);
94
+ // Build the pack manifest. The hints drive what Genesis tries to
95
+ // create when no reusable asset is found. In 'quick' mode we only
96
+ // wire one skill; 'professional' adds a squad; 'elite' adds a full
97
+ // workflow stub too.
98
+ const mode = brief.mode || 'professional';
99
+ const skillsToInclude = brief.hints?.skills || [];
100
+ const squadsToInclude = brief.hints?.squads || [];
101
+ const workflowsToInclude = brief.hints?.workflows || [];
102
+ const createdAssets = [];
103
+ const skillRefs = [];
104
+ const squadRefs = [];
105
+ const workflowRefs = [];
106
+ // Create pack directory skeleton first so embedded creates land here.
107
+ fs.mkdirSync(packDir, { recursive: true });
108
+ for (const sub of ['skills', 'squads', 'agents', 'workflows', 'checklists', 'templates']) {
109
+ fs.mkdirSync(path.join(packDir, sub), { recursive: true });
110
+ }
111
+ // Skills
112
+ for (const skillId of skillsToInclude) {
113
+ const reuseHit = reusedAssets.find((a) => a.toLowerCase().includes(skillId.toLowerCase()));
114
+ if (reuseHit) {
115
+ skillRefs.push({ id: skillId, source: 'referenced', label: `Reused: ${reuseHit}` });
116
+ continue;
117
+ }
118
+ // Embed: create a stub skill inside the pack
119
+ const stubPath = path.join(packDir, 'skills', `${skillId}.md`);
120
+ (0, AtomicWriter_1.writeStringAtomic)(stubPath, this.skillStub(skillId, brief.description));
121
+ skillRefs.push({ id: skillId, source: 'embedded' });
122
+ createdAssets.push(`skills/${skillId}.md`);
123
+ }
124
+ // Squads — only in professional/elite mode
125
+ if (mode === 'professional' || mode === 'elite') {
126
+ for (const squadId of squadsToInclude) {
127
+ const stubDir = path.join(packDir, 'squads', squadId);
128
+ fs.mkdirSync(stubDir, { recursive: true });
129
+ (0, AtomicWriter_1.writeStringAtomic)(path.join(stubDir, 'SQUAD.md'), this.squadStub(squadId, brief.description));
130
+ squadRefs.push({ id: squadId, source: 'embedded' });
131
+ createdAssets.push(`squads/${squadId}/SQUAD.md`);
132
+ }
133
+ }
134
+ // Workflows — only in elite mode
135
+ if (mode === 'elite') {
136
+ for (const wfId of workflowsToInclude) {
137
+ const stubPath = path.join(packDir, 'workflows', `${wfId}.yaml`);
138
+ (0, AtomicWriter_1.writeStringAtomic)(stubPath, this.workflowStub(wfId, brief.description));
139
+ workflowRefs.push({ id: wfId, source: 'embedded' });
140
+ createdAssets.push(`workflows/${wfId}.yaml`);
141
+ }
142
+ }
143
+ // Build the manifest
144
+ const pack = {
145
+ id: packId,
146
+ name: brief.packName || titleCase(packId),
147
+ description: brief.description,
148
+ version: '0.1.0',
149
+ status: 'draft',
150
+ objective: brief.description,
151
+ skills: skillRefs.length > 0 ? skillRefs : undefined,
152
+ squads: squadRefs.length > 0 ? squadRefs : undefined,
153
+ workflows: workflowRefs.length > 0 ? workflowRefs : undefined,
154
+ metadata: {
155
+ createdAt: new Date().toISOString(),
156
+ updatedAt: new Date().toISOString(),
157
+ author: brief.actor,
158
+ tags: [mode],
159
+ },
160
+ };
161
+ const manifestYaml = yaml.dump({ capability: pack }, { lineWidth: 100 });
162
+ const manifestPath = path.join(packDir, 'capability.yaml');
163
+ (0, AtomicWriter_1.writeStringAtomic)(manifestPath, manifestYaml);
164
+ // INDEX.md — quick browsable summary
165
+ const indexMd = this.renderIndexMd(pack, reusedAssets, createdAssets);
166
+ (0, AtomicWriter_1.writeStringAtomic)(path.join(packDir, 'INDEX.md'), indexMd);
167
+ // Initialize lifecycle status
168
+ this.stateStore.init(packId, brief.actor);
169
+ return {
170
+ ok: true,
171
+ packId,
172
+ packDir,
173
+ manifestPath,
174
+ pack,
175
+ reusedAssets,
176
+ createdAssets,
177
+ };
178
+ }
179
+ skillStub(skillId, briefText) {
180
+ return `---
181
+ id: ${skillId}
182
+ name: ${skillId}
183
+ status: draft
184
+ source: capability-genesis
185
+ version: 0.1.0
186
+ ---
187
+
188
+ # ${skillId}
189
+
190
+ > Auto-generated stub from CapabilityGenesisEngine.
191
+ > Brief: ${briefText}
192
+
193
+ ## When to use
194
+
195
+ - TBD — operator must refine
196
+
197
+ ## Procedure
198
+
199
+ 1. TBD — operator must refine
200
+
201
+ ## Validation
202
+
203
+ - TBD — operator must refine
204
+ `;
205
+ }
206
+ squadStub(squadId, briefText) {
207
+ return `---
208
+ id: ${squadId}
209
+ name: ${squadId}
210
+ status: draft
211
+ source: capability-genesis
212
+ version: 0.1.0
213
+ ---
214
+
215
+ # ${squadId}
216
+
217
+ > Auto-generated stub from CapabilityGenesisEngine.
218
+ > Brief: ${briefText}
219
+
220
+ ## Agents
221
+
222
+ | Agent | Role |
223
+ |-------|------|
224
+ | TBD | TBD |
225
+ `;
226
+ }
227
+ workflowStub(wfId, briefText) {
228
+ return `workflow:
229
+ id: ${wfId}
230
+ name: ${wfId}
231
+ description: "${briefText.replace(/"/g, '\\"')}"
232
+ type: custom
233
+ version: "0.1.0"
234
+ sequence:
235
+ - phase: 0
236
+ name: planning
237
+ description: TBD — operator must refine
238
+ - id: step-1
239
+ agent: planner
240
+ action: plan
241
+ notes: |
242
+ Auto-generated stub. Operator must refine.
243
+ `;
244
+ }
245
+ renderIndexMd(pack, reused, created) {
246
+ const lines = [
247
+ `# ${pack.name}`,
248
+ '',
249
+ `> ${pack.description}`,
250
+ '',
251
+ `**Status:** ${pack.status} • **Version:** ${pack.version}`,
252
+ '',
253
+ `## Objective`,
254
+ pack.objective,
255
+ '',
256
+ ];
257
+ if (pack.skills?.length) {
258
+ lines.push('## Skills', ...pack.skills.map((s) => `- \`${s.id}\` (${s.source})`), '');
259
+ }
260
+ if (pack.squads?.length) {
261
+ lines.push('## Squads', ...pack.squads.map((s) => `- \`${s.id}\` (${s.source})`), '');
262
+ }
263
+ if (pack.workflows?.length) {
264
+ lines.push('## Workflows', ...pack.workflows.map((s) => `- \`${s.id}\` (${s.source})`), '');
265
+ }
266
+ lines.push('## Genesis report', '');
267
+ lines.push(`Reused assets: ${reused.length ? reused.join(', ') : '(none)'}`);
268
+ lines.push(`Created assets: ${created.length ? created.join(', ') : '(none)'}`);
269
+ return lines.join('\n') + '\n';
270
+ }
271
+ }
272
+ exports.CapabilityGenesisEngine = CapabilityGenesisEngine;
273
+ function slugify(s) {
274
+ return s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
275
+ }
276
+ function titleCase(s) {
277
+ return s.split(/[-_]/).map((w) => w[0]?.toUpperCase() + w.slice(1)).join(' ');
278
+ }