xonecode 0.3.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 +56 -8
- 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":"escrituraExterna.js","sourceRoot":"","sources":["../../src/agent/escrituraExterna.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
|
|
2
|
+
function esRegistro(valor) {
|
|
3
|
+
return typeof valor === "object" && valor !== null && !Array.isArray(valor);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* La API de function calling de Gemini acepta solo una parte de OpenAPI. Zod
|
|
7
|
+
* traduce `.positive()`, `.max()` o `.regex()` a restricciones que son válidas
|
|
8
|
+
* en JSON Schema, pero que Gemini rechaza (por ejemplo `exclusiveMinimum`).
|
|
9
|
+
*
|
|
10
|
+
* La validación real no se pierde: Zod sigue comprobando los argumentos cuando
|
|
11
|
+
* la tool se ejecuta. Aquí solo se rebaja la declaración enviada al modelo.
|
|
12
|
+
*/
|
|
13
|
+
const RESTRICCIONES_NO_COMPATIBLES = new Set([
|
|
14
|
+
"default",
|
|
15
|
+
"exclusiveMinimum",
|
|
16
|
+
"exclusiveMaximum",
|
|
17
|
+
"minimum",
|
|
18
|
+
"maximum",
|
|
19
|
+
"multipleOf",
|
|
20
|
+
"minLength",
|
|
21
|
+
"maxLength",
|
|
22
|
+
"pattern",
|
|
23
|
+
"minItems",
|
|
24
|
+
"maxItems",
|
|
25
|
+
"minProperties",
|
|
26
|
+
"maxProperties",
|
|
27
|
+
"additionalProperties",
|
|
28
|
+
]);
|
|
29
|
+
/**
|
|
30
|
+
* Gemini recibe los esquemas de function calling como un subconjunto de OpenAPI:
|
|
31
|
+
* `type` es escalar y la nulabilidad se expresa con `nullable`. Zod genera la
|
|
32
|
+
* unión JSON Schema `type: [T, "null"]` para los argumentos optional+nullable
|
|
33
|
+
* de las herramientas de filesystem de Deep Agents.
|
|
34
|
+
*/
|
|
35
|
+
function normalizarEsquemaGemini(valor, esEsquema = false) {
|
|
36
|
+
if (Array.isArray(valor))
|
|
37
|
+
return valor.map((hijo) => normalizarEsquemaGemini(hijo, esEsquema));
|
|
38
|
+
if (!esRegistro(valor))
|
|
39
|
+
return valor;
|
|
40
|
+
const salida = {};
|
|
41
|
+
for (const [clave, hijo] of Object.entries(valor)) {
|
|
42
|
+
// No se puede hacer este filtro en todos los objetos: `pattern` también es
|
|
43
|
+
// un nombre perfectamente válido de ARGUMENTO dentro de `properties`.
|
|
44
|
+
if (esEsquema && RESTRICCIONES_NO_COMPATIBLES.has(clave))
|
|
45
|
+
continue;
|
|
46
|
+
if (clave === "properties" || clave === "$defs" || clave === "defs") {
|
|
47
|
+
salida[clave] = esRegistro(hijo)
|
|
48
|
+
? Object.fromEntries(Object.entries(hijo).map(([nombre, schema]) => [nombre, normalizarEsquemaGemini(schema, true)]))
|
|
49
|
+
: hijo;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (clave === "items" || clave === "anyOf" || clave === "any_of") {
|
|
53
|
+
salida[clave] = normalizarEsquemaGemini(hijo, true);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
// `parameters` vive en la declaración de function calling y es la raíz de
|
|
57
|
+
// un schema; fuera de ahí seguimos recorriendo la configuración sin filtrar.
|
|
58
|
+
salida[clave] = normalizarEsquemaGemini(hijo, clave === "parameters" || clave === "response");
|
|
59
|
+
}
|
|
60
|
+
if (!Array.isArray(salida.type))
|
|
61
|
+
return salida;
|
|
62
|
+
const tipos = salida.type.filter((tipo) => typeof tipo === "string");
|
|
63
|
+
const sinNull = tipos.filter((tipo) => tipo !== "null");
|
|
64
|
+
if (!tipos.includes("null") || sinNull.length !== 1)
|
|
65
|
+
return salida;
|
|
66
|
+
salida.type = sinNull[0];
|
|
67
|
+
salida.nullable = true;
|
|
68
|
+
return salida;
|
|
69
|
+
}
|
|
70
|
+
/** Cliente de Gemini que adapta los esquemas de tools al formato de su API. */
|
|
71
|
+
export class ChatGoogleGenerativeAICompatible extends ChatGoogleGenerativeAI {
|
|
72
|
+
bindTools(...args) {
|
|
73
|
+
const ligado = super.bindTools(...args);
|
|
74
|
+
const config = ligado;
|
|
75
|
+
if (config.config.tools !== undefined) {
|
|
76
|
+
config.config.tools = normalizarEsquemaGemini(config.config.tools);
|
|
77
|
+
}
|
|
78
|
+
return ligado;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/agent/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lo que `instantanea.ts` (la foto del ANTES por turno) y `gitSync.ts` (el libro de
|
|
3
|
+
* cuentas de la subida a CloudStudio) necesitan de git y no depende de para qué lo usa
|
|
4
|
+
* cada uno. Estaba copiado en los dos ficheros y ya había DIVERGIDO — este módulo es la
|
|
5
|
+
* única fuente de esa lógica de aquí en adelante.
|
|
6
|
+
*/
|
|
7
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
8
|
+
import { tmpdir } from "node:os";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
/**
|
|
11
|
+
* Índice de git propio y temporal, para poder construir un árbol (`git add` + `write-tree`
|
|
12
|
+
* o `commit-tree`) sin pasar por el índice de verdad.
|
|
13
|
+
*
|
|
14
|
+
* Existe porque el usuario puede tener trabajo a medias en SU staging cuando xonecode
|
|
15
|
+
* necesita fotografiar el árbol (al empezar un turno, o al hacer un `/sync`) — tocárselo
|
|
16
|
+
* sería imperdonable: perdería la frontera entre lo que él decidió `add`-ear y lo que no.
|
|
17
|
+
* Un índice aparte, en un directorio temporal que se limpia al terminar, dejar hacer todo
|
|
18
|
+
* esto sin que el índice real se entere de que existió.
|
|
19
|
+
*
|
|
20
|
+
* `etiqueta` solo distingue el prefijo del directorio temporal entre llamadores (útil para
|
|
21
|
+
* reconocer de quién es un directorio huérfano si algo no limpia bien); no cambia el
|
|
22
|
+
* comportamiento.
|
|
23
|
+
*/
|
|
24
|
+
export function indicePrivado(etiqueta) {
|
|
25
|
+
const dir = mkdtempSync(join(tmpdir(), `xonecode-${etiqueta}-`));
|
|
26
|
+
return { ruta: join(dir, "git.index"), limpiar: () => rmSync(dir, { recursive: true, force: true }) };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Saca `.xonecode` de un índice PRIVADO recién construido con `git add -A`.
|
|
30
|
+
*
|
|
31
|
+
* Va aquí y no en un pathspec del `add` porque ese camino está medido y no vale: `git add`
|
|
32
|
+
* con `:(exclude).xonecode` en un repo donde la carpeta YA está ignorada —el caso normal,
|
|
33
|
+
* `prepararRepo` escribe `info/exclude`— da por nombrada una ruta ignorada y **sale con
|
|
34
|
+
* código 1**. `rm --cached` con `--ignore-unmatch` funciona en los dos casos y no dice nada
|
|
35
|
+
* cuando no había qué quitar.
|
|
36
|
+
*
|
|
37
|
+
* Y hace falta desde que ahí dentro vive el checkpointer: en un proyecto CLOUD la carpeta
|
|
38
|
+
* está excluida y esto es un no-op, pero en modo OFFLINE sobre el repo del usuario nadie
|
|
39
|
+
* escribió ese exclude —lo dice la cabecera de `sesionGit.ts`—, así que cada foto metía
|
|
40
|
+
* `checkpoint.sqlite` entero en `.git/objects`. Con `MemorySaver` eran unos KB de `.jsonl`
|
|
41
|
+
* y no se notaba; medido hoy, ese fichero son 30 MB que cambian en cada superpaso, y las
|
|
42
|
+
* refs `refs/xonecode/sesion/*` mantienen vivo cada blob para siempre.
|
|
43
|
+
*
|
|
44
|
+
* No cambia lo que se REPORTA en un proyecto cloud (ya no salía), y en uno offline alinea
|
|
45
|
+
* las dos vistas: `sesionGit.ts` ya excluye `.xonecode` de sus diffs a propósito.
|
|
46
|
+
*/
|
|
47
|
+
export async function sacarXonecodeDelIndice(ejecutar, raiz, indice) {
|
|
48
|
+
await ejecutar("git", ["rm", "-r", "--cached", "--ignore-unmatch", "-q", "--", ".xonecode"], {
|
|
49
|
+
cwd: raiz,
|
|
50
|
+
env: { ...process.env, GIT_INDEX_FILE: indice },
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Traduce la marca de una línea de `git diff --name-status` (la primera letra: `A`, `M`,
|
|
55
|
+
* `D`, `R100`, …) a una de las tres clases de `Cambio`/`CambioLocal`.
|
|
56
|
+
*
|
|
57
|
+
* Esto es la parte que había divergido: `gitSync.ts` mapeaba `T` (cambio de tipo, p.ej.
|
|
58
|
+
* fichero → symlink) a `modificado` pero DESCARTABA en silencio cualquier marca que no
|
|
59
|
+
* reconociera; `instantanea.ts` no mapeaba `T` pero usaba `?? "modificado"` como omisión
|
|
60
|
+
* para lo desconocido. La regla unificada, pensada por caso de uso y no promediada:
|
|
61
|
+
*
|
|
62
|
+
* - `A` es alta limpia (`nuevo`) y `D` es baja limpia (`borrado`): son las dos únicas
|
|
63
|
+
* marcas que hay que distinguir de un cambio de contenido, porque de ellas depende el
|
|
64
|
+
* candado de `planDeSubida` (solo se borra lo que se descargó) y el alta/baja del plan.
|
|
65
|
+
* - CUALQUIER OTRA MARCA —`M`, `R`, `C`, `T`, o una que git añada mañana y que hoy no
|
|
66
|
+
* conocemos— se trata como `modificado`. Para `instantanea.ts` (la foto del ANTES: solo
|
|
67
|
+
* alimenta el deshacer y el diff que lee el modelo) tratar de más como "cambiado" cuesta,
|
|
68
|
+
* como mucho, una línea de diff rara. Para `gitSync.ts` (el plan de subida) la alternativa
|
|
69
|
+
* —descartar la línea, que es lo que hacía antes— es el peor fallo posible: una marca
|
|
70
|
+
* perdida es un fichero que ni sube ni se borra en CloudStudio, y nada avisa de ello. Entre
|
|
71
|
+
* "invisible por defecto" y "visible por defecto", esto último es lo seguro en los dos
|
|
72
|
+
* sitios, así que gana en los dos. `T` en concreto sigue el mismo criterio: es un cambio
|
|
73
|
+
* de contenido (el fichero pasó de ser una cosa a ser otra), no un alta ni una baja.
|
|
74
|
+
*/
|
|
75
|
+
export function claseDeCambio(marca) {
|
|
76
|
+
const letra = marca.charAt(0);
|
|
77
|
+
if (letra === "A")
|
|
78
|
+
return "nuevo";
|
|
79
|
+
if (letra === "D")
|
|
80
|
+
return "borrado";
|
|
81
|
+
return "modificado";
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/agent/git.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,QAAQ,GAAG,CAAC,CAAC,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACxG,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAA8G,EAC9G,IAAY,EACZ,MAAc;IAEd,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE;QAC3F,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IAClC,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IACpC,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El git local como libro de cuentas de la sincronización.
|
|
3
|
+
*
|
|
4
|
+
* La idea entera: CloudStudio se declara como un remoto SIN servidor git detrás, y su
|
|
5
|
+
* estado vive en una ref de seguimiento. Así `git status` responde «¿está subido?» sin
|
|
6
|
+
* que xonecode invente un fichero de estado — y dos fuentes de verdad para lo mismo es
|
|
7
|
+
* como se rompe esto a los tres meses.
|
|
8
|
+
*/
|
|
9
|
+
import { execFile } from "node:child_process";
|
|
10
|
+
import { promisify } from "node:util";
|
|
11
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync } from "node:fs";
|
|
12
|
+
import { basename, dirname, resolve } from "node:path";
|
|
13
|
+
import { indicePrivado, claseDeCambio } from "./git.js";
|
|
14
|
+
import { NOMBRE_CARPETA } from "./configEnDisco.js";
|
|
15
|
+
import { selloDeSesion } from "./sesionGit.js";
|
|
16
|
+
const ejecutar = promisify(execFile);
|
|
17
|
+
export const REMOTO = "cloudstudio";
|
|
18
|
+
const EXCLUSION = `${NOMBRE_CARPETA}/`;
|
|
19
|
+
const git = (raiz, args, env) => ejecutar("git", args, { cwd: raiz, env: env ?? process.env, maxBuffer: 32 * 1024 * 1024 });
|
|
20
|
+
async function esRepo(raiz) {
|
|
21
|
+
try {
|
|
22
|
+
const { stdout } = await git(raiz, ["rev-parse", "--is-inside-work-tree"]);
|
|
23
|
+
return stdout.trim() === "true";
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Dónde vive de VERDAD el `info/exclude` de este repo.
|
|
31
|
+
*
|
|
32
|
+
* `join(raiz, ".git", "info", "exclude")` da por hecho dos cosas falsas: que el proyecto
|
|
33
|
+
* es la raíz del repo (con `outer/` repo y `outer/app/` proyecto, crea un `.git` fantasma
|
|
34
|
+
* en `outer/app/` y la exclusión se escribe donde git no la lee jamás) y que `.git` es un
|
|
35
|
+
* directorio (en un worktree de git es un FICHERO, y el `mkdirSync` revienta con ENOTDIR
|
|
36
|
+
* DESPUÉS de que el ZIP ya escribió el disco). `--git-path` resuelve las dos: en un
|
|
37
|
+
* worktree apunta al `info/` del directorio común, que es donde git lo lee.
|
|
38
|
+
*
|
|
39
|
+
* La salida puede venir relativa al cwd (que es `raiz`) o absoluta; `resolve` cubre ambas.
|
|
40
|
+
*/
|
|
41
|
+
async function rutaDeExclusion(raiz) {
|
|
42
|
+
const { stdout } = await git(raiz, ["rev-parse", "--git-path", "info/exclude"]);
|
|
43
|
+
return resolve(raiz, stdout.trim());
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* El prefijo del proyecto dentro del repo (`app/`), o `""` si el proyecto ES la raíz.
|
|
47
|
+
*
|
|
48
|
+
* Mismo patrón que `agent/instantanea.ts#porArbol`, que ya resolvía exactamente esto: git
|
|
49
|
+
* habla en rutas relativas a la raíz del REPO y el resto de xonecode (el manifiesto, los
|
|
50
|
+
* `descargados` del ZIP, el `join(raiz, ruta)` de la subida) habla en rutas relativas al
|
|
51
|
+
* PROYECTO. Sin recortar, `subida.ts` compone `outer/app/app/app.xml` y falla en cada
|
|
52
|
+
* fichero, y el candado de borrado no reconoce ni una ruta.
|
|
53
|
+
*
|
|
54
|
+
* No se detecta el caso comparando `--show-toplevel` con `raiz`: en macOS un temporal es
|
|
55
|
+
* `/var/folders/…` y git devuelve el realpath `/private/var/…`, así que la comparación de
|
|
56
|
+
* cadenas mentiría. El prefijo vacío ES la respuesta a «¿soy la raíz?».
|
|
57
|
+
*/
|
|
58
|
+
async function prefijoDelProyecto(raiz) {
|
|
59
|
+
const { stdout } = await git(raiz, ["rev-parse", "--show-prefix"]);
|
|
60
|
+
return stdout.trim();
|
|
61
|
+
}
|
|
62
|
+
/** Quita el prefijo del repo: las rutas se leen desde el proyecto, como en todo lo demás. */
|
|
63
|
+
const recortar = (prefijo, ruta) => prefijo !== "" && ruta.startsWith(prefijo) ? ruta.slice(prefijo.length) : ruta;
|
|
64
|
+
/**
|
|
65
|
+
* El valor EFECTIVO de una clave de configuración, o `undefined` si no la tiene nadie.
|
|
66
|
+
*
|
|
67
|
+
* `git config --get` sale con código 1 cuando la clave no existe, y `execFile` convierte
|
|
68
|
+
* eso en una excepción: sin este envoltorio, «no está puesta» sería un error.
|
|
69
|
+
*
|
|
70
|
+
* Se mira el valor efectivo (repo + global + sistema), no solo el `--local`: al usuario
|
|
71
|
+
* le importa lo que git hace de verdad en esa carpeta, no en qué fichero está escrito.
|
|
72
|
+
*/
|
|
73
|
+
async function valorDeConfig(raiz, clave) {
|
|
74
|
+
try {
|
|
75
|
+
const { stdout } = await git(raiz, ["config", "--get", clave]);
|
|
76
|
+
const valor = stdout.trim();
|
|
77
|
+
return valor === "" ? undefined : valor;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Deja el repo listo tras una descarga: repo, exclusiones, remoto y baseline.
|
|
85
|
+
*
|
|
86
|
+
* El commit de baseline se construye con índice privado para no tocar el staging del
|
|
87
|
+
* usuario, que puede tener trabajo a medias cuando hace un `/sync`.
|
|
88
|
+
*
|
|
89
|
+
* **En un repo PREEXISTENTE la configuración es suya, no nuestra.** Se cuida su índice
|
|
90
|
+
* con esmero (`indicePrivado`, la guarda antes del `reset --mixed`) y pisarle la config
|
|
91
|
+
* sin la misma guarda sería incoherente: un repo con `origin` en GitHub acababa con su
|
|
92
|
+
* rama apuntando a un remoto `cloudstudio://` que no es ningún servidor git, y su
|
|
93
|
+
* `git push` dejaba de funcionar. Las claves que ya tienen valor se respetan y se DICE
|
|
94
|
+
* cuáles se omitieron: un aviso que no se da es un cambio invisible en el repo de otro.
|
|
95
|
+
*/
|
|
96
|
+
/**
|
|
97
|
+
* Lo que este repo no tiene que ver: la carpeta del harness y la basura del sistema.
|
|
98
|
+
*
|
|
99
|
+
* **Va en `info/exclude` y NUNCA en `.gitignore`**, y no es una preferencia: `.gitignore` es
|
|
100
|
+
* un fichero del PROYECTO, así que el plan de subida lo vería como una alta y acabaría
|
|
101
|
+
* dentro de la app XOne del cliente. `info/exclude` es local del repo y no viaja a ninguna
|
|
102
|
+
* parte.
|
|
103
|
+
*
|
|
104
|
+
* Dos grupos:
|
|
105
|
+
* - **`.xonecode/`**, donde escribe el propio harness. La exclusión se ancla al PROYECTO: en
|
|
106
|
+
* un repo mayor, `.xonecode/` a secas excluiría también el de cualquier otro subdirectorio
|
|
107
|
+
* del usuario. La `/` inicial es relativa a la raíz del repo, que es donde git lo lee.
|
|
108
|
+
* - **La basura del SO**, que sí va sin anclar —un `.DS_Store` es basura esté donde esté— y
|
|
109
|
+
* que entró aquí midiendo: sin ella, el `git add -A` de `commitDeTurno` se la tragaba, y
|
|
110
|
+
* como `cambiosPendientes` compara la ref remota contra el árbol, el fichero del Finder
|
|
111
|
+
* salía en el plan de `/sync subir` como una alta y `subida.ts` lo habría escrito en la app
|
|
112
|
+
* del cliente. De paso arregla la otra mitad: hasta ahora un `.DS_Store` suelto bastaba
|
|
113
|
+
* para que la guarda de árbol limpio se negara a subir.
|
|
114
|
+
*
|
|
115
|
+
* Es idempotente y **solo AÑADE lo que falte**, línea a línea: el fichero puede tener
|
|
116
|
+
* patrones del usuario y de una versión anterior de esto.
|
|
117
|
+
*/
|
|
118
|
+
export async function asegurarExclusiones(raiz) {
|
|
119
|
+
const exclude = await rutaDeExclusion(raiz);
|
|
120
|
+
const prefijo = await prefijoDelProyecto(raiz);
|
|
121
|
+
mkdirSync(dirname(exclude), { recursive: true });
|
|
122
|
+
const actual = existsSync(exclude) ? readFileSync(exclude, "utf8") : "";
|
|
123
|
+
const patrones = [`/${prefijo}${EXCLUSION}`, ...BASURA_DEL_SO];
|
|
124
|
+
const lineas = new Set(actual.split("\n").map((l) => l.trim()));
|
|
125
|
+
const faltan = patrones.filter((p) => !lineas.has(p));
|
|
126
|
+
if (faltan.length === 0)
|
|
127
|
+
return;
|
|
128
|
+
appendFileSync(exclude, `${actual.endsWith("\n") || actual === "" ? "" : "\n"}${faltan.join("\n")}\n`);
|
|
129
|
+
}
|
|
130
|
+
export async function prepararRepo(raiz, ramaOrigen, informar = () => { }) {
|
|
131
|
+
const yaEraRepo = await esRepo(raiz);
|
|
132
|
+
if (!yaEraRepo) {
|
|
133
|
+
// La rama local se llama como la remota: dos vocabularios para lo mismo confunden.
|
|
134
|
+
await git(raiz, ["init", "-q", "-b", ramaOrigen]);
|
|
135
|
+
}
|
|
136
|
+
await asegurarExclusiones(raiz);
|
|
137
|
+
// `remote.cloudstudio.*` es nuestro propio espacio de nombres: ahí sí se escribe
|
|
138
|
+
// siempre, porque la ref de seguimiento (`refs/remotes/cloudstudio/…`) es el libro de
|
|
139
|
+
// cuentas de xonecode y nadie más lo usa.
|
|
140
|
+
await git(raiz, ["config", `remote.${REMOTO}.url`, `cloudstudio://${ramaOrigen}`]);
|
|
141
|
+
await git(raiz, ["config", `remote.${REMOTO}.fetch`, `+refs/heads/*:refs/remotes/${REMOTO}/*`]);
|
|
142
|
+
// DETRÁS DE ESTE REMOTO NO HAY UN SERVIDOR GIT. La url `cloudstudio://…` existe para que
|
|
143
|
+
// la pareja `branch.<rama>.remote` + la ref le den a `git status` el «ahead/behind»
|
|
144
|
+
// —que es el corazón del diseño: el libro de cuentas es git y no un fichero nuestro—,
|
|
145
|
+
// pero nadie puede hablar ese protocolo. Sin esto, medido, el `git fetch --all` o el
|
|
146
|
+
// `git remote update` del usuario mueren con «remote helper 'cloudstudio' aborted
|
|
147
|
+
// session» (código 128) por culpa de un remoto que le pusimos nosotros. `skipFetchAll`
|
|
148
|
+
// hace que los recorridos de TODOS los remotos se salten este, y deja intacto todo lo
|
|
149
|
+
// demás. Nuestro «fetch» de verdad es `/sync bajar`, no un transporte de git.
|
|
150
|
+
await git(raiz, ["config", `remote.${REMOTO}.skipFetchAll`, "true"]);
|
|
151
|
+
// Estas tres son del USUARIO: `core.autocrlf` gobierna todo su repo y
|
|
152
|
+
// `branch.<rama>.remote`/`.merge` son a dónde empuja su `git push`. En un repo
|
|
153
|
+
// preexistente solo se escriben si no valen ya nada.
|
|
154
|
+
const omitidas = [];
|
|
155
|
+
const fijarSinPisar = async (clave, valor) => {
|
|
156
|
+
if (yaEraRepo) {
|
|
157
|
+
const actual = await valorDeConfig(raiz, clave);
|
|
158
|
+
// Se compara el VALOR, no solo la presencia. Con `actual !== undefined` bastaba con
|
|
159
|
+
// que la clave existiera: a partir del SEGUNDO `/sync bajar` sobre el repo que
|
|
160
|
+
// xonecode acaba de crear, `yaEraRepo` ya es cierto y nuestras propias claves con
|
|
161
|
+
// nuestros propios valores se declaraban «conservadas» — un aviso que salta cuando
|
|
162
|
+
// no ha pasado nada, que es justo lo que enseña a ignorar los avisos.
|
|
163
|
+
if (actual !== undefined && actual !== valor) {
|
|
164
|
+
omitidas.push(`${clave}=${actual}`);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
await git(raiz, ["config", clave, valor]);
|
|
169
|
+
};
|
|
170
|
+
// Sin `core.autocrlf=false`, el texto que vuelve del servidor se normaliza al
|
|
171
|
+
// escribirlo y cada `/sync` produce diffs fantasma — pero si el usuario ya eligió otra
|
|
172
|
+
// cosa, mandan él y su aviso, no nuestra comodidad.
|
|
173
|
+
await fijarSinPisar("core.autocrlf", "false");
|
|
174
|
+
await fijarSinPisar(`branch.${ramaOrigen}.remote`, REMOTO);
|
|
175
|
+
await fijarSinPisar(`branch.${ramaOrigen}.merge`, `refs/heads/${ramaOrigen}`);
|
|
176
|
+
if (omitidas.length > 0) {
|
|
177
|
+
informar(`se conserva tu configuración de git y no se toca: ${omitidas.join(", ")}. ` +
|
|
178
|
+
`El seguimiento de CloudStudio vive igualmente en refs/remotes/${REMOTO}/${ramaOrigen}\n`);
|
|
179
|
+
}
|
|
180
|
+
const idx = indicePrivado("sync");
|
|
181
|
+
try {
|
|
182
|
+
const env = { ...process.env, GIT_INDEX_FILE: idx.ruta };
|
|
183
|
+
await git(raiz, ["add", "-A", "--", "."], env);
|
|
184
|
+
const { stdout: arbol } = await git(raiz, ["write-tree"], env);
|
|
185
|
+
const { stdout: commit } = await git(raiz, [
|
|
186
|
+
"-c", "user.email=xonecode@local", "-c", "user.name=xonecode",
|
|
187
|
+
"commit-tree", arbol.trim(), "-m", `estado de CloudStudio (${ramaOrigen})`,
|
|
188
|
+
], env);
|
|
189
|
+
const sha = commit.trim();
|
|
190
|
+
await git(raiz, ["update-ref", "-m", "sync: descarga inicial", `refs/remotes/${REMOTO}/${ramaOrigen}`, sha]);
|
|
191
|
+
// Si la rama local aún no tiene commits, el baseline ES su primer commit: así el
|
|
192
|
+
// usuario parte de un árbol limpio en vez de con todo el proyecto sin commitear.
|
|
193
|
+
try {
|
|
194
|
+
await git(raiz, ["rev-parse", "--verify", "HEAD"]);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// OJO: `git reset --mixed` sin pathspec sustituye el índice REAL entero por el árbol
|
|
198
|
+
// del commit — no se puede acotar a rutas. Si el usuario ya tenía algo en staging
|
|
199
|
+
// (posible: un repo sin commits que él mismo inició antes del primer `/sync`), ese
|
|
200
|
+
// reset se lo comería. `git diff --cached` funciona con HEAD sin nacer (compara
|
|
201
|
+
// contra el árbol vacío), así que sirve para saber si el índice real está intacto
|
|
202
|
+
// ANTES de tocar nada. Solo con el índice vacío es seguro dejarlo apuntando al
|
|
203
|
+
// baseline; si no, se prioriza no tocar el índice del usuario sobre la comodidad
|
|
204
|
+
// de empezar con un árbol limpio.
|
|
205
|
+
const { stdout: enStaging } = await git(raiz, ["diff", "--cached", "--name-only"]);
|
|
206
|
+
if (enStaging.trim() === "") {
|
|
207
|
+
await git(raiz, ["update-ref", "-m", "sync: descarga inicial", `refs/heads/${ramaOrigen}`, sha]);
|
|
208
|
+
await git(raiz, ["reset", "-q", "--mixed"]);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return sha;
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
idx.limpiar();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Lo que hay en local y no está subido: el diff contra la ref de seguimiento de LA rama,
|
|
219
|
+
* `refs/remotes/cloudstudio/<rama>`.
|
|
220
|
+
*
|
|
221
|
+
* Una sola rama, en los dos sentidos: se baja de `config.rama` y se sube a `config.rama`.
|
|
222
|
+
* Hubo una rama de trabajo (`xonecode/<origen>`, con su propia ref y su `crearRama` en el
|
|
223
|
+
* servidor) para no escribir en la rama que el cliente tiene abierta en Studio; el precio
|
|
224
|
+
* era que lo que se subía vivía en un sitio que nadie mira, y la rama del proyecto se
|
|
225
|
+
* quedaba quieta. Lo que se pide es aplicar cambios y subirlos a la rama de la que se bajó
|
|
226
|
+
* el proyecto, así que la ref es UNA — y `prepararRepo` la escribe en cada bajada (y en el
|
|
227
|
+
* alta), que es justo el estado con el que se compara esto.
|
|
228
|
+
*/
|
|
229
|
+
export async function cambiosPendientes(raiz, rama) {
|
|
230
|
+
// Las rutas del diff vienen relativas a la RAÍZ DEL REPO. Si el proyecto es un
|
|
231
|
+
// subdirectorio, hay que recortar el prefijo o `subida.ts` compone `raiz/app/app.xml`
|
|
232
|
+
// (ENOENT) y ninguna ruta casa con `descargados`, que son relativas al proyecto.
|
|
233
|
+
const prefijo = await prefijoDelProyecto(raiz);
|
|
234
|
+
// `core.quotePath` (por omisión `true`) escapa a octal cualquier byte >= 0x80: una
|
|
235
|
+
// ruta como «ñu.xne» saldría como `"\303\261u.xne"`. El candado de `planDeSubida`
|
|
236
|
+
// compara estas rutas, tal cual, contra las de `descargados` (que SÍ vienen en UTF-8
|
|
237
|
+
// sin comillas, de `extraerZipBase64`/el manifiesto) — con la ruta citada nunca
|
|
238
|
+
// coinciden, y un proyecto XOne en castellano tiene nombres así a diario.
|
|
239
|
+
const { stdout } = await git(raiz, [
|
|
240
|
+
"-c", "core.quotePath=false",
|
|
241
|
+
// Sin `--no-renames`, un `A.xne` → `B.xne` sale como una sola línea `R100 A.xne
|
|
242
|
+
// B.xne` y este parser solo se queda con el destino (`resto[resto.length - 1]`):
|
|
243
|
+
// `B` sube y `A` se queda vivo en Studio para siempre, como colección huérfana, sin
|
|
244
|
+
// ningún aviso. Forzando borrado + alta por separado, el borrado de `A` SÍ pasa por
|
|
245
|
+
// el candado (estaba en `descargados`, así que se emite) y `B` sube como alta.
|
|
246
|
+
"diff", "--no-renames", "--name-status", `refs/remotes/${REMOTO}/${rama}`, "--", ".",
|
|
247
|
+
]);
|
|
248
|
+
return stdout
|
|
249
|
+
.split("\n")
|
|
250
|
+
.filter((linea) => linea.trim() !== "")
|
|
251
|
+
.flatMap((linea) => {
|
|
252
|
+
const [marca, ...resto] = linea.split("\t");
|
|
253
|
+
const ruta = resto[resto.length - 1];
|
|
254
|
+
// `claseDeCambio` nunca devuelve `undefined` (ver `agent/git.ts`): una marca que no
|
|
255
|
+
// reconocemos también se cuenta, nunca se pierde en silencio del plan de subida.
|
|
256
|
+
return ruta === undefined ? [] : [{ clase: claseDeCambio(marca), ruta: recortar(prefijo, ruta) }];
|
|
257
|
+
})
|
|
258
|
+
.sort((a, b) => a.ruta.localeCompare(b.ruta));
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* «Simular el push»: mover la ref. Solo se llama cuando la subida terminó ENTERA.
|
|
262
|
+
*
|
|
263
|
+
* Se mueve la ref de la rama a la que se escribió, que ahora es la MISMA de la que se
|
|
264
|
+
* bajó (`refs/remotes/cloudstudio/<rama>`), así que «lo que falta por subir» se mide
|
|
265
|
+
* siempre contra lo último que consta arriba y el libro de cuentas llama a las cosas por
|
|
266
|
+
* el nombre que tienen en el servidor.
|
|
267
|
+
*/
|
|
268
|
+
export async function marcarSubido(raiz, rama, mensaje) {
|
|
269
|
+
const { stdout } = await git(raiz, ["rev-parse", "HEAD"]);
|
|
270
|
+
await git(raiz, ["update-ref", "-m", mensaje, `refs/remotes/${REMOTO}/${rama}`, stdout.trim()]);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* ¿Hay cambios sin commitear?
|
|
274
|
+
*
|
|
275
|
+
* Lo exigen las DOS direcciones, por motivos distintos: subir sube el estado de un commit
|
|
276
|
+
* (no un borrador), y bajar SOBRESCRIBE el disco con lo que venga del servidor — sin
|
|
277
|
+
* commit debajo, el trabajo local no se recupera de ninguna forma.
|
|
278
|
+
*
|
|
279
|
+
* `.xonecode/` no cuenta nunca. En el alta, la config del proyecto se escribe ANTES de la
|
|
280
|
+
* primera descarga y `prepararRepo` (que es quien pone la exclusión en `info/exclude`)
|
|
281
|
+
* corre DESPUÉS: sin este `:(exclude)`, la propia alta se bloquearía a sí misma en
|
|
282
|
+
* cualquier repo preexistente. Y la carpeta del harness no sube ni baja jamás.
|
|
283
|
+
*
|
|
284
|
+
* **Sin repo** no hay `git status` que valer: se responde por el contenido. Una carpeta
|
|
285
|
+
* vacía (salvo `.xonecode/` y la basura del sistema operativo) es el alta normal y se deja
|
|
286
|
+
* pasar; una con ficheros dentro y sin git es justo el caso sin red de seguridad —nada que
|
|
287
|
+
* recuperar tras sobrescribir—, así que se declara sucia.
|
|
288
|
+
*/
|
|
289
|
+
export async function arbolLimpio(raiz) {
|
|
290
|
+
return (await sinCommitear(raiz)).length === 0;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Ficheros que pone el SISTEMA OPERATIVO, no el usuario.
|
|
294
|
+
*
|
|
295
|
+
* Sin repo, `sinCommitear` responde por el contenido de la carpeta, y en macOS —la
|
|
296
|
+
* plataforma de este repo— una carpeta vacía que se ha abierto una vez en el Finder tiene
|
|
297
|
+
* un `.DS_Store` dentro. Contarlo bloqueaba el alta entera («hay trabajo local sin
|
|
298
|
+
* commitear (.DS_Store)») sin salida posible desde xonecode, porque `/sync bajar` lleva la
|
|
299
|
+
* misma guarda: se arreglaba un riesgo real y se rompía el camino feliz.
|
|
300
|
+
*
|
|
301
|
+
* Es una LISTA CERRADA y no «ignora los ocultos» a propósito: un `.env` o un `.gitignore`
|
|
302
|
+
* son trabajo del usuario, y sobrescribirlos sin red de seguridad es exactamente lo que la
|
|
303
|
+
* guarda existe para impedir. Estos tres no son contenido de ningún proyecto y aparecen
|
|
304
|
+
* solo por abrir la carpeta.
|
|
305
|
+
*/
|
|
306
|
+
export const BASURA_DEL_SO = [".DS_Store", "Thumbs.db", "desktop.ini"];
|
|
307
|
+
const esBasuraDelSO = (entrada) => BASURA_DEL_SO.includes(entrada);
|
|
308
|
+
/**
|
|
309
|
+
* QUÉ está sin commitear, para poder decirlo. Es la misma pregunta que `arbolLimpio`
|
|
310
|
+
* —de hecho aquélla se responde con ésta, para que no haya dos criterios de «limpio»—,
|
|
311
|
+
* y no la misma que `cambiosPendientes`: aquélla es «qué falta por SUBIR» (diff contra la
|
|
312
|
+
* ref de seguimiento) y ésta es «qué falta por COMMITEAR».
|
|
313
|
+
*/
|
|
314
|
+
export async function sinCommitear(raiz) {
|
|
315
|
+
if (!(await esRepo(raiz))) {
|
|
316
|
+
return readdirSync(raiz)
|
|
317
|
+
.filter((entrada) => entrada !== NOMBRE_CARPETA && entrada !== ".git" && !esBasuraDelSO(entrada))
|
|
318
|
+
.sort();
|
|
319
|
+
}
|
|
320
|
+
return sinCommitearEnRepo(raiz);
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* El `git status` de un repo, ya sabiendo que lo es. Un fallo aquí SUBE: quien pregunta
|
|
324
|
+
* por esta rama es la guarda de `/sync`, y ahí «no pude mirar» no puede leerse como
|
|
325
|
+
* «adelante» — bajar sobrescribe el disco.
|
|
326
|
+
*
|
|
327
|
+
* `unoAUno` es la única diferencia entre las dos preguntas que pasan por aquí. Por omisión
|
|
328
|
+
* git COLAPSA una carpeta entera sin rastrear en una sola línea («doc/»), que para una
|
|
329
|
+
* guarda es suficiente —lo que decide es si hay algo—, pero para el AVISO no: con la
|
|
330
|
+
* carpeta colapsada, un `doc/` que dentro solo tiene un `.DS_Store` no se puede reconocer
|
|
331
|
+
* como basura, y además «doc/» le dice a quien lo lee mucho menos que «doc/NOTA-DEMO.md».
|
|
332
|
+
* El volumen lo sujetan el tope de nombres y el total, que van al lado.
|
|
333
|
+
*/
|
|
334
|
+
async function sinCommitearEnRepo(raiz, unoAUno = false) {
|
|
335
|
+
const prefijo = await prefijoDelProyecto(raiz);
|
|
336
|
+
const { stdout } = await git(raiz, [
|
|
337
|
+
// Mismo motivo que en `cambiosPendientes`: un nombre en castellano saldría citado en
|
|
338
|
+
// octal y el mensaje al usuario sería ilegible.
|
|
339
|
+
"-c", "core.quotePath=false",
|
|
340
|
+
"status", "--porcelain", ...(unoAUno ? ["--untracked-files=all"] : []),
|
|
341
|
+
"--", ".", `:(exclude)${NOMBRE_CARPETA}`,
|
|
342
|
+
]);
|
|
343
|
+
return stdout
|
|
344
|
+
.split("\n")
|
|
345
|
+
.filter((linea) => linea.trim() !== "")
|
|
346
|
+
// `XY ruta`: dos caracteres de estado y un espacio.
|
|
347
|
+
.map((linea) => recortar(prefijo, linea.slice(3).trim()))
|
|
348
|
+
.sort();
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* El trabajo de un turno, commiteado en la rama.
|
|
352
|
+
*
|
|
353
|
+
* Existe porque sin él nada se commitea nunca: `prepararRepo` hace UN commit de baseline al
|
|
354
|
+
* descargar y ahí se acaba, así que el árbol se ensucia y no se limpia jamás. Dos
|
|
355
|
+
* consecuencias, y la segunda es la que aprieta: las sesiones se mezclan sin que nada pueda
|
|
356
|
+
* atribuir ni revertir lo de cada una, y **`/sync subir` se vuelve inalcanzable** — su guarda
|
|
357
|
+
* exige árbol limpio, así que después de cualquier trabajo del agente se niega para siempre.
|
|
358
|
+
*
|
|
359
|
+
* Cuatro decisiones:
|
|
360
|
+
* - **Con el índice DE VERDAD, no con el privado de `arbolDeAhora`.** Aquél existe para una
|
|
361
|
+
* foto de solo lectura que no puede tocar el staging del usuario; esto es lo contrario. Si
|
|
362
|
+
* el índice no queda igualado con el commit, `git status` enseña reversiones fantasma y
|
|
363
|
+
* `trabajoSinCommitear` reporta suciedad que no existe.
|
|
364
|
+
* - **`.xonecode/` fuera**, con el `rm --cached` de siempre y no con un pathspec de
|
|
365
|
+
* exclusión: `git add` con `:(exclude).xonecode` en un repo donde ya está ignorado avisa y
|
|
366
|
+
* **sale con código 1** (medido, ver `arbolDeAhora`).
|
|
367
|
+
* - **Sin cambios no se commitea**, y no es higiene: `git commit` con el índice vacío sale
|
|
368
|
+
* con error, así que el camino MÁS común —un turno de conversación— sería un fallo tragado.
|
|
369
|
+
* - **La identidad es NUESTRA y va por `-c`**, como la del baseline: el commit lo hizo el
|
|
370
|
+
* harness, no la persona, y por `-c` no se le escribe nada al `config` de su repo.
|
|
371
|
+
*
|
|
372
|
+
* Lo que el mensaje NO puede decir es «lo escribió el agente»: esto barre todo lo que haya
|
|
373
|
+
* cambiado, incluido lo que tocara una persona a mano en esa carpeta durante el turno. Es la
|
|
374
|
+
* misma honestidad que separa `autorizadas` de «aplicados».
|
|
375
|
+
*/
|
|
376
|
+
export async function commitDeTurno(raiz, mensaje, sesion) {
|
|
377
|
+
try {
|
|
378
|
+
if (!(await esRepo(raiz)))
|
|
379
|
+
return { via: "sin-git" };
|
|
380
|
+
// ANTES de mirar y de añadir: un repo bajado con una versión anterior no tiene en su
|
|
381
|
+
// `info/exclude` la basura del SO, y sin ella el `add -A` se la traga y acaba SUBIDA a
|
|
382
|
+
// la app del cliente (medido sobre una copia del proyecto real). Es idempotente.
|
|
383
|
+
await asegurarExclusiones(raiz);
|
|
384
|
+
const cambiados = await sinCommitearEnRepo(raiz);
|
|
385
|
+
if (cambiados.length === 0)
|
|
386
|
+
return { via: "sin-cambios" };
|
|
387
|
+
await git(raiz, ["add", "-A", "--", "."]);
|
|
388
|
+
await git(raiz, ["rm", "-r", "--cached", "--ignore-unmatch", "-q", NOMBRE_CARPETA]);
|
|
389
|
+
// El SELLO va en un trailer, y es lo que permite atribuir un cambio a una sesión
|
|
390
|
+
// (`sesionGit.ts#cambiosDeSesion`). El formato lo pone `selloDeSesion` y no este
|
|
391
|
+
// fichero: quien lo escribe y quien lo lee tienen que ser el mismo, o la atribución se
|
|
392
|
+
// rompe sin que nada avise. Sin id —o con uno que no vale como argumento de git— se
|
|
393
|
+
// commitea igual: perder el commit del turno sería mucho peor que perder su sello, y
|
|
394
|
+
// esa sesión se cae al respaldo «desde-apertura», que dice lo que es.
|
|
395
|
+
const sello = sesion === undefined ? undefined : selloDeSesion(sesion);
|
|
396
|
+
await git(raiz, [
|
|
397
|
+
"-c", "user.email=xonecode@local", "-c", "user.name=xonecode",
|
|
398
|
+
"commit", "-q", "-m", mensaje, ...(sello === undefined ? [] : ["-m", sello]),
|
|
399
|
+
]);
|
|
400
|
+
return { via: "commit", ficheros: cambiados.length };
|
|
401
|
+
}
|
|
402
|
+
catch (error) {
|
|
403
|
+
// El mensaje de git, acotado: de aquí sale un aviso que se lee en el transcript.
|
|
404
|
+
return { via: "fallo", motivo: error.message.split("\n")[0] ?? "git falló" };
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* ¿Había trabajo de alguien sin commitear cuando llegaste? La misma medida que
|
|
409
|
+
* `sinCommitear` —mismo `git status`, misma exclusión de `.xonecode/`, mismo
|
|
410
|
+
* `core.quotePath`— con OTRA política ante lo que no se puede mirar, porque la pregunta
|
|
411
|
+
* es otra.
|
|
412
|
+
*
|
|
413
|
+
* `sinCommitear` sostiene una guarda: sin git no hay nada que recuperar tras sobrescribir,
|
|
414
|
+
* así que declara la carpeta sucia y bloquea, y un git roto LANZA para que `/sync` pare.
|
|
415
|
+
* Esto sostiene un AVISO, y un aviso que no se puede sostener no se da: sin repo, o con un
|
|
416
|
+
* git que revienta, se responde `sin-git` y arriba no se pinta nada. Todo proyecto OFFLINE
|
|
417
|
+
* es una carpeta sin git —`prepararRepo` solo corre al descargar—, así que la política de
|
|
418
|
+
* la otra pondría un aviso en cada apertura de cada proyecto offline: el aviso que enseña
|
|
419
|
+
* a ignorar los avisos.
|
|
420
|
+
*
|
|
421
|
+
* No lanza NUNCA: de esto cuelga el mensaje de alta de la consola web, que se emite en los
|
|
422
|
+
* dos flancos de cada turno.
|
|
423
|
+
*/
|
|
424
|
+
export async function trabajoSinCommitear(raiz) {
|
|
425
|
+
try {
|
|
426
|
+
if (!(await esRepo(raiz)))
|
|
427
|
+
return { via: "sin-git" };
|
|
428
|
+
const ficheros = await sinCommitearEnRepo(raiz, true);
|
|
429
|
+
// La basura del SO se quita también DENTRO de un repo, y aquí solo aquí: medido contra
|
|
430
|
+
// los proyectos reales del usuario, uno tenía exactamente UN fichero sin commitear y
|
|
431
|
+
// era un `.DS_Store`, o sea que el aviso habría saltado para decir que alguien abrió
|
|
432
|
+
// la carpeta en el Finder. `prepararRepo` solo excluye `.xonecode/`, así que en un repo
|
|
433
|
+
// `git status` los nombra. Es el mismo argumento —y la misma lista CERRADA— que la
|
|
434
|
+
// rama sin repo ya usaba; `sinCommitear` no lo hereda porque sostiene otra cosa.
|
|
435
|
+
return { via: "git", ficheros: ficheros.filter((f) => !esBasuraDelSO(basename(f))) };
|
|
436
|
+
}
|
|
437
|
+
catch {
|
|
438
|
+
return { via: "sin-git" };
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=gitSync.js.map
|