@barnaby.build/barnaby 0.0.171 → 0.0.234

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.
@@ -1,4 +1,4 @@
1
- "use strict";const r=require("electron"),i={connect(e,t){return r.ipcRenderer.invoke("agentorchestrator:connect",e,t)},sendMessage(e,t,n,o,c,p){return r.ipcRenderer.invoke("agentorchestrator:sendMessageEx",e,{text:t,imagePaths:n??[],priorMessagesForContext:o,interactionMode:c,responseStyle:p})},loadChatHistory(){return r.ipcRenderer.invoke("agentorchestrator:loadChatHistory")},saveChatHistory(e){return r.ipcRenderer.invoke("agentorchestrator:saveChatHistory",e)},loadAppState(){return r.ipcRenderer.invoke("agentorchestrator:loadAppState")},saveAppState(e){return r.ipcRenderer.invoke("agentorchestrator:saveAppState",e)},setWindowTheme(e){return r.ipcRenderer.invoke("agentorchestrator:setWindowTheme",e)},notifyRendererReady(){return r.ipcRenderer.invoke("agentorchestrator:rendererReady")},getDiagnosticsInfo(){return r.ipcRenderer.invoke("agentorchestrator:getDiagnosticsInfo")},openRuntimeLog(){return r.ipcRenderer.invoke("agentorchestrator:openRuntimeLog")},openDebugOutputWindow(){return r.ipcRenderer.invoke("agentorchestrator:openDebugOutputWindow")},getDebugLogContent(){return r.ipcRenderer.invoke("agentorchestrator:getDebugLogContent")},onDebugLogAppend(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("barnaby:debug-log-append",t),()=>r.ipcRenderer.removeListener("barnaby:debug-log-append",t)},openDiagnosticsPath(e){return r.ipcRenderer.invoke("agentorchestrator:openDiagnosticsPath",e)},readDiagnosticsFile(e){return r.ipcRenderer.invoke("agentorchestrator:readDiagnosticsFile",e)},writeDiagnosticsFile(e,t){return r.ipcRenderer.invoke("agentorchestrator:writeDiagnosticsFile",e,t)},openExternalUrl(e){return r.ipcRenderer.invoke("agentorchestrator:openExternalUrl",e)},getOrchestratorLicenseKeyState(){return r.ipcRenderer.invoke("agentorchestrator:getOrchestratorLicenseKeyState")},setOrchestratorLicenseKey(e){return r.ipcRenderer.invoke("agentorchestrator:setOrchestratorLicenseKey",e)},repairStartMenuShortcut(){return r.ipcRenderer.invoke("barnaby:repairStartMenuShortcut")},openPluginsFolder(){return r.ipcRenderer.invoke("agentorchestrator:openPluginsFolder")},installOrchestratorPlugin(){return r.ipcRenderer.invoke("agentorchestrator:installOrchestratorPlugin")},uninstallOrchestratorPlugin(){return r.ipcRenderer.invoke("agentorchestrator:uninstallOrchestratorPlugin")},syncOrchestratorSettings(e){return r.ipcRenderer.invoke("agentorchestrator:syncOrchestratorSettings",e)},interrupt(e){return r.ipcRenderer.invoke("agentorchestrator:interrupt",e)},disconnect(e){return r.ipcRenderer.invoke("agentorchestrator:disconnect",e)},openFolderDialog(){return r.ipcRenderer.invoke("agentorchestrator:openFolderDialog")},openTerminalInWorkspace(e){return r.ipcRenderer.invoke("agentorchestrator:openTerminalInWorkspace",e)},terminalSpawn(e){return r.ipcRenderer.invoke("agentorchestrator:terminalSpawn",e)},terminalWrite(e){r.ipcRenderer.send("agentorchestrator:terminalWrite",e)},terminalResize(e,t){r.ipcRenderer.invoke("agentorchestrator:terminalResize",e,t)},terminalDestroy(){return r.ipcRenderer.invoke("agentorchestrator:terminalDestroy")},onTerminalData(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("agentorchestrator:terminalData",t),()=>r.ipcRenderer.off("agentorchestrator:terminalData",t)},onTerminalExit(e){const t=()=>e();return r.ipcRenderer.on("agentorchestrator:terminalExit",t),()=>r.ipcRenderer.off("agentorchestrator:terminalExit",t)},writeWorkspaceConfig(e){return r.ipcRenderer.invoke("agentorchestrator:writeWorkspaceConfig",e)},claimWorkspace(e){return r.ipcRenderer.invoke("agentorchestrator:claimWorkspace",e)},releaseWorkspace(e){return r.ipcRenderer.invoke("agentorchestrator:releaseWorkspace",e)},forceClaimWorkspace(e){return r.ipcRenderer.invoke("agentorchestrator:forceClaimWorkspace",e)},savePastedImage(e,t){return r.ipcRenderer.invoke("agentorchestrator:savePastedImage",e,t)},listWorkspaceTree(e,t){return r.ipcRenderer.invoke("agentorchestrator:listWorkspaceTree",e,t)},readWorkspaceFile(e,t){return r.ipcRenderer.invoke("agentorchestrator:readWorkspaceFile",e,t)},readWorkspaceTextFile(e,t){return r.ipcRenderer.invoke("agentorchestrator:readWorkspaceTextFile",e,t)},writeWorkspaceFile(e,t,n){return r.ipcRenderer.invoke("agentorchestrator:writeWorkspaceFile",e,t,n)},pickWorkspaceSavePath(e,t){return r.ipcRenderer.invoke("agentorchestrator:pickWorkspaceSavePath",e,t)},pickWorkspaceOpenPath(e){return r.ipcRenderer.invoke("agentorchestrator:pickWorkspaceOpenPath",e)},getGitStatus(e){return r.ipcRenderer.invoke("agentorchestrator:getGitStatus",e)},gitCommit(e,t){return r.ipcRenderer.invoke("agentorchestrator:gitCommit",e,t)},gitPush(e,t){return r.ipcRenderer.invoke("agentorchestrator:gitPush",e,t)},gitDeploy(e,t){return r.ipcRenderer.invoke("agentorchestrator:gitDeploy",e,t)},gitBuild(e,t){return r.ipcRenderer.invoke("agentorchestrator:gitBuild",e,t)},gitRelease(e,t){return r.ipcRenderer.invoke("agentorchestrator:gitRelease",e,t)},setRecentWorkspaces(e){r.ipcRenderer.send("agentorchestrator:setRecentWorkspaces",e)},setEditorMenuState(e){r.ipcRenderer.send("agentorchestrator:setEditorMenuState",!!e)},findInPage(e){return r.ipcRenderer.invoke("agentorchestrator:findInPage",e)},showContextMenu(e){return r.ipcRenderer.invoke("agentorchestrator:showContextMenu",e)},getProviderAuthStatus(e){return r.ipcRenderer.invoke("agentorchestrator:getProviderAuthStatus",e)},pingProvider(e){return r.ipcRenderer.invoke("agentorchestrator:pingProvider",e)},pingModel(e,t){return r.ipcRenderer.invoke("agentorchestrator:pingModel",e,t)},startProviderLogin(e){return r.ipcRenderer.invoke("agentorchestrator:startProviderLogin",e)},upgradeProviderCli(e){return r.ipcRenderer.invoke("agentorchestrator:upgradeProviderCli",e)},setProviderApiKey(e,t){return r.ipcRenderer.invoke("agentorchestrator:setProviderApiKey",e,t)},getProviderApiKeyState(e){return r.ipcRenderer.invoke("agentorchestrator:getProviderApiKeyState",e)},importProviderApiKeyFromEnv(e){return r.ipcRenderer.invoke("agentorchestrator:importProviderApiKeyFromEnv",e)},resetApplicationData(){return r.ipcRenderer.invoke("agentorchestrator:resetApplicationData")},getMcpServers(){return r.ipcRenderer.invoke("agentorchestrator:getMcpServers")},addMcpServer(e,t){return r.ipcRenderer.invoke("agentorchestrator:addMcpServer",e,t)},updateMcpServer(e,t){return r.ipcRenderer.invoke("agentorchestrator:updateMcpServer",e,t)},removeMcpServer(e){return r.ipcRenderer.invoke("agentorchestrator:removeMcpServer",e)},restartMcpServer(e){return r.ipcRenderer.invoke("agentorchestrator:restartMcpServer",e)},getMcpServerTools(e){return r.ipcRenderer.invoke("agentorchestrator:getMcpServerTools",e)},getGeminiAvailableModels(){return r.ipcRenderer.invoke("agentorchestrator:getGeminiAvailableModels")},getAvailableModels(){return r.ipcRenderer.invoke("agentorchestrator:getAvailableModels")},onEvent(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("agentorchestrator:event",t),()=>r.ipcRenderer.off("agentorchestrator:event",t)},onMenu(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("agentorchestrator:menu",t),()=>r.ipcRenderer.off("agentorchestrator:menu",t)},onPluginHostRequest(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("barnaby:plugin-host:request",t),()=>r.ipcRenderer.off("barnaby:plugin-host:request",t)},pluginHostRespond(e,t){return r.ipcRenderer.invoke(e,t)},onPluginHostRecovery(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("barnaby:plugin-host:recovery",t),()=>r.ipcRenderer.off("barnaby:plugin-host:recovery",t)},getLoadedPlugins(){return r.ipcRenderer.invoke("agentorchestrator:getLoadedPlugins")},onPluginsLoaded(e){const t=()=>e();return r.ipcRenderer.on("barnaby:plugin-host:plugins-loaded",t),()=>r.ipcRenderer.off("barnaby:plugin-host:plugins-loaded",t)},zoomIn(){const e=r.webFrame.getZoomLevel();r.webFrame.setZoomLevel(e+1)},zoomOut(){const e=r.webFrame.getZoomLevel();r.webFrame.setZoomLevel(e-1)},resetZoom(){r.webFrame.setZoomLevel(0)},getZoomLevel(){return r.webFrame.getZoomLevel()}};r.contextBridge.exposeInMainWorld("agentOrchestrator",i);r.contextBridge.exposeInMainWorld("fireharness",i);function d(e=["complete","interactive"]){return new Promise(t=>{e.includes(document.readyState)?t(!0):document.addEventListener("readystatechange",()=>{e.includes(document.readyState)&&t(!0)})})}const a={append(e,t){if(!Array.from(e.children).find(n=>n===t))return e.appendChild(t)},remove(e,t){if(Array.from(e.children).find(n=>n===t))return e.removeChild(t)}};function g(){const e="loaders-css__square-spin",t=`
1
+ "use strict";const r=require("electron"),i={connect(e,t){return r.ipcRenderer.invoke("agentorchestrator:connect",e,t)},sendMessage(e,t,n,o,s,p){return r.ipcRenderer.invoke("agentorchestrator:sendMessageEx",e,{text:t,imagePaths:n??[],priorMessagesForContext:o,interactionMode:s,responseStyle:p})},loadChatHistory(){return r.ipcRenderer.invoke("agentorchestrator:loadChatHistory")},saveChatHistory(e){return r.ipcRenderer.invoke("agentorchestrator:saveChatHistory",e)},saveTranscriptFile(e,t,n){return r.ipcRenderer.invoke("agentorchestrator:saveTranscriptFile",e,t,n)},saveTranscriptDirect(e,t,n){return r.ipcRenderer.invoke("agentorchestrator:saveTranscriptDirect",e,t,n)},loadAppState(){return r.ipcRenderer.invoke("agentorchestrator:loadAppState")},saveAppState(e){return r.ipcRenderer.invoke("agentorchestrator:saveAppState",e)},setWindowTheme(e){return r.ipcRenderer.invoke("agentorchestrator:setWindowTheme",e)},setWindowWorkspaceTitle(e){return r.ipcRenderer.invoke("agentorchestrator:setWindowWorkspaceTitle",e)},notifyRendererReady(){return r.ipcRenderer.invoke("agentorchestrator:rendererReady")},getDiagnosticsInfo(){return r.ipcRenderer.invoke("agentorchestrator:getDiagnosticsInfo")},openRuntimeLog(){return r.ipcRenderer.invoke("agentorchestrator:openRuntimeLog")},openDebugOutputWindow(){return r.ipcRenderer.invoke("agentorchestrator:openDebugOutputWindow")},getDebugLogContent(){return r.ipcRenderer.invoke("agentorchestrator:getDebugLogContent")},onDebugLogAppend(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("barnaby:debug-log-append",t),()=>r.ipcRenderer.removeListener("barnaby:debug-log-append",t)},openDiagnosticsPath(e){return r.ipcRenderer.invoke("agentorchestrator:openDiagnosticsPath",e)},readDiagnosticsFile(e){return r.ipcRenderer.invoke("agentorchestrator:readDiagnosticsFile",e)},writeDiagnosticsFile(e,t){return r.ipcRenderer.invoke("agentorchestrator:writeDiagnosticsFile",e,t)},openExternalUrl(e){return r.ipcRenderer.invoke("agentorchestrator:openExternalUrl",e)},getOrchestratorLicenseKeyState(){return r.ipcRenderer.invoke("agentorchestrator:getOrchestratorLicenseKeyState")},setOrchestratorLicenseKey(e){return r.ipcRenderer.invoke("agentorchestrator:setOrchestratorLicenseKey",e)},repairStartMenuShortcut(){return r.ipcRenderer.invoke("barnaby:repairStartMenuShortcut")},openPluginsFolder(){return r.ipcRenderer.invoke("agentorchestrator:openPluginsFolder")},reloadLocalPlugins(){return r.ipcRenderer.invoke("agentorchestrator:reloadLocalPlugins")},syncOrchestratorSettings(e){return r.ipcRenderer.invoke("agentorchestrator:syncOrchestratorSettings",e)},interrupt(e){return r.ipcRenderer.invoke("agentorchestrator:interrupt",e)},disconnect(e){return r.ipcRenderer.invoke("agentorchestrator:disconnect",e)},openFolderDialog(){return r.ipcRenderer.invoke("agentorchestrator:openFolderDialog")},openTerminalInWorkspace(e){return r.ipcRenderer.invoke("agentorchestrator:openTerminalInWorkspace",e)},terminalSpawn(e){return r.ipcRenderer.invoke("agentorchestrator:terminalSpawn",e)},terminalWrite(e){r.ipcRenderer.send("agentorchestrator:terminalWrite",e)},terminalResize(e,t){r.ipcRenderer.invoke("agentorchestrator:terminalResize",e,t)},terminalDestroy(){return r.ipcRenderer.invoke("agentorchestrator:terminalDestroy")},onTerminalData(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("agentorchestrator:terminalData",t),()=>r.ipcRenderer.off("agentorchestrator:terminalData",t)},onTerminalExit(e){const t=()=>e();return r.ipcRenderer.on("agentorchestrator:terminalExit",t),()=>r.ipcRenderer.off("agentorchestrator:terminalExit",t)},writeWorkspaceConfig(e,t){return r.ipcRenderer.invoke("agentorchestrator:writeWorkspaceConfig",e,t)},openWorkspaceInNewWindow(e){return r.ipcRenderer.invoke("agentorchestrator:openWorkspaceInNewWindow",e)},claimWorkspace(e){return r.ipcRenderer.invoke("agentorchestrator:claimWorkspace",e)},releaseWorkspace(e){return r.ipcRenderer.invoke("agentorchestrator:releaseWorkspace",e)},forceClaimWorkspace(e){return r.ipcRenderer.invoke("agentorchestrator:forceClaimWorkspace",e)},savePastedImage(e,t){return r.ipcRenderer.invoke("agentorchestrator:savePastedImage",e,t)},listWorkspaceTree(e,t){return r.ipcRenderer.invoke("agentorchestrator:listWorkspaceTree",e,t)},readWorkspaceFile(e,t){return r.ipcRenderer.invoke("agentorchestrator:readWorkspaceFile",e,t)},readWorkspaceTextFile(e,t){return r.ipcRenderer.invoke("agentorchestrator:readWorkspaceTextFile",e,t)},writeWorkspaceFile(e,t,n){return r.ipcRenderer.invoke("agentorchestrator:writeWorkspaceFile",e,t,n)},pickWorkspaceSavePath(e,t){return r.ipcRenderer.invoke("agentorchestrator:pickWorkspaceSavePath",e,t)},pickWorkspaceOpenPath(e){return r.ipcRenderer.invoke("agentorchestrator:pickWorkspaceOpenPath",e)},getGitStatus(e){return r.ipcRenderer.invoke("agentorchestrator:getGitStatus",e)},gitCommit(e,t){return r.ipcRenderer.invoke("agentorchestrator:gitCommit",e,t)},gitPush(e,t){return r.ipcRenderer.invoke("agentorchestrator:gitPush",e,t)},gitDeploy(e,t){return r.ipcRenderer.invoke("agentorchestrator:gitDeploy",e,t)},gitBuild(e,t){return r.ipcRenderer.invoke("agentorchestrator:gitBuild",e,t)},gitRelease(e,t){return r.ipcRenderer.invoke("agentorchestrator:gitRelease",e,t)},gitRollback(e,t){return r.ipcRenderer.invoke("agentorchestrator:gitRollback",e,t)},setRecentWorkspaces(e){r.ipcRenderer.send("agentorchestrator:setRecentWorkspaces",e)},setEditorMenuState(e){r.ipcRenderer.send("agentorchestrator:setEditorMenuState",!!e)},setDockPanelMenuState(e){r.ipcRenderer.send("agentorchestrator:setDockPanelMenuState",e)},findInPage(e){return r.ipcRenderer.invoke("agentorchestrator:findInPage",e)},showContextMenu(e){return r.ipcRenderer.invoke("agentorchestrator:showContextMenu",e)},getProviderAuthStatus(e){return r.ipcRenderer.invoke("agentorchestrator:getProviderAuthStatus",e)},pingProvider(e){return r.ipcRenderer.invoke("agentorchestrator:pingProvider",e)},pingModel(e,t,n){return r.ipcRenderer.invoke("agentorchestrator:pingModel",e,t,n)},startProviderLogin(e){return r.ipcRenderer.invoke("agentorchestrator:startProviderLogin",e)},upgradeProviderCli(e){return r.ipcRenderer.invoke("agentorchestrator:upgradeProviderCli",e)},setProviderApiKey(e,t){return r.ipcRenderer.invoke("agentorchestrator:setProviderApiKey",e,t)},getProviderApiKeyState(e){return r.ipcRenderer.invoke("agentorchestrator:getProviderApiKeyState",e)},importProviderApiKeyFromEnv(e){return r.ipcRenderer.invoke("agentorchestrator:importProviderApiKeyFromEnv",e)},resetApplicationData(){return r.ipcRenderer.invoke("agentorchestrator:resetApplicationData")},getMcpServers(){return r.ipcRenderer.invoke("agentorchestrator:getMcpServers")},addMcpServer(e,t){return r.ipcRenderer.invoke("agentorchestrator:addMcpServer",e,t)},updateMcpServer(e,t){return r.ipcRenderer.invoke("agentorchestrator:updateMcpServer",e,t)},removeMcpServer(e){return r.ipcRenderer.invoke("agentorchestrator:removeMcpServer",e)},restartMcpServer(e){return r.ipcRenderer.invoke("agentorchestrator:restartMcpServer",e)},getMcpServerTools(e){return r.ipcRenderer.invoke("agentorchestrator:getMcpServerTools",e)},getGeminiAvailableModels(){return r.ipcRenderer.invoke("agentorchestrator:getGeminiAvailableModels")},getAvailableModels(){return r.ipcRenderer.invoke("agentorchestrator:getAvailableModels")},onEvent(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("agentorchestrator:event",t),()=>r.ipcRenderer.off("agentorchestrator:event",t)},onMenu(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("agentorchestrator:menu",t),()=>r.ipcRenderer.off("agentorchestrator:menu",t)},onPluginHostRequest(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("barnaby:plugin-host:request",t),()=>r.ipcRenderer.off("barnaby:plugin-host:request",t)},pluginHostRespond(e,t){return r.ipcRenderer.invoke(e,t)},onPluginHostRecovery(e){const t=(n,o)=>e(o);return r.ipcRenderer.on("barnaby:plugin-host:recovery",t),()=>r.ipcRenderer.off("barnaby:plugin-host:recovery",t)},getLoadedPlugins(){return r.ipcRenderer.invoke("agentorchestrator:getLoadedPlugins")},startOrchestratorComparativeReview(e,t){return r.ipcRenderer.invoke("agentorchestrator:startOrchestratorComparativeReview",e,t)},startOrchestratorGoalRun(e){return r.ipcRenderer.invoke("agentorchestrator:startOrchestratorGoalRun",e)},pauseOrchestratorRun(){return r.ipcRenderer.invoke("agentorchestrator:pauseOrchestratorRun")},cancelOrchestratorRun(){return r.ipcRenderer.invoke("agentorchestrator:cancelOrchestratorRun")},getOrchestratorState(){return r.ipcRenderer.invoke("agentorchestrator:getOrchestratorState")},browseMarkdownFile(){return r.ipcRenderer.invoke("agentorchestrator:browseMarkdownFile")},onPluginsLoaded(e){const t=()=>e();return r.ipcRenderer.on("barnaby:plugin-host:plugins-loaded",t),()=>r.ipcRenderer.off("barnaby:plugin-host:plugins-loaded",t)},zoomIn(){const e=r.webFrame.getZoomLevel();r.webFrame.setZoomLevel(e+1)},zoomOut(){const e=r.webFrame.getZoomLevel();r.webFrame.setZoomLevel(e-1)},resetZoom(){r.webFrame.setZoomLevel(0)},getZoomLevel(){return r.webFrame.getZoomLevel()}};r.contextBridge.exposeInMainWorld("agentOrchestrator",i);r.contextBridge.exposeInMainWorld("fireharness",i);function d(e=["complete","interactive"]){return new Promise(t=>{e.includes(document.readyState)?t(!0):document.addEventListener("readystatechange",()=>{e.includes(document.readyState)&&t(!0)})})}const a={append(e,t){if(!Array.from(e.children).find(n=>n===t))return e.appendChild(t)},remove(e,t){if(Array.from(e.children).find(n=>n===t))return e.removeChild(t)}};function g(){const e="loaders-css__square-spin",t=`
2
2
  @keyframes square-spin {
3
3
  25% { transform: perspective(100px) rotateX(180deg) rotateY(0); }
4
4
  50% { transform: perspective(100px) rotateX(180deg) rotateY(180deg); }
@@ -24,4 +24,4 @@
24
24
  background: #282c34;
25
25
  z-index: 9;
26
26
  }
27
- `,n=document.createElement("style"),o=document.createElement("div");return n.id="app-loading-style",n.innerHTML=t,o.className="app-loading-wrap",o.innerHTML=`<div class="${e}"><div></div></div>`,{appendLoading(){a.append(document.head,n),a.append(document.body,o)},removeLoading(){a.remove(document.head,n),a.remove(document.body,o)}}}const{appendLoading:u,removeLoading:s}=g();d().then(u);window.onmessage=e=>{e.data.payload==="removeLoading"&&s()};setTimeout(s,4999);
27
+ `,n=document.createElement("style"),o=document.createElement("div");return n.id="app-loading-style",n.innerHTML=t,o.className="app-loading-wrap",o.innerHTML=`<div class="${e}"><div></div></div>`,{appendLoading(){a.append(document.head,n),a.append(document.body,o)},removeLoading(){a.remove(document.head,n),a.remove(document.body,o)}}}const{appendLoading:u,removeLoading:c}=g();d().then(u);window.onmessage=e=>{e.data.payload==="removeLoading"&&c()};setTimeout(c,4999);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@barnaby.build/barnaby",
3
3
  "productName": "Barnaby",
