wave-agent-sdk 0.4.0 → 0.6.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/dist/agent.d.ts +42 -11
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +114 -115
- package/dist/constants/prompts.d.ts +18 -14
- package/dist/constants/prompts.d.ts.map +1 -1
- package/dist/constants/prompts.js +130 -54
- package/dist/constants/tools.d.ts +6 -3
- package/dist/constants/tools.d.ts.map +1 -1
- package/dist/constants/tools.js +6 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/managers/MemoryRuleManager.js +1 -1
- package/dist/managers/aiManager.d.ts +5 -3
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +57 -20
- package/dist/managers/backgroundBashManager.d.ts.map +1 -1
- package/dist/managers/backgroundBashManager.js +1 -0
- package/dist/managers/backgroundTaskManager.d.ts +35 -0
- package/dist/managers/backgroundTaskManager.d.ts.map +1 -0
- package/dist/managers/backgroundTaskManager.js +255 -0
- package/dist/managers/foregroundTaskManager.d.ts +9 -0
- package/dist/managers/foregroundTaskManager.d.ts.map +1 -0
- package/dist/managers/foregroundTaskManager.js +21 -0
- package/dist/managers/liveConfigManager.d.ts +1 -1
- package/dist/managers/lspManager.d.ts.map +1 -1
- package/dist/managers/lspManager.js +3 -1
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/messageManager.d.ts +26 -12
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +138 -64
- package/dist/managers/permissionManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.js +26 -22
- package/dist/managers/planManager.d.ts +1 -1
- package/dist/managers/planManager.d.ts.map +1 -1
- package/dist/managers/planManager.js +2 -2
- package/dist/managers/pluginManager.d.ts.map +1 -1
- package/dist/managers/pluginManager.js +3 -2
- package/dist/managers/slashCommandManager.d.ts +6 -0
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +8 -2
- package/dist/managers/subagentManager.d.ts +15 -2
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +153 -39
- package/dist/managers/toolManager.d.ts +18 -1
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +29 -5
- package/dist/services/GitService.d.ts.map +1 -1
- package/dist/services/GitService.js +6 -2
- package/dist/services/MarketplaceService.d.ts +2 -2
- package/dist/services/MarketplaceService.d.ts.map +1 -1
- package/dist/services/MarketplaceService.js +18 -11
- package/dist/services/MemoryRuleService.d.ts +1 -1
- package/dist/services/MemoryRuleService.d.ts.map +1 -1
- package/dist/services/MemoryRuleService.js +13 -2
- package/dist/services/aiService.d.ts +0 -1
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +4 -140
- package/dist/services/memory.d.ts +0 -3
- package/dist/services/memory.d.ts.map +1 -1
- package/dist/services/memory.js +1 -60
- package/dist/services/session.d.ts +15 -1
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +57 -1
- package/dist/services/taskManager.d.ts +21 -0
- package/dist/services/taskManager.d.ts.map +1 -0
- package/dist/services/taskManager.js +158 -0
- package/dist/tools/askUserQuestion.d.ts.map +1 -1
- package/dist/tools/askUserQuestion.js +39 -25
- package/dist/tools/bashTool.d.ts +0 -8
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +48 -172
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +8 -6
- package/dist/tools/exitPlanMode.d.ts.map +1 -1
- package/dist/tools/exitPlanMode.js +25 -1
- package/dist/tools/globTool.d.ts.map +1 -1
- package/dist/tools/globTool.js +8 -2
- package/dist/tools/grepTool.d.ts.map +1 -1
- package/dist/tools/grepTool.js +17 -6
- package/dist/tools/lsTool.d.ts.map +1 -1
- package/dist/tools/lsTool.js +3 -1
- package/dist/tools/multiEditTool.d.ts.map +1 -1
- package/dist/tools/multiEditTool.js +7 -6
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +16 -1
- package/dist/tools/taskManagementTools.d.ts +6 -0
- package/dist/tools/taskManagementTools.d.ts.map +1 -0
- package/dist/tools/taskManagementTools.js +453 -0
- package/dist/tools/taskOutputTool.d.ts +3 -0
- package/dist/tools/taskOutputTool.d.ts.map +1 -0
- package/dist/tools/taskOutputTool.js +173 -0
- package/dist/tools/taskStopTool.d.ts +3 -0
- package/dist/tools/taskStopTool.d.ts.map +1 -0
- package/dist/tools/taskStopTool.js +71 -0
- package/dist/tools/taskTool.d.ts.map +1 -1
- package/dist/tools/taskTool.js +110 -63
- package/dist/tools/types.d.ts +12 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +9 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/marketplace.d.ts +1 -0
- package/dist/types/marketplace.d.ts.map +1 -1
- package/dist/types/messaging.d.ts +3 -8
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/processes.d.ts +29 -4
- package/dist/types/processes.d.ts.map +1 -1
- package/dist/types/tasks.d.ts +13 -0
- package/dist/types/tasks.d.ts.map +1 -0
- package/dist/types/tasks.js +1 -0
- package/dist/types/tools.d.ts +4 -1
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/utils/builtinSubagents.d.ts.map +1 -1
- package/dist/utils/builtinSubagents.js +38 -1
- package/dist/utils/cacheControlUtils.d.ts.map +1 -1
- package/dist/utils/cacheControlUtils.js +18 -12
- package/dist/utils/constants.d.ts +0 -4
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +0 -4
- package/dist/utils/convertMessagesForAPI.js +2 -2
- package/dist/utils/editUtils.d.ts +2 -11
- package/dist/utils/editUtils.d.ts.map +1 -1
- package/dist/utils/editUtils.js +52 -79
- package/dist/utils/messageOperations.d.ts +5 -36
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +9 -98
- package/dist/utils/nameGenerator.d.ts +1 -1
- package/dist/utils/nameGenerator.d.ts.map +1 -1
- package/dist/utils/nameGenerator.js +19 -3
- package/package.json +5 -5
- package/src/agent.ts +157 -134
- package/src/constants/prompts.ts +156 -65
- package/src/constants/tools.ts +6 -3
- package/src/index.ts +1 -0
- package/src/managers/MemoryRuleManager.ts +1 -1
- package/src/managers/aiManager.ts +77 -35
- package/src/managers/backgroundBashManager.ts +1 -0
- package/src/managers/backgroundTaskManager.ts +305 -0
- package/src/managers/foregroundTaskManager.ts +27 -0
- package/src/managers/lspManager.ts +3 -1
- package/src/managers/mcpManager.ts +6 -3
- package/src/managers/messageManager.ts +185 -75
- package/src/managers/permissionManager.ts +33 -28
- package/src/managers/planManager.ts +2 -2
- package/src/managers/pluginManager.ts +4 -3
- package/src/managers/slashCommandManager.ts +15 -2
- package/src/managers/subagentManager.ts +194 -35
- package/src/managers/toolManager.ts +48 -6
- package/src/services/GitService.ts +6 -2
- package/src/services/MarketplaceService.ts +30 -12
- package/src/services/MemoryRuleService.ts +18 -6
- package/src/services/aiService.ts +3 -145
- package/src/services/memory.ts +1 -73
- package/src/services/session.ts +73 -0
- package/src/services/taskManager.ts +188 -0
- package/src/tools/askUserQuestion.ts +51 -29
- package/src/tools/bashTool.ts +63 -196
- package/src/tools/editTool.ts +9 -18
- package/src/tools/exitPlanMode.ts +26 -2
- package/src/tools/globTool.ts +10 -2
- package/src/tools/grepTool.ts +17 -6
- package/src/tools/lsTool.ts +3 -1
- package/src/tools/multiEditTool.ts +7 -18
- package/src/tools/readTool.ts +17 -1
- package/src/tools/taskManagementTools.ts +498 -0
- package/src/tools/taskOutputTool.ts +196 -0
- package/src/tools/taskStopTool.ts +78 -0
- package/src/tools/taskTool.ts +136 -74
- package/src/tools/types.ts +13 -0
- package/src/tools/writeTool.ts +9 -2
- package/src/types/index.ts +1 -0
- package/src/types/marketplace.ts +1 -0
- package/src/types/messaging.ts +2 -9
- package/src/types/processes.ts +39 -4
- package/src/types/tasks.ts +13 -0
- package/src/types/tools.ts +4 -1
- package/src/utils/builtinSubagents.ts +47 -1
- package/src/utils/cacheControlUtils.ts +26 -18
- package/src/utils/constants.ts +0 -5
- package/src/utils/convertMessagesForAPI.ts +2 -2
- package/src/utils/editUtils.ts +65 -103
- package/src/utils/messageOperations.ts +12 -136
- package/src/utils/nameGenerator.ts +20 -3
- package/dist/tools/todoWriteTool.d.ts +0 -6
- package/dist/tools/todoWriteTool.d.ts.map +0 -1
- package/dist/tools/todoWriteTool.js +0 -220
- package/src/tools/todoWriteTool.ts +0 -257
|
@@ -1,25 +1,6 @@
|
|
|
1
|
-
import { MessageSource } from "../types/index.js";
|
|
2
|
-
import { DEFAULT_KEEP_LAST_MESSAGES_COUNT } from "./constants.js";
|
|
3
1
|
import { readFileSync } from "fs";
|
|
4
2
|
import { extname } from "path";
|
|
5
3
|
import { logger } from "./globalLogger.js";
|
|
6
|
-
/**
|
|
7
|
-
* Extract text content from user messages in the messages array
|
|
8
|
-
* Excludes messages with source HOOK to prevent hook-generated content from entering user history
|
|
9
|
-
*/
|
|
10
|
-
export const extractUserInputHistory = (messages) => {
|
|
11
|
-
return messages
|
|
12
|
-
.filter((message) => message.role === "user")
|
|
13
|
-
.map((message) => {
|
|
14
|
-
// Extract text block content, excluding HOOK-sourced blocks
|
|
15
|
-
const textBlocks = message.blocks.filter((block) => block.type === "text" && block.source !== MessageSource.HOOK);
|
|
16
|
-
return textBlocks
|
|
17
|
-
.map((block) => block.content)
|
|
18
|
-
.join(" ")
|
|
19
|
-
.trim();
|
|
20
|
-
})
|
|
21
|
-
.filter((text) => text.length > 0); // Filter out empty text
|
|
22
|
-
};
|
|
23
4
|
/**
|
|
24
5
|
* Convert image file path to base64 format
|
|
25
6
|
* @param imagePath Image file path
|
|
@@ -116,7 +97,7 @@ export const addAssistantMessageToMessages = (messages, content, toolCalls, usag
|
|
|
116
97
|
return [...messages, initialAssistantMessage];
|
|
117
98
|
};
|
|
118
99
|
// Update Tool Block of the last assistant message
|
|
119
|
-
export const updateToolBlockInMessage = ({ messages, id, parameters, result, success, error, stage, name, shortResult, images, compactParams, parametersChunk, }) => {
|
|
100
|
+
export const updateToolBlockInMessage = ({ messages, id, parameters, result, success, error, stage, name, shortResult, images, compactParams, parametersChunk, isManuallyBackgrounded, }) => {
|
|
120
101
|
const newMessages = [...messages];
|
|
121
102
|
// Find the last assistant message
|
|
122
103
|
for (let i = newMessages.length - 1; i >= 0; i--) {
|
|
@@ -141,6 +122,8 @@ export const updateToolBlockInMessage = ({ messages, id, parameters, result, suc
|
|
|
141
122
|
toolBlock.compactParams = compactParams;
|
|
142
123
|
if (parametersChunk !== undefined)
|
|
143
124
|
toolBlock.parametersChunk = parametersChunk;
|
|
125
|
+
if (isManuallyBackgrounded !== undefined)
|
|
126
|
+
toolBlock.isManuallyBackgrounded = isManuallyBackgrounded;
|
|
144
127
|
}
|
|
145
128
|
}
|
|
146
129
|
else {
|
|
@@ -159,6 +142,7 @@ export const updateToolBlockInMessage = ({ messages, id, parameters, result, suc
|
|
|
159
142
|
stage: stage ?? "start",
|
|
160
143
|
compactParams: compactParams,
|
|
161
144
|
parametersChunk: parametersChunk,
|
|
145
|
+
isManuallyBackgrounded: isManuallyBackgrounded,
|
|
162
146
|
});
|
|
163
147
|
}
|
|
164
148
|
break;
|
|
@@ -198,83 +182,6 @@ export const addErrorBlockToMessage = ({ messages, error, }) => {
|
|
|
198
182
|
}
|
|
199
183
|
return newMessages;
|
|
200
184
|
};
|
|
201
|
-
// Add Memory Block as new assistant message
|
|
202
|
-
export const addMemoryBlockToMessage = ({ messages, content, isSuccess, memoryType, storagePath, }) => {
|
|
203
|
-
const newMessages = [...messages];
|
|
204
|
-
// Create new assistant message containing MemoryBlock
|
|
205
|
-
const memoryMessage = {
|
|
206
|
-
role: "assistant",
|
|
207
|
-
blocks: [
|
|
208
|
-
{
|
|
209
|
-
type: "memory",
|
|
210
|
-
content,
|
|
211
|
-
isSuccess,
|
|
212
|
-
memoryType,
|
|
213
|
-
storagePath,
|
|
214
|
-
},
|
|
215
|
-
],
|
|
216
|
-
};
|
|
217
|
-
// Add to end of message list
|
|
218
|
-
newMessages.push(memoryMessage);
|
|
219
|
-
return newMessages;
|
|
220
|
-
};
|
|
221
|
-
/**
|
|
222
|
-
* Count valid blocks from the end
|
|
223
|
-
* Only text, image, and tool type blocks are counted
|
|
224
|
-
* @param messages Message array
|
|
225
|
-
* @param targetCount Number of valid blocks to count
|
|
226
|
-
* @returns { messageIndex: number, blockCount: number } Message index and actual counted block count
|
|
227
|
-
*/
|
|
228
|
-
export const countValidBlocksFromEnd = (messages, targetCount) => {
|
|
229
|
-
let validBlockCount = 0;
|
|
230
|
-
// Iterate messages from end to beginning
|
|
231
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
232
|
-
const message = messages[i];
|
|
233
|
-
// Iterate through all blocks of current message
|
|
234
|
-
for (const block of message.blocks) {
|
|
235
|
-
// Only count valid block types
|
|
236
|
-
if (block.type === "text" ||
|
|
237
|
-
block.type === "image" ||
|
|
238
|
-
block.type === "tool") {
|
|
239
|
-
validBlockCount++;
|
|
240
|
-
// If target count reached, return current message index
|
|
241
|
-
if (validBlockCount >= targetCount) {
|
|
242
|
-
return { messageIndex: i, blockCount: validBlockCount };
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
// If target count not reached, return index 0
|
|
248
|
-
return { messageIndex: 0, blockCount: validBlockCount };
|
|
249
|
-
};
|
|
250
|
-
/**
|
|
251
|
-
* Get messages to be compressed and insertion position
|
|
252
|
-
* @param messages Message array
|
|
253
|
-
* @param keepLastCount Keep the last few valid blocks uncompressed
|
|
254
|
-
* @returns { messagesToCompress: Message[], insertIndex: number }
|
|
255
|
-
*/
|
|
256
|
-
export const getMessagesToCompress = (messages, keepLastCount = DEFAULT_KEEP_LAST_MESSAGES_COUNT) => {
|
|
257
|
-
// Calculate message position to keep from end to beginning
|
|
258
|
-
const { messageIndex } = countValidBlocksFromEnd(messages, keepLastCount);
|
|
259
|
-
// Find the last message containing compression block
|
|
260
|
-
let lastCompressIndex = -1;
|
|
261
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
262
|
-
const hasCompressBlock = messages[i].blocks.some((block) => block.type === "compress");
|
|
263
|
-
if (hasCompressBlock) {
|
|
264
|
-
lastCompressIndex = i;
|
|
265
|
-
break;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
// Determine compression start position
|
|
269
|
-
// If compression block exists, start from compression block position (include compression block)
|
|
270
|
-
// If no compression block, start from beginning
|
|
271
|
-
const startIndex = lastCompressIndex >= 0 ? lastCompressIndex : 0;
|
|
272
|
-
// Messages to compress are all messages from start position to before calculated position
|
|
273
|
-
const messagesToCompress = messages.slice(startIndex, messageIndex);
|
|
274
|
-
// Change insertion position to negative number, indicating position from end
|
|
275
|
-
const insertIndex = messageIndex - messages.length;
|
|
276
|
-
return { messagesToCompress, insertIndex };
|
|
277
|
-
};
|
|
278
185
|
// Add command output block to message list
|
|
279
186
|
export const addCommandOutputMessage = ({ messages, command, }) => {
|
|
280
187
|
const outputMessage = {
|
|
@@ -328,7 +235,7 @@ export const completeCommandInMessage = ({ messages, command, exitCode, }) => {
|
|
|
328
235
|
}
|
|
329
236
|
return newMessages;
|
|
330
237
|
};
|
|
331
|
-
export const addSubagentBlockToMessage = ({ messages, subagentId, subagentName, status, sessionId, configuration, }) => {
|
|
238
|
+
export const addSubagentBlockToMessage = ({ messages, subagentId, subagentName, status, sessionId, configuration, runInBackground, }) => {
|
|
332
239
|
const newMessages = [...messages];
|
|
333
240
|
// Find the last assistant message or create one
|
|
334
241
|
let lastAssistantMessage = newMessages[newMessages.length - 1];
|
|
@@ -349,6 +256,7 @@ export const addSubagentBlockToMessage = ({ messages, subagentId, subagentName,
|
|
|
349
256
|
status,
|
|
350
257
|
sessionId,
|
|
351
258
|
configuration,
|
|
259
|
+
runInBackground,
|
|
352
260
|
});
|
|
353
261
|
return newMessages;
|
|
354
262
|
};
|
|
@@ -366,6 +274,9 @@ export const updateSubagentBlockInMessage = (messages, subagentId, updates) => {
|
|
|
366
274
|
if (updates.sessionId !== undefined) {
|
|
367
275
|
block.sessionId = updates.sessionId;
|
|
368
276
|
}
|
|
277
|
+
if (updates.runInBackground !== undefined) {
|
|
278
|
+
block.runInBackground = updates.runInBackground;
|
|
279
|
+
}
|
|
369
280
|
return newMessages;
|
|
370
281
|
}
|
|
371
282
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nameGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/nameGenerator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoEH;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"nameGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/nameGenerator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoEH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBxD"}
|
|
@@ -68,8 +68,24 @@ const nouns = [
|
|
|
68
68
|
/**
|
|
69
69
|
* Generates a random English name (adjective-noun)
|
|
70
70
|
*/
|
|
71
|
-
export function generateRandomName() {
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
export function generateRandomName(seed) {
|
|
72
|
+
let adjIndex;
|
|
73
|
+
let nounIndex;
|
|
74
|
+
if (seed) {
|
|
75
|
+
// Simple hash function to derive indices from seed
|
|
76
|
+
let hash = 0;
|
|
77
|
+
for (let i = 0; i < seed.length; i++) {
|
|
78
|
+
hash = (hash << 5) - hash + seed.charCodeAt(i);
|
|
79
|
+
hash |= 0; // Convert to 32bit integer
|
|
80
|
+
}
|
|
81
|
+
adjIndex = Math.abs(hash) % adjectives.length;
|
|
82
|
+
nounIndex = Math.abs(hash >> 8) % nouns.length;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
adjIndex = Math.floor(Math.random() * adjectives.length);
|
|
86
|
+
nounIndex = Math.floor(Math.random() * nouns.length);
|
|
87
|
+
}
|
|
88
|
+
const adj = adjectives[adjIndex];
|
|
89
|
+
const noun = nouns[nounIndex];
|
|
74
90
|
return `${adj}-${noun}`;
|
|
75
91
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wave-agent-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "SDK for building AI-powered development tools and agents",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"openai": "^5.12.2"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@vitest/coverage-v8": "^
|
|
35
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
36
36
|
"rimraf": "^6.1.2",
|
|
37
37
|
"tsc-alias": "^1.8.16",
|
|
38
38
|
"tsx": "^4.20.4",
|
|
39
|
-
"vitest": "^
|
|
39
|
+
"vitest": "^4.0.18"
|
|
40
40
|
},
|
|
41
41
|
"engines": {
|
|
42
42
|
"node": ">=22.0.0"
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"build": "rimraf dist && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
|
|
47
47
|
"type-check": "tsc --noEmit --incremental",
|
|
48
48
|
"watch": "tsc -p tsconfig.build.json --watch & tsc-alias -p tsconfig.build.json --watch",
|
|
49
|
-
"test": "vitest run",
|
|
50
|
-
"test:coverage": "vitest run --coverage",
|
|
49
|
+
"test": "vitest run --reporter=dot",
|
|
50
|
+
"test:coverage": "vitest run --coverage --reporter=dot",
|
|
51
51
|
"lint": "eslint --cache",
|
|
52
52
|
"format": "prettier --write .",
|
|
53
53
|
"version:patch": "node ../../scripts/version.js patch",
|