xonecode 0.3.0 → 0.5.1
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 +50 -8
- package/THIRD_PARTY_NOTICES.md +160 -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/sqliteSaver.js +389 -0
- package/dist/vendor/sqliteSaver.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 +33 -9
- 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
|
@@ -10,25 +10,35 @@
|
|
|
10
10
|
* Los nombres de campo son los de las tools de fichero de deepagents, verificados
|
|
11
11
|
* contra su dist (`file_path` con `path` normalizado, `pattern` en glob/grep).
|
|
12
12
|
*/
|
|
13
|
-
/** El único campo permitido de cada tool. Sin entrada: nada sale. */
|
|
14
|
-
const CAMPO_SEGURO = {
|
|
15
|
-
read_file: "file_path",
|
|
16
|
-
write_file: "file_path",
|
|
17
|
-
edit_file: "file_path",
|
|
18
|
-
ls: "path",
|
|
19
|
-
glob: "pattern",
|
|
20
|
-
grep: "pattern",
|
|
21
|
-
};
|
|
22
13
|
/**
|
|
23
|
-
*
|
|
14
|
+
* Campos permitidos por tool. Es una lista blanca deliberada: ni `content`,
|
|
15
|
+
* ni `old_string`/`new_string`, ni la descripción de `task` llegan a disco.
|
|
24
16
|
*
|
|
25
|
-
* Los
|
|
26
|
-
*
|
|
17
|
+
* Los parámetros de paginación y acotación son justo los que necesitamos para
|
|
18
|
+
* detectar una lectura masiva o una búsqueda mal afinada.
|
|
27
19
|
*/
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
20
|
+
const CAMPOS_SEGUROS = {
|
|
21
|
+
read_file: ["file_path", "offset", "limit"],
|
|
22
|
+
write_file: ["file_path"],
|
|
23
|
+
edit_file: ["file_path"],
|
|
24
|
+
ls: ["path"],
|
|
25
|
+
glob: ["pattern", "path"],
|
|
26
|
+
grep: ["pattern", "path", "glob", "max_count", "output_mode"],
|
|
27
|
+
regex_search: ["pattern", "path", "glob", "flags", "max_count"],
|
|
28
|
+
/**
|
|
29
|
+
* De `task` sale el NOMBRE del especialista y nada más — nunca su `description`, que es
|
|
30
|
+
* el encargo entero y puede llevar contenido del proyecto dentro (por eso la cabecera de
|
|
31
|
+
* este fichero ya la nombraba como el ejemplo de lo que NO sale).
|
|
32
|
+
*
|
|
33
|
+
* El nombre sí puede: es el de un fichero que escribió el usuario, ya se pinta en Ajustes
|
|
34
|
+
* y ya viaja como `origen` en cada petición de aprobación. Y hace falta: medido en la
|
|
35
|
+
* pantalla del usuario, la línea decía «⚙ task» a secas, así que con un motor externo no
|
|
36
|
+
* había NADA en la interfaz que dijera a quién se delegó — y un hijo de Claude Code son
|
|
37
|
+
* minutos en otro proceso, sin una sola tool que cruce.
|
|
38
|
+
*/
|
|
39
|
+
task: ["subagent_type"],
|
|
40
|
+
};
|
|
41
|
+
function objetoDeArgs(args) {
|
|
32
42
|
let objeto = args;
|
|
33
43
|
if (typeof args === "string") {
|
|
34
44
|
try {
|
|
@@ -38,9 +48,45 @@ export function detalleDe(nombre, args) {
|
|
|
38
48
|
return undefined;
|
|
39
49
|
}
|
|
40
50
|
}
|
|
41
|
-
|
|
51
|
+
return objeto && typeof objeto === "object" && !Array.isArray(objeto)
|
|
52
|
+
? objeto
|
|
53
|
+
: undefined;
|
|
54
|
+
}
|
|
55
|
+
/** Argumentos acotados y seguros para la traza opt-in de diagnóstico. */
|
|
56
|
+
export function parametrosDe(nombre, args) {
|
|
57
|
+
const campos = CAMPOS_SEGUROS[nombre];
|
|
58
|
+
const objeto = objetoDeArgs(args);
|
|
59
|
+
if (campos === undefined || objeto === undefined)
|
|
60
|
+
return undefined;
|
|
61
|
+
const salida = {};
|
|
62
|
+
for (const campo of campos) {
|
|
63
|
+
const valor = objeto[campo];
|
|
64
|
+
if (typeof valor === "string" || typeof valor === "number" || typeof valor === "boolean") {
|
|
65
|
+
salida[campo] = valor;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return Object.keys(salida).length > 0 ? salida : undefined;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* El `detalle` de una llamada, o `undefined` si no hay nada permitido que contar.
|
|
72
|
+
*
|
|
73
|
+
* Los argumentos llegan como objeto o como cadena JSON (así viajan en las
|
|
74
|
+
* `tool_calls`); un JSON roto es una tool rota, no una excepción que tumbe el turno.
|
|
75
|
+
*/
|
|
76
|
+
export function detalleDe(nombre, args) {
|
|
77
|
+
const parametros = parametrosDe(nombre, args);
|
|
78
|
+
const campo = nombre === "read_file" || nombre === "write_file" || nombre === "edit_file"
|
|
79
|
+
? "file_path"
|
|
80
|
+
: nombre === "ls"
|
|
81
|
+
? "path"
|
|
82
|
+
: nombre === "glob" || nombre === "grep" || nombre === "regex_search"
|
|
83
|
+
? "pattern"
|
|
84
|
+
: nombre === "task"
|
|
85
|
+
? "subagent_type"
|
|
86
|
+
: undefined;
|
|
87
|
+
if (campo === undefined || parametros === undefined)
|
|
42
88
|
return undefined;
|
|
43
|
-
const valor =
|
|
89
|
+
const valor = parametros[campo];
|
|
44
90
|
// Una cadena vacía no describe nada, y un tipo raro (`file_path: 42`) tampoco:
|
|
45
91
|
// sin detalle es una respuesta válida.
|
|
46
92
|
return typeof valor === "string" && valor !== "" ? valor : undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resumenDeTool.js","sourceRoot":"","sources":["../../src/agent/resumenDeTool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"resumenDeTool.js","sourceRoot":"","sources":["../../src/agent/resumenDeTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qué ficheros ha tocado UNA sesión, con git y sin molestar al usuario.
|
|
3
|
+
*
|
|
4
|
+
* **Por qué una ref y no un tag** (que es lo primero que se le ocurre a cualquiera): un tag
|
|
5
|
+
* es una referencia PÚBLICA y con significado —una versión— que aparece en `git tag`, viaja
|
|
6
|
+
* con `push --tags` y la ve todo el equipo. Una sesión de trabajo no es una versión de nada.
|
|
7
|
+
* Aquí se usa `refs/xonecode/sesion/<id>`: fuera de `refs/heads` y de `refs/tags`, así que
|
|
8
|
+
* ni sale en `git branch`/`git tag` ni se empuja por omisión — la misma familia de truco que
|
|
9
|
+
* ya usa la sincronización con `refs/remotes/cloudstudio/<rama>`, donde la REF es el libro
|
|
10
|
+
* de cuentas y no un fichero nuestro.
|
|
11
|
+
*
|
|
12
|
+
* **Y por qué una ref y no guardar el sha en un JSON**: un árbol al que no apunta ninguna
|
|
13
|
+
* referencia es basura para git, y `git gc` lo borra. El día que eso pasara, la vista de la
|
|
14
|
+
* sesión se quedaría sin el «antes» y no habría forma de saber por qué. La ref es lo que lo
|
|
15
|
+
* mantiene vivo.
|
|
16
|
+
*
|
|
17
|
+
* La comparación es de ÁRBOL contra ÁRBOL, no contra el índice del usuario: se escribe un
|
|
18
|
+
* árbol nuevo con `add -A` sobre un índice PRIVADO (`indicePrivado`, en `tmpdir`) igual que
|
|
19
|
+
* `instantanea.ts`. Medido: `git diff <arbol> -- .` a secas compara contra el índice real, y
|
|
20
|
+
* como en él no hay nada, daba «borrado» para ficheros que están ahí delante.
|
|
21
|
+
*/
|
|
22
|
+
import { execFile } from "node:child_process";
|
|
23
|
+
import { promisify } from "node:util";
|
|
24
|
+
import { claseDeCambio, indicePrivado, sacarXonecodeDelIndice } from "./git.js";
|
|
25
|
+
const ejecutar = promisify(execFile);
|
|
26
|
+
/**
|
|
27
|
+
* El nombre de la ref de una sesión. El id se cuela en un nombre de referencia, así que se
|
|
28
|
+
* acota a lo que git admite sin ambigüedad —letras, cifras, guion, guion bajo y punto— en
|
|
29
|
+
* vez de confiar en que quien llama traiga algo limpio: un id con `..`, con un espacio o
|
|
30
|
+
* empezando por guion no da un error claro, da un `update-ref` que falla raro o, peor, otra
|
|
31
|
+
* ref.
|
|
32
|
+
*/
|
|
33
|
+
export function refDeSesion(id) {
|
|
34
|
+
if (!idAceptable(id))
|
|
35
|
+
return undefined;
|
|
36
|
+
return `refs/xonecode/sesion/${id}`;
|
|
37
|
+
}
|
|
38
|
+
/** La misma criba para la ref y para el sello: los dos meten el id en un argumento de git. */
|
|
39
|
+
function idAceptable(id) {
|
|
40
|
+
return /^[A-Za-z0-9._-]+$/.test(id) && !id.startsWith("-") && !id.includes("..");
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* La clave del sello que `commitDeTurno` escribe en el mensaje y que esta vista lee.
|
|
44
|
+
*
|
|
45
|
+
* Es un TRAILER y no el asunto: el asunto lleva el título de la sesión, que no identifica
|
|
46
|
+
* nada —dos sesiones se llaman «Hola» en el proyecto del usuario ahora mismo— y que además
|
|
47
|
+
* cambia si alguien la renombra. El id sí es estable, y un trailer es el sitio que git tiene
|
|
48
|
+
* para esto: se lee con `%(trailers:key=…)` sin adivinar formato.
|
|
49
|
+
*
|
|
50
|
+
* Vive en este módulo, que es el que lo GREPEA, y `gitSync.ts` lo importa para escribirlo:
|
|
51
|
+
* con el formato en los dos lados, un cambio en uno rompe la atribución del otro en silencio.
|
|
52
|
+
*/
|
|
53
|
+
export const CLAVE_DE_SELLO = "Xonecode-Sesion";
|
|
54
|
+
/** El sello de una sesión, listo para pegar al final de un mensaje de commit. */
|
|
55
|
+
export function selloDeSesion(id) {
|
|
56
|
+
return idAceptable(id) ? `${CLAVE_DE_SELLO}: ${id}` : undefined;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Los commits de una sesión, del más VIEJO al más nuevo, y opcionalmente solo los que tocan
|
|
60
|
+
* una ruta.
|
|
61
|
+
*
|
|
62
|
+
* Dos cosas que no son opcionales:
|
|
63
|
+
* - **`--fixed-strings`**: `--grep` es una expresión regular por omisión, y un id lleva
|
|
64
|
+
* puntos y guiones. Aquí no hay daño posible con un uuid, pero el id llega de fuera de
|
|
65
|
+
* esta función.
|
|
66
|
+
* - **Y el `--grep` NO decide: verifica el TRAILER.** Un grep de texto casa por SUBCADENA,
|
|
67
|
+
* así que el id `abc` casaría con el sello de `abc1` — o con un id citado dentro del
|
|
68
|
+
* cuerpo del mensaje. Se pide el valor del trailer con `%(trailers:key=…,valueonly)` y se
|
|
69
|
+
* compara ENTERO. Es exactamente la misatribución silenciosa que esto viene a quitar.
|
|
70
|
+
*/
|
|
71
|
+
async function commitsDeSesion(raiz, id, ruta) {
|
|
72
|
+
const sello = selloDeSesion(id);
|
|
73
|
+
if (sello === undefined)
|
|
74
|
+
return [];
|
|
75
|
+
// Un repo recién creado no tiene `HEAD`, y ahí `git log` FALLA en vez de no decir nada
|
|
76
|
+
// (medido: es el caso de un proyecto offline al que nadie ha commiteado todavía, y hacía
|
|
77
|
+
// que `parcheDeSesion` devolviera «no hay parche» con el fichero delante). Para esta
|
|
78
|
+
// pregunta las dos cosas son lo mismo: no hay ningún commit sellado.
|
|
79
|
+
let stdout;
|
|
80
|
+
try {
|
|
81
|
+
({ stdout } = await ejecutar("git", [
|
|
82
|
+
"log",
|
|
83
|
+
"--reverse",
|
|
84
|
+
"--no-merges",
|
|
85
|
+
// La coma como separador porque el de omisión es un salto de línea, que partiría
|
|
86
|
+
// las filas de esta salida. Un id no puede llevar comas (`idAceptable`).
|
|
87
|
+
`--format=%H%x09%(trailers:key=${CLAVE_DE_SELLO},valueonly,separator=%x2C)`,
|
|
88
|
+
"--fixed-strings",
|
|
89
|
+
`--grep=${sello}`,
|
|
90
|
+
"HEAD",
|
|
91
|
+
...(ruta === undefined ? [] : ["--", ruta]),
|
|
92
|
+
], { cwd: raiz, maxBuffer: 8 * 1024 * 1024 }));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
const commits = [];
|
|
98
|
+
for (const linea of stdout.split("\n")) {
|
|
99
|
+
const [sha, valores] = linea.split("\t");
|
|
100
|
+
if (sha === undefined || sha === "" || valores === undefined)
|
|
101
|
+
continue;
|
|
102
|
+
if (valores.split(",").some((v) => v.trim() === id))
|
|
103
|
+
commits.push(sha);
|
|
104
|
+
}
|
|
105
|
+
return commits;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* La clase NETA de un fichero al que la sesión tocó en varios commits, de la primera vez a
|
|
109
|
+
* la última. Pura y aparte porque es una decisión, no un detalle del bucle:
|
|
110
|
+
*
|
|
111
|
+
* - creado y luego borrado por la misma sesión → **nada**: no estaba antes y no está ahora,
|
|
112
|
+
* así que una fila de «borrado» afirmaría que la sesión borró algo que nunca existió.
|
|
113
|
+
* - lo último es un borrado → borrado.
|
|
114
|
+
* - lo primero es un alta → nuevo (aunque después lo modificara).
|
|
115
|
+
* - en cualquier otro caso → modificado.
|
|
116
|
+
*/
|
|
117
|
+
export function claseNeta(primera, ultima) {
|
|
118
|
+
if (primera === "nuevo" && ultima === "borrado")
|
|
119
|
+
return undefined;
|
|
120
|
+
if (ultima === "borrado")
|
|
121
|
+
return "borrado";
|
|
122
|
+
if (primera === "nuevo")
|
|
123
|
+
return "nuevo";
|
|
124
|
+
return "modificado";
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Lo que NO cuenta como trabajo de la sesión, en la forma de pathspec de git.
|
|
128
|
+
*
|
|
129
|
+
* `.xonecode/` es nuestro: ahí dentro está el `.jsonl` de la propia sesión, que `volcar()`
|
|
130
|
+
* escribe al final de CADA turno (`web/servidor/vestibulo.ts`). Sin excluirlo, la primera
|
|
131
|
+
* fila de la lista sería el transcript de la sesión diciendo que la sesión lo modificó —un
|
|
132
|
+
* bucle, y encima el fichero que menos interesa. Es la misma regla que ya aplica
|
|
133
|
+
* `arbolLimpio` (`agent/gitSync.ts`), y por el mismo motivo: `.xonecode` es interno, no
|
|
134
|
+
* trabajo del usuario. Se paga que la memoria del proyecto (`.xonecode/memoria.md`), que
|
|
135
|
+
* el agente sí escribe a veces, tampoco salga aquí; es coherente con el resto del repo, que
|
|
136
|
+
* trata esa carpeta entera como interna, y esa escritura pasa igual por su aprobación.
|
|
137
|
+
*
|
|
138
|
+
* No basta con confiar en el `.gitignore` del proyecto: en modo offline sobre un repo del
|
|
139
|
+
* usuario, `prepararRepo` no ha escrito ningún `info/exclude`, y `.gitignore` no se toca
|
|
140
|
+
* nunca porque es un fichero del proyecto.
|
|
141
|
+
*
|
|
142
|
+
* Va en los DIFF y no en el `git add` del árbol; el porqué está donde se escribe el árbol.
|
|
143
|
+
*/
|
|
144
|
+
const FUERA = ":(exclude).xonecode";
|
|
145
|
+
/**
|
|
146
|
+
* Las TRES clases que esta vista sabe contar: creado, modificado y borrado.
|
|
147
|
+
*
|
|
148
|
+
* No es decoración del listado, es una guarda: `claseDeCambio` (`agent/git.ts`) devuelve
|
|
149
|
+
* «modificado» para cualquier letra que no sea `A` ni `D`, así que un cambio de TIPO (`T`,
|
|
150
|
+
* un fichero que pasa a enlace simbólico) o una entrada sin fusionar (`U`) se colarían
|
|
151
|
+
* etiquetados como una modificación normal — una etiqueta falsa, no una lista incompleta.
|
|
152
|
+
* Pidiéndole a git solo `AMD`, lo que llega es exactamente lo que la vista sabe nombrar.
|
|
153
|
+
* Los renombrados ya no aparecen por `--no-renames`, que los parte en borrado + alta.
|
|
154
|
+
*/
|
|
155
|
+
const FILTRO = "--diff-filter=AMD";
|
|
156
|
+
/** El árbol de AHORA, escrito sobre un índice privado. Incluye lo no seguido por git, que
|
|
157
|
+
* es justo lo que un fichero recién creado por el agente es. */
|
|
158
|
+
async function arbolDeAhora(raiz) {
|
|
159
|
+
const idx = indicePrivado("sesion");
|
|
160
|
+
try {
|
|
161
|
+
// El pathspec de exclusión NO va aquí, y no es un olvido: `git add` con
|
|
162
|
+
// `:(exclude).xonecode` en un repo donde `.xonecode` YA está ignorado (el caso normal:
|
|
163
|
+
// `prepararRepo` escribe `info/exclude`) considera que has nombrado una ruta ignorada,
|
|
164
|
+
// avisa y **sale con código 1**. Medido contra el proyecto de verdad: `marcarSesion`
|
|
165
|
+
// devolvía `false` y la pestaña entera decía «sin-marca» para siempre. Excluir en el
|
|
166
|
+
// DIFF hace el mismo trabajo y no tiene esa arista: si `.xonecode` está ignorado no
|
|
167
|
+
// entra en el árbol, y si no lo está, entra en los DOS árboles y el diff lo descarta.
|
|
168
|
+
await ejecutar("git", ["add", "-A", "--", "."], {
|
|
169
|
+
cwd: raiz,
|
|
170
|
+
env: { ...process.env, GIT_INDEX_FILE: idx.ruta },
|
|
171
|
+
});
|
|
172
|
+
// El pathspec no vale (ver arriba), pero `rm --cached --ignore-unmatch` sí: sin esto,
|
|
173
|
+
// en un proyecto offline el `checkpoint.sqlite` entra en el árbol y sus 30 MB se quedan
|
|
174
|
+
// en `.git/objects`, vivos para siempre porque `refs/xonecode/sesion/*` los alcanza.
|
|
175
|
+
await sacarXonecodeDelIndice(ejecutar, raiz, idx.ruta);
|
|
176
|
+
const { stdout } = await ejecutar("git", ["write-tree"], {
|
|
177
|
+
cwd: raiz,
|
|
178
|
+
env: { ...process.env, GIT_INDEX_FILE: idx.ruta },
|
|
179
|
+
});
|
|
180
|
+
return stdout.trim();
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
idx.limpiar();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Marca el ANTES de una sesión. Se llama al abrirla, no al primer turno: lo que interesa es
|
|
188
|
+
* lo que ha cambiado desde que te sentaste.
|
|
189
|
+
*
|
|
190
|
+
* No lanza. Un proyecto sin git usable —o con un hook que revienta— no puede impedir abrir
|
|
191
|
+
* una sesión; lo que pasa es que después no habrá «antes» que enseñar, y eso se dice con
|
|
192
|
+
* `via: "sin-marca"` en vez de con una lista vacía que parecería «no tocaste nada».
|
|
193
|
+
*/
|
|
194
|
+
export async function marcarSesion(raiz, id) {
|
|
195
|
+
const foto = await fotoDeApertura(raiz);
|
|
196
|
+
return foto(id);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* La foto se toma AHORA y se nombra DESPUÉS.
|
|
200
|
+
*
|
|
201
|
+
* Hace falta porque el id de sesión no existe hasta que se vuelca el primer acto —y para
|
|
202
|
+
* entonces el agente ya ha escrito—, mientras que el «antes» tiene que ser el momento en que
|
|
203
|
+
* se abrió el proyecto. Así que se escribe el árbol al abrir y se apunta la ref cuando hay a
|
|
204
|
+
* qué nombre apuntarla.
|
|
205
|
+
*
|
|
206
|
+
* No lanza: un proyecto sin git usable no puede impedir abrir una sesión. Lo que pasa es que
|
|
207
|
+
* después no habrá «antes» que enseñar, y eso se dice con `via: "sin-marca"` en vez de con
|
|
208
|
+
* una lista vacía que parecería «no tocaste nada».
|
|
209
|
+
*/
|
|
210
|
+
export async function fotoDeApertura(raiz) {
|
|
211
|
+
let arbol;
|
|
212
|
+
try {
|
|
213
|
+
arbol = await arbolDeAhora(raiz);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
arbol = undefined;
|
|
217
|
+
}
|
|
218
|
+
return async (id) => {
|
|
219
|
+
const ref = refDeSesion(id);
|
|
220
|
+
if (ref === undefined || arbol === undefined)
|
|
221
|
+
return false;
|
|
222
|
+
try {
|
|
223
|
+
await ejecutar("git", ["update-ref", ref, arbol], { cwd: raiz });
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/** El árbol vacío de git: el «antes» cuando el primer commit de la sesión es la raíz del
|
|
232
|
+
* repo y no tiene padre. Se COMPRUEBA antes de usarlo (en un repo sha256 no es este), y si
|
|
233
|
+
* no está se cae a la medida de apertura en vez de inventar un extremo. */
|
|
234
|
+
const ARBOL_VACIO = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
|
|
235
|
+
/** Las opciones que comparten todos los diffs de esta vista. El porqué de cada una está en
|
|
236
|
+
* `FILTRO`, en `FUERA` y en el comentario de `--relative` de más abajo. */
|
|
237
|
+
const COMUNES = ["--relative", "--no-renames", FILTRO];
|
|
238
|
+
/** El diff de UN commit contra su padre. `diff-tree --root` es lo que hace que el primer
|
|
239
|
+
* commit de un repo (que no tiene padre) salga como altas en vez de reventar. */
|
|
240
|
+
const deCommit = (sha) => ["diff-tree", "-r", "--no-commit-id", "--root", ...COMUNES, sha];
|
|
241
|
+
/** El diff entre dos extremos cualesquiera: árboles, commits o `HEAD`. */
|
|
242
|
+
const entre = (a, b) => ["diff", ...COMUNES, a, b];
|
|
243
|
+
/**
|
|
244
|
+
* Las dos salidas de git de un diff, fusionadas en filas. Son dos llamadas porque
|
|
245
|
+
* `--name-status` y `--numstat` no se pueden pedir juntas, y la clase la da la primera y
|
|
246
|
+
* las cuentas la segunda.
|
|
247
|
+
*/
|
|
248
|
+
async function filasDeDiff(raiz, args) {
|
|
249
|
+
const cola = ["--", ".", FUERA];
|
|
250
|
+
const [estados, numeros] = await Promise.all([
|
|
251
|
+
ejecutar("git", [...args, "--name-status", ...cola], { cwd: raiz, maxBuffer: 32 * 1024 * 1024 }),
|
|
252
|
+
ejecutar("git", [...args, "--numstat", ...cola], { cwd: raiz, maxBuffer: 32 * 1024 * 1024 }),
|
|
253
|
+
]);
|
|
254
|
+
const cuentas = new Map();
|
|
255
|
+
for (const linea of numeros.stdout.split("\n")) {
|
|
256
|
+
const [mas, menos, ruta] = linea.split("\t");
|
|
257
|
+
if (ruta === undefined)
|
|
258
|
+
continue;
|
|
259
|
+
// Un binario viene como «-»: no se convierte a 0, que diría «no cambió nada».
|
|
260
|
+
cuentas.set(ruta.trim(), {
|
|
261
|
+
...(mas === "-" ? {} : { mas: Number(mas) }),
|
|
262
|
+
...(menos === "-" ? {} : { menos: Number(menos) }),
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
const ficheros = [];
|
|
266
|
+
for (const linea of estados.stdout.split("\n")) {
|
|
267
|
+
if (!linea.trim())
|
|
268
|
+
continue;
|
|
269
|
+
const [estado, ruta] = linea.split("\t");
|
|
270
|
+
if (ruta === undefined)
|
|
271
|
+
continue;
|
|
272
|
+
const limpia = ruta.trim();
|
|
273
|
+
ficheros.push({ ruta: limpia, clase: claseDeCambio(estado), ...(cuentas.get(limpia) ?? {}) });
|
|
274
|
+
}
|
|
275
|
+
return ficheros;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Lo que ha cambiado ESTA sesión.
|
|
279
|
+
*
|
|
280
|
+
* **Se atribuye por COMMIT**, que es lo único que dice de quién es cada cambio: cada turno
|
|
281
|
+
* commitea (`gitSync.ts#commitDeTurno`) con el id de la sesión sellado en el mensaje. La
|
|
282
|
+
* medida vieja —el árbol de ahora contra la foto de apertura— no atribuía nada, y desde que
|
|
283
|
+
* hay tareas de fondo escribiendo en la misma copia dejó de ser un proxy razonable: MEDIDO
|
|
284
|
+
* en el proyecto del usuario el 10-09-2026, una conversación enseñaba +1266 líneas que
|
|
285
|
+
* había escrito una tarea de fondo veinte minutos después, con la pestaña rotulada
|
|
286
|
+
* «Sesión». Se conserva como respaldo declarado (`via: "desde-apertura"`) para las sesiones
|
|
287
|
+
* sin sello, que son todas las de antes de esto.
|
|
288
|
+
*
|
|
289
|
+
* Y lo que la atribución por commit NO puede prometer, porque `commitDeTurno` hace `add -A`:
|
|
290
|
+
* un commit barre todo lo que estuviera sucio en ese instante, incluido lo que tocara otra
|
|
291
|
+
* sesión sin commitear. Es la misma honestidad que separa `Tarea.autorizadas` de
|
|
292
|
+
* «aplicados»; el aislamiento de verdad es un árbol por sesión, que no está hecho.
|
|
293
|
+
*/
|
|
294
|
+
export async function cambiosDeSesion(raiz, id) {
|
|
295
|
+
try {
|
|
296
|
+
const commits = await commitsDeSesion(raiz, id);
|
|
297
|
+
if (commits.length > 0)
|
|
298
|
+
return await porCommits(raiz, commits);
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
// Cae al respaldo, que se declara como lo que es.
|
|
302
|
+
}
|
|
303
|
+
return desdeLaApertura(raiz, id);
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* La atribución por commit, con los extremos elegidos así:
|
|
307
|
+
*
|
|
308
|
+
* - **El «antes» es el PADRE del primer commit de la sesión**, no la foto de apertura, y
|
|
309
|
+
* eso es mejor y no un atajo: lo que otra sesión commiteara entre que te sentaste y tu
|
|
310
|
+
* primer turno queda fuera por construcción.
|
|
311
|
+
* - **El «ahora» es el árbol de ahora** y no el último commit de la sesión, porque el turno
|
|
312
|
+
* en vuelo no ha commiteado todavía: con el último commit, la pestaña se quedaría vacía
|
|
313
|
+
* justo mientras el agente escribe, que es cuando más se mira.
|
|
314
|
+
* - **La LISTA sale de los commits, uno a uno** —así una ruta que la sesión no tocó no
|
|
315
|
+
* entra aunque haya cambiado— y las CUENTAS y el PARCHE salen de los dos extremos, que es
|
|
316
|
+
* lo que hace que la cifra de una fila y su diff cuenten lo mismo.
|
|
317
|
+
*/
|
|
318
|
+
async function porCommits(raiz, commits) {
|
|
319
|
+
const primero = commits[0];
|
|
320
|
+
const base = await padreDe(raiz, primero);
|
|
321
|
+
if (base === undefined)
|
|
322
|
+
return desdeLaApertura(raiz, "");
|
|
323
|
+
const ahora = await arbolDeAhora(raiz);
|
|
324
|
+
// Qué rutas tocó la sesión, y con qué clase la primera y la última vez.
|
|
325
|
+
const tocadas = new Map();
|
|
326
|
+
for (const sha of commits) {
|
|
327
|
+
for (const f of await filasDeDiff(raiz, deCommit(sha))) {
|
|
328
|
+
const antes = tocadas.get(f.ruta);
|
|
329
|
+
tocadas.set(f.ruta, { primera: antes?.primera ?? f.clase, ultima: f.clase });
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const netas = await filasDeDiff(raiz, entre(base, ahora));
|
|
333
|
+
const pendientes = new Set((await filasDeDiff(raiz, entre("HEAD", ahora))).map((f) => f.ruta));
|
|
334
|
+
const ficheros = [];
|
|
335
|
+
for (const fila of netas) {
|
|
336
|
+
const suya = tocadas.get(fila.ruta);
|
|
337
|
+
// Una ruta que la sesión no tocó y que nadie ha commiteado se enseña igual, dicha como
|
|
338
|
+
// lo que es: puede ser el turno en vuelo. Una que no tocó y que SÍ está commiteada es
|
|
339
|
+
// de otra sesión, y esa es justamente la que sobraba.
|
|
340
|
+
if (suya === undefined && !pendientes.has(fila.ruta))
|
|
341
|
+
continue;
|
|
342
|
+
const clase = suya === undefined ? fila.clase : claseNeta(suya.primera, suya.ultima);
|
|
343
|
+
if (clase === undefined)
|
|
344
|
+
continue;
|
|
345
|
+
ficheros.push({ ...fila, clase, ...(pendientes.has(fila.ruta) ? { sinCommitear: true } : {}) });
|
|
346
|
+
}
|
|
347
|
+
const mezclados = await commitsAjenos(raiz, base, commits);
|
|
348
|
+
return {
|
|
349
|
+
via: "git",
|
|
350
|
+
ficheros: ficheros.sort((a, b) => a.ruta.localeCompare(b.ruta)),
|
|
351
|
+
...(mezclados === undefined || mezclados === 0 ? {} : { mezclados }),
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
/** El padre de un commit, o el árbol vacío si es la raíz del repo. `undefined` = no se pudo
|
|
355
|
+
* resolver ninguno de los dos, y entonces no hay «antes» que usar. */
|
|
356
|
+
async function padreDe(raiz, sha) {
|
|
357
|
+
try {
|
|
358
|
+
const { stdout } = await ejecutar("git", ["rev-parse", "--verify", "--quiet", `${sha}^`], { cwd: raiz });
|
|
359
|
+
return stdout.trim();
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
try {
|
|
363
|
+
await ejecutar("git", ["rev-parse", "--verify", "--quiet", `${ARBOL_VACIO}^{tree}`], { cwd: raiz });
|
|
364
|
+
return ARBOL_VACIO;
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
return undefined;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
/** Cuántos commits que NO son de esta sesión hay desde su «antes» hasta ahora. `undefined`
|
|
372
|
+
* si no se pudo preguntar: entonces no se afirma ni que haya ni que no haya. */
|
|
373
|
+
async function commitsAjenos(raiz, base, commits) {
|
|
374
|
+
try {
|
|
375
|
+
const { stdout } = await ejecutar("git", ["rev-list", `${base}..HEAD`], { cwd: raiz, maxBuffer: 8 * 1024 * 1024 });
|
|
376
|
+
const mios = new Set(commits);
|
|
377
|
+
return stdout
|
|
378
|
+
.split("\n")
|
|
379
|
+
.map((l) => l.trim())
|
|
380
|
+
.filter((l) => l !== "" && !mios.has(l)).length;
|
|
381
|
+
}
|
|
382
|
+
catch {
|
|
383
|
+
return undefined;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* El respaldo: el árbol de ahora contra la foto de apertura. Es la medida de siempre y lo
|
|
388
|
+
* único posible en una sesión sin sello — pero NO atribuye, así que viaja con su propio
|
|
389
|
+
* `via` para que nadie la pinte como «lo que hizo esta sesión».
|
|
390
|
+
*/
|
|
391
|
+
async function desdeLaApertura(raiz, id) {
|
|
392
|
+
const ref = refDeSesion(id);
|
|
393
|
+
if (ref === undefined)
|
|
394
|
+
return { via: "sin-marca", ficheros: [] };
|
|
395
|
+
try {
|
|
396
|
+
await ejecutar("git", ["rev-parse", "--verify", "--quiet", ref], { cwd: raiz });
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
return { via: "sin-marca", ficheros: [] };
|
|
400
|
+
}
|
|
401
|
+
try {
|
|
402
|
+
const ahora = await arbolDeAhora(raiz);
|
|
403
|
+
// `--relative` porque los dos árboles se escriben con rutas desde la RAÍZ DEL REPO, y el
|
|
404
|
+
// proyecto no tiene por qué serlo (`instantanea.ts` sostiene ese caso a propósito). Sin
|
|
405
|
+
// él, en un proyecto que cuelga de un repo mayor las rutas saldrían con el prefijo de la
|
|
406
|
+
// subcarpeta y `parcheDeSesion` no casaría con ninguna.
|
|
407
|
+
const ficheros = await filasDeDiff(raiz, entre(ref, ahora));
|
|
408
|
+
return { via: "desde-apertura", ficheros: ficheros.sort((a, b) => a.ruta.localeCompare(b.ruta)) };
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
return { via: "sin-marca", ficheros: [] };
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/** Cuánto parche se sirve de un fichero. Un `.min.js` regenerado son megas y la vista no los
|
|
415
|
+
* puede pintar: se recorta y quien llama lo dice. */
|
|
416
|
+
const TOPE_DE_PARCHE = 400_000;
|
|
417
|
+
/**
|
|
418
|
+
* El parche de UN fichero de la sesión, en texto de git.
|
|
419
|
+
*
|
|
420
|
+
* La ruta se pasa después de `--`, que es lo que impide que una ruta que empiece por guion
|
|
421
|
+
* se lea como una opción. Y se acota el tamaño: la vista no puede pintar un fichero
|
|
422
|
+
* generado de tres megas, y truncar diciéndolo es mejor que colgar el navegador.
|
|
423
|
+
*/
|
|
424
|
+
export async function parcheDeSesion(raiz, id, ruta) {
|
|
425
|
+
try {
|
|
426
|
+
const extremos = await extremosDelParche(raiz, id, ruta);
|
|
427
|
+
if (extremos === undefined)
|
|
428
|
+
return undefined;
|
|
429
|
+
const { stdout } = await ejecutar("git",
|
|
430
|
+
// `FUERA` también aquí: nadie debe poder pedir el parche de un fichero interno
|
|
431
|
+
// nombrándolo a mano, ni siquiera si se cuela en la lista por una ref antigua.
|
|
432
|
+
["diff", "--relative", "--no-renames", extremos.antes, extremos.despues, "--", ruta, FUERA], { cwd: raiz, maxBuffer: 32 * 1024 * 1024 });
|
|
433
|
+
if (stdout.length <= TOPE_DE_PARCHE)
|
|
434
|
+
return { texto: stdout, recortado: false };
|
|
435
|
+
return { texto: stdout.slice(0, TOPE_DE_PARCHE), recortado: true };
|
|
436
|
+
}
|
|
437
|
+
catch {
|
|
438
|
+
return undefined;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Entre qué dos extremos se pide el parche de un fichero, y son los MISMOS que dan sus
|
|
443
|
+
* cuentas en la lista — si no, una fila diría «+40» y su diff enseñaría otra cosa.
|
|
444
|
+
*
|
|
445
|
+
* Con atribución por commit el «antes» es el padre del primer commit de la sesión que TOCÓ
|
|
446
|
+
* ESTE fichero, no el primero de la sesión: así el parche empieza donde empieza el cambio y
|
|
447
|
+
* no arrastra lo que otro commit de la misma sesión hiciera en otros ficheros. Sin sello, la
|
|
448
|
+
* foto de apertura, que es lo único que hay.
|
|
449
|
+
*/
|
|
450
|
+
async function extremosDelParche(raiz, id, ruta) {
|
|
451
|
+
const ahora = await arbolDeAhora(raiz);
|
|
452
|
+
const suyos = await commitsDeSesion(raiz, id, ruta);
|
|
453
|
+
if (suyos.length > 0) {
|
|
454
|
+
const base = await padreDe(raiz, suyos[0]);
|
|
455
|
+
if (base !== undefined)
|
|
456
|
+
return { antes: base, despues: ahora };
|
|
457
|
+
}
|
|
458
|
+
// Sin commits de la sesión para este fichero: o es una sesión sin sello, o el fichero solo
|
|
459
|
+
// tiene cambios sin commitear. Lo primero se mide contra la foto; lo segundo, contra HEAD.
|
|
460
|
+
const commits = await commitsDeSesion(raiz, id);
|
|
461
|
+
if (commits.length > 0)
|
|
462
|
+
return { antes: "HEAD", despues: ahora };
|
|
463
|
+
const ref = refDeSesion(id);
|
|
464
|
+
if (ref === undefined)
|
|
465
|
+
return undefined;
|
|
466
|
+
return { antes: ref, despues: ahora };
|
|
467
|
+
}
|
|
468
|
+
/** Olvida la marca de una sesión. Para cuando se borre una sesión: una ref que apunta a un
|
|
469
|
+
* árbol de un proyecto que ya no interesa mantiene vivo ese árbol para siempre. */
|
|
470
|
+
export async function olvidarSesion(raiz, id) {
|
|
471
|
+
const ref = refDeSesion(id);
|
|
472
|
+
if (ref === undefined)
|
|
473
|
+
return;
|
|
474
|
+
try {
|
|
475
|
+
await ejecutar("git", ["update-ref", "-d", ref], { cwd: raiz });
|
|
476
|
+
}
|
|
477
|
+
catch {
|
|
478
|
+
// Borrar lo que no está no es un error.
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=sesionGit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sesionGit.js","sourceRoot":"","sources":["../../src/agent/sesionGit.ts"],"names":[],"mappings":"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"}
|