4
- "version": "0.0.171",
4
+ "version": "0.0.234",
5
5
  "main": "dist-electron/main/index.js",
6
6
  "bin": {
7
7
  "barnaby": "bin/barnaby.cjs"
@@ -12,12 +12,21 @@
12
12
  "public",
13
13
  "build",
14
14
  "bin",
15
+ "docs/screenshots",
15
16
  "scripts",
16
17
  "package.json"
17
18
  ],
18
19
  "description": "Barnaby: local agent loops without API keys.",
19
20
  "author": "stuart",
20
21
  "license": "MIT",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/incendiosoftware/Barnaby.git"
25
+ },
26
+ "homepage": "https://github.com/incendiosoftware/Barnaby",
27
+ "bugs": {
28
+ "url": "https://github.com/incendiosoftware/Barnaby/issues"
29
+ },
21
30
  "publishConfig": {
22
31
  "access": "public"
23
32
  },
@@ -35,23 +44,28 @@
35
44
  "predev": "node -e \"const major = Number(process.versions.node.split('.')[0]); if (major < 20 || major >= 27) { console.error('\\nUnsupported Node.js version ' + process.version + '.\\nUse Node >=20 and <27 (recommended: Node 22 LTS).\\n'); process.exit(1); }\"",
36
45
  "dev": "vite",
