gaunt-sloth-assistant 0.7.2 → 0.7.3
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/.gsloth.config_.json +2 -2
- package/.gsloth.config_claude.mjs +18 -0
- package/.gsloth.config_vertex.json +6 -0
- package/README.md +1 -1
- package/assets/release-notes/v0_7_3.md +64 -0
- package/dist/builtInToolsConfig.d.ts +6 -0
- package/dist/builtInToolsConfig.js +73 -0
- package/dist/builtInToolsConfig.js.map +1 -0
- package/dist/commands/prCommand.js +14 -1
- package/dist/commands/prCommand.js.map +1 -1
- package/dist/config.d.ts +18 -7
- package/dist/config.js +1 -41
- package/dist/config.js.map +1 -1
- package/dist/core/Invocation.js +5 -2
- package/dist/core/Invocation.js.map +1 -1
- package/dist/helpers/jira/jiraClient.d.ts +4 -0
- package/dist/helpers/jira/jiraClient.js +75 -0
- package/dist/helpers/jira/jiraClient.js.map +1 -0
- package/dist/helpers/jira/jiraLogWork.d.ts +2 -0
- package/dist/helpers/jira/jiraLogWork.js +53 -0
- package/dist/helpers/jira/jiraLogWork.js.map +1 -0
- package/dist/providers/jiraIssueProvider.js +9 -52
- package/dist/providers/jiraIssueProvider.js.map +1 -1
- package/dist/tools/gthJiraLogWorkTool.d.ts +3 -0
- package/dist/tools/gthJiraLogWorkTool.js +37 -0
- package/dist/tools/gthJiraLogWorkTool.js.map +1 -0
- package/dist/tools/gthStatusUpdateTool.d.ts +2 -0
- package/dist/tools/gthStatusUpdateTool.js +16 -0
- package/dist/tools/gthStatusUpdateTool.js.map +1 -0
- package/docs/DEVELOPMENT.md +26 -0
- package/package.json +1 -1
- package/src/builtInToolsConfig.ts +99 -0
- package/src/commands/prCommand.ts +28 -3
- package/src/config.ts +20 -62
- package/src/core/Invocation.ts +7 -2
- package/src/helpers/jira/jiraClient.ts +99 -0
- package/src/helpers/jira/jiraLogWork.ts +81 -0
- package/src/providers/jiraIssueProvider.ts +13 -70
- package/src/tools/gthJiraLogWorkTool.ts +51 -0
- package/src/tools/gthStatusUpdateTool.ts +18 -0
- package/vitest-it.config.ts +1 -1
- package/vitest.config.ts +1 -0
- package/dist/tools/statusUpdate.d.ts +0 -1
- package/dist/tools/statusUpdate.js +0 -12
- package/dist/tools/statusUpdate.js.map +0 -1
- package/src/tools/statusUpdate.ts +0 -15
package/.gsloth.config_.json
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export async function configure() {
|
|
2
|
+
const { ChatAnthropic } = await import('@langchain/anthropic');
|
|
3
|
+
|
|
4
|
+
const model = new ChatAnthropic({
|
|
5
|
+
model: 'claude-sonnet-4-20250514',
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
return {
|
|
9
|
+
llm: model,
|
|
10
|
+
tools: [
|
|
11
|
+
{
|
|
12
|
+
type: 'web_search_20250305',
|
|
13
|
+
name: 'web_search',
|
|
14
|
+
max_uses: 10,
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
};
|
|
18
|
+
}
|
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Gaunt Sloth Assistant
|
|
2
|
-
[](https://github.com/andruhon/gaunt-sloth-assistant/actions/workflows/ci.yml)
|
|
2
|
+
[](https://github.com/andruhon/gaunt-sloth-assistant/actions/workflows/ci.yml) [](https://github.com/andruhon/gaunt-sloth-assistant/actions/workflows/it.yml)
|
|
3
3
|
|
|
4
4
|
Gaunt GSloth Assistant is a lightweight **command line AI assistant**
|
|
5
5
|
built with TypeScript (JavaScript) and distributed via NPM with minimum dependencies.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# v0.7.3 Prebuilt Tools and automatic Jira Worklogs
|
|
2
|
+
|
|
3
|
+
## New Features
|
|
4
|
+
|
|
5
|
+
### Prebuilt Tools
|
|
6
|
+
Introduced a new feature of prebuilt tools, which can be enabled in config:
|
|
7
|
+
|
|
8
|
+
For example, this config below will allow doing something like `gth ask "log time to jira BO-4242 with comment research"`:
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"llm": {
|
|
12
|
+
"type": "vertexai",
|
|
13
|
+
"model": "gemini-2.5-pro"
|
|
14
|
+
},
|
|
15
|
+
"requirementsProviderConfig": {
|
|
16
|
+
"jira": {
|
|
17
|
+
"cloudId": "77777777-7777-7777-77aa-424242424242",
|
|
18
|
+
"displayUrl": "https://yourcompany.atlassian.net/browse/"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"commands": {
|
|
22
|
+
"pr": {
|
|
23
|
+
"contentProvider": "github",
|
|
24
|
+
"requirementsProvider": "jira"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"builtInTools": [
|
|
28
|
+
"gth_jira_log_work"
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Currently `gth_jira_log_work` and `gth_status_update` are the only prebuilt tools available.
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
### Automatically log time to Jira when after doing PR review
|
|
37
|
+
|
|
38
|
+
Similarly, this config below will allow automatically allow time to be logged after completing PR review with `gth pr 4242 BO-4242`:
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"llm": {
|
|
42
|
+
"type": "vertexai",
|
|
43
|
+
"model": "gemini-2.5-pro"
|
|
44
|
+
},
|
|
45
|
+
"requirementsProviderConfig": {
|
|
46
|
+
"jira": {
|
|
47
|
+
"cloudId": "77777777-7777-7777-77aa-424242424242",
|
|
48
|
+
"displayUrl": "https://yourcompany.atlassian.net/browse/"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"commands": {
|
|
52
|
+
"pr": {
|
|
53
|
+
"contentProvider": "github",
|
|
54
|
+
"requirementsProvider": "jira",
|
|
55
|
+
"logWorkForReviewInSeconds": 600
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"builtInTools": [
|
|
59
|
+
"gth_jira_log_work"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`logWorkForReviewInSeconds` is a number of seconds to be logged every time to reviewed Jira.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { StructuredToolInterface } from '@langchain/core/tools';
|
|
2
|
+
import { SlothConfig } from '#src/config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get default tools based on filesystem and built-in tools configuration
|
|
5
|
+
*/
|
|
6
|
+
export declare function getDefaultTools(config: SlothConfig): Promise<StructuredToolInterface[]>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import GthFileSystemToolkit from '#src/tools/GthFileSystemToolkit.js';
|
|
2
|
+
import { displayWarning } from '#src/consoleUtils.js';
|
|
3
|
+
import { getCurrentDir } from '#src/systemUtils.js';
|
|
4
|
+
const AVAILABLE_BUILT_IN_TOOLS = {
|
|
5
|
+
gth_status_update: '#src/tools/gthStatusUpdateTool.js',
|
|
6
|
+
gth_jira_log_work: '#src/tools/gthJiraLogWorkTool.js',
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Get default tools based on filesystem and built-in tools configuration
|
|
10
|
+
*/
|
|
11
|
+
export async function getDefaultTools(config) {
|
|
12
|
+
const filesystemTools = filterFilesystemTools(new GthFileSystemToolkit([getCurrentDir()]), config.filesystem);
|
|
13
|
+
const builtInTools = await getBuiltInTools(config);
|
|
14
|
+
return [...filesystemTools, ...builtInTools];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Filter filesystem tools based on configuration
|
|
18
|
+
*/
|
|
19
|
+
function filterFilesystemTools(toolkit, filesystemConfig) {
|
|
20
|
+
if (filesystemConfig === 'all') {
|
|
21
|
+
return toolkit.getTools();
|
|
22
|
+
}
|
|
23
|
+
if (filesystemConfig === 'none') {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
if (filesystemConfig === 'read') {
|
|
27
|
+
// Read-only: only allow read operations
|
|
28
|
+
return toolkit.getFilteredTools(['read']);
|
|
29
|
+
}
|
|
30
|
+
if (!Array.isArray(filesystemConfig)) {
|
|
31
|
+
return toolkit.getTools();
|
|
32
|
+
}
|
|
33
|
+
if (filesystemConfig.includes('all')) {
|
|
34
|
+
return toolkit.getTools();
|
|
35
|
+
}
|
|
36
|
+
// Handle an array of specific tool names or 'read'/'all'
|
|
37
|
+
const allowedTools = filesystemConfig.includes('read')
|
|
38
|
+
? toolkit.getFilteredTools(['read'])
|
|
39
|
+
: [];
|
|
40
|
+
// Also allow specific tool names
|
|
41
|
+
const allowedToolNames = new Set(filesystemConfig.filter((name) => name !== 'read' && name !== 'all'));
|
|
42
|
+
const specificNamedTools = toolkit.getTools().filter((tool) => {
|
|
43
|
+
return tool.name && allowedToolNames.has(tool.name);
|
|
44
|
+
});
|
|
45
|
+
// Combine and deduplicate
|
|
46
|
+
const allAllowedTools = [...allowedTools, ...specificNamedTools];
|
|
47
|
+
return allAllowedTools.filter((tool, index, arr) => arr.findIndex((t) => t.name === tool.name) === index);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get built-in tools based on configuration
|
|
51
|
+
*/
|
|
52
|
+
async function getBuiltInTools(config) {
|
|
53
|
+
const tools = [];
|
|
54
|
+
if (!config.builtInTools) {
|
|
55
|
+
return tools;
|
|
56
|
+
}
|
|
57
|
+
for (const toolName of config.builtInTools) {
|
|
58
|
+
if (toolName in AVAILABLE_BUILT_IN_TOOLS) {
|
|
59
|
+
try {
|
|
60
|
+
const tool = await import(AVAILABLE_BUILT_IN_TOOLS[toolName]);
|
|
61
|
+
tools.push(tool.get(config));
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
displayWarning(`Failed to load built-in tool '${toolName}': ${error}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
displayWarning(`Unknown built-in tool: ${toolName}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return tools;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=builtInToolsConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtInToolsConfig.js","sourceRoot":"","sources":["../src/builtInToolsConfig.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,oCAAoC,CAAC;AAGtE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,wBAAwB,GAAG;IAC/B,iBAAiB,EAAE,mCAAmC;IACtD,iBAAiB,EAAE,kCAAkC;CACtD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAmB;IACvD,MAAM,eAAe,GAAG,qBAAqB,CAC3C,IAAI,oBAAoB,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,EAC3C,MAAM,CAAC,UAAU,CAClB,CAAC;IACF,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAEnD,OAAO,CAAC,GAAG,eAAe,EAAE,GAAG,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,OAA6B,EAC7B,gBAAoD;IAEpD,IAAI,gBAAgB,KAAK,KAAK,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAChC,wCAAwC;QACxC,OAAO,OAAO,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,yDAAyD;IACzD,MAAM,YAAY,GAA8B,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/E,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC,CAAC,EAAE,CAAC;IAEP,iCAAiC;IACjC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC,CACrE,CAAC;IACF,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5D,OAAO,IAAI,CAAC,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,MAAM,eAAe,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,kBAAkB,CAAC,CAAC;IACjE,OAAO,eAAe,CAAC,MAAM,CAC3B,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,MAAmB;IAChD,MAAM,KAAK,GAA8B,EAAE,CAAC;IAE5C,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,QAAQ,IAAI,wBAAwB,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CACvB,wBAAwB,CAAC,QAAiD,CAAC,CAC5E,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAc,CAAC,iCAAiC,QAAQ,MAAM,KAAK,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Option } from 'commander';
|
|
2
2
|
import { readBackstory, readGuidelines, readReviewInstructions, readSystemPrompt, } from '#src/prompt.js';
|
|
3
3
|
import { readMultipleFilesFromCurrentDir } from '#src/utils.js';
|
|
4
|
-
import {
|
|
4
|
+
import { CONTENT_PROVIDERS, getRequirementsFromProvider, REQUIREMENTS_PROVIDERS, } from './commandUtils.js';
|
|
5
|
+
import jiraLogWork from '#src/helpers/jira/jiraLogWork.js';
|
|
5
6
|
export function prCommand(program) {
|
|
6
7
|
program
|
|
7
8
|
.command('pr')
|
|
@@ -12,6 +13,7 @@ export function prCommand(program) {
|
|
|
12
13
|
.argument('[requirementsId]', 'Optional requirements ID argument to retrieve requirements with requirements provider')
|
|
13
14
|
.addOption(new Option('-p, --requirements-provider <requirementsProvider>', 'Requirements provider for this review.').choices(Object.keys(REQUIREMENTS_PROVIDERS)))
|
|
14
15
|
.option('-f, --file [files...]', 'Input files. Content of these files will be added BEFORE the diff, but after requirements')
|
|
16
|
+
.option('-m, --message <message>', 'Extra message to provide just before the content')
|
|
15
17
|
.action(async (prId, requirementsId, options) => {
|
|
16
18
|
const { initConfig } = await import('#src/config.js');
|
|
17
19
|
const config = await initConfig(); // Initialize and get config
|
|
@@ -43,10 +45,21 @@ export function prCommand(program) {
|
|
|
43
45
|
const providerPath = `#src/providers/${CONTENT_PROVIDERS[contentProvider]}`;
|
|
44
46
|
const { get } = await import(providerPath);
|
|
45
47
|
content.push(await get(null, prId));
|
|
48
|
+
if (options.message) {
|
|
49
|
+
content.push(options.message);
|
|
50
|
+
}
|
|
46
51
|
const { review } = await import('#src/modules/reviewModule.js');
|
|
47
52
|
// TODO consider including requirements id
|
|
48
53
|
// TODO sanitize prId
|
|
49
54
|
await review(`PR-${prId}`, systemMessage.join('\n'), content.join('\n'), config, 'pr');
|
|
55
|
+
if (requirementsId &&
|
|
56
|
+
(config.commands?.pr?.requirementsProvider ?? config.requirementsProvider) === 'jira' &&
|
|
57
|
+
config.commands?.pr?.logWorkForReviewInSeconds) {
|
|
58
|
+
// TODO we need to figure out some sort of post-processors
|
|
59
|
+
let jiraConfig = config.prebuiltToolsConfig?.jira ||
|
|
60
|
+
config.requirementsProviderConfig?.jira;
|
|
61
|
+
await jiraLogWork(jiraConfig, requirementsId, config.commands?.pr?.logWorkForReviewInSeconds, 'code review');
|
|
62
|
+
}
|
|
50
63
|
});
|
|
51
64
|
}
|
|
52
65
|
//# sourceMappingURL=prCommand.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prCommand.js","sourceRoot":"","sources":["../../src/commands/prCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EACL,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"prCommand.js","sourceRoot":"","sources":["../../src/commands/prCommand.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
2
2
|
import type { Connection } from '@langchain/mcp-adapters';
|
|
3
3
|
import type { BaseToolkit, StructuredToolInterface } from '@langchain/core/tools';
|
|
4
|
+
import { JiraConfig } from '#src/providers/types.js';
|
|
4
5
|
export interface SlothConfig extends BaseSlothConfig {
|
|
5
6
|
llm: BaseChatModel;
|
|
6
7
|
contentProvider: string;
|
|
@@ -9,6 +10,7 @@ export interface SlothConfig extends BaseSlothConfig {
|
|
|
9
10
|
projectReviewInstructions: string;
|
|
10
11
|
streamOutput: boolean;
|
|
11
12
|
filesystem: string[] | 'all' | 'read' | 'none';
|
|
13
|
+
builtInTools?: string[];
|
|
12
14
|
tools?: StructuredToolInterface[] | BaseToolkit[];
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
@@ -28,31 +30,44 @@ interface BaseSlothConfig {
|
|
|
28
30
|
projectReviewInstructions?: string;
|
|
29
31
|
streamOutput?: boolean;
|
|
30
32
|
filesystem?: string[] | 'all' | 'read' | 'none';
|
|
33
|
+
prebuiltToolsConfig?: PreBuiltToolsConfig;
|
|
34
|
+
customToolsConfig?: CustomToolsConfig;
|
|
35
|
+
requirementsProviderConfig?: Record<string, unknown>;
|
|
36
|
+
contentProviderConfig?: Record<string, unknown>;
|
|
37
|
+
mcpServers?: Record<string, Connection>;
|
|
38
|
+
builtInTools?: string[];
|
|
31
39
|
commands?: {
|
|
32
40
|
pr?: {
|
|
33
41
|
contentProvider?: string;
|
|
34
42
|
requirementsProvider?: string;
|
|
35
43
|
filesystem?: string[] | 'all' | 'read' | 'none';
|
|
44
|
+
builtInTools?: string[];
|
|
45
|
+
logWorkForReviewInSeconds?: number;
|
|
36
46
|
};
|
|
37
47
|
review?: {
|
|
38
48
|
requirementsProvider?: string;
|
|
39
49
|
contentProvider?: string;
|
|
40
50
|
filesystem?: string[] | 'all' | 'read' | 'none';
|
|
51
|
+
builtInTools?: string[];
|
|
41
52
|
};
|
|
42
53
|
ask?: {
|
|
43
54
|
filesystem?: string[] | 'all' | 'read' | 'none';
|
|
55
|
+
builtInTools?: string[];
|
|
44
56
|
};
|
|
45
57
|
chat?: {
|
|
46
58
|
filesystem?: string[] | 'all' | 'read' | 'none';
|
|
59
|
+
builtInTools?: string[];
|
|
47
60
|
};
|
|
48
61
|
code?: {
|
|
49
62
|
filesystem?: string[] | 'all' | 'read' | 'none';
|
|
63
|
+
builtInTools?: string[];
|
|
50
64
|
};
|
|
51
65
|
};
|
|
52
|
-
requirementsProviderConfig?: Record<string, unknown>;
|
|
53
|
-
contentProviderConfig?: Record<string, unknown>;
|
|
54
|
-
mcpServers?: Record<string, Connection>;
|
|
55
66
|
}
|
|
67
|
+
export type CustomToolsConfig = Record<string, object>;
|
|
68
|
+
export type PreBuiltToolsConfig = {
|
|
69
|
+
jira: JiraConfig;
|
|
70
|
+
};
|
|
56
71
|
export interface LLMConfig extends Record<string, unknown> {
|
|
57
72
|
type: string;
|
|
58
73
|
model: string;
|
|
@@ -73,8 +88,4 @@ export declare function initConfig(): Promise<SlothConfig>;
|
|
|
73
88
|
export declare function tryJsonConfig(jsonConfig: RawSlothConfig): Promise<SlothConfig>;
|
|
74
89
|
export declare function createProjectConfig(configType: string): Promise<void>;
|
|
75
90
|
export declare function writeProjectReviewPreamble(): void;
|
|
76
|
-
/**
|
|
77
|
-
* Get default tools based on filesystem configuration
|
|
78
|
-
*/
|
|
79
|
-
export declare function getDefaultTools(filesystemConfig?: string[] | 'all' | 'read' | 'none'): StructuredToolInterface[];
|
|
80
91
|
export {};
|
package/dist/config.js
CHANGED
|
@@ -4,8 +4,6 @@ import { existsSync, readFileSync } from 'node:fs';
|
|
|
4
4
|
import { error, exit } from '#src/systemUtils.js';
|
|
5
5
|
import { getGslothConfigReadPath, getGslothConfigWritePath } from '#src/filePathUtils.js';
|
|
6
6
|
import { PROJECT_GUIDELINES, PROJECT_REVIEW_INSTRUCTIONS, USER_PROJECT_CONFIG_JS, USER_PROJECT_CONFIG_JSON, USER_PROJECT_CONFIG_MJS, } from '#src/constants.js';
|
|
7
|
-
import { getCurrentDir } from '#src/systemUtils.js';
|
|
8
|
-
import GthFileSystemToolkit from '#src/tools/GthFileSystemToolkit.js';
|
|
9
7
|
export const availableDefaultConfigs = ['vertexai', 'anthropic', 'groq', 'deepseek'];
|
|
10
8
|
export const DEFAULT_CONFIG = {
|
|
11
9
|
llm: undefined,
|
|
@@ -45,6 +43,7 @@ export async function initConfig() {
|
|
|
45
43
|
exit(1);
|
|
46
44
|
// noinspection ExceptionCaughtLocallyJS
|
|
47
45
|
// This throw is unreachable due to exit(1) above, but satisfies TS type analysis and prevents tests from exiting
|
|
46
|
+
// noinspection ExceptionCaughtLocallyJS
|
|
48
47
|
throw new Error('Unexpected error occurred.');
|
|
49
48
|
}
|
|
50
49
|
}
|
|
@@ -221,43 +220,4 @@ function mergeConfig(partialConfig) {
|
|
|
221
220
|
function mergeRawConfig(config, llm) {
|
|
222
221
|
return mergeConfig({ ...config, llm });
|
|
223
222
|
}
|
|
224
|
-
/**
|
|
225
|
-
* Filter filesystem tools based on configuration
|
|
226
|
-
*/
|
|
227
|
-
function filterFilesystemTools(toolkit, filesystemConfig) {
|
|
228
|
-
if (filesystemConfig === 'all') {
|
|
229
|
-
return toolkit.getTools();
|
|
230
|
-
}
|
|
231
|
-
if (filesystemConfig === 'none') {
|
|
232
|
-
return [];
|
|
233
|
-
}
|
|
234
|
-
if (filesystemConfig === 'read') {
|
|
235
|
-
// Read-only: only allow read operations
|
|
236
|
-
return toolkit.getFilteredTools(['read']);
|
|
237
|
-
}
|
|
238
|
-
if (!Array.isArray(filesystemConfig)) {
|
|
239
|
-
return toolkit.getTools();
|
|
240
|
-
}
|
|
241
|
-
if (filesystemConfig.includes('all')) {
|
|
242
|
-
return toolkit.getTools();
|
|
243
|
-
}
|
|
244
|
-
// Handle an array of specific tool names or 'read'/'all'
|
|
245
|
-
const allowedTools = filesystemConfig.includes('read')
|
|
246
|
-
? toolkit.getFilteredTools(['read'])
|
|
247
|
-
: [];
|
|
248
|
-
// Also allow specific tool names
|
|
249
|
-
const allowedToolNames = new Set(filesystemConfig.filter((name) => name !== 'read' && name !== 'all'));
|
|
250
|
-
const specificNamedTools = toolkit.getTools().filter((tool) => {
|
|
251
|
-
return tool.name && allowedToolNames.has(tool.name);
|
|
252
|
-
});
|
|
253
|
-
// Combine and deduplicate
|
|
254
|
-
const allAllowedTools = [...allowedTools, ...specificNamedTools];
|
|
255
|
-
return allAllowedTools.filter((tool, index, arr) => arr.findIndex((t) => t.name === tool.name) === index);
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* Get default tools based on filesystem configuration
|
|
259
|
-
*/
|
|
260
|
-
export function getDefaultTools(filesystemConfig = 'none') {
|
|
261
|
-
return [...filterFilesystemTools(new GthFileSystemToolkit([getCurrentDir()]), filesystemConfig)];
|
|
262
|
-
}
|
|
263
223
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,gCAAgC,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAG1F,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/core/Invocation.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { isAIMessage } from '@langchain/core/messages';
|
|
2
|
-
import { getDefaultTools } from '#src/config.js';
|
|
3
2
|
import { MultiServerMCPClient } from '@langchain/mcp-adapters';
|
|
4
3
|
import { createReactAgent } from '@langchain/langgraph/prebuilt';
|
|
5
4
|
import { formatToolCalls, ProgressIndicator } from '#src/utils.js';
|
|
5
|
+
import { getDefaultTools } from '#src/builtInToolsConfig.js';
|
|
6
6
|
export class Invocation {
|
|
7
7
|
statusUpdate;
|
|
8
8
|
verbose = false;
|
|
@@ -24,7 +24,7 @@ export class Invocation {
|
|
|
24
24
|
this.config = this.getEffectiveConfig(config, command);
|
|
25
25
|
this.mcpClient = this.getMcpClient(this.config);
|
|
26
26
|
// Get default filesystem tools (filtered based on config)
|
|
27
|
-
const defaultTools = getDefaultTools(
|
|
27
|
+
const defaultTools = await getDefaultTools(config);
|
|
28
28
|
// Get user config tools
|
|
29
29
|
const flattenedConfigTools = this.extractAndFlattenTools(this.config.tools || []);
|
|
30
30
|
// Get MCP tools
|
|
@@ -55,6 +55,9 @@ export class Invocation {
|
|
|
55
55
|
filesystem: command && config.commands?.[command]?.filesystem !== undefined
|
|
56
56
|
? config.commands[command].filesystem
|
|
57
57
|
: config.filesystem,
|
|
58
|
+
builtInTools: command && config.commands?.[command]?.builtInTools !== undefined
|
|
59
|
+
? config.commands[command].builtInTools
|
|
60
|
+
: config.builtInTools,
|
|
58
61
|
};
|
|
59
62
|
}
|
|
60
63
|
async invoke(messages, runConfig) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Invocation.js","sourceRoot":"","sources":["../../src/core/Invocation.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"Invocation.js","sourceRoot":"","sources":["../../src/core/Invocation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { JiraConfig } from '#src/providers/types.js';
|
|
2
|
+
export declare function getJiraCredentials(config: Partial<JiraConfig> | null): JiraConfig;
|
|
3
|
+
export declare function getJiraHeaders(config: JiraConfig): Record<string, string>;
|
|
4
|
+
export declare function jiraRequest<T>(config: JiraConfig, endpoint: string, options?: RequestInit, showProgress?: boolean): Promise<T>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { env } from '#src/systemUtils.js';
|
|
2
|
+
import { ProgressIndicator } from '#src/utils.js';
|
|
3
|
+
export function getJiraCredentials(config) {
|
|
4
|
+
if (!config) {
|
|
5
|
+
throw new Error('No Jira config provided');
|
|
6
|
+
}
|
|
7
|
+
const username = env.JIRA_USERNAME || config.username;
|
|
8
|
+
if (!username) {
|
|
9
|
+
throw new Error('Missing JIRA username. The username can be defined as JIRA_USERNAME environment variable or as "username" in config.');
|
|
10
|
+
}
|
|
11
|
+
const token = env.JIRA_API_PAT_TOKEN || config.token;
|
|
12
|
+
if (!token) {
|
|
13
|
+
throw new Error('Missing JIRA PAT token. The token can be defined as JIRA_API_PAT_TOKEN environment variable or as "token" in config.');
|
|
14
|
+
}
|
|
15
|
+
const cloudId = env.JIRA_CLOUD_ID || config.cloudId;
|
|
16
|
+
if (!cloudId) {
|
|
17
|
+
throw new Error('Missing JIRA Cloud ID. The Cloud ID can be defined as JIRA_CLOUD_ID environment variable or as "cloudId" in config.');
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
username,
|
|
21
|
+
token,
|
|
22
|
+
cloudId,
|
|
23
|
+
displayUrl: config.displayUrl,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function getJiraHeaders(config) {
|
|
27
|
+
const credentials = `${config.username}:${config.token}`;
|
|
28
|
+
const encodedCredentials = Buffer.from(credentials).toString('base64');
|
|
29
|
+
const authHeader = `Basic ${encodedCredentials}`;
|
|
30
|
+
return {
|
|
31
|
+
Authorization: authHeader,
|
|
32
|
+
Accept: 'application/json; charset=utf-8',
|
|
33
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
34
|
+
'Content-Type': 'application/json',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export async function jiraRequest(config, endpoint, options = {}, showProgress = true) {
|
|
38
|
+
const apiUrl = `https://api.atlassian.com/ex/jira/${config.cloudId}${endpoint}`;
|
|
39
|
+
const headers = getJiraHeaders(config);
|
|
40
|
+
let progressIndicator;
|
|
41
|
+
if (showProgress) {
|
|
42
|
+
progressIndicator = new ProgressIndicator(`${options.method || 'GET'} ${apiUrl.replace(/^https?:\/\//, '')}`);
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const response = await fetch(apiUrl, {
|
|
46
|
+
...options,
|
|
47
|
+
headers: {
|
|
48
|
+
...headers,
|
|
49
|
+
...options.headers,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
if (progressIndicator) {
|
|
53
|
+
progressIndicator.stop();
|
|
54
|
+
}
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
let errorMessage = `Failed to fetch from Jira: ${response.statusText}`;
|
|
57
|
+
try {
|
|
58
|
+
const errorData = await response.json();
|
|
59
|
+
errorMessage += ` - ${JSON.stringify(errorData)}`;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// If we can't parse JSON error, use the basic message
|
|
63
|
+
}
|
|
64
|
+
throw new Error(errorMessage);
|
|
65
|
+
}
|
|
66
|
+
return response.json();
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (progressIndicator) {
|
|
70
|
+
progressIndicator.stop();
|
|
71
|
+
}
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=jiraClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jiraClient.js","sourceRoot":"","sources":["../../../src/helpers/jira/jiraClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { getJiraCredentials, jiraRequest } from './jiraClient.js';
|
|
2
|
+
import { displayError, displaySuccess } from '#src/consoleUtils.js';
|
|
3
|
+
export default async function jiraLogWork(config, jiraId, timeInSeconds, comment = 'Work logged', startedAt = new Date()) {
|
|
4
|
+
try {
|
|
5
|
+
// Use provided config or empty config (will use environment variables)
|
|
6
|
+
const credentials = getJiraCredentials(config);
|
|
7
|
+
const bodyData = {
|
|
8
|
+
comment: {
|
|
9
|
+
content: [
|
|
10
|
+
{
|
|
11
|
+
content: [
|
|
12
|
+
{
|
|
13
|
+
text: comment,
|
|
14
|
+
type: 'text',
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
type: 'paragraph',
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
type: 'doc',
|
|
21
|
+
version: 1,
|
|
22
|
+
},
|
|
23
|
+
started: startedAt.toISOString().replace('Z', '+0000'),
|
|
24
|
+
timeSpentSeconds: timeInSeconds,
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-worklogs/#api-rest-api-3-issue-issueidorkey-worklog-post
|
|
28
|
+
* Needs:
|
|
29
|
+
* Classic RECOMMENDED:write:jira-work
|
|
30
|
+
*
|
|
31
|
+
* OR
|
|
32
|
+
*
|
|
33
|
+
* write:issue-worklog:jira, write:issue-worklog.property:jira, read:avatar:jira, read:group:jira,
|
|
34
|
+
* read:issue-worklog:jira, read:project-role:jira, read:user:jira, read:issue-worklog.property:jira
|
|
35
|
+
*/
|
|
36
|
+
await jiraRequest(credentials, `/rest/api/3/issue/${jiraId}/worklog`, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
body: JSON.stringify(bodyData),
|
|
39
|
+
});
|
|
40
|
+
const hours = Math.floor(timeInSeconds / 3600);
|
|
41
|
+
const minutes = Math.floor((timeInSeconds % 3600) / 60);
|
|
42
|
+
const timeStr = hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;
|
|
43
|
+
const successMessage = `✅ Logged ${timeStr} to ${jiraId}`;
|
|
44
|
+
displaySuccess(successMessage);
|
|
45
|
+
return successMessage;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
const errorMessage = `Failed to log work to Jira: ${error instanceof Error ? error.message : String(error)}`;
|
|
49
|
+
displayError(errorMessage);
|
|
50
|
+
return errorMessage;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=jiraLogWork.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jiraLogWork.js","sourceRoot":"","sources":["../../../src/helpers/jira/jiraLogWork.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAkBpE,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,WAAW,CACvC,MAAkC,EAClC,MAAc,EACd,aAAqB,EACrB,UAAkB,aAAa,EAC/B,YAAkB,IAAI,IAAI,EAAE;IAE5B,IAAI,CAAC;QACH,uEAAuE;QACvE,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAuB;YACnC,OAAO,EAAE;gBACP,OAAO,EAAE;oBACP;wBACE,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,OAAO;gCACb,IAAI,EAAE,MAAM;6BACb;yBACF;wBACD,IAAI,EAAE,WAAW;qBAClB;iBACF;gBACD,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,CAAC;aACX;YACD,OAAO,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC;YACtD,gBAAgB,EAAE,aAAa;SAChC,CAAC;QAEF;;;;;;;;;WASG;QACH,MAAM,WAAW,CAAC,WAAW,EAAE,qBAAqB,MAAM,UAAU,EAAE;YACpE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;SAC/B,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;QAEpE,MAAM,cAAc,GAAG,YAAY,OAAO,OAAO,MAAM,EAAE,CAAC;QAC1D,cAAc,CAAC,cAAc,CAAC,CAAC;QAC/B,OAAO,cAAc,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,+BACnB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CAAC;QACH,YAAY,CAAC,YAAY,CAAC,CAAC;QAC3B,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC"}
|