specrails-desktop 2.6.0 → 2.7.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/client/dist/assets/{ActivityFeedPage-CoWwVcty.js → ActivityFeedPage-LKqd18-G.js} +1 -1
- package/client/dist/assets/{AgentsPage-CgPvynWc.js → AgentsPage-Cb-b-6Ot.js} +1 -1
- package/client/dist/assets/AnalyticsPage-HVxQQ1wy.js +1 -0
- package/client/dist/assets/{BarChart-BKXQPcoW.js → BarChart-BOyHB0dw.js} +1 -1
- package/client/dist/assets/{CodePage-CYhXRKiI.js → CodePage-DnOnwKGB.js} +1 -1
- package/client/dist/assets/{DesktopAnalyticsPage-CBfPCT3q.js → DesktopAnalyticsPage-D2auU39x.js} +1 -1
- package/client/dist/assets/{DocsDialog-uRTBV-3T.js → DocsDialog-CTuDX3GK.js} +1 -1
- package/client/dist/assets/{DocsPage-gH0Lc54I.js → DocsPage-DRyMmu0Z.js} +1 -1
- package/client/dist/assets/{ExportDropdown-DAp7zWib.js → ExportDropdown-DO-GGiMh.js} +1 -1
- package/client/dist/assets/{IntegrationsPage-D40Si_7s.js → IntegrationsPage-BhbO4jFT.js} +1 -1
- package/client/dist/assets/{JobDetailPage-DSxAvB1n.js → JobDetailPage-DJooEg1s.js} +1 -1
- package/client/dist/assets/{JobsPage-ZMBc1BHE.js → JobsPage-BbaC-YOg.js} +1 -1
- package/client/dist/assets/{addspec-DeDOztDr.js → addspec-B-BKlvDj.js} +1 -1
- package/client/dist/assets/{addspec-v8j6A7CD.js → addspec-BErjOdNK.js} +1 -1
- package/client/dist/assets/{addspec-B1FTtI2a.js → addspec-CIGb34PS.js} +1 -1
- package/client/dist/assets/{addspec-GWm4ffKl.js → addspec-C_3NBarY.js} +1 -1
- package/client/dist/assets/{addspec-Dw-0Dg-4.js → addspec-DDvvnE6N.js} +1 -1
- package/client/dist/assets/{addspec-DpRgmfmx.js → addspec-RuL8Zd7w.js} +1 -1
- package/client/dist/assets/{addspec-rp496P_F.js → addspec-rmhOaH7N.js} +1 -1
- package/client/dist/assets/{addspec-BCT9vm_c.js → addspec-xjDbYZWL.js} +1 -1
- package/client/dist/assets/{dist-js-CKqmDyXR.js → dist-js-CiIVMsx3.js} +1 -1
- package/client/dist/assets/{dist-js-bTZuok_W.js → dist-js-Xc2lRKp2.js} +1 -1
- package/client/dist/assets/{index-B9IKK_QQ.js → index-DK214dak.js} +34 -34
- package/client/dist/assets/index-DgKfQFcf.css +2 -0
- package/client/dist/assets/{lib-B5mjOeEi.js → lib-Bo5s6xpe.js} +1 -1
- package/client/dist/assets/{useProjectCache-Cf83MBQh.js → useProjectCache-DVNypkmR.js} +1 -1
- package/client/dist/index.html +3 -3
- package/docs/adding-a-provider.md +107 -0
- package/docs/agy-cli-provider-study.md +179 -0
- package/docs/gemini-cli-provider-study.md +301 -0
- package/docs/gemini-core-support-evaluation.md +160 -0
- package/docs/gemini.md +106 -0
- package/package.json +1 -1
- package/server/dist/chat-manager.js +1 -1
- package/server/dist/core-package.js +6 -1
- package/server/dist/desktop-router.js +27 -8
- package/server/dist/explore-cwd-manager.js +1 -1
- package/server/dist/mobile/mobile-datachannel.js +65 -4
- package/server/dist/pricing.js +13 -0
- package/server/dist/project-router-tickets.js +63 -18
- package/server/dist/providers/gemini-adapter.js +234 -0
- package/server/dist/providers/index.js +4 -1
- package/server/dist/setup-manager.js +13 -7
- package/server/dist/setup-prerequisites.js +4 -0
- package/server/dist/spec-models.js +17 -3
- package/server/dist/util/cli-prompt.js +17 -1
- package/client/dist/assets/AnalyticsPage-ioz3Ub2D.js +0 -1
- package/client/dist/assets/index-BqAXaTbC.css +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
var e={title:`Añadir spec`,dialogDescription:`Crea una nueva spec a partir de una idea breve, ya sea al instante o mediante el modo Explore.`,engineAriaLabel:`Motor de IA para esta spec`,modeTablistLabel:`Modo de creación de la spec`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interactivo`,rawHint:`sin IA`},modeDescription:{quick:`Describe la funcionalidad o el cambio. Adjunta mockups, briefs o datos para dar más contexto.`,explore:`Describe una idea aproximada. Claude te ayudará a darle forma conversando — tú decides cuándo confirmarla.`,raw:`Tu prompt, tal cual — guardado como ticket de spec. No se ejecuta IA ahora; arrástralo a un rail para construirlo.`},editorPlaceholder:{quick:`p. ej. Añade un interruptor de modo oscuro a la página de ajustes que recuerde la preferencia del usuario...`,explore:`p. ej. modo oscuro — no tengo claro dónde colocar el interruptor ni cómo persistirlo…`,raw:`Describe la funcionalidad, el cambio o la idea. Admite Markdown, imágenes y archivos…`},ideaAriaLabel:`Idea de la spec`,raw:{titleLabel:`Título`,titlePlaceholder:`Se autocompleta a partir de tu prompt…`,priorityLabel:`Prioridad`,labelsLabel:`Etiquetas`,removeLabel:`Quitar etiqueta {{label}}`,addLabelAria:`Añadir etiqueta`,labelPlaceholder:`opcional…`,bodyAriaLabel:`Cuerpo de la spec Raw`},priority:{critical:`Crítica`,high:`Alta`,medium:`Media`,low:`Baja`},fromWebsite:`Desde una web`,fromWebsiteTitle:`Abre una página web real, selecciona un área y conviértela en una spec`,capture:{responsiveSizes_one:`Responsive · {{count}} tamaño`,responsiveSizes_other:`Responsive · {{count}} tamaños`},submit:{quick:`Generar spec`,explore:`Continuar`,raw:`Crear`,disabledTitle:`Escribe primero un prompt`},toast:{createFailed:`No se pudo crear la spec`,rawSavedWithId:`Guardada como #{{id}} · Spec Raw lista para los rails`,rawCreated:`Spec Raw creada`,exploreNotWired:`El modo Explore no está disponible en esta vista`,generating:`Generando...`,failedToStart:`{{projectName}} · Error al iniciar`,unsupportedFileType:`Tipo de archivo no compatible: {{name}}`,uploadFailed:`Error al subir {{name}}: {{message}}`}},t={title:`Proponer una funcionalidad`,ideaIntro:`Describe tu idea en lenguaje natural. Claude leerá el código y la estructurará en una propuesta completa.`,ideaAriaLabel:`Idea de funcionalidad`,ideaPlaceholder:`p. ej. Quiero que los usuarios puedan configurar una alerta de presupuesto para recibir un aviso cuando los costes de la API superen un umbral...`,cmdEnterToSubmit:`Cmd+Enter para enviar`,exploreIdea:`Explorar idea`,exploringTitle:`Explorando tu idea...`,refiningTitle:`Refinando la propuesta...`,reviewTitle:`Revisar propuesta`,readingCodebase_one:`Leyendo el código... ({{count}} archivo explorado)`,readingCodebase_other:`Leyendo el código... ({{count}} archivos explorados)`,refinementAriaLabel:`Comentarios de refinamiento`,refinementPlaceholder:`Pide cambios, añade restricciones, ajusta el alcance...`,sendRefinementTitle:`Enviar refinamiento (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter para enviar`,confirmCreateIssue:`¿Crear un issue de GitHub a partir de esta propuesta?`,yesCreateIssue:`Sí, crear issue`,createGithubIssue:`Crear issue de GitHub`,startOver:`Empezar de nuevo`,creatingIssueTitle:`Creando issue de GitHub...`,creatingIssueViaCli:`Creando el issue con la CLI de GitHub...`,issueCreated:`Issue creado`,proposeAnother:`Proponer otra`,errorTitle:`Algo ha ido mal`,errorFallback:`Se ha producido un error`,tryAgain:`Reintentar`,cancelledTitle:`Cancelado`,cancelledBody:`La propuesta se ha cancelado.`},n={heading:`Conocimiento del contexto`,custom:`Personalizado`,customMix:`Combinación personalizada — ver Ajuste fino abajo`,estimateUnavailable:`{{tier}} · estimación no disponible`,preset:{minimal:`Mínimo`,light:`Ligero`,standard:`Estándar`,rich:`Amplio`,max:`Max`,desktop:`Desktop`},presetCost:{minimal:`Coste 1× · primer token más rápido · sin specs cargadas`,light:`Coste 1,3× · specs de Specrails cargadas`,standard:`Coste 1,6× · specs de Specrails + OpenSpec cargadas`,rich:`Coste 2× · acceso de lectura a todo el repo`,max:`Coste 4× · lectura completa + refinamiento de Contract Layer`,desktop:`Coste 4–6× · todas las funciones + MCP del proyecto y tus MCP aprobados`},smashCapable:`Compatible con SMASH`,smashHint:`La Contract Layer está activada, así que esta spec podrá descomponerse después en Sub-Specs.`,fineTune:`Ajuste fino`,defaultLabel:`Alcance del contexto`,summaryMinimal:`mínimo`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`tickets de specrails`,openspecLabel:`specs de openspec`,fullLabel:`Código completo`,mcpLabel:`MCP del proyecto`,mcpHint:`servidores de .mcp.json`,userMcpLabel:`Mis MCP aprobados`,userMcpHint:`servidores de ~/.claude · ~/.codex`,userMcpTooltip:`Tus servidores MCP aprobados en local (claude mcp add / codex mcp add)`,exploreOnly:`Solo en modo Explore`,contractLabel:`Enriquecer con Contract Layer`,contractHint:`refinamiento post-commit · habilita SMASH`}},r={label:`Motor de IA`},i={presetHeading:`Preset de modelo`,preset:{balanced:{label:`Equilibrado`,description:`
|
|
1
|
+
var e={title:`Añadir spec`,dialogDescription:`Crea una nueva spec a partir de una idea breve, ya sea al instante o mediante el modo Explore.`,engineAriaLabel:`Motor de IA para esta spec`,modeTablistLabel:`Modo de creación de la spec`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interactivo`,rawHint:`sin IA`},modeDescription:{quick:`Describe la funcionalidad o el cambio. Adjunta mockups, briefs o datos para dar más contexto.`,explore:`Describe una idea aproximada. Claude te ayudará a darle forma conversando — tú decides cuándo confirmarla.`,raw:`Tu prompt, tal cual — guardado como ticket de spec. No se ejecuta IA ahora; arrástralo a un rail para construirlo.`},editorPlaceholder:{quick:`p. ej. Añade un interruptor de modo oscuro a la página de ajustes que recuerde la preferencia del usuario...`,explore:`p. ej. modo oscuro — no tengo claro dónde colocar el interruptor ni cómo persistirlo…`,raw:`Describe la funcionalidad, el cambio o la idea. Admite Markdown, imágenes y archivos…`},ideaAriaLabel:`Idea de la spec`,raw:{titleLabel:`Título`,titlePlaceholder:`Se autocompleta a partir de tu prompt…`,priorityLabel:`Prioridad`,labelsLabel:`Etiquetas`,removeLabel:`Quitar etiqueta {{label}}`,addLabelAria:`Añadir etiqueta`,labelPlaceholder:`opcional…`,bodyAriaLabel:`Cuerpo de la spec Raw`},priority:{critical:`Crítica`,high:`Alta`,medium:`Media`,low:`Baja`},fromWebsite:`Desde una web`,fromWebsiteTitle:`Abre una página web real, selecciona un área y conviértela en una spec`,capture:{responsiveSizes_one:`Responsive · {{count}} tamaño`,responsiveSizes_other:`Responsive · {{count}} tamaños`},submit:{quick:`Generar spec`,explore:`Continuar`,raw:`Crear`,disabledTitle:`Escribe primero un prompt`},toast:{createFailed:`No se pudo crear la spec`,rawSavedWithId:`Guardada como #{{id}} · Spec Raw lista para los rails`,rawCreated:`Spec Raw creada`,exploreNotWired:`El modo Explore no está disponible en esta vista`,generating:`Generando...`,failedToStart:`{{projectName}} · Error al iniciar`,unsupportedFileType:`Tipo de archivo no compatible: {{name}}`,uploadFailed:`Error al subir {{name}}: {{message}}`}},t={title:`Proponer una funcionalidad`,ideaIntro:`Describe tu idea en lenguaje natural. Claude leerá el código y la estructurará en una propuesta completa.`,ideaAriaLabel:`Idea de funcionalidad`,ideaPlaceholder:`p. ej. Quiero que los usuarios puedan configurar una alerta de presupuesto para recibir un aviso cuando los costes de la API superen un umbral...`,cmdEnterToSubmit:`Cmd+Enter para enviar`,exploreIdea:`Explorar idea`,exploringTitle:`Explorando tu idea...`,refiningTitle:`Refinando la propuesta...`,reviewTitle:`Revisar propuesta`,readingCodebase_one:`Leyendo el código... ({{count}} archivo explorado)`,readingCodebase_other:`Leyendo el código... ({{count}} archivos explorados)`,refinementAriaLabel:`Comentarios de refinamiento`,refinementPlaceholder:`Pide cambios, añade restricciones, ajusta el alcance...`,sendRefinementTitle:`Enviar refinamiento (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter para enviar`,confirmCreateIssue:`¿Crear un issue de GitHub a partir de esta propuesta?`,yesCreateIssue:`Sí, crear issue`,createGithubIssue:`Crear issue de GitHub`,startOver:`Empezar de nuevo`,creatingIssueTitle:`Creando issue de GitHub...`,creatingIssueViaCli:`Creando el issue con la CLI de GitHub...`,issueCreated:`Issue creado`,proposeAnother:`Proponer otra`,errorTitle:`Algo ha ido mal`,errorFallback:`Se ha producido un error`,tryAgain:`Reintentar`,cancelledTitle:`Cancelado`,cancelledBody:`La propuesta se ha cancelado.`},n={heading:`Conocimiento del contexto`,custom:`Personalizado`,customMix:`Combinación personalizada — ver Ajuste fino abajo`,estimateUnavailable:`{{tier}} · estimación no disponible`,preset:{minimal:`Mínimo`,light:`Ligero`,standard:`Estándar`,rich:`Amplio`,max:`Max`,desktop:`Desktop`},presetCost:{minimal:`Coste 1× · primer token más rápido · sin specs cargadas`,light:`Coste 1,3× · specs de Specrails cargadas`,standard:`Coste 1,6× · specs de Specrails + OpenSpec cargadas`,rich:`Coste 2× · acceso de lectura a todo el repo`,max:`Coste 4× · lectura completa + refinamiento de Contract Layer`,desktop:`Coste 4–6× · todas las funciones + MCP del proyecto y tus MCP aprobados`},smashCapable:`Compatible con SMASH`,smashHint:`La Contract Layer está activada, así que esta spec podrá descomponerse después en Sub-Specs.`,fineTune:`Ajuste fino`,defaultLabel:`Alcance del contexto`,summaryMinimal:`mínimo`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`tickets de specrails`,openspecLabel:`specs de openspec`,fullLabel:`Código completo`,mcpLabel:`MCP del proyecto`,mcpHint:`servidores de .mcp.json`,userMcpLabel:`Mis MCP aprobados`,userMcpHint:`servidores de ~/.claude · ~/.codex`,userMcpTooltip:`Tus servidores MCP aprobados en local (claude mcp add / codex mcp add)`,exploreOnly:`Solo en modo Explore`,contractLabel:`Enriquecer con Contract Layer`,contractHint:`refinamiento post-commit · habilita SMASH`}},r={label:`Motor de IA`},i={presetHeading:`Preset de modelo`,preset:{balanced:{label:`Equilibrado`,description:`{{model}} para todos los agentes (recomendado)`},budget:{label:`Económico`,description:`{{model}} para todos los agentes — 3× más barato y rápido`},max:{label:`Max`,description:`{{topModel}} para arquitecto + PM, {{baseModel}} para el resto`}},overridesHeading:`Modelo por agente`,overriddenCount:`{{count}} modificados`,customBadge:`personalizado`,resetToDefault:`Restablecer al valor del preset`},a={alias:`Alias en Claude Code: {{alias}}`,tier:{balanced:`Equilibrado`,mostCapable:`Más capaz`,fastest:`Más rápido`}},o={heading:`Indicador de coste`,meterAriaLabel:`nivel de coste`,estimateUnavailable:`solo nivel — estimación no disponible`},s={heading:`Comando sugerido`,run:`Ejecutar`,dismiss:`Descartar`},c={serverError:`Error del servidor ({{status}})`,connectionFailed:`Error de conexión: {{message}}`,sendRefinementFailed:`No se pudo enviar el refinamiento`,createIssueFailed:`No se pudo crear el issue`},l={proposeModal:e,featureProposal:t,contextScope:n,aiEngine:r,modelSelector:i,modelCombobox:a,costMeter:o,commandProposal:s,errors:c};export{r as aiEngine,s as commandProposal,n as contextScope,o as costMeter,l as default,c as errors,t as featureProposal,a as modelCombobox,i as modelSelector,e as proposeModal};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,r as t}from"./index-
|
|
1
|
+
import{i as e,r as t}from"./index-DK214dak.js";var n=class{constructor(){this.eventListeners=Object.create(null)}addListener(e,t){return this.on(e,t)}removeListener(e,t){return this.off(e,t)}on(e,t){return e in this.eventListeners?this.eventListeners[e].push(t):this.eventListeners[e]=[t],this}once(e,t){let n=r=>{this.removeListener(e,n),t(r)};return this.addListener(e,n)}off(e,t){return e in this.eventListeners&&(this.eventListeners[e]=this.eventListeners[e].filter(e=>e!==t)),this}removeAllListeners(e){return e?delete this.eventListeners[e]:this.eventListeners=Object.create(null),this}emit(e,t){if(e in this.eventListeners){let n=this.eventListeners[e];for(let e of n)e(t);return!0}return!1}listenerCount(e){return e in this.eventListeners?this.eventListeners[e].length:0}prependListener(e,t){return e in this.eventListeners?this.eventListeners[e].unshift(t):this.eventListeners[e]=[t],this}prependOnceListener(e,t){let n=r=>{this.removeListener(e,n),t(r)};return this.prependListener(e,n)}},r=class{constructor(e){this.pid=e}async write(t){await e(`plugin:shell|stdin_write`,{pid:this.pid,buffer:t})}async kill(){await e(`plugin:shell|kill`,{cmd:`killChild`,pid:this.pid})}},i=class i extends n{constructor(e,t=[],r){super(),this.stdout=new n,this.stderr=new n,this.program=e,this.args=typeof t==`string`?[t]:t,this.options=r??{}}static create(e,t=[],n){return new i(e,t,n)}static sidecar(e,t=[],n){let r=new i(e,t,n);return r.options.sidecar=!0,r}async spawn(){let n=this.program,i=this.args,a=this.options;typeof i==`object`&&Object.freeze(i);let o=new t;return o.onmessage=e=>{switch(e.event){case`Error`:this.emit(`error`,e.payload);break;case`Terminated`:this.emit(`close`,e.payload);break;case`Stdout`:this.stdout.emit(`data`,e.payload);break;case`Stderr`:this.stderr.emit(`data`,e.payload);break}},await e(`plugin:shell|spawn`,{program:n,args:i,options:a,onEvent:o}).then(e=>new r(e))}async execute(){let t=this.program,n=this.args,r=this.options;return typeof n==`object`&&Object.freeze(n),await e(`plugin:shell|execute`,{program:t,args:n,options:r})}};async function a(t,n){await e(`plugin:shell|open`,{path:t,with:n})}export{r as Child,i as Command,n as EventEmitter,a as open};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./index-
|
|
1
|
+
import{i as e}from"./index-DK214dak.js";function t(e){if(e!==void 0){if(typeof e==`string`)return e;if(`ok`in e&&`cancel`in e)return{OkCancelCustom:[e.ok,e.cancel]};if(`yes`in e&&`no`in e&&`cancel`in e)return{YesNoCancelCustom:[e.yes,e.no,e.cancel]};if(`ok`in e)return{OkCustom:e.ok}}}async function n(t={}){return typeof t==`object`&&Object.freeze(t),await e(`plugin:dialog|open`,{options:t})}async function r(t={}){return typeof t==`object`&&Object.freeze(t),await e(`plugin:dialog|save`,{options:t})}async function i(n,r){return await e(`plugin:dialog|message`,{message:n,title:r?.title,kind:r?.kind,buttons:t(r?.buttons)})}async function a(e,t){let n=typeof t==`string`?{title:t}:t;return n&&!n.buttons&&n.okLabel&&(n.buttons={ok:n.okLabel}),i(e,n)}async function o(e,t){let n=typeof t==`string`?{title:t}:t,r=n?.okLabel||n?.cancelLabel,a=n?.okLabel??`Yes`;return await i(e,{title:n?.title,kind:n?.kind,buttons:r?{ok:a,cancel:n.cancelLabel??`No`}:`YesNo`})===a}async function s(e,t){let n=typeof t==`string`?{title:t}:t,r=n?.okLabel||n?.cancelLabel,a=n?.okLabel??`Ok`;return await i(e,{title:n?.title,kind:n?.kind,buttons:r?{ok:a,cancel:n.cancelLabel??`Cancel`}:`OkCancel`})===a}export{o as ask,s as confirm,a as message,n as open,r as save};
|