37
46
  "dev:clean": "node scripts/dev-clean.mjs && npm run dev",
47
+ "prebuild:dist:raw": "node scripts/sync-icon.mjs",
38
48
  "build:dist:raw": "tsc && vite build",
39
- "build:dist": "npm run bump:version && npm run build:dist:raw",
40
- "build:portable:raw": "npm run build:dist:raw && electron-builder --win portable",
41
- "build": "npm run build:portable",
42
- "build:portable": "npm run build:dist && electron-builder --win portable",
49
+ "build:dist": "node scripts/run-with-version-bump.mjs \"npm run build:dist:raw\"",
50
+ "build:portable:raw": "npm run build:dist:raw && electron-builder --win portable && node scripts/apply-exe-icon.mjs",
51
+ "build": "node scripts/build-dispatch.mjs",
52
+ "build:raw": "npm run build:portable:raw",
53
+ "build:portable": "node scripts/run-with-version-bump.mjs \"npm run build:portable:raw\"",
43
54
  "package": "npm run build:portable",
44
55
  "deploy": "npm run package",
45
- "build:release": "npm run build:dist && electron-builder",
56
+ "build:release": "npm run build:dist && electron-builder && node scripts/apply-exe-icon.mjs",
57
+ "build:release:raw": "npm run build:dist:raw && electron-builder --publish never && node scripts/apply-exe-icon.mjs",
46
58
  "release:notes": "node scripts/create-release-notes.mjs",
