xonecode 0.2.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -7
- package/THIRD_PARTY_NOTICES.md +128 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/apps/web/dist/assets/c-BIGW1oBm.js +1 -0
- package/apps/web/dist/assets/cpp-DddhVWhK.js +1 -0
- package/apps/web/dist/assets/csharp-DSvCPggb.js +1 -0
- package/apps/web/dist/assets/css-CLj8gQPS.js +1 -0
- package/apps/web/dist/assets/go-C27-OAKa.js +1 -0
- package/apps/web/dist/assets/html-CfGypltT.js +1 -0
- package/apps/web/dist/assets/index-BB3SamhR.css +1 -0
- package/apps/web/dist/assets/index-CFYAoHdw.js +477 -0
- package/apps/web/dist/assets/ini-BEwlwnbL.js +1 -0
- package/apps/web/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/apps/web/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/apps/web/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/apps/web/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/apps/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/apps/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/apps/web/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/apps/web/dist/assets/java-CylS5w8V.js +1 -0
- package/apps/web/dist/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/apps/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
- package/apps/web/dist/assets/less-B1dDrJ26.js +1 -0
- package/apps/web/dist/assets/lua-BaeVxFsk.js +1 -0
- package/apps/web/dist/assets/markdown-Cvjx9yec.js +1 -0
- package/apps/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
- package/apps/web/dist/assets/php-D_2--9WK.js +1 -0
- package/apps/web/dist/assets/python-B6aJPvgy.js +1 -0
- package/apps/web/dist/assets/ruby-DSHSDbk1.js +1 -0
- package/apps/web/dist/assets/rust-B1yitclQ.js +1 -0
- package/apps/web/dist/assets/scss-D5BDwBP9.js +1 -0
- package/apps/web/dist/assets/sql-CRqJ_cUM.js +1 -0
- package/apps/web/dist/assets/swift-C2oV4EkX.js +1 -0
- package/apps/web/dist/assets/toml-vGWfd6FD.js +1 -0
- package/apps/web/dist/assets/xml-sdJ4AIDG.js +1 -0
- package/apps/web/dist/assets/yaml-Buea-lGh.js +1 -0
- package/apps/web/dist/iconos/xonecode.png +0 -0
- package/apps/web/dist/index.html +20 -0
- package/dist/agent/agentesEnDisco.js +539 -0
- package/dist/agent/agentesEnDisco.js.map +1 -0
- package/dist/agent/arbolDeProyecto.js +245 -0
- package/dist/agent/arbolDeProyecto.js.map +1 -0
- package/dist/agent/artefactosEnDisco.js +139 -0
- package/dist/agent/artefactosEnDisco.js.map +1 -0
- package/dist/agent/aumentador.js +175 -0
- package/dist/agent/aumentador.js.map +1 -0
- package/dist/agent/authEnDisco.js +76 -1
- package/dist/agent/authEnDisco.js.map +1 -1
- package/dist/agent/busquedaRegex.js +92 -0
- package/dist/agent/busquedaRegex.js.map +1 -0
- package/dist/agent/catalogoModelos.js +345 -0
- package/dist/agent/catalogoModelos.js.map +1 -0
- package/dist/agent/checkpointer.js +127 -0
- package/dist/agent/checkpointer.js.map +1 -0
- package/dist/agent/cloudstudioClient.js +194 -0
- package/dist/agent/cloudstudioClient.js.map +1 -0
- package/dist/agent/cloudstudioMcp.js +722 -0
- package/dist/agent/cloudstudioMcp.js.map +1 -0
- package/dist/agent/configEnDisco.js +309 -11
- package/dist/agent/configEnDisco.js.map +1 -1
- package/dist/agent/consumoExterno.js +99 -0
- package/dist/agent/consumoExterno.js.map +1 -0
- package/dist/agent/descarga.js +149 -0
- package/dist/agent/descarga.js.map +1 -0
- package/dist/agent/diagnosticoDeTools.js +51 -0
- package/dist/agent/diagnosticoDeTools.js.map +1 -0
- package/dist/agent/dispositivosEnMaquina.js +596 -0
- package/dist/agent/dispositivosEnMaquina.js.map +1 -0
- package/dist/agent/escrituraDeCodex.js +134 -0
- package/dist/agent/escrituraDeCodex.js.map +1 -0
- package/dist/agent/escrituraDeOpencode.js +80 -0
- package/dist/agent/escrituraDeOpencode.js.map +1 -0
- package/dist/agent/escrituraExterna.js +742 -0
- package/dist/agent/escrituraExterna.js.map +1 -0
- package/dist/agent/gemini.js +81 -0
- package/dist/agent/gemini.js.map +1 -0
- package/dist/agent/git.js +83 -0
- package/dist/agent/git.js.map +1 -0
- package/dist/agent/gitSync.js +441 -0
- package/dist/agent/gitSync.js.map +1 -0
- package/dist/agent/hotswap.js +448 -0
- package/dist/agent/hotswap.js.map +1 -0
- package/dist/agent/instalacionEnMaquina.js +252 -0
- package/dist/agent/instalacionEnMaquina.js.map +1 -0
- package/dist/agent/instantanea.js +7 -10
- package/dist/agent/instantanea.js.map +1 -1
- package/dist/agent/interrupts.js +11 -2
- package/dist/agent/interrupts.js.map +1 -1
- package/dist/agent/juezDeTarea.js +345 -0
- package/dist/agent/juezDeTarea.js.map +1 -0
- package/dist/agent/lanzamientoEnMaquina.js +377 -0
- package/dist/agent/lanzamientoEnMaquina.js.map +1 -0
- package/dist/agent/manifiesto.js +59 -0
- package/dist/agent/manifiesto.js.map +1 -0
- package/dist/agent/memoriaDeProyecto.js +60 -0
- package/dist/agent/memoriaDeProyecto.js.map +1 -0
- package/dist/agent/modelos.js +105 -17
- package/dist/agent/modelos.js.map +1 -1
- package/dist/agent/modelosDeMotor.js +204 -0
- package/dist/agent/modelosDeMotor.js.map +1 -0
- package/dist/agent/paqueteDelProyecto.js +181 -0
- package/dist/agent/paqueteDelProyecto.js.map +1 -0
- package/dist/agent/perfiles.js +92 -31
- package/dist/agent/perfiles.js.map +1 -1
- package/dist/agent/persona.js +40 -0
- package/dist/agent/persona.js.map +1 -0
- package/dist/agent/procesosEnMaquina.js +204 -0
- package/dist/agent/procesosEnMaquina.js.map +1 -0
- package/dist/agent/proyecto.js +311 -13
- package/dist/agent/proyecto.js.map +1 -1
- package/dist/agent/puente.js +63 -6
- package/dist/agent/puente.js.map +1 -1
- package/dist/agent/resumenDeContexto.js +30 -0
- package/dist/agent/resumenDeContexto.js.map +1 -0
- package/dist/agent/resumenDeTool.js +64 -18
- package/dist/agent/resumenDeTool.js.map +1 -1
- package/dist/agent/sesionGit.js +481 -0
- package/dist/agent/sesionGit.js.map +1 -0
- package/dist/agent/settingsEnDisco.js +189 -0
- package/dist/agent/settingsEnDisco.js.map +1 -0
- package/dist/agent/subagenteCodex.js +368 -0
- package/dist/agent/subagenteCodex.js.map +1 -0
- package/dist/agent/subagenteExterno.js +423 -0
- package/dist/agent/subagenteExterno.js.map +1 -0
- package/dist/agent/subagenteOpencode.js +389 -0
- package/dist/agent/subagenteOpencode.js.map +1 -0
- package/dist/agent/subida.js +202 -0
- package/dist/agent/subida.js.map +1 -0
- package/dist/agent/tareasEnDisco.js +466 -0
- package/dist/agent/tareasEnDisco.js.map +1 -0
- package/dist/agent/turnoReal.js +663 -50
- package/dist/agent/turnoReal.js.map +1 -1
- package/dist/agent/versionEnDisco.js +48 -0
- package/dist/agent/versionEnDisco.js.map +1 -0
- package/dist/agent/xoneAgent.js +290 -49
- package/dist/agent/xoneAgent.js.map +1 -1
- package/dist/agent/zip.js +52 -0
- package/dist/agent/zip.js.map +1 -0
- package/dist/cli/acuseDeModelo.js +30 -0
- package/dist/cli/acuseDeModelo.js.map +1 -0
- package/dist/cli/aprobar.js +55 -2
- package/dist/cli/aprobar.js.map +1 -1
- package/dist/cli/config.js +9 -13
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/consola.js +750 -19
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/main.js +740 -81
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/markdown.js +188 -2
- package/dist/cli/markdown.js.map +1 -1
- package/dist/cli/run.js +32 -4
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/stdio.js +46 -19
- package/dist/cli/stdio.js.map +1 -1
- package/dist/cli/tema.js +96 -8
- package/dist/cli/tema.js.map +1 -1
- package/dist/cli/tokens.js +29 -0
- package/dist/cli/tokens.js.map +1 -0
- package/dist/cli/tui/app.js +171 -0
- package/dist/cli/tui/app.js.map +1 -0
- package/dist/cli/tui/aprobarTui.js +80 -0
- package/dist/cli/tui/aprobarTui.js.map +1 -0
- package/dist/cli/tui/barra.js +37 -0
- package/dist/cli/tui/barra.js.map +1 -0
- package/dist/cli/tui/correrTui.js +478 -0
- package/dist/cli/tui/correrTui.js.map +1 -0
- package/dist/cli/tui/entrada.js +166 -0
- package/dist/cli/tui/entrada.js.map +1 -0
- package/dist/cli/tui/filas.js +24 -0
- package/dist/cli/tui/filas.js.map +1 -0
- package/dist/cli/tui/logo.js +49 -0
- package/dist/cli/tui/logo.js.map +1 -0
- package/dist/cli/tui/pielTui.js +14 -0
- package/dist/cli/tui/pielTui.js.map +1 -0
- package/dist/cli/tui/raton.js +126 -0
- package/dist/cli/tui/raton.js.map +1 -0
- package/dist/cli/tui/sidebar.js +86 -0
- package/dist/cli/tui/sidebar.js.map +1 -0
- package/dist/cli/tui/store.js +143 -0
- package/dist/cli/tui/store.js.map +1 -0
- package/dist/cli/tui/tarjeta.js +19 -0
- package/dist/cli/tui/tarjeta.js.map +1 -0
- package/dist/cli/tui/temaInk.js +114 -0
- package/dist/cli/tui/temaInk.js.map +1 -0
- package/dist/cli/tui/transcript.js +254 -0
- package/dist/cli/tui/transcript.js.map +1 -0
- package/dist/cli/wizardInicial.js +240 -0
- package/dist/cli/wizardInicial.js.map +1 -0
- package/dist/core/actos.js +113 -0
- package/dist/core/actos.js.map +1 -0
- package/dist/core/adjuntos.js +97 -0
- package/dist/core/adjuntos.js.map +1 -0
- package/dist/core/agentes.js +227 -0
- package/dist/core/agentes.js.map +1 -0
- package/dist/core/artefactos.js +149 -0
- package/dist/core/artefactos.js.map +1 -0
- package/dist/core/cloudstudio.js +7 -0
- package/dist/core/cloudstudio.js.map +1 -0
- package/dist/core/config.js +212 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/contextos.js +53 -1
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/descargas.js +106 -0
- package/dist/core/descargas.js.map +1 -0
- package/dist/core/descriptoresDeApp.js +279 -0
- package/dist/core/descriptoresDeApp.js.map +1 -0
- package/dist/core/dispositivos.js +466 -0
- package/dist/core/dispositivos.js.map +1 -0
- package/dist/core/entrega.js +141 -0
- package/dist/core/entrega.js.map +1 -0
- package/dist/core/entrelazar.js +90 -0
- package/dist/core/entrelazar.js.map +1 -0
- package/dist/core/esqueleto.js +10 -0
- package/dist/core/esqueleto.js.map +1 -1
- package/dist/core/modelos.js +235 -3
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/notify.js +27 -9
- package/dist/core/notify.js.map +1 -1
- package/dist/core/planDeSubida.js +127 -0
- package/dist/core/planDeSubida.js.map +1 -0
- package/dist/core/ports.js +189 -1
- package/dist/core/ports.js.map +1 -1
- package/dist/core/puedeLanzarse.js +239 -0
- package/dist/core/puedeLanzarse.js.map +1 -0
- package/dist/core/rutaVirtual.js +42 -0
- package/dist/core/rutaVirtual.js.map +1 -0
- package/dist/core/settings.js +246 -0
- package/dist/core/settings.js.map +1 -0
- package/dist/core/tareas.js +230 -0
- package/dist/core/tareas.js.map +1 -0
- package/dist/core/textos.js +36 -0
- package/dist/core/textos.js.map +1 -0
- package/dist/core/turno.js +70 -10
- package/dist/core/turno.js.map +1 -1
- package/dist/core/version.js +31 -0
- package/dist/core/version.js.map +1 -0
- package/dist/vendor/tokenTracking.js +22 -1
- package/dist/vendor/tokenTracking.js.map +1 -1
- package/dist/web/servidor/arranque.js +3964 -0
- package/dist/web/servidor/arranque.js.map +1 -0
- package/dist/web/servidor/consolaDeTarea.js +161 -0
- package/dist/web/servidor/consolaDeTarea.js.map +1 -0
- package/dist/web/servidor/consolaWeb.js +389 -0
- package/dist/web/servidor/consolaWeb.js.map +1 -0
- package/dist/web/servidor/corredorDeTareas.js +1119 -0
- package/dist/web/servidor/corredorDeTareas.js.map +1 -0
- package/dist/web/servidor/pielWeb.js +269 -0
- package/dist/web/servidor/pielWeb.js.map +1 -0
- package/dist/web/servidor/servidor.js +257 -0
- package/dist/web/servidor/servidor.js.map +1 -0
- package/dist/web/servidor/sesiones.js +440 -0
- package/dist/web/servidor/sesiones.js.map +1 -0
- package/dist/web/servidor/transporte.js +169 -0
- package/dist/web/servidor/transporte.js.map +1 -0
- package/dist/web/servidor/vestibulo.js +1276 -0
- package/dist/web/servidor/vestibulo.js.map +1 -0
- package/package.json +30 -8
- package/skills/archify/LICENSE +22 -0
- package/skills/archify/SKILL.md +109 -0
- package/skills/archify/THIRD_PARTY_NOTICES.md +56 -0
- package/skills/archify/assets/template.html +14787 -0
- package/skills/archify/bin/archify.mjs +1990 -0
- package/skills/archify/bin/open-artifact.mjs +86 -0
- package/skills/archify/bin/preview.mjs +648 -0
- package/skills/archify/bin/visual-check.mjs +829 -0
- package/skills/archify/brand-marks/README.md +31 -0
- package/skills/archify/brand-marks/catalog.json +131 -0
- package/skills/archify/delta/architecture-delta.mjs +1214 -0
- package/skills/archify/examples/agent-run.lifecycle.json +71 -0
- package/skills/archify/examples/agent-tool-call.workflow.json +94 -0
- package/skills/archify/examples/async-job-roundtrip.sequence.json +61 -0
- package/skills/archify/examples/brand-aware-delivery.architecture.json +47 -0
- package/skills/archify/examples/cache-miss-request.sequence.json +81 -0
- package/skills/archify/examples/checkout-platform.base.architecture.json +31 -0
- package/skills/archify/examples/checkout-platform.head.architecture.json +31 -0
- package/skills/archify/examples/dataflow-product-analytics.html +14898 -0
- package/skills/archify/examples/deployment-release.lifecycle.json +49 -0
- package/skills/archify/examples/event-stream.dataflow.json +57 -0
- package/skills/archify/examples/incident-response.workflow.json +64 -0
- package/skills/archify/examples/lifecycle-agent-run.html +14847 -0
- package/skills/archify/examples/product-analytics.dataflow.json +76 -0
- package/skills/archify/examples/production-deployment.architecture.json +71 -0
- package/skills/archify/examples/release-delivery.workflow.json +62 -0
- package/skills/archify/examples/sequence-cache-miss-request.html +14913 -0
- package/skills/archify/examples/web-app-rendered.html +14862 -0
- package/skills/archify/examples/web-app.architecture.json +46 -0
- package/skills/archify/examples/workflow-agent-tool-call-rendered.html +14904 -0
- package/skills/archify/migrations/workflow-v2.mjs +279 -0
- package/skills/archify/package.json +17 -0
- package/skills/archify/recipes/scenarios.mjs +391 -0
- package/skills/archify/references/authoring-contract.md +198 -0
- package/skills/archify/references/brand-marks.md +69 -0
- package/skills/archify/references/delivery-contract.md +116 -0
- package/skills/archify/references/viewer-runtime.md +45 -0
- package/skills/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/archify/renderers/architecture/render-architecture.mjs +1078 -0
- package/skills/archify/renderers/dataflow/README.md +104 -0
- package/skills/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- package/skills/archify/renderers/lifecycle/README.md +115 -0
- package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- package/skills/archify/renderers/sequence/README.md +114 -0
- package/skills/archify/renderers/sequence/render-sequence.mjs +453 -0
- package/skills/archify/renderers/shared/brand-marks.mjs +563 -0
- package/skills/archify/renderers/shared/cli.mjs +218 -0
- package/skills/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/skills/archify/renderers/shared/diagnostics.mjs +127 -0
- package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
- package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/archify/renderers/shared/geometry.mjs +1423 -0
- package/skills/archify/renderers/shared/i18n.mjs +594 -0
- package/skills/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/archify/renderers/shared/legend.mjs +217 -0
- package/skills/archify/renderers/shared/output-path.mjs +321 -0
- package/skills/archify/renderers/shared/repository-evidence.mjs +235 -0
- package/skills/archify/renderers/shared/text-fit.mjs +49 -0
- package/skills/archify/renderers/shared/utils.mjs +232 -0
- package/skills/archify/renderers/shared/validator.mjs +86 -0
- package/skills/archify/renderers/workflow/README.md +223 -0
- package/skills/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/skills/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/archify/schemas/README.md +211 -0
- package/skills/archify/schemas/architecture.schema.json +176 -0
- package/skills/archify/schemas/common.schema.json +115 -0
- package/skills/archify/schemas/dataflow.schema.json +243 -0
- package/skills/archify/schemas/lifecycle.schema.json +266 -0
- package/skills/archify/schemas/sequence.schema.json +223 -0
- package/skills/archify/schemas/workflow.schema.json +428 -0
- package/skills/archify/scripts/check-render-output.mjs +835 -0
- package/skills/archify/scripts/check-update.mjs +1667 -0
- package/skills/archify/scripts/render-examples.mjs +26 -0
- package/skills/archify/scripts/update-contract.mjs +182 -0
- package/skills/archify/skill-release.json +10 -0
- package/skills/artifacts-builder/SKILL.md +120 -0
- package/skills/artifacts-builder/reference/diagramas.md +123 -0
- package/skills/artifacts-builder/reference/estilo.md +123 -0
- package/skills/artifacts-builder/reference/exportar-pdf.md +56 -0
- package/skills/artifacts-builder/reference/graficas.md +22 -0
- package/skills/artifacts-builder/scripts/bundle_artifact.py +109 -0
- package/skills/artifacts-builder/scripts/validate_artifact.py +345 -0
- package/skills/xone-hotswap/SKILL.md +185 -0
- package/skills/xone-hotswap/references/comandos.md +706 -0
- package/skills/xone-hotswap/references/conexion-y-despliegue.md +226 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planDeSubida.js","sourceRoot":"","sources":["../../src/core/planDeSubida.ts"],"names":[],"mappings":"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"}
|
package/dist/core/ports.js
CHANGED
|
@@ -21,8 +21,60 @@
|
|
|
21
21
|
* editar su propia definición.
|
|
22
22
|
*/
|
|
23
23
|
export const ES_DOBLE = Symbol.for("xonecode.es-doble");
|
|
24
|
+
/**
|
|
25
|
+
* Acepta objeto O función: en JS una función también es un objeto en tiempo de ejecución
|
|
26
|
+
* y puede llevar una propiedad-symbol igual que cualquier otro. Hace falta para
|
|
27
|
+
* `cli/consola.ts#ejecutarTurnoGuionizado` — un `EjecutorDeTurno` es un tipo función, no
|
|
28
|
+
* una clase con instancia, y es SIEMPRE de pega (todo turno que pasa por ahí usa
|
|
29
|
+
* `new AgenteGuionizado()`), así que la marca vive en la función exportada y no en un
|
|
30
|
+
* booleano en quien la invoca (`web/servidor/vestibulo.ts#volcar`).
|
|
31
|
+
*/
|
|
24
32
|
export function esDoble(puerto) {
|
|
25
|
-
return typeof puerto === "object"
|
|
33
|
+
return ((typeof puerto === "object" || typeof puerto === "function") &&
|
|
34
|
+
puerto !== null &&
|
|
35
|
+
ES_DOBLE in puerto);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* El consumo vivo de una sesión, en la forma que se PERSISTE (`ConsumoDeTurno`).
|
|
39
|
+
*
|
|
40
|
+
* Son las mismas cifras con otro nombre en la ventana: lo que aquí se llama `contexto` es un
|
|
41
|
+
* nivel que se mide al cerrar el turno, y allí se llama `ventana` porque es lo que ocupaba
|
|
42
|
+
* el historial. Se traduce en una función CON NOMBRE, y no con un literal donde se use, por
|
|
43
|
+
* la razón de siempre en este repo: una regla de producción compuesta dentro de un cierre
|
|
44
|
+
* que los tests doblan deja de estar probada y pasa a estar solo escrita.
|
|
45
|
+
*
|
|
46
|
+
* Copia las cuentas en vez de reenviarlas: lo que se guarda en el `.jsonl` no puede
|
|
47
|
+
* compartir objeto con el tracker vivo, o el siguiente turno lo movería por debajo.
|
|
48
|
+
*
|
|
49
|
+
* **Un `contexto` de cero sale SIN `ventana`**, y no es una comodidad: es la diferencia entre
|
|
50
|
+
* «no se midió» y «midió cero». El ejecutor declara `contexto: number`, así que un turno que no
|
|
51
|
+
* pudo leer la ventana llega con un cero, y estamparlo escribiría en el `.jsonl` una medición
|
|
52
|
+
* que nadie hizo — con una consecuencia concreta: `consumoDeLosActos` se queda con la última
|
|
53
|
+
* ventana que CONSTA, así que ese cero falso borraría el nivel que sí midió el turno anterior,
|
|
54
|
+
* que es justo lo que su regla dice que no puede pasar. Cero no es un nivel: un historial con
|
|
55
|
+
* turnos dentro nunca ocupa nada.
|
|
56
|
+
*/
|
|
57
|
+
export function consumoPersistible(c) {
|
|
58
|
+
return {
|
|
59
|
+
modelo: { ...c.modelo },
|
|
60
|
+
externo: { ...c.externo },
|
|
61
|
+
...(c.contexto === 0 ? {} : { ventana: c.contexto }),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* La vuelta: lo que se guardó en un `fin`, en la forma que el cable ya manda.
|
|
66
|
+
*
|
|
67
|
+
* `ventana` ausente —una sesión sin ninguna medición de contexto, o escrita por una versión
|
|
68
|
+
* anterior— vuelve como `contexto: 0`, que es «no consta» y no «cero tokens»: quien pinta ya
|
|
69
|
+
* distingue los dos casos por el `> 0` de siempre, y por eso el cero es la traducción
|
|
70
|
+
* honesta de una ausencia.
|
|
71
|
+
*/
|
|
72
|
+
export function consumoDeLaSesion(c) {
|
|
73
|
+
return {
|
|
74
|
+
modelo: { ...c.modelo },
|
|
75
|
+
externo: { ...c.externo },
|
|
76
|
+
contexto: c.ventana ?? 0,
|
|
77
|
+
};
|
|
26
78
|
}
|
|
27
79
|
/**
|
|
28
80
|
* La huella de un hallazgo, para detectar NO-PROGRESO: la misma huella dos veces seguidas
|
|
@@ -77,6 +129,11 @@ export class ModeloGuionizado {
|
|
|
77
129
|
paraPapel() {
|
|
78
130
|
return { guion: this.respuestas };
|
|
79
131
|
}
|
|
132
|
+
/** El mismo guion venga por papel o por id: el modo offline no distingue modelos, y
|
|
133
|
+
* fingir que sí obligaría a los tests a saber qué modelo pide cada agente. */
|
|
134
|
+
paraModelo() {
|
|
135
|
+
return { guion: this.respuestas };
|
|
136
|
+
}
|
|
80
137
|
descripcion() {
|
|
81
138
|
return {
|
|
82
139
|
rapido: "[DOBLE] guionizado",
|
|
@@ -85,6 +142,64 @@ export class ModeloGuionizado {
|
|
|
85
142
|
};
|
|
86
143
|
}
|
|
87
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* El doble del aumentador: devuelve el texto original, DICIENDO que no lo redactó nadie.
|
|
147
|
+
*
|
|
148
|
+
* La marca `[DOBLE]` no es adorno y es la misma disciplina que `McpVacio` y
|
|
149
|
+
* `SkillsEnMemoria`: este texto se le enseña a una persona en la ventana de crear —para que
|
|
150
|
+
* lo edite— y después se le manda al agente, así que sin la marca pasaría por una redacción
|
|
151
|
+
* de verdad. Con `--guion` es lo que se monta, que es exactamente el caso que la marca
|
|
152
|
+
* describe.
|
|
153
|
+
*
|
|
154
|
+
* La plantilla entra por parámetro para que un test pueda afirmar sobre el paso de datos sin
|
|
155
|
+
* la marca de por medio.
|
|
156
|
+
*/
|
|
157
|
+
export class AumentadorGuionizado {
|
|
158
|
+
plantilla;
|
|
159
|
+
[ES_DOBLE] = true;
|
|
160
|
+
constructor(plantilla = (t) => `[DOBLE] no hay aumentador real en esta consola, así que este encargo es la petición tal cual:\n\n${t}`) {
|
|
161
|
+
this.plantilla = plantilla;
|
|
162
|
+
}
|
|
163
|
+
async augmentar(peticion) {
|
|
164
|
+
return this.plantilla(peticion.texto);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* El doble: contesta sin lanzar ningún proceso.
|
|
169
|
+
*
|
|
170
|
+
* `disponible` devuelve `false` por omisión a propósito. Un doble que dijera que sí haría
|
|
171
|
+
* que los tests recorrieran la rama de «hay Claude Code» sin haberlo, que es justo la
|
|
172
|
+
* mentira que `ES_DOBLE` existe para impedir — y el modo offline enseñaría un especialista
|
|
173
|
+
* que no puede correr.
|
|
174
|
+
*/
|
|
175
|
+
export class SubagenteExternoGuionizado {
|
|
176
|
+
hay;
|
|
177
|
+
respuesta;
|
|
178
|
+
[ES_DOBLE] = true;
|
|
179
|
+
constructor(hay = false, respuesta = "[DOBLE] respuesta guionizada del agente externo") {
|
|
180
|
+
this.hay = hay;
|
|
181
|
+
this.respuesta = respuesta;
|
|
182
|
+
}
|
|
183
|
+
async disponible() {
|
|
184
|
+
return this.hay;
|
|
185
|
+
}
|
|
186
|
+
async correr(peticion) {
|
|
187
|
+
if (!this.hay)
|
|
188
|
+
throw new Error(`[DOBLE] no hay ${peticion.motor} instalado`);
|
|
189
|
+
return this.respuesta;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/** Catálogo determinista para recorrer la CLI sin red ni credenciales. */
|
|
193
|
+
export class CatalogoModelosEnMemoria {
|
|
194
|
+
porProveedor;
|
|
195
|
+
[ES_DOBLE] = true;
|
|
196
|
+
constructor(porProveedor = {}) {
|
|
197
|
+
this.porProveedor = porProveedor;
|
|
198
|
+
}
|
|
199
|
+
async listar(proveedor) {
|
|
200
|
+
return this.porProveedor[proveedor] ?? [];
|
|
201
|
+
}
|
|
202
|
+
}
|
|
88
203
|
/**
|
|
89
204
|
* Verificador que siempre dice verde.
|
|
90
205
|
*
|
|
@@ -111,4 +226,77 @@ export class VerifierGuionizado {
|
|
|
111
226
|
return r;
|
|
112
227
|
}
|
|
113
228
|
}
|
|
229
|
+
/** El proyecto remoto en memoria: recorre el flujo entero sin red ni credenciales. */
|
|
230
|
+
export class CloudStudioEnMemoria {
|
|
231
|
+
opciones;
|
|
232
|
+
[ES_DOBLE] = true;
|
|
233
|
+
/** Lo escrito, para poder afirmar sobre ello en los tests. */
|
|
234
|
+
escrituras = [];
|
|
235
|
+
abierto;
|
|
236
|
+
ramaActual;
|
|
237
|
+
constructor(opciones = {}) {
|
|
238
|
+
this.opciones = opciones;
|
|
239
|
+
this.ramaActual = opciones.rama ?? "master";
|
|
240
|
+
}
|
|
241
|
+
async abrir(nombre) {
|
|
242
|
+
this.abierto = nombre;
|
|
243
|
+
}
|
|
244
|
+
exigirAbierto() {
|
|
245
|
+
// El servidor real responde «No project is open»; el doble no puede ser más blando,
|
|
246
|
+
// o el adaptador nunca ejercitaría su reapertura.
|
|
247
|
+
if (this.abierto === undefined)
|
|
248
|
+
throw new Error("No project is open");
|
|
249
|
+
}
|
|
250
|
+
async contexto() {
|
|
251
|
+
this.exigirAbierto();
|
|
252
|
+
return { proyecto: this.abierto, rama: this.ramaActual };
|
|
253
|
+
}
|
|
254
|
+
async descargarZip() {
|
|
255
|
+
this.exigirAbierto();
|
|
256
|
+
if (this.opciones.zipFalla !== undefined)
|
|
257
|
+
throw new Error(this.opciones.zipFalla);
|
|
258
|
+
if (this.opciones.zipBase64 === undefined)
|
|
259
|
+
throw new Error("[DOBLE] falta `zipBase64`");
|
|
260
|
+
return this.opciones.zipBase64;
|
|
261
|
+
}
|
|
262
|
+
async estructura(directorio = "") {
|
|
263
|
+
this.exigirAbierto();
|
|
264
|
+
const todas = [
|
|
265
|
+
...Object.entries(this.opciones.textos ?? {}).map(([ruta, texto]) => ({ ruta, bytes: texto.length })),
|
|
266
|
+
...Object.entries(this.opciones.binarios ?? {}).map(([ruta, bytes]) => ({ ruta, bytes })),
|
|
267
|
+
].filter((e) => directorio === "" || e.ruta.startsWith(`${directorio}/`));
|
|
268
|
+
const tope = this.opciones.topeEstructura;
|
|
269
|
+
const truncado = tope !== undefined && todas.length > tope;
|
|
270
|
+
return { entradas: truncado ? todas.slice(0, tope) : todas, truncado };
|
|
271
|
+
}
|
|
272
|
+
async leerTexto(ruta) {
|
|
273
|
+
this.exigirAbierto();
|
|
274
|
+
const texto = this.opciones.textos?.[ruta];
|
|
275
|
+
// El servidor rechaza por EXTENSIÓN, no por ausencia: el mensaje se replica para que
|
|
276
|
+
// la vía degradada aprenda a distinguir «no existe» de «no se puede bajar así».
|
|
277
|
+
if (texto === undefined)
|
|
278
|
+
throw new Error(`File extension not allowed or missing: ${ruta}`);
|
|
279
|
+
return texto;
|
|
280
|
+
}
|
|
281
|
+
async escribirTexto(ruta, contenido) {
|
|
282
|
+
this.exigirAbierto();
|
|
283
|
+
this.escrituras.push({ tipo: "texto", ruta, bytes: contenido.length });
|
|
284
|
+
}
|
|
285
|
+
async borrarTexto(ruta) {
|
|
286
|
+
this.exigirAbierto();
|
|
287
|
+
this.escrituras.push({ tipo: "borrado", ruta });
|
|
288
|
+
}
|
|
289
|
+
async subirBinario(ruta, datos) {
|
|
290
|
+
this.exigirAbierto();
|
|
291
|
+
this.escrituras.push({ tipo: "binario", ruta, bytes: datos.byteLength });
|
|
292
|
+
}
|
|
293
|
+
async ramas() {
|
|
294
|
+
this.exigirAbierto();
|
|
295
|
+
return [this.ramaActual];
|
|
296
|
+
}
|
|
297
|
+
async cambiarRama(nombre) {
|
|
298
|
+
this.exigirAbierto();
|
|
299
|
+
this.ramaActual = nombre;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
114
302
|
//# sourceMappingURL=ports.js.map
|
package/dist/core/ports.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/core/ports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/core/ports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El veredicto de «¿se puede lanzar esta app en este dispositivo?»: el predicado de listo y el
|
|
3
|
+
* catálogo de causas por las que NO lo está, cada una con su frase y con dónde se arregla.
|
|
4
|
+
*
|
|
5
|
+
* **Por qué esto existe, y es un caso medido.** El `launchApplication` del framework contesta
|
|
6
|
+
* `{"result":true}` y eso es un ACUSE, no una medida: a un proyecto cuyo `app.xml` declara
|
|
7
|
+
* `<connection name="main" connstring="bd/gestion.db" />` y que **no tiene** ese fichero le
|
|
8
|
+
* contestó `true`, y la app murió detrás en un diálogo «Error opening database». El verificador
|
|
9
|
+
* no lo caza —`xone-simulator validate` sobre ese mismo proyecto da `success: true`, 0 errores
|
|
10
|
+
* y 0 avisos, porque **no mira la conexión**—, así que el síntoma es el peor de todos: nada
|
|
11
|
+
* falla por ningún lado y la app no arranca.
|
|
12
|
+
*
|
|
13
|
+
* **Y lo que se comprueba NO se deduce de `app.xml`: la base es `bd/gestion.db` POR DEFECTO.**
|
|
14
|
+
* Aquí hubo una regla que solo miraba los `connstring` declarados con forma de ruta, y es un
|
|
15
|
+
* **falso negativo**, que es el error peligroso de este módulo: medido sobre los proyectos
|
|
16
|
+
* reales, **solo MinitsMT declara su base** (`<connection name="NoReplica"
|
|
17
|
+
* connstring="bd/gestion.db" />`); MyAllXOne y Replanteos_2026 declaran únicamente conexiones de
|
|
18
|
+
* proveedor (`Provider=…`), AppDemo no declara **ninguna**, y **los cuatro tienen su
|
|
19
|
+
* `bd/gestion.db`**. O sea: la declaración es la forma RARA, y una regla que dependiera de ella
|
|
20
|
+
* dejaría sin comprobar justo lo que se quería comprobar —el caso medido, el diálogo «Database
|
|
21
|
+
* not found»— en tres de cada cuatro proyectos. Comprobado en el aparato: XOne usa esa ruta por
|
|
22
|
+
* defecto, se declare o no. Así que la comprobación tiene DOS entradas y una sola pregunta: la
|
|
23
|
+
* ruta de la convención siempre, más cualquier otra ruta que el `app.xml` declare —una segunda
|
|
24
|
+
* base es un sitio distinto donde puede faltar un fichero—.
|
|
25
|
+
*
|
|
26
|
+
* Datos puros y sin efectos: lo caro entra por parámetro (`existe`, los textos de los ficheros),
|
|
27
|
+
* que es lo que deja `npm test` sin disco y sin dispositivo. Quien lee el proyecto y mide la
|
|
28
|
+
* máquina es `web/servidor` / `agent/`.
|
|
29
|
+
*
|
|
30
|
+
* **Y el catálogo es una unión discriminada y no una lista de booleanos.** Cada causa lleva sus
|
|
31
|
+
* datos (el nombre del dispositivo, el `connstring` que falta) porque la frase los necesita, y
|
|
32
|
+
* el `switch` de `motivoDeBloqueo` va exhaustivo y sin `default`: añadir una causa es un error de
|
|
33
|
+
* compilación hasta que alguien escriba qué decir y dónde se arregla. Una lista de booleanos se
|
|
34
|
+
* amplía en silencio, y lo que se amplía en silencio es lo que acaba sin frase.
|
|
35
|
+
*/
|
|
36
|
+
import { esAlcanzable } from "./dispositivos.js";
|
|
37
|
+
import { conexionesDeApp, esRutaDeFichero, nombreDeApp, } from "./descriptoresDeApp.js";
|
|
38
|
+
/**
|
|
39
|
+
* La base local de una app XOne, siempre en el mismo sitio: `bd/gestion.db`.
|
|
40
|
+
*
|
|
41
|
+
* **Es una convención de la plataforma, no algo que haya que leer de `app.xml`.** XOne la usa
|
|
42
|
+
* por defecto cuando no se declara ninguna conexión, así que un proyecto que no la declara **sí
|
|
43
|
+
* la necesita**, y comprobar solo lo declarado dejaría sin comprobar el caso más común —está
|
|
44
|
+
* medido: de cuatro proyectos reales, tres no la declaran y los cuatro la tienen—.
|
|
45
|
+
*
|
|
46
|
+
* Se comprueba tal cual, sin normalizar, porque es como la nombra el propio XOne y como la
|
|
47
|
+
* declara el esqueleto de `core/esqueleto.ts`.
|
|
48
|
+
*/
|
|
49
|
+
export const RUTA_DE_LA_BASE = "bd/gestion.db";
|
|
50
|
+
/**
|
|
51
|
+
* ¿Está este dispositivo listo para lanzar? Alcanzable **y** con el framework instalado.
|
|
52
|
+
*
|
|
53
|
+
* **Un framework sin medir NO es un framework ausente, y aquí las dos cosas dan «no listo» pero
|
|
54
|
+
* la frase que lo acompaña es distinta** —«no se sabe» no se arregla instalando nada—. El
|
|
55
|
+
* predicado se queda con el lado conservador: un botón de lanzar sobre un «no se sabe» es la
|
|
56
|
+
* promesa que este repo no se permite, porque el acuse del framework llega igual y el fallo
|
|
57
|
+
* aparece detrás, en la app.
|
|
58
|
+
*
|
|
59
|
+
* Es el eje DISPOSITIVO de `puedeLanzarse`, no el veredicto entero: un proyecto sin `app.xml`
|
|
60
|
+
* bloquea aunque esto diga que sí. `puedeLanzarse` no lo recalcula por su cuenta —el veredicto
|
|
61
|
+
* sale de su lista de causas, que es exhaustiva sobre este eje— y hay un test que ata las dos
|
|
62
|
+
* respuestas para que no puedan divergir.
|
|
63
|
+
*/
|
|
64
|
+
export function dispositivoListo(dispositivo, framework) {
|
|
65
|
+
if (dispositivo === undefined)
|
|
66
|
+
return false;
|
|
67
|
+
// El camino (adb, su túnel y la subida) todavía solo existe para Android: un iPhone
|
|
68
|
+
// arrancado tampoco está listo, porque desde aquí no se llega a él.
|
|
69
|
+
if (dispositivo.plataforma !== "android")
|
|
70
|
+
return false;
|
|
71
|
+
if (!esAlcanzable(dispositivo.estado))
|
|
72
|
+
return false;
|
|
73
|
+
return framework?.instalado === true;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* El veredicto entero: el dispositivo, el camino, la medida del framework y el proyecto.
|
|
77
|
+
*
|
|
78
|
+
* **El orden de las causas es el de la lectura**, y no es alfabético a propósito: primero lo que
|
|
79
|
+
* hay que arreglar antes de que nada más importe —elegir un dispositivo— y al final el proyecto,
|
|
80
|
+
* para que quien esté mirando la pantalla no arregle una cosa y descubra la siguiente después.
|
|
81
|
+
* Las causas son todas las que hay, no la primera.
|
|
82
|
+
*/
|
|
83
|
+
export function puedeLanzarse(entrada) {
|
|
84
|
+
const causas = [];
|
|
85
|
+
const { dispositivo } = entrada;
|
|
86
|
+
if (dispositivo === undefined) {
|
|
87
|
+
causas.push(entrada.elegido === undefined
|
|
88
|
+
? { causa: "sin-dispositivo-elegido" }
|
|
89
|
+
: { causa: "dispositivo-desconocido" });
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
if (!esAlcanzable(dispositivo.estado)) {
|
|
93
|
+
causas.push({
|
|
94
|
+
causa: "dispositivo-no-alcanzable",
|
|
95
|
+
nombre: dispositivo.nombre,
|
|
96
|
+
estado: dispositivo.estado,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (dispositivo.plataforma !== "android") {
|
|
100
|
+
causas.push({ causa: "plataforma-sin-camino", plataforma: dispositivo.plataforma });
|
|
101
|
+
// Y no se pregunta por el framework: `frameworkEnDispositivo` contesta «iOS todavía no»
|
|
102
|
+
// sin lanzar nada, así que aquí no hay medida que leer y decir «falta el framework»
|
|
103
|
+
// culparía al dispositivo de que el camino no exista.
|
|
104
|
+
}
|
|
105
|
+
else if (entrada.framework === undefined) {
|
|
106
|
+
causas.push({ causa: "framework-no-medido", nombre: dispositivo.nombre });
|
|
107
|
+
}
|
|
108
|
+
else if (entrada.framework.instalado !== true) {
|
|
109
|
+
causas.push({ causa: "framework-ausente", nombre: dispositivo.nombre });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const conexiones = entrada.xml === undefined ? [] : conexionesDeApp(entrada.xml);
|
|
113
|
+
const app = entrada.ini === undefined ? undefined : nombreDeApp(entrada.ini);
|
|
114
|
+
if (entrada.xml === undefined) {
|
|
115
|
+
causas.push(entrada.motivoDeLectura === undefined
|
|
116
|
+
? { causa: "sin-app-xml" }
|
|
117
|
+
: { causa: "app-xml-ilegible", motivo: entrada.motivoDeLectura });
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// Un `app.xml` sin ninguna `<connection>` NO bloquea por eso y no se cuenta: no declarar
|
|
121
|
+
// ninguna no es síntoma de nada —AppDemo, la app con la que se prueba, declara cero y
|
|
122
|
+
// arranca—. Lo que el recorrido diga de las conexiones lo lleva `Veredicto.conexiones`, que
|
|
123
|
+
// es un dato.
|
|
124
|
+
//
|
|
125
|
+
// **Pero la base se comprueba igual, porque la ruta es una convención y no una
|
|
126
|
+
// declaración.** XOne arranca con `bd/gestion.db` sin que nadie la declare —medido, y es
|
|
127
|
+
// como arrancan MyAllXOne, Replanteos_2026 y AppDemo—, así que mirar solo lo declarado
|
|
128
|
+
// dejaría pasar el caso medido justo en los proyectos donde más pasa. Las dos entradas son
|
|
129
|
+
// una sola pregunta: la convención siempre, y además cualquier OTRA ruta que el `app.xml`
|
|
130
|
+
// declare, porque una segunda base es un sitio distinto donde puede faltar un fichero.
|
|
131
|
+
//
|
|
132
|
+
// **Y solo las declaradas que son RUTAS de fichero.** Medido: un `connstring` de proveedor
|
|
133
|
+
// (`Provider=…;ProgID=…`) no es un fichero de aquí y esos proyectos arrancan perfectamente,
|
|
134
|
+
// así que preguntar por su existencia bloquearía proyectos que funcionan. El fichero que
|
|
135
|
+
// falta de verdad es el caso medido: `{"result":true}` y el diálogo de error detrás.
|
|
136
|
+
const declaradas = conexiones.filter((c) => esRutaDeFichero(c.connstring));
|
|
137
|
+
const candidatas = declaradas.map((c) => ({
|
|
138
|
+
ruta: c.connstring,
|
|
139
|
+
declarada: true,
|
|
140
|
+
}));
|
|
141
|
+
if (!declaradas.some((c) => c.connstring === RUTA_DE_LA_BASE)) {
|
|
142
|
+
candidatas.push({ ruta: RUTA_DE_LA_BASE, declarada: false });
|
|
143
|
+
}
|
|
144
|
+
// Dos conexiones a la misma base son una frase y no dos: la segunda no dice nada nuevo. Y
|
|
145
|
+
// una base que el `app.xml` SÍ declara se cuenta con la verdad más específica —que está
|
|
146
|
+
// declarada y que no está—, que es la que dice dónde mirar.
|
|
147
|
+
const yaDicho = new Set();
|
|
148
|
+
for (const { ruta, declarada } of candidatas) {
|
|
149
|
+
if (yaDicho.has(ruta))
|
|
150
|
+
continue;
|
|
151
|
+
if (entrada.existe(ruta))
|
|
152
|
+
continue;
|
|
153
|
+
yaDicho.add(ruta);
|
|
154
|
+
causas.push(declarada
|
|
155
|
+
? { causa: "falta-el-fichero-de-la-conexion", connstring: ruta }
|
|
156
|
+
: { causa: "falta-la-base" });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
// Las causas son exhaustivas sobre los tres ejes, así que esto ES `dispositivoListo(...)`
|
|
161
|
+
// y el proyecto — y hay un test que lo comprueba, para que no puedan divergir.
|
|
162
|
+
listo: causas.length === 0,
|
|
163
|
+
causas,
|
|
164
|
+
...(app === undefined ? {} : { app }),
|
|
165
|
+
conexiones,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/** Cómo se escribe la plataforma en la ventana. Exhaustivo por tipo, como todo lo que reparte. */
|
|
169
|
+
function nombreDePlataforma(plataforma) {
|
|
170
|
+
switch (plataforma) {
|
|
171
|
+
case "android":
|
|
172
|
+
return "Android";
|
|
173
|
+
case "ios":
|
|
174
|
+
return "iOS";
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* El estado medido, como se dice en la ventana.
|
|
179
|
+
*
|
|
180
|
+
* Es la TERCERA copia de esta tabla en el repo —`Equipo.tsx` e `inventarioDeDispositivos.ts`
|
|
181
|
+
* tienen las suyas— y el motivo es la frontera: `apps/web/` redeclara los tipos del cable y no
|
|
182
|
+
* importa de aquí, y esta vive donde viven las frases que salen del servidor. El
|
|
183
|
+
* `Record<…, string>` la deja exhaustiva por tipo: un estado nuevo no compila hasta que alguien
|
|
184
|
+
* decida cómo se escribe.
|
|
185
|
+
*/
|
|
186
|
+
const ETIQUETA_DE_ESTADO = {
|
|
187
|
+
conectado: "conectado",
|
|
188
|
+
arrancado: "arrancado",
|
|
189
|
+
apagado: "apagado",
|
|
190
|
+
"sin-autorizar": "sin autorizar",
|
|
191
|
+
offline: "offline",
|
|
192
|
+
"no-disponible": "no disponible",
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* UNA frase por causa, en español, y **cada una dice DÓNDE se arregla**.
|
|
196
|
+
*
|
|
197
|
+
* El `switch` va exhaustivo y sin `default` a propósito: un `default` que devolviera «no se
|
|
198
|
+
* puede» taparía la causa nueva en vez de obligar a escribir qué falta y con qué se arregla, que
|
|
199
|
+
* es justo lo único que esta pestaña tiene que decir. Y por eso ninguna frase es un «no se
|
|
200
|
+
* puede» a secas: quien la lee está mirando una pantalla que le acaba de negar algo, y lo único
|
|
201
|
+
* que puede hacer con un «no se puede» es irse a buscar por su cuenta —o creer que xonecode
|
|
202
|
+
* tenía que haberlo puesto él.
|
|
203
|
+
*/
|
|
204
|
+
export function motivoDeBloqueo(causa) {
|
|
205
|
+
switch (causa.causa) {
|
|
206
|
+
case "sin-dispositivo-elegido":
|
|
207
|
+
return "Esta sesión no tiene ningún dispositivo elegido: elígelo en la pastilla del compositor, junto al modelo —es donde se elige el de ESTA sesión—, y vuelve a intentarlo.";
|
|
208
|
+
case "dispositivo-desconocido":
|
|
209
|
+
return "El dispositivo que esta sesión tenía elegido ya no aparece en la última medida del equipo: los identificadores no son estables (el de un emulador es un puerto). Vuelve a elegirlo en la pastilla del compositor.";
|
|
210
|
+
case "dispositivo-no-alcanzable":
|
|
211
|
+
return `«${causa.nombre}» no está alcanzable ahora: su estado es «${ETIQUETA_DE_ESTADO[causa.estado]}». Arranca el dispositivo o conéctalo del todo —y acepta la depuración si es un teléfono— y vuelve a mirar en Ajustes → Dispositivos.`;
|
|
212
|
+
case "framework-ausente":
|
|
213
|
+
return `«${causa.nombre}» no tiene instalado el framework de XOne, que es la app con la que se habla para lanzar (XOneStudio). Instálalo en el dispositivo —XOne Studio lo distribuye— y vuelve a mirar en Ajustes → Dispositivos.`;
|
|
214
|
+
case "framework-no-medido":
|
|
215
|
+
return `Todavía no se ha mirado si «${causa.nombre}» tiene el framework de XOne, así que no se puede prometer que la app vaya a arrancar. Vuelve a mirar en Ajustes → Dispositivos y espera a que llegue la medida.`;
|
|
216
|
+
case "sin-app-xml":
|
|
217
|
+
return "El proyecto no tiene app.xml —o la raíz que se abrió no es la carpeta que lo contiene—: es el fichero que declara la app, y sin él no hay nada que lanzar. Ábrelo en XOne Studio, o comprueba que abriste la carpeta del proyecto y no una de dentro.";
|
|
218
|
+
case "app-xml-ilegible":
|
|
219
|
+
return `No se pudo leer app.xml: ${causa.motivo}. Es el fichero que declara la app, así que sin leerlo no se sabe qué se va a lanzar: ábrelo y vuelve a guardarlo desde XOne Studio.`;
|
|
220
|
+
case "falta-el-fichero-de-la-conexion":
|
|
221
|
+
// Larga a propósito: lo que un despliegue tiene que decir es QUÉ falta, DE DÓNDE sale y
|
|
222
|
+
// qué pasa si se ignora. Una frase corta aquí manda a la persona a buscar sola y la deja
|
|
223
|
+
// creyendo que el fichero lo pone xonecode.
|
|
224
|
+
return `app.xml declara la conexión «${causa.connstring}» y ese fichero no está en el proyecto. La base la genera el simulador fuera de xonecode —xonecode no la crea—, así que hay que abrir el proyecto en XOne Studio y arrancarlo una vez, o traerlo de donde se generó. Sin él la app recibe el lanzamiento y muere en un diálogo «Error opening database».`;
|
|
225
|
+
case "falta-la-base":
|
|
226
|
+
// La hermana de la de arriba, y la que más veces va a salir: medido, tres de cada cuatro
|
|
227
|
+
// proyectos reales NO declaran su base y la necesitan igual, porque la ruta es la de por
|
|
228
|
+
// defecto de XOne.
|
|
229
|
+
//
|
|
230
|
+
// **Y lleva la única frase que reconoce un falso positivo propio**: el fichero se mira en
|
|
231
|
+
// el PROYECTO, y una app que ya se lanzó antes en ese dispositivo tiene allí su copia, así
|
|
232
|
+
// que volver a lanzarla no la necesita. No se puede preguntar al aparato todavía, así que
|
|
233
|
+
// lo honesto es decir que no se puede prometer — y lo que hay que hacer si ese es el caso.
|
|
234
|
+
return `El proyecto no tiene ${RUTA_DE_LA_BASE}, que es la base local de XOne: la usa POR DEFECTO, se declare en app.xml o no, y sin ella la app recibe el lanzamiento y muere en un diálogo «Error opening database». La genera el simulador fuera de xonecode —xonecode no la crea—, así que hay que abrir el proyecto en XOne Studio y arrancarlo una vez, o traerla de donde se generó. (Se mira el proyecto, no el aparato: si esta app ya se lanzó antes en ese dispositivo, allí sigue su copia y no hace falta esto.)`;
|
|
235
|
+
case "plataforma-sin-camino":
|
|
236
|
+
return `Lanzar desde xonecode todavía solo está montado para Android —el túnel, el canal y la subida son los de esa plataforma—, así que sobre ${nombreDePlataforma(causa.plataforma)} no hay camino. Elige un dispositivo de Android en Ajustes → Dispositivos, o lanza la app desde XOne Studio.`;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=puedeLanzarse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puedeLanzarse.js","sourceRoot":"","sources":["../../src/core/puedeLanzarse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { resolve, sep } from "node:path";
|
|
2
|
+
/**
|
|
3
|
+
* La ruta REAL de una ruta VIRTUAL del backend del agente, o `undefined` si se sale del
|
|
4
|
+
* proyecto.
|
|
5
|
+
*
|
|
6
|
+
* El backend del agente es un `FilesystemBackend` con `virtualMode: true`, así que lo que el
|
|
7
|
+
* modelo escribe —y lo que llega en los argumentos de un `interrupt`— viene ROOTEADO en el
|
|
8
|
+
* proyecto: `/app.xne`, `/artefactos/x.html`. Es la forma que usan las descripciones de las
|
|
9
|
+
* tools, las skills y el predicado `seDetieneEn`.
|
|
10
|
+
*
|
|
11
|
+
* Y ahí estaba la trampa, medida: `resolve(raiz, "/app.xne")` devuelve `/app.xne`, porque una
|
|
12
|
+
* ruta absoluta DESCARTA la base. Quien leyera el disco así con la forma rooteada no
|
|
13
|
+
* encontraba nada — con la relativa sí, que es por lo que pasó desapercibido: el test que lo
|
|
14
|
+
* cubría usaba `"app.xne"` sin barra. En el ANTES del diff de una aprobación eso significaba
|
|
15
|
+
* un fichero existente enseñado como si fuera NUEVO, con sus líneas quitadas invisibles. Es
|
|
16
|
+
* el peor sitio posible para una media verdad: el diff de la aprobación es el único momento
|
|
17
|
+
* en que alguien ve lo que el agente va a escribir antes de que exista.
|
|
18
|
+
*
|
|
19
|
+
* Las dos formas se aceptan —la relativa y la rooteada— porque las dos funcionan contra el
|
|
20
|
+
* backend y por tanto las dos pueden llegar. Los separadores se normalizan antes de resolver:
|
|
21
|
+
* en POSIX `resolve` trata «\» como un carácter más del nombre, la misma lección que ya pagó
|
|
22
|
+
* `leerFicheroDeProyecto`.
|
|
23
|
+
*
|
|
24
|
+
* La contención se comprueba porque `..` sí puede salir del proyecto, y de aquí sale una
|
|
25
|
+
* lectura de disco: sin ella, el contenido de un fichero de FUERA acabaría en la pantalla de
|
|
26
|
+
* la aprobación. Es lexical y no `realpath` —esta función es pura y no toca disco—, así que
|
|
27
|
+
* quien necesite además cerrar los enlaces simbólicos recomprueba después, como hace
|
|
28
|
+
* `arbolDeProyecto.ts`.
|
|
29
|
+
*/
|
|
30
|
+
export function rutaRealDeVirtual(raiz, virtual) {
|
|
31
|
+
const normal = virtual.split(/[\\/]/).filter((s) => s.length > 0).join("/");
|
|
32
|
+
if (normal.length === 0)
|
|
33
|
+
return undefined;
|
|
34
|
+
const real = resolve(raiz, normal);
|
|
35
|
+
// Se exige estar DEBAJO, no «dentro o ser»: la raíz misma no es un fichero que leer, y un
|
|
36
|
+
// «.» o un «/» resuelven a ella. Devolverla haría que el llamante intentara leer un
|
|
37
|
+
// directorio y se llevara un `EISDIR` donde esperaba texto.
|
|
38
|
+
const dentro = resolve(raiz);
|
|
39
|
+
const prefijo = dentro.endsWith(sep) ? dentro : dentro + sep;
|
|
40
|
+
return real.startsWith(prefijo) ? real : undefined;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=rutaVirtual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rutaVirtual.js","sourceRoot":"","sources":["../../src/core/rutaVirtual.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAe;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,0FAA0F;IAC1F,oFAAoF;IACpF,4DAA4D;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;IAC7D,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC"}
|