@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,70 @@
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
+ const fs = __importStar(require("fs"));
37
+ const os = __importStar(require("os"));
38
+ const path = __importStar(require("path"));
39
+ const InstallFlow_1 = require("./cli/InstallFlow");
40
+ function assert(condition, message) {
41
+ if (!condition)
42
+ throw new Error(message);
43
+ }
44
+ function main() {
45
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'openlife-install-flow-'));
46
+ fs.writeFileSync(path.join(root, 'models.json'), '{}', 'utf-8');
47
+ fs.writeFileSync(path.join(root, 'executor-policy.json'), '{}', 'utf-8');
48
+ fs.writeFileSync(path.join(root, 'governance-policy.json'), '{}', 'utf-8');
49
+ fs.writeFileSync(path.join(root, 'voice.config.json'), '{}', 'utf-8');
50
+ fs.mkdirSync(path.join(root, '.artifacts'), { recursive: true });
51
+ fs.writeFileSync(path.join(root, '.artifacts', 'security-events.jsonl'), '', 'utf-8');
52
+ fs.writeFileSync(path.join(root, 'OPENLIFE_PROJECT.md'), '# test', 'utf-8');
53
+ const flow = new InstallFlow_1.InstallFlow(root);
54
+ const result = flow.run({ profile: 'autonomous', host: 'claude-code' });
55
+ assert(fs.existsSync(result.manifestPath), 'install manifest should exist');
56
+ assert(fs.existsSync(result.reportPath), 'install flow report should exist');
57
+ assert(result.profile === 'autonomous', 'profile should be autonomous');
58
+ assert(result.nextCommands.some((cmd) => cmd.includes('openlife agent start')), 'should include autonomous next command');
59
+ const summary = flow.renderSummary(result).join('\n');
60
+ assert(summary.includes('OpenLife Setup concluรญdo'), 'summary should include success title');
61
+ assert(summary.includes('Prรณximos comandos'), 'summary should include next commands section');
62
+ console.log('TEST_INSTALL_FLOW_OK');
63
+ }
64
+ try {
65
+ main();
66
+ }
67
+ catch (error) {
68
+ console.error(error.message || error);
69
+ process.exit(1);
70
+ }
@@ -0,0 +1,143 @@
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
+ /*
37
+ * Story 3.1 โ€” Host enum + validator regression test.
38
+ *
39
+ * Asserts:
40
+ * 1. validateHost accepts the 3 canonical hosts (claude-code, gemini-cli, codex)
41
+ * 2. validateHost rejects unknown values with clear error message
42
+ * 3. validateHost falls back to DEFAULT_HOST on empty/null/undefined
43
+ * 4. detectHostFromEnv picks the right host based on env signals
44
+ * 5. InstallFlow.run() with valid --host runs without throwing
45
+ * 6. InstallFlow.run() with invalid --host throws clear error
46
+ * 7. buildNextCommands no longer references the deprecated `mode set` command
47
+ */
48
+ const InstallFlow_1 = require("./cli/InstallFlow");
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ const os = __importStar(require("os"));
52
+ function assert(cond, msg) {
53
+ if (!cond)
54
+ throw new Error(`ASSERTION_FAILED: ${msg}`);
55
+ }
56
+ function testValidateHostAcceptsCanonical() {
57
+ for (const h of InstallFlow_1.VALID_HOSTS) {
58
+ const result = (0, InstallFlow_1.validateHost)(h);
59
+ assert(result === h, `validateHost('${h}') should return '${h}', got '${result}'`);
60
+ }
61
+ }
62
+ function testValidateHostRejectsUnknown() {
63
+ const cases = ['cursor', 'vscode', 'random', 'CLAUDE-CODE-TYPO', ''];
64
+ for (const bad of cases) {
65
+ if (bad === '')
66
+ continue; // empty falls to default โ€” tested separately
67
+ let threw = false;
68
+ try {
69
+ (0, InstallFlow_1.validateHost)(bad);
70
+ }
71
+ catch (err) {
72
+ threw = true;
73
+ assert(err.message.includes('INVALID_HOST') && err.message.includes('claude-code'), `Error should mention INVALID_HOST and list valid hosts; got: ${err.message}`);
74
+ }
75
+ assert(threw, `validateHost('${bad}') should have thrown but didn't`);
76
+ }
77
+ }
78
+ function testValidateHostFallsBackToDefault() {
79
+ assert((0, InstallFlow_1.validateHost)(undefined) === InstallFlow_1.DEFAULT_HOST, 'undefined should fall to DEFAULT_HOST');
80
+ assert((0, InstallFlow_1.validateHost)(null) === InstallFlow_1.DEFAULT_HOST, 'null should fall to DEFAULT_HOST');
81
+ assert((0, InstallFlow_1.validateHost)('') === InstallFlow_1.DEFAULT_HOST, 'empty string should fall to DEFAULT_HOST');
82
+ }
83
+ function testValidateHostCaseInsensitive() {
84
+ assert((0, InstallFlow_1.validateHost)('CLAUDE-CODE') === 'claude-code', 'uppercase should normalize');
85
+ assert((0, InstallFlow_1.validateHost)(' Codex ') === 'codex', 'whitespace + caps should normalize');
86
+ }
87
+ function testDetectHostFromEnv() {
88
+ assert((0, InstallFlow_1.detectHostFromEnv)({ CLAUDECODE: '1' }) === 'claude-code', 'CLAUDECODE โ†’ claude-code');
89
+ assert((0, InstallFlow_1.detectHostFromEnv)({ CLAUDE_PROJECT_DIR: '/x' }) === 'claude-code', 'CLAUDE_PROJECT_DIR โ†’ claude-code');
90
+ assert((0, InstallFlow_1.detectHostFromEnv)({ GEMINI_CONFIG_DIR: '/x' }) === 'gemini-cli', 'GEMINI_CONFIG_DIR โ†’ gemini-cli');
91
+ assert((0, InstallFlow_1.detectHostFromEnv)({ CODEX_HOME: '/x' }) === 'codex', 'CODEX_HOME โ†’ codex');
92
+ assert((0, InstallFlow_1.detectHostFromEnv)({}) === null, 'no env signals โ†’ null');
93
+ }
94
+ function testInstallFlowAcceptsValidHosts() {
95
+ // Run InstallFlow in a temp dir to avoid clobbering project state.
96
+ const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'openlife-installflow-test-'));
97
+ try {
98
+ const flow = new InstallFlow_1.InstallFlow(tempRoot);
99
+ for (const h of InstallFlow_1.VALID_HOSTS) {
100
+ const result = flow.run({ profile: 'framework', host: h, skipDoctor: true });
101
+ assert(result.host === h, `InstallFlow with host ${h} should keep host in result`);
102
+ assert(result.nextCommands.some((c) => c.includes(`--host ${h}`)), `nextCommands should include --host ${h}: got ${JSON.stringify(result.nextCommands)}`);
103
+ // Story 3.1 fix: no `mode set` in nextCommands
104
+ assert(!result.nextCommands.some((c) => c.includes('mode set')), `nextCommands should NOT reference deprecated 'mode set'; got: ${JSON.stringify(result.nextCommands)}`);
105
+ assert(result.nextCommands.some((c) => c.includes('system setup')), `nextCommands should use 'system setup' instead; got: ${JSON.stringify(result.nextCommands)}`);
106
+ }
107
+ }
108
+ finally {
109
+ fs.rmSync(tempRoot, { recursive: true, force: true });
110
+ }
111
+ }
112
+ function testInstallFlowRejectsInvalidHost() {
113
+ const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'openlife-installflow-test-'));
114
+ try {
115
+ const flow = new InstallFlow_1.InstallFlow(tempRoot);
116
+ let threw = false;
117
+ try {
118
+ flow.run({ profile: 'framework', host: 'cursor', skipDoctor: true });
119
+ }
120
+ catch (err) {
121
+ threw = true;
122
+ assert(err.message.includes('INVALID_HOST'), `should throw INVALID_HOST; got: ${err.message}`);
123
+ }
124
+ assert(threw, 'InstallFlow.run with invalid host should throw');
125
+ }
126
+ finally {
127
+ fs.rmSync(tempRoot, { recursive: true, force: true });
128
+ }
129
+ }
130
+ async function main() {
131
+ testValidateHostAcceptsCanonical();
132
+ testValidateHostRejectsUnknown();
133
+ testValidateHostFallsBackToDefault();
134
+ testValidateHostCaseInsensitive();
135
+ testDetectHostFromEnv();
136
+ testInstallFlowAcceptsValidHosts();
137
+ testInstallFlowRejectsInvalidHost();
138
+ console.log('TEST_INSTALL_FLOW_HOST_VALIDATION_OK');
139
+ }
140
+ main().catch((err) => {
141
+ console.error('TEST_INSTALL_FLOW_HOST_VALIDATION_FAIL:', err?.message || err);
142
+ process.exit(1);
143
+ });
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ // Story 3.5 โ€” Regression test for the interactive install wizard.
3
+ // Uses CannedAnswerProvider so no real stdin/tty is required.
4
+ //
5
+ // Question order in wizard.run() (when no pre-existing install):
6
+ // 1) profile (choice: 0=framework, 1=autonomous)
7
+ // 2) host (choice: 0=claude-code, 1=gemini-cli, 2=codex)
8
+ // 3) model order (text: blank or comma list)
9
+ // 4) telegram? (yesNo, autonomous only)
10
+ // 5) skip doctor? (yesNo)
11
+ // 6) confirm preview (yesNo)
12
+ //
13
+ // When pre-existing install detected, an extra choice prompt fires FIRST:
14
+ // 0) abort 1) reinstall 2) repair
15
+ // Selecting abort short-circuits the rest of the flow.
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ const fs = __importStar(require("fs"));
51
+ const os = __importStar(require("os"));
52
+ const path = __importStar(require("path"));
53
+ const InstallWizard_1 = require("./cli/InstallWizard");
54
+ function assert(cond, msg) {
55
+ if (!cond) {
56
+ console.error(`โŒ ASSERT FAILED: ${msg}`);
57
+ process.exit(1);
58
+ }
59
+ }
60
+ function tempRoot() {
61
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'openlife-init-wizard-'));
62
+ }
63
+ function cleanup(root) {
64
+ try {
65
+ fs.rmSync(root, { recursive: true, force: true });
66
+ }
67
+ catch {
68
+ // best-effort
69
+ }
70
+ }
71
+ function writeExistingInstall(root) {
72
+ const dir = path.join(root, '.openlife');
73
+ fs.mkdirSync(dir, { recursive: true });
74
+ fs.writeFileSync(path.join(dir, 'install-manifest.json'), JSON.stringify({ installedAt: new Date().toISOString(), version: 'test' }, null, 2), 'utf-8');
75
+ }
76
+ async function scenario1HappyPathFrameworkClaudeCode() {
77
+ const root = tempRoot();
78
+ try {
79
+ // profile=framework(0), host=claude-code(0), models='', skipDoctor=false, confirm=true
80
+ const provider = new InstallWizard_1.CannedAnswerProvider([0, 0, '', false, true]);
81
+ const wizard = new InstallWizard_1.InstallWizard(root, provider);
82
+ const result = await wizard.run();
83
+ assert(result.ok === true, 'scenario1: expected ok=true');
84
+ if (!result.ok)
85
+ return;
86
+ assert(result.options.profile === 'framework', 'scenario1: profile should be framework');
87
+ assert(result.options.host === 'claude-code', 'scenario1: host should be claude-code');
88
+ assert(result.options.skipDoctor === false, 'scenario1: skipDoctor should be false');
89
+ assert(result.options.modelOrder === undefined, 'scenario1: modelOrder should be undefined when blank');
90
+ assert(result.preExistingAction === undefined, 'scenario1: no pre-existing action expected');
91
+ assert(!result.warnings, 'scenario1: no warnings expected for default claude-code');
92
+ console.log('โœ… scenario 1: happy path framework + claude-code');
93
+ }
94
+ finally {
95
+ cleanup(root);
96
+ }
97
+ }
98
+ async function scenario2HappyPathAutonomousClaudeCode() {
99
+ const root = tempRoot();
100
+ try {
101
+ // profile=autonomous(1), host=claude-code(0), models='', telegram=true, skipDoctor=false, confirm=true
102
+ const provider = new InstallWizard_1.CannedAnswerProvider([1, 0, '', true, false, true]);
103
+ const wizard = new InstallWizard_1.InstallWizard(root, provider);
104
+ const result = await wizard.run();
105
+ assert(result.ok === true, 'scenario2: expected ok=true');
106
+ if (!result.ok)
107
+ return;
108
+ assert(result.options.profile === 'autonomous', 'scenario2: profile should be autonomous');
109
+ assert(result.options.host === 'claude-code', 'scenario2: host should be claude-code');
110
+ assert(!result.warnings, 'scenario2: no warnings when telegram already configured');
111
+ console.log('โœ… scenario 2: happy path autonomous + claude-code');
112
+ }
113
+ finally {
114
+ cleanup(root);
115
+ }
116
+ }
117
+ async function scenario3UserAbortsOnConfirm() {
118
+ const root = tempRoot();
119
+ try {
120
+ // framework, claude-code, blank models, skipDoctor=false, confirm=false (abort)
121
+ const provider = new InstallWizard_1.CannedAnswerProvider([0, 0, '', false, false]);
122
+ const wizard = new InstallWizard_1.InstallWizard(root, provider);
123
+ const result = await wizard.run();
124
+ assert(result.ok === false, 'scenario3: expected ok=false');
125
+ if (result.ok)
126
+ return;
127
+ assert(result.reason === 'user_aborted', 'scenario3: reason should be user_aborted');
128
+ assert(result.detail === 'preview_not_confirmed', 'scenario3: detail should be preview_not_confirmed');
129
+ console.log('โœ… scenario 3: user aborts on confirm-preview');
130
+ }
131
+ finally {
132
+ cleanup(root);
133
+ }
134
+ }
135
+ async function scenario4PreExistingAbort() {
136
+ const root = tempRoot();
137
+ try {
138
+ writeExistingInstall(root);
139
+ // pre-existing prompt: 0=abort. No further questions should fire.
140
+ const provider = new InstallWizard_1.CannedAnswerProvider([0]);
141
+ const wizard = new InstallWizard_1.InstallWizard(root, provider);
142
+ const result = await wizard.run();
143
+ assert(result.ok === false, 'scenario4: expected ok=false');
144
+ if (result.ok)
145
+ return;
146
+ assert(result.reason === 'user_aborted', 'scenario4: reason should be user_aborted');
147
+ assert(result.detail === 'pre_existing_install_abort', 'scenario4: detail should be pre_existing_install_abort');
148
+ assert(provider.remaining() === 0, 'scenario4: queue should be empty (no further questions asked)');
149
+ console.log('โœ… scenario 4: pre-existing install + abort short-circuits');
150
+ }
151
+ finally {
152
+ cleanup(root);
153
+ }
154
+ }
155
+ async function scenario5PreExistingRepair() {
156
+ const root = tempRoot();
157
+ try {
158
+ writeExistingInstall(root);
159
+ // 2=repair, then full flow: framework, claude-code, '', skipDoctor=false, confirm=true
160
+ const provider = new InstallWizard_1.CannedAnswerProvider([2, 0, 0, '', false, true]);
161
+ const wizard = new InstallWizard_1.InstallWizard(root, provider);
162
+ const result = await wizard.run();
163
+ assert(result.ok === true, 'scenario5: expected ok=true');
164
+ if (!result.ok)
165
+ return;
166
+ assert(result.preExistingAction === 'repair', 'scenario5: preExistingAction should be repair');
167
+ assert(result.options.profile === 'framework', 'scenario5: profile should be framework');
168
+ console.log('โœ… scenario 5: pre-existing install + repair');
169
+ }
170
+ finally {
171
+ cleanup(root);
172
+ }
173
+ }
174
+ async function scenario6PreExistingReinstall() {
175
+ const root = tempRoot();
176
+ try {
177
+ writeExistingInstall(root);
178
+ // 1=reinstall, framework, claude-code, '', skipDoctor=false, confirm=true
179
+ const provider = new InstallWizard_1.CannedAnswerProvider([1, 0, 0, '', false, true]);
180
+ const wizard = new InstallWizard_1.InstallWizard(root, provider);
181
+ const result = await wizard.run();
182
+ assert(result.ok === true, 'scenario6: expected ok=true');
183
+ if (!result.ok)
184
+ return;
185
+ assert(result.preExistingAction === 'reinstall', 'scenario6: preExistingAction should be reinstall');
186
+ console.log('โœ… scenario 6: pre-existing install + reinstall');
187
+ }
188
+ finally {
189
+ cleanup(root);
190
+ }
191
+ }
192
+ async function scenario7UnsupportedHostGeminiCli() {
193
+ const root = tempRoot();
194
+ try {
195
+ // framework, host=1 (gemini-cli, not yet supported), blank models, skipDoctor=false, confirm=true
196
+ const provider = new InstallWizard_1.CannedAnswerProvider([0, 1, '', false, true]);
197
+ const wizard = new InstallWizard_1.InstallWizard(root, provider);
198
+ const result = await wizard.run();
199
+ assert(result.ok === true, 'scenario7: expected ok=true even with unsupported host');
200
+ if (!result.ok)
201
+ return;
202
+ assert(result.options.host === 'gemini-cli', 'scenario7: host should be gemini-cli');
203
+ assert(Array.isArray(result.warnings), 'scenario7: should have warnings array');
204
+ assert(result.warnings.some((w) => w.includes('HOST_NOT_YET_SUPPORTED')), 'scenario7: should warn HOST_NOT_YET_SUPPORTED');
205
+ console.log('โœ… scenario 7: unsupported host (gemini-cli) accepted with warning');
206
+ }
207
+ finally {
208
+ cleanup(root);
209
+ }
210
+ }
211
+ async function scenario8CustomModelChain() {
212
+ const root = tempRoot();
213
+ try {
214
+ const models = 'gemini-api/gemini-3.1-pro-preview,openai-api/gpt-5.4-mini';
215
+ // framework, claude-code, models=custom, skipDoctor=false, confirm=true
216
+ const provider = new InstallWizard_1.CannedAnswerProvider([0, 0, models, false, true]);
217
+ const wizard = new InstallWizard_1.InstallWizard(root, provider);
218
+ const result = await wizard.run();
219
+ assert(result.ok === true, 'scenario8: expected ok=true');
220
+ if (!result.ok)
221
+ return;
222
+ assert(Array.isArray(result.options.modelOrder), 'scenario8: modelOrder should be array');
223
+ assert(result.options.modelOrder.length === 2, 'scenario8: modelOrder should have 2 entries');
224
+ assert(result.options.modelOrder[0] === 'gemini-api/gemini-3.1-pro-preview', 'scenario8: first model should be gemini-3.1-pro-preview');
225
+ assert(result.options.modelOrder[1] === 'openai-api/gpt-5.4-mini', 'scenario8: second model should be gpt-5.4-mini');
226
+ console.log('โœ… scenario 8: custom model chain parsed correctly');
227
+ }
228
+ finally {
229
+ cleanup(root);
230
+ }
231
+ }
232
+ async function scenario9OutOfAnswersThrows() {
233
+ const root = tempRoot();
234
+ try {
235
+ // Provide too few answers: stop after profile.
236
+ const provider = new InstallWizard_1.CannedAnswerProvider([0]);
237
+ const wizard = new InstallWizard_1.InstallWizard(root, provider);
238
+ let threw = false;
239
+ let detail = '';
240
+ try {
241
+ await wizard.run();
242
+ }
243
+ catch (err) {
244
+ threw = true;
245
+ detail = err instanceof Error ? err.message : String(err);
246
+ }
247
+ assert(threw, 'scenario9: wizard should throw when canned queue is exhausted');
248
+ assert(detail.includes('WIZARD_TEST_OUT_OF_ANSWERS'), `scenario9: error should mention WIZARD_TEST_OUT_OF_ANSWERS; got: ${detail}`);
249
+ console.log('โœ… scenario 9: CannedAnswerProvider throws WIZARD_TEST_OUT_OF_ANSWERS on dry queue');
250
+ }
251
+ finally {
252
+ cleanup(root);
253
+ }
254
+ }
255
+ async function main() {
256
+ console.log('๐Ÿงช test_install_wizard โ€” Story 3.5 regression suite');
257
+ await scenario1HappyPathFrameworkClaudeCode();
258
+ await scenario2HappyPathAutonomousClaudeCode();
259
+ await scenario3UserAbortsOnConfirm();
260
+ await scenario4PreExistingAbort();
261
+ await scenario5PreExistingRepair();
262
+ await scenario6PreExistingReinstall();
263
+ await scenario7UnsupportedHostGeminiCli();
264
+ await scenario8CustomModelChain();
265
+ await scenario9OutOfAnswersThrows();
266
+ console.log('');
267
+ console.log('TEST_INSTALL_WIZARD_OK');
268
+ }
269
+ main().catch((err) => {
270
+ console.error('โŒ test_install_wizard failed:', err);
271
+ process.exit(1);
272
+ });
@@ -0,0 +1,95 @@
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
+ /*
37
+ * INT-01 โ€” Live integration test against Gemini API.
38
+ *
39
+ * Requires GEMINI_API_KEY in .env. Makes ONE real API call.
40
+ * Cost: ~$0.0001 per run (negligible).
41
+ *
42
+ * NOT included in test:all. Run via: npm run test:integration-gemini
43
+ */
44
+ const dotenv = __importStar(require("dotenv"));
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ const Brain_1 = require("./orchestrator/Brain");
48
+ dotenv.config();
49
+ const LOG_PATH = path.join(process.cwd(), 'docs', 'audit', 'integrations', 'gemini.log');
50
+ function logLine(line) {
51
+ fs.mkdirSync(path.dirname(LOG_PATH), { recursive: true });
52
+ fs.appendFileSync(LOG_PATH, `${new Date().toISOString()} ${line}\n`);
53
+ }
54
+ async function main() {
55
+ const key = process.env.GEMINI_API_KEY;
56
+ if (!key) {
57
+ throw new Error('MISSING_GEMINI_API_KEY: skipping live test');
58
+ }
59
+ const keyPrefix = key.slice(0, 6) + '...';
60
+ logLine(`START gemini live test (key prefix=${keyPrefix})`);
61
+ const brain = new Brain_1.Brain();
62
+ // Force Gemini-only chain: override fallbacks to nothing
63
+ brain.modelManager = {
64
+ getModelConfig: () => ({
65
+ primary: { provider: 'gemini-api', name: 'gemini-3.1-flash-lite-preview', raw: 'gemini-api/gemini-3.1-flash-lite-preview' },
66
+ fallbacks: []
67
+ })
68
+ };
69
+ const t0 = Date.now();
70
+ const response = await brain.think('You are an audit assistant. Reply with the literal string AUDIT-OK and nothing else.', 'ping');
71
+ const elapsed = Date.now() - t0;
72
+ if (!response || response.length < 3) {
73
+ logLine(`FAIL empty response`);
74
+ throw new Error(`GEMINI_EMPTY_RESPONSE: "${response}"`);
75
+ }
76
+ if (response.includes('CRITICAL ERROR')) {
77
+ logLine(`FAIL critical error: ${response.slice(0, 200)}`);
78
+ throw new Error(`GEMINI_CRITICAL_ERROR: ${response.slice(0, 200)}`);
79
+ }
80
+ const containsAuditOk = response.toUpperCase().includes('AUDIT-OK') || response.toUpperCase().includes('AUDIT OK');
81
+ logLine(`OK elapsed=${elapsed}ms response_length=${response.length} contains_audit_ok=${containsAuditOk}`);
82
+ logLine(` response_preview="${response.slice(0, 100).replace(/\n/g, ' ')}"`);
83
+ console.log(`TEST_INTEGRATION_GEMINI_LIVE_OK (elapsed=${elapsed}ms, length=${response.length}, contains_audit_ok=${containsAuditOk})`);
84
+ console.log(` log: ${LOG_PATH}`);
85
+ console.log(` preview: ${response.slice(0, 80).replace(/\n/g, ' ')}`);
86
+ }
87
+ main().catch((err) => {
88
+ const msg = err?.message || String(err);
89
+ try {
90
+ logLine(`FAIL ${msg.slice(0, 300)}`);
91
+ }
92
+ catch { }
93
+ console.error('TEST_INTEGRATION_GEMINI_LIVE_FAIL:', msg);
94
+ process.exit(1);
95
+ });