47
- "release:prepare": "npm run bump:version && npm run release:notes && npm run build:portable:raw",
48
- "publish": "gh workflow run release.yml -f releasable=true --ref main",
59
+ "release:prepare": "node scripts/run-with-version-bump.mjs \"npm run release:notes && npm run build:portable:raw\"",
49
60
  "postinstall": "node scripts/shortcut-win.mjs && node scripts/rebuild-native.mjs",
50
- "publish:npm": "npm run build && npm publish",
51
- "package:win": "npm run build:dist && electron-packager . Barnaby --platform=win32 --arch=x64 --out=release/0.0.1/packaged --overwrite --asar --prune=true --icon=build/icon.png",
61
+ "publish:npm": "npm run build:dist:raw && npm pack --dry-run && npm publish",
62
+ "package:win": "npm run build:dist && electron-packager . Barnaby --platform=win32 --arch=x64 --out=release/0.0.1/packaged --overwrite --asar --prune=true --icon=build/icon.ico",
52
63
  "preview": "vite preview",
53
64
  "pretest": "vite build --mode=test",
54
- "test": "vitest run"
65
+ "test": "vitest run",
66
+ "orch:build": "cd ../barnaby-orchestrator && npm run build:raw",
67
+ "orch:deploy": "npm run orch:build && node -e \"const fs=require('fs'),path=require('path'),os=require('os');const src=path.resolve('../barnaby-orchestrator');const dest=path.join(os.homedir(),'.barnaby','plugins','barnaby-orchestrator');const distSrc=path.join(src,'dist');const distDest=path.join(dest,'dist');fs.rmSync(dest,{recursive:true,force:true});fs.mkdirSync(distDest,{recursive:true});for(const f of fs.readdirSync(distSrc))fs.copyFileSync(path.join(distSrc,f),path.join(distDest,f));fs.copyFileSync(path.join(src,'package.json'),path.join(dest,'package.json'));console.log('Orchestrator deployed to '+dest)\"",
68
+ "build:all": "npm run build:portable && npm run orch:deploy"
55
69
  },
56
70
  "dependencies": {
57
71
  "@codemirror/lang-cpp": "^6.0.3",
@@ -69,6 +83,7 @@
69
83
  "@google/genai": "^1.42.0",
70
84
  "@modelcontextprotocol/sdk": "^1.27.0",
71
85
  "@types/react-syntax-highlighter": "^15.5.13",
86
+ "@uiw/codemirror-theme-vscode": "^4.25.5",
72
87
  "@uiw/react-codemirror": "^4.25.4",
73
88
  "@xterm/addon-fit": "^0.11.0",
74
89
  "@xterm/xterm": "^5.3.0",
@@ -96,6 +111,7 @@
96
111
  "electron-builder": "^26.8.1",
97
112
  "postcss": "^8.4.49",
98
113
  "postcss-import": "^16.1.0",
114
+ "rcedit": "^5.0.2",
99
115
  "react": "^18.3.1",
100
116
  "react-dom": "^18.3.1",
101
117
  "tailwindcss": "^3.4.15",
@@ -1,65 +1,65 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>Barnaby Debug Output</title>
7
- <style>
8
- * { box-sizing: border-box; }
9
- html, body { margin: 0; height: 100%; font-family: 'Consolas', 'Monaco', monospace; font-size: 12px; background: #1e1e1e; color: #d4d4d4; overflow: hidden; }
10
- #toolbar { padding: 6px 8px; background: #252526; border-bottom: 1px solid #3c3c3c; display: flex; align-items: center; gap: 8px; }
11
- #toolbar button { padding: 4px 10px; font-size: 11px; cursor: pointer; background: #0e639c; color: white; border: none; border-radius: 2px; }
12
- #toolbar button:hover { background: #1177bb; }
13
- #toolbar button.secondary { background: #3c3c3c; }
14
- #toolbar button.secondary:hover { background: #505050; }
15
- #log { padding: 8px; height: calc(100% - 36px); overflow: auto; white-space: pre-wrap; word-wrap: break-word; }
16
- .error { color: #f48771; }
17
- .warn { color: #dcdcaa; }
18
- .info { color: #9cdcfe; }
19
- </style>
20
- </head>
21
- <body>
22
- <div id="toolbar">
23
- <button id="refresh">Refresh</button>
24
- <button id="clear" class="secondary">Clear view</button>
25
- <span id="status" style="font-size: 11px; color: #858585;"></span>
26
- </div>
27
- <pre id="log"></pre>
28
- <script>
29
- const logEl = document.getElementById('log');
30
- const statusEl = document.getElementById('status');
31
- function render(content) {
32
- const lines = (content || '').split('\n');
33
- logEl.innerHTML = lines.map(l => {
34
- if (l.includes('[ERROR]')) return '<span class="error">' + escapeHtml(l) + '</span>';
35
- if (l.includes('[WARN]')) return '<span class="warn">' + escapeHtml(l) + '</span>';
36
- return '<span class="info">' + escapeHtml(l) + '</span>';
37
- }).join('\n');
38
- logEl.scrollTop = logEl.scrollHeight;
39
- }
40
- function escapeHtml(s) { return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); }
41
- async function load() {
42
- try {
43
- const r = await (window.api && window.api.getDebugLogContent ? window.api.getDebugLogContent() : Promise.resolve({ ok: false, content: '' }));
44
- render(r.ok ? r.content : '');
45
- statusEl.textContent = r.ok ? 'Live' : 'No API';
46
- } catch (e) {
47
- statusEl.textContent = 'Error: ' + e.message;
48
- }
49
- }
50
- document.getElementById('refresh').onclick = load;
51
- document.getElementById('clear').onclick = () => { logEl.innerHTML = ''; statusEl.textContent = 'Cleared'; };
52
- if (window.api && window.api.onDebugLogAppend) {
53
- window.api.onDebugLogAppend((line) => {
54
- const span = document.createElement('span');
55
- span.className = line.includes('[ERROR]') ? 'error' : line.includes('[WARN]') ? 'warn' : 'info';
56
- span.textContent = line + '\n';
57
- logEl.appendChild(span);
58
- logEl.scrollTop = logEl.scrollHeight;
59
- });
60
- }
61
- load();
62
- setInterval(load, 2000);
63
- </script>
64
- </body>
65
- </html>
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Barnaby Debug Output</title>
7
+ <style>
8
+ * { box-sizing: border-box; }
9
+ html, body { margin: 0; height: 100%; font-family: 'Consolas', 'Monaco', monospace; font-size: 12px; background: #1e1e1e; color: #d4d4d4; overflow: hidden; }
10
+ #toolbar { padding: 6px 8px; background: #252526; border-bottom: 1px solid #3c3c3c; display: flex; align-items: center; gap: 8px; }
11
+ #toolbar button { padding: 4px 10px; font-size: 11px; cursor: pointer; background: #0e639c; color: white; border: none; border-radius: 2px; }
12
+ #toolbar button:hover { background: #1177bb; }
13
+ #toolbar button.secondary { background: #3c3c3c; }
14
+ #toolbar button.secondary:hover { background: #505050; }
15
+ #log { padding: 8px; height: calc(100% - 36px); overflow: auto; white-space: pre-wrap; word-wrap: break-word; }
16
+ .error { color: #f48771; }
17
+ .warn { color: #dcdcaa; }
18
+ .info { color: #9cdcfe; }
19
+ </style>
20
+ </head>
21
+ <body>
22
+ <div id="toolbar">
23
+ <button id="refresh">Refresh</button>
24
+ <button id="clear" class="secondary">Clear view</button>
25
+ <span id="status" style="font-size: 11px; color: #858585;"></span>
26
+ </div>
27
+ <pre id="log"></pre>
28
+ <script>
29
+ const logEl = document.getElementById('log');
30
+ const statusEl = document.getElementById('status');
31
+ function render(content) {
32
+ const lines = (content || '').split('\n');
33
+ logEl.innerHTML = lines.map(l => {
34
+ if (l.includes('[ERROR]')) return '<span class="error">' + escapeHtml(l) + '</span>';
35
+ if (l.includes('[WARN]')) return '<span class="warn">' + escapeHtml(l) + '</span>';
36
+ return '<span class="info">' + escapeHtml(l) + '</span>';
37
+ }).join('\n');
38
+ logEl.scrollTop = logEl.scrollHeight;
39
+ }
40
+ function escapeHtml(s) { return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); }
41
+ async function load() {
42
+ try {
43
+ const r = await (window.api && window.api.getDebugLogContent ? window.api.getDebugLogContent() : Promise.resolve({ ok: false, content: '' }));
44
+ render(r.ok ? r.content : '');
45
+ statusEl.textContent = r.ok ? 'Live' : 'No API';
46
+ } catch (e) {
47
+ statusEl.textContent = 'Error: ' + e.message;
48
+ }
49
+ }
50
+ document.getElementById('refresh').onclick = load;
51
+ document.getElementById('clear').onclick = () => { logEl.innerHTML = ''; statusEl.textContent = 'Cleared'; };
52
+ if (window.api && window.api.onDebugLogAppend) {
53
+ window.api.onDebugLogAppend((line) => {
54
+ const span = document.createElement('span');
55
+ span.className = line.includes('[ERROR]') ? 'error' : line.includes('[WARN]') ? 'warn' : 'info';
56
+ span.textContent = line + '\n';
57
+ logEl.appendChild(span);
58
+ logEl.scrollTop = logEl.scrollHeight;
59
+ });
60
+ }
61
+ load();
62
+ setInterval(load, 2000);
63
+ </script>
64
+ </body>
65
+ </html>
@@ -1,46 +1,46 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Barnaby Splash</title>
7
- <style>
8
- html, body {
9
- margin: 0;
10
- width: 100%;
11
- height: 100%;
12
- background: #0b0b0b;
13
- overflow: hidden;
14
- }
15
- .root {
16
- width: 100%;
17
- height: 100%;
18
- display: flex;
19
- align-items: center;
20
- justify-content: center;
21
- }
22
- img {
23
- max-width: 90%;
24
- max-height: 90%;
25
- object-fit: contain;
26
- user-select: none;
27
- -webkit-user-drag: none;
28
- }
29
- .version {
30
- position: fixed;
31
- bottom: 8px;
32
- right: 12px;
33
- font-size: 11px;
34
- color: white;
35
- font-family: system-ui, sans-serif;
36
- opacity: 0.8;
37
- }
38
- </style>
39
- </head>
40
- <body>
41
- <div class="root">
42
- <img src="./splash.png" alt="Barnaby splash" />
43
- </div>
44
- <div id="version" class="version"></div>
45
- </body>
46
- </html>
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Barnaby Splash</title>
7
+ <style>
8
+ html, body {
9
+ margin: 0;
10
+ width: 100%;
11
+ height: 100%;
12
+ background: #0b0b0b;
13
+ overflow: hidden;
14
+ }
15
+ .root {
16
+ width: 100%;
17
+ height: 100%;
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ }
22
+ img {
23
+ max-width: 90%;
24
+ max-height: 90%;
25
+ object-fit: contain;
26
+ user-select: none;
27
+ -webkit-user-drag: none;
28
+ }
29
+ .version {
30
+ position: fixed;
31
+ bottom: 8px;
32
+ right: 12px;
33
+ font-size: 11px;
34
+ color: white;
35
+ font-family: system-ui, sans-serif;
36
+ opacity: 0.8;
37
+ }
38
+ </style>
39
+ </head>
40
+ <body>
41
+ <div class="root">
42
+ <img src="./splash.png" alt="Barnaby splash" />
43
+ </div>
44
+ <div id="version" class="version"></div>
45
+ </body>
46
+ </html>
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Apply build/icon.ico to built Windows executables using rcedit.
4
+ * electron-builder with signAndEditExecutable:false skips icon embedding;
5
+ * this script patches the exe(s) after build so the custom icon appears.
6
+ */
7
+ import fs from 'node:fs'
8
+ import path from 'node:path'
9
+ import { rcedit } from 'rcedit'
10
+
11
+ const root = process.cwd()
12
+ const iconPath = path.join(root, 'build', 'icon.ico')
13
+
14
+ if (!fs.existsSync(iconPath)) {
15
+ console.warn('[apply-exe-icon] build/icon.ico not found, skipping')
16
+ process.exit(0)
17
+ }
18
+
19
+ // Read version from package.json
20
+ const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'))
21
+ const version = pkg.version
22
+ const releaseDir = path.join(root, 'release', version)
23
+
24
+ if (!fs.existsSync(releaseDir)) {
25
+ console.warn('[apply-exe-icon] release dir not found:', releaseDir)
26
+ process.exit(0)
27
+ }
28
+
29
+ // Only patch win-unpacked and setup exe. Do NOT patch portable exe - it is a 7-Zip SFX
30
+ // and rcedit corrupts it (replaces archive payload with resource data, shrinking to ~90KB).
31
+ const targets = [
32
+ path.join(releaseDir, 'win-unpacked', 'Barnaby.exe'),
33
+ path.join(releaseDir, `Barnaby_${version}_setup.exe`),
34
+ ]
35
+
36
+ let patched = 0
37
+ for (const exePath of targets) {
38
+ if (fs.existsSync(exePath)) {
39
+ try {
40
+ await rcedit(exePath, { icon: iconPath })
41
+ console.log('[apply-exe-icon] Applied icon to', path.relative(root, exePath))
42
+ patched++
43
+ } catch (err) {
44
+ console.error('[apply-exe-icon] Failed to patch', exePath, err.message)
45
+ }
46
+ }
47
+ }
48
+
49
+ if (patched === 0) {
50
+ console.warn('[apply-exe-icon] No executables found to patch')
51
+ }
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from 'node:child_process'
3
+
4
+ const args = process.argv
5
+ .slice(2)
6
+ .map((value) => value.trim().toLowerCase())
7
+ .filter(Boolean)
8
+
9
+ let targetScript = ''
10
+ if (args.length === 0) {
11
+ targetScript = 'build:portable:raw'
12
+ } else if (args.length === 1 && args[0] === 'raw') {
13
+ targetScript = 'build:portable:raw'
14
+ } else if (args.length === 1 && (args[0] === 'bump' || args[0] === 'versioned')) {
15
+ targetScript = 'build:portable'
16
+ } else {
17
+ console.error('[build] Invalid arguments.')
18
+ console.error('[build] Allowed usage:')
19
+ console.error(' npm run build')
20
+ console.error(' npm run build raw')
21
+ console.error(' npm run build bump')
22
+ console.error(' npm run build versioned')
23
+ console.error(' npm run build:raw')
24
+ console.error(' npm run build:dist:raw')
25
+ console.error(' npm run build:portable:raw')
26
+ process.exit(1)
27
+ }
28
+
29
+ const result = spawnSync(`npm run ${targetScript}`, {
30
+ stdio: 'inherit',
31
+ env: process.env,
32
+ shell: true,
33
+ })
34
+
35
+ if (result.error) {
36
+ console.error(`[build] Failed to run "${targetScript}": ${result.error.message}`)
37
+ process.exit(1)
38
+ }
39
+
40
+ process.exit(result.status ?? 1)
@@ -1,35 +1,35 @@
1
- import fs from 'node:fs'
2
- import path from 'node:path'
3
-
4
- const root = process.cwd()
5
- const packageJsonPath = path.join(root, 'package.json')
6
- const packageLockPath = path.join(root, 'package-lock.json')
7
-
8
- function bumpPatch(version) {
9
- const parts = String(version).trim().split('.')
10
- if (parts.length !== 3) {
11
- throw new Error(`Expected semantic version x.y.z, got "${version}"`)
12
- }
13
- const [major, minor, patch] = parts.map((p) => Number(p))
14
- if ([major, minor, patch].some((n) => Number.isNaN(n))) {
15
- throw new Error(`Expected numeric semantic version, got "${version}"`)
16
- }
17
- return `${major}.${minor}.${patch + 1}`
18
- }
19
-
20
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
21
- const currentVersion = packageJson.version
22
- const nextVersion = bumpPatch(currentVersion)
23
- packageJson.version = nextVersion
24
- fs.writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\n`, 'utf8')
25
-
26
- if (fs.existsSync(packageLockPath)) {
27
- const packageLock = JSON.parse(fs.readFileSync(packageLockPath, 'utf8'))
28
- if (typeof packageLock.version === 'string') packageLock.version = nextVersion
29
- if (packageLock.packages && packageLock.packages[''] && typeof packageLock.packages[''].version === 'string') {
30
- packageLock.packages[''].version = nextVersion
31
- }
32
- fs.writeFileSync(packageLockPath, `${JSON.stringify(packageLock, null, 2)}\n`, 'utf8')
33
- }
34
-
35
- console.log(`Version bumped: ${currentVersion} -> ${nextVersion}`)
1
+ import fs from 'node:fs'
2
+ import path from 'node:path'
3
+
4
+ const root = process.cwd()
5
+ const packageJsonPath = path.join(root, 'package.json')
6
+ const packageLockPath = path.join(root, 'package-lock.json')
7
+
8
+ function bumpPatch(version) {
9
+ const parts = String(version).trim().split('.')
10
+ if (parts.length !== 3) {
11
+ throw new Error(`Expected semantic version x.y.z, got "${version}"`)
12
+ }
13
+ const [major, minor, patch] = parts.map((p) => Number(p))
14
+ if ([major, minor, patch].some((n) => Number.isNaN(n))) {
15
+ throw new Error(`Expected numeric semantic version, got "${version}"`)
16
+ }
17
+ return `${major}.${minor}.${patch + 1}`
18
+ }
19
+
20
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
21
+ const currentVersion = packageJson.version
22
+ const nextVersion = bumpPatch(currentVersion)
23
+ packageJson.version = nextVersion
24
+ fs.writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\n`, 'utf8')
25
+
26
+ if (fs.existsSync(packageLockPath)) {
27
+ const packageLock = JSON.parse(fs.readFileSync(packageLockPath, 'utf8'))
28
+ if (typeof packageLock.version === 'string') packageLock.version = nextVersion
29
+ if (packageLock.packages && packageLock.packages[''] && typeof packageLock.packages[''].version === 'string') {
30
+ packageLock.packages[''].version = nextVersion
31
+ }
32
+ fs.writeFileSync(packageLockPath, `${JSON.stringify(packageLock, null, 2)}\n`, 'utf8')
33
+ }
34
+
35
+ console.log(`Version bumped: ${currentVersion} -> ${nextVersion}`)
@@ -1,47 +1,47 @@
1
- import fs from 'node:fs'
2
- import path from 'node:path'
3
-
4
- const root = process.cwd()
5
- const packageJsonPath = path.join(root, 'package.json')
6
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
7
- const version = String(packageJson.version || '').trim()
8
-
9
- if (!version) {
10
- throw new Error('package.json version is missing.')
11
- }
12
-
13
- const notesFilename = `RELEASE_NOTES_${version}.md`
14
- const notesPath = path.join(root, notesFilename)
15
-
16
- if (fs.existsSync(notesPath)) {
17
- console.log(`Release notes already exist: ${notesFilename}`)
18
- process.exit(0)
19
- }
20
-
21
- const now = new Date()
22
- const month = now.toLocaleString('en-US', { month: 'long' })
23
- const year = now.getFullYear()
24
-
25
- const template = `# Barnaby ${version} - Release Notes
26
-
27
- **Released:** ${month} ${year}
28
-
29
- ## Added
30
-
31
- - TODO
32
-
33
- ## Changed
34
-
35
- - TODO
36
-
37
- ## Fixed
38
-
39
- - TODO
40
-
41
- ## Notes
42
-
43
- - Artifact: \`release/${version}/Barnaby_${version}_portable.exe\`
44
- `
45
-
46
- fs.writeFileSync(notesPath, template, 'utf8')
47
- console.log(`Created ${notesFilename}`)
1
+ import fs from 'node:fs'
2
+ import path from 'node:path'
3
+
4
+ const root = process.cwd()
5
+ const packageJsonPath = path.join(root, 'package.json')
6
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
7
+ const version = String(packageJson.version || '').trim()
8
+
9
+ if (!version) {
10
+ throw new Error('package.json version is missing.')
11
+ }
12
+
13
+ const notesFilename = `RELEASE_NOTES_${version}.md`
14
+ const notesPath = path.join(root, notesFilename)
15
+
16
+ if (fs.existsSync(notesPath)) {
17
+ console.log(`Release notes already exist: ${notesFilename}`)
18
+ process.exit(0)
19
+ }
20
+
21
+ const now = new Date()
22
+ const month = now.toLocaleString('en-US', { month: 'long' })
23
+ const year = now.getFullYear()
24
+
25
+ const template = `# Barnaby ${version} - Release Notes
26
+
27
+ **Released:** ${month} ${year}
28
+
29
+ ## Added
30
+
31
+ - TODO
32
+
33
+ ## Changed
34
+
35
+ - TODO
36
+
37
+ ## Fixed
38
+
39
+ - TODO
40
+
41
+ ## Notes
42
+
43
+ - Artifact: \`release/${version}/Barnaby_${version}_portable.exe\`
44
+ `
45
+
46
+ fs.writeFileSync(notesPath, template, 'utf8')
47
+ console.log(`Created ${notesFilename}`)