gaunt-sloth-assistant 1.3.1 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -4
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/askCommand.js +3 -7
- package/dist/commands/askCommand.js.map +1 -1
- package/dist/commands/commandIntrospection.d.ts +11 -0
- package/dist/commands/commandIntrospection.js +57 -0
- package/dist/commands/commandIntrospection.js.map +1 -0
- package/dist/commands/getCommand.d.ts +3 -0
- package/dist/commands/getCommand.js +45 -0
- package/dist/commands/getCommand.js.map +1 -0
- package/dist/commands/prCommand.js +8 -20
- package/dist/commands/prCommand.js.map +1 -1
- package/dist/commands/reviewCommand.js +8 -20
- package/dist/commands/reviewCommand.js.map +1 -1
- package/dist/helpers/jira/jiraClient.d.ts +10 -3
- package/dist/helpers/jira/jiraClient.js +16 -8
- package/dist/helpers/jira/jiraClient.js.map +1 -1
- package/dist/providers/jiraIssueProvider.js +1 -1
- package/dist/providers/jiraIssueProvider.js.map +1 -1
- package/dist/providers/types.d.ts +3 -2
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# Gaunt Sloth Assistant
|
|
2
2
|
[](https://github.com/Galvanized-Pukeko/gaunt-sloth-assistant/actions/workflows/unit-tests.yml) [](https://github.com/Galvanized-Pukeko/gaunt-sloth-assistant/actions/workflows/integration-tests.yml)
|
|
3
3
|
|
|
4
|
-
Gaunt Sloth Assistant is a
|
|
5
|
-
Built with TypeScript and distributed via NPM, Gaunt Sloth maintains minimal dependencies for easy integration.
|
|
4
|
+
Gaunt Sloth Assistant is a command-line AI assistant for CI/CD workflows, code reviews, and DIY projects. It supports PR and diff reviews with requirements context, code and diff Q&A, interactive chat and coding sessions, and controlled automation through predefined tools and JSON or JavaScript configuration.
|
|
6
5
|
|
|
7
6
|

|
|
8
7
|
|
|
@@ -24,8 +23,7 @@ The promise of Gaunt Sloth:
|
|
|
24
23
|
- **Extensibility**. Feel free to write some JS and create your Tool, Provider or connect to the MCP server of your choice.
|
|
25
24
|
- **No vendor lock-in**. Just BYO API keys.
|
|
26
25
|
- **Easy installation via NPM**.
|
|
27
|
-
- **All prompts are editable** via markdown files.
|
|
28
|
-
- **No UI**. Command Line only, with intent to be used in build pipeline, or as a dependency to help in nodejs projects.
|
|
26
|
+
- **All prompts are editable** via markdown files.
|
|
29
27
|
|
|
30
28
|
## What GSloth does:
|
|
31
29
|
|
|
@@ -74,6 +72,7 @@ These apply to every command:
|
|
|
74
72
|
### Available Commands:
|
|
75
73
|
|
|
76
74
|
- **`init`** - Initialize Gaunt Sloth in your project (auto-detects API keys when called without arguments)
|
|
75
|
+
- **`get`** - Inspect the effective prompt or provider-backed input used by another command
|
|
77
76
|
- **`pr`** - ⚠️ This feature requires GitHub CLI to be installed. Review pull requests with optional requirement integration (GitHub issues or Jira).
|
|
78
77
|
- **`review`** - Review any diff or content from various sources
|
|
79
78
|
- **`ask`** - Ask questions about code or programming topics
|
|
@@ -93,6 +92,13 @@ gsloth init anthropic # Or specify provider directly
|
|
|
93
92
|
gsloth pr 42 23 # Review PR #42 with GitHub issue #23
|
|
94
93
|
```
|
|
95
94
|
|
|
95
|
+
**Inspect command inputs:**
|
|
96
|
+
```bash
|
|
97
|
+
gsloth get pr prompt
|
|
98
|
+
gsloth get pr content 42
|
|
99
|
+
gsloth get review requirements PROJ-123
|
|
100
|
+
```
|
|
101
|
+
|
|
96
102
|
**Review local changes:**
|
|
97
103
|
```bash
|
|
98
104
|
git --no-pager diff | gsloth review
|
package/dist/cli.js
CHANGED
|
@@ -6,6 +6,7 @@ import { prCommand } from '#src/commands/prCommand.js';
|
|
|
6
6
|
import { chatCommand } from '#src/commands/chatCommand.js';
|
|
7
7
|
import { codeCommand } from '#src/commands/codeCommand.js';
|
|
8
8
|
import { apiCommand } from '#src/commands/apiCommand.js';
|
|
9
|
+
import { getCommand } from '#src/commands/getCommand.js';
|
|
9
10
|
import { argv, getSlothVersion, readStdin } from '#src/utils/systemUtils.js';
|
|
10
11
|
import { coerceBooleanOrString } from '#src/utils/consoleUtils.js';
|
|
11
12
|
const program = new Command();
|
|
@@ -54,5 +55,6 @@ askCommand(program, cliConfigOverrides);
|
|
|
54
55
|
chatCommand(program, cliConfigOverrides);
|
|
55
56
|
codeCommand(program, cliConfigOverrides);
|
|
56
57
|
apiCommand(program, cliConfigOverrides);
|
|
58
|
+
getCommand(program, cliConfigOverrides);
|
|
57
59
|
await readStdin(program);
|
|
58
60
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,0CAA0C,CAAC;KACvD,OAAO,CAAC,eAAe,EAAE,CAAC;KAC1B,MAAM,CACL,WAAW,EACX,2CAA2C;IACzC,kEAAkE;IAClE,0EAA0E,CAC7E;KACA,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;KAClE,MAAM,CAAC,mCAAmC,EAAE,gDAAgD,CAAC;KAC7F,MAAM,CACL,oCAAoC,EACpC,0FAA0F,CAC3F;KACA,SAAS,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAEpD,MAAM,kBAAkB,GAA+B,EAAE,CAAC;AAE1D,mDAAmD;AACnD,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC3B,IAAI,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;IACtC;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;AACpC,CAAC;AACD,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;IACrC,2BAA2B;IAC3B,kBAAkB,CAAC,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;AACzE,CAAC;AACD,IAAI,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC9C,kBAAkB,CAAC,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;AAEhE,qEAAqE;AACrE,oEAAoE;AACpE,6EAA6E;AAC7E,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;AACnD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;IAC1B,kBAAkB,CAAC,iBAAiB,GAAG,OAAO,CAAC;AACjD,CAAC;AAED,sEAAsE;AACtE,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,aAAa,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAC3C,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACvC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACxC,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACzC,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACzC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAExC,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,0CAA0C,CAAC;KACvD,OAAO,CAAC,eAAe,EAAE,CAAC;KAC1B,MAAM,CACL,WAAW,EACX,2CAA2C;IACzC,kEAAkE;IAClE,0EAA0E,CAC7E;KACA,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;KAClE,MAAM,CAAC,mCAAmC,EAAE,gDAAgD,CAAC;KAC7F,MAAM,CACL,oCAAoC,EACpC,0FAA0F,CAC3F;KACA,SAAS,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAEpD,MAAM,kBAAkB,GAA+B,EAAE,CAAC;AAE1D,mDAAmD;AACnD,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC3B,IAAI,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;IACtC;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;AACpC,CAAC;AACD,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;IACrC,2BAA2B;IAC3B,kBAAkB,CAAC,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;AACzE,CAAC;AACD,IAAI,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC9C,kBAAkB,CAAC,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;AAEhE,qEAAqE;AACrE,oEAAoE;AACpE,6EAA6E;AAC7E,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;AACnD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;IAC1B,kBAAkB,CAAC,iBAAiB,GAAG,OAAO,CAAC;AACjD,CAAC;AAED,sEAAsE;AACtE,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,aAAa,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAC3C,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACvC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACxC,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACzC,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACzC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACxC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAExC,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { initConfig } from '#src/config.js';
|
|
2
|
+
import { getAskSystemPrompt } from '#src/commands/commandIntrospection.js';
|
|
2
3
|
import { getStringFromStdin } from '#src/utils/systemUtils.js';
|
|
3
|
-
import {
|
|
4
|
+
import { wrapContent } from '#src/utils/llmUtils.js';
|
|
4
5
|
import { readMultipleFilesFromProjectDir } from '#src/utils/fileUtils.js';
|
|
5
6
|
/**
|
|
6
7
|
* Adds the ask command to the program
|
|
@@ -15,11 +16,6 @@ export function askCommand(program, commandLineConfigOverrides) {
|
|
|
15
16
|
.option('-f, --file [files...]', 'Input files. Content of these files will be added BEFORE the message')
|
|
16
17
|
.action(async (message, options) => {
|
|
17
18
|
const config = await initConfig(commandLineConfigOverrides);
|
|
18
|
-
const systemPrompt = readSystemPrompt(config);
|
|
19
|
-
const preamble = [readBackstory(config), readGuidelines(config)];
|
|
20
|
-
if (systemPrompt) {
|
|
21
|
-
preamble.push(systemPrompt);
|
|
22
|
-
}
|
|
23
19
|
const content = [];
|
|
24
20
|
if (options.file) {
|
|
25
21
|
content.push(readMultipleFilesFromProjectDir(options.file));
|
|
@@ -36,7 +32,7 @@ export function askCommand(program, commandLineConfigOverrides) {
|
|
|
36
32
|
throw new Error('At least one of the following is required: file, stdin, or message');
|
|
37
33
|
}
|
|
38
34
|
const { askQuestion } = await import('#src/modules/questionAnsweringModule.js');
|
|
39
|
-
await askQuestion('ASK',
|
|
35
|
+
await askQuestion('ASK', getAskSystemPrompt(config), content.join('\n'), config);
|
|
40
36
|
});
|
|
41
37
|
}
|
|
42
38
|
//# sourceMappingURL=askCommand.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"askCommand.js","sourceRoot":"","sources":["../../src/commands/askCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"askCommand.js","sourceRoot":"","sources":["../../src/commands/askCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAM1E;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,OAAgB,EAChB,0BAAsD;IAEtD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,gBAAgB,CAAC;SAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;SAClC,MAAM,CACL,uBAAuB,EACvB,sEAAsE,CACvE;SACA,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAA0B,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,0BAA0B,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;QAC7C,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,sDAAsD;QACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;QAChF,MAAM,WAAW,CAAC,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GthConfig } from '#src/config.js';
|
|
2
|
+
import { type ContentProviderType, type RequirementsProviderType } from '#src/commands/commandUtils.js';
|
|
3
|
+
export type PromptCommandType = 'ask' | 'review' | 'pr' | 'chat' | 'code';
|
|
4
|
+
export type ProviderCommandType = 'review' | 'pr';
|
|
5
|
+
export type ProviderInputType = 'content' | 'requirements';
|
|
6
|
+
export declare function getAskSystemPrompt(config: GthConfig): string;
|
|
7
|
+
export declare function getReviewSystemPrompt(config: GthConfig): string;
|
|
8
|
+
export declare function getCommandSystemPrompt(command: PromptCommandType, config: GthConfig): string;
|
|
9
|
+
export declare function getEffectiveRequirementsProvider(command: ProviderCommandType, config: GthConfig, cliProvider?: RequirementsProviderType): RequirementsProviderType | undefined;
|
|
10
|
+
export declare function getEffectiveContentProvider(command: ProviderCommandType, config: GthConfig, cliProvider?: ContentProviderType): ContentProviderType | undefined;
|
|
11
|
+
export declare function getCommandProviderInput(command: ProviderCommandType, inputType: ProviderInputType, id: string | undefined, config: GthConfig, cliProvider?: RequirementsProviderType | ContentProviderType): Promise<string>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { getContentFromProvider, getRequirementsFromProvider, } from '#src/commands/commandUtils.js';
|
|
2
|
+
import { buildSystemMessages, readBackstory, readChatPrompt, readCodePrompt, readGuidelines, readReviewInstructions, readSystemPrompt, } from '#src/utils/llmUtils.js';
|
|
3
|
+
export function getAskSystemPrompt(config) {
|
|
4
|
+
const parts = [readBackstory(config), readGuidelines(config)];
|
|
5
|
+
const systemPrompt = readSystemPrompt(config);
|
|
6
|
+
if (systemPrompt) {
|
|
7
|
+
parts.push(systemPrompt);
|
|
8
|
+
}
|
|
9
|
+
return parts.join('\n');
|
|
10
|
+
}
|
|
11
|
+
export function getReviewSystemPrompt(config) {
|
|
12
|
+
const parts = [readBackstory(config), readGuidelines(config), readReviewInstructions(config)];
|
|
13
|
+
const systemPrompt = readSystemPrompt(config);
|
|
14
|
+
if (systemPrompt) {
|
|
15
|
+
parts.push(systemPrompt);
|
|
16
|
+
}
|
|
17
|
+
return parts.join('\n');
|
|
18
|
+
}
|
|
19
|
+
export function getCommandSystemPrompt(command, config) {
|
|
20
|
+
if (command === 'ask') {
|
|
21
|
+
return getAskSystemPrompt(config);
|
|
22
|
+
}
|
|
23
|
+
if (command === 'review' || command === 'pr') {
|
|
24
|
+
return getReviewSystemPrompt(config);
|
|
25
|
+
}
|
|
26
|
+
const modePrompt = command === 'chat' ? readChatPrompt(config) : readCodePrompt(config);
|
|
27
|
+
const messages = buildSystemMessages(config, modePrompt);
|
|
28
|
+
const [systemMessage] = messages;
|
|
29
|
+
const content = systemMessage?.content;
|
|
30
|
+
if (typeof content === 'string') {
|
|
31
|
+
return content;
|
|
32
|
+
}
|
|
33
|
+
if (Array.isArray(content)) {
|
|
34
|
+
return content
|
|
35
|
+
.map((item) => (typeof item === 'string' ? item : 'text' in item ? item.text : ''))
|
|
36
|
+
.join('\n');
|
|
37
|
+
}
|
|
38
|
+
return '';
|
|
39
|
+
}
|
|
40
|
+
export function getEffectiveRequirementsProvider(command, config, cliProvider) {
|
|
41
|
+
return (cliProvider ??
|
|
42
|
+
config?.commands?.[command]?.requirementsProvider ??
|
|
43
|
+
config?.requirementsProvider);
|
|
44
|
+
}
|
|
45
|
+
export function getEffectiveContentProvider(command, config, cliProvider) {
|
|
46
|
+
return (cliProvider ??
|
|
47
|
+
config?.commands?.[command]?.contentProvider ??
|
|
48
|
+
config?.contentProvider ??
|
|
49
|
+
(command === 'pr' ? 'github' : undefined));
|
|
50
|
+
}
|
|
51
|
+
export async function getCommandProviderInput(command, inputType, id, config, cliProvider) {
|
|
52
|
+
if (inputType === 'requirements') {
|
|
53
|
+
return getRequirementsFromProvider(getEffectiveRequirementsProvider(command, config, cliProvider), id, config);
|
|
54
|
+
}
|
|
55
|
+
return getContentFromProvider(getEffectiveContentProvider(command, config, cliProvider), id, config);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=commandIntrospection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandIntrospection.js","sourceRoot":"","sources":["../../src/commands/commandIntrospection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { initConfig } from '#src/config.js';
|
|
2
|
+
import { getCommandProviderInput, getCommandSystemPrompt, } from '#src/commands/commandIntrospection.js';
|
|
3
|
+
import { display, displayError } from '#src/utils/consoleUtils.js';
|
|
4
|
+
import { setExitCode } from '#src/utils/systemUtils.js';
|
|
5
|
+
const PROMPT_COMMANDS = ['ask', 'review', 'pr', 'chat', 'code'];
|
|
6
|
+
const PROVIDER_COMMANDS = ['review', 'pr'];
|
|
7
|
+
const INPUT_TYPES = ['content', 'requirements'];
|
|
8
|
+
export function getCommand(program, commandLineConfigOverrides) {
|
|
9
|
+
program
|
|
10
|
+
.command('get')
|
|
11
|
+
.description('Print the effective prompt or provider-backed command input')
|
|
12
|
+
.argument('<command>', 'Command to introspect')
|
|
13
|
+
.argument('<subject>', 'Either prompt, content, or requirements')
|
|
14
|
+
.argument('[id]', 'Provider-backed content identifier')
|
|
15
|
+
.action(async (command, subject, id) => {
|
|
16
|
+
try {
|
|
17
|
+
const config = await initConfig(commandLineConfigOverrides);
|
|
18
|
+
if (subject === 'prompt') {
|
|
19
|
+
if (id) {
|
|
20
|
+
throw new Error('Prompt subject does not accept an ID.');
|
|
21
|
+
}
|
|
22
|
+
if (!PROMPT_COMMANDS.includes(command)) {
|
|
23
|
+
throw new Error(`Unsupported prompt command: ${command}.`);
|
|
24
|
+
}
|
|
25
|
+
display(getCommandSystemPrompt(command, config));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (!INPUT_TYPES.includes(subject)) {
|
|
29
|
+
throw new Error(`Unsupported subject: ${subject}.`);
|
|
30
|
+
}
|
|
31
|
+
if (!PROVIDER_COMMANDS.includes(command)) {
|
|
32
|
+
throw new Error(`Unsupported provider-backed command: ${command}.`);
|
|
33
|
+
}
|
|
34
|
+
if (!id) {
|
|
35
|
+
throw new Error(`Subject "${subject}" requires an ID.`);
|
|
36
|
+
}
|
|
37
|
+
display(await getCommandProviderInput(command, subject, id, config));
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
displayError(error instanceof Error ? error.message : String(error));
|
|
41
|
+
setExitCode(1);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=getCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCommand.js","sourceRoot":"","sources":["../../src/commands/getCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GAIvB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AACzE,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAU,CAAC;AACpD,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,cAAc,CAAU,CAAC;AAEzD,MAAM,UAAU,UAAU,CACxB,OAAgB,EAChB,0BAAsD;IAEtD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,6DAA6D,CAAC;SAC1E,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;SAC9C,QAAQ,CAAC,WAAW,EAAE,yCAAyC,CAAC;SAChE,QAAQ,CAAC,MAAM,EAAE,oCAAoC,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAAe,EAAE,EAAsB,EAAE,EAAE;QACzE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,0BAA0B,CAAC,CAAC;YAE5D,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACzB,IAAI,EAAE,EAAE,CAAC;oBACP,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAC3D,CAAC;gBACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAA4B,CAAC,EAAE,CAAC;oBAC5D,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,GAAG,CAAC,CAAC;gBAC7D,CAAC;gBAED,OAAO,CAAC,sBAAsB,CAAC,OAA4B,EAAE,MAAM,CAAC,CAAC,CAAC;gBACtE,OAAO;YACT,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAA4B,CAAC,EAAE,CAAC;gBACxD,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,GAAG,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAA8B,CAAC,EAAE,CAAC;gBAChE,MAAM,IAAI,KAAK,CAAC,wCAAwC,OAAO,GAAG,CAAC,CAAC;YACtE,CAAC;YACD,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,mBAAmB,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO,CACL,MAAM,uBAAuB,CAC3B,OAA8B,EAC9B,OAA4B,EAC5B,EAAE,EACF,MAAM,CACP,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,WAAW,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Option } from 'commander';
|
|
2
2
|
import { displayError } from '#src/utils/consoleUtils.js';
|
|
3
3
|
import { setExitCode } from '#src/utils/systemUtils.js';
|
|
4
|
-
import {
|
|
4
|
+
import { getCommandProviderInput, getEffectiveContentProvider, getEffectiveRequirementsProvider, getReviewSystemPrompt, } from '#src/commands/commandIntrospection.js';
|
|
5
|
+
import { REQUIREMENTS_PROVIDERS } from './commandUtils.js';
|
|
5
6
|
import jiraLogWork from '#src/helpers/jira/jiraLogWork.js';
|
|
6
|
-
import {
|
|
7
|
+
import { wrapContent } from '#src/utils/llmUtils.js';
|
|
7
8
|
import { readMultipleFilesFromProjectDir } from '#src/utils/fileUtils.js';
|
|
8
9
|
export function prCommand(program, commandLineConfigOverrides) {
|
|
9
10
|
program
|
|
@@ -19,33 +20,20 @@ export function prCommand(program, commandLineConfigOverrides) {
|
|
|
19
20
|
.action(async (prId, requirementsId, options) => {
|
|
20
21
|
const { initConfig } = await import('#src/config.js');
|
|
21
22
|
const config = await initConfig(commandLineConfigOverrides); // Initialize and get config
|
|
22
|
-
const systemPrompt = readSystemPrompt(config);
|
|
23
|
-
const systemMessage = [
|
|
24
|
-
readBackstory(config),
|
|
25
|
-
readGuidelines(config),
|
|
26
|
-
readReviewInstructions(config),
|
|
27
|
-
];
|
|
28
|
-
if (systemPrompt) {
|
|
29
|
-
systemMessage.push(systemPrompt);
|
|
30
|
-
}
|
|
31
23
|
const content = [];
|
|
32
|
-
const requirementsProvider = options.requirementsProvider
|
|
33
|
-
|
|
34
|
-
config?.requirementsProvider;
|
|
35
|
-
const contentProvider = config?.commands?.pr?.contentProvider ??
|
|
36
|
-
config?.contentProvider ??
|
|
37
|
-
'github';
|
|
24
|
+
const requirementsProvider = getEffectiveRequirementsProvider('pr', config, options.requirementsProvider);
|
|
25
|
+
const contentProvider = getEffectiveContentProvider('pr', config);
|
|
38
26
|
if (options.file) {
|
|
39
27
|
content.push(readMultipleFilesFromProjectDir(options.file));
|
|
40
28
|
}
|
|
41
29
|
// Handle requirements
|
|
42
|
-
const requirements = await
|
|
30
|
+
const requirements = await getCommandProviderInput('pr', 'requirements', requirementsId, config, requirementsProvider);
|
|
43
31
|
if (requirements) {
|
|
44
32
|
content.push(requirements);
|
|
45
33
|
}
|
|
46
34
|
// Get PR diff using the provider
|
|
47
35
|
try {
|
|
48
|
-
content.push(await
|
|
36
|
+
content.push(await getCommandProviderInput('pr', 'content', prId, config, contentProvider));
|
|
49
37
|
}
|
|
50
38
|
catch (error) {
|
|
51
39
|
displayError(error instanceof Error ? error.message : String(error));
|
|
@@ -58,7 +46,7 @@ export function prCommand(program, commandLineConfigOverrides) {
|
|
|
58
46
|
const { review } = await import('#src/modules/reviewModule.js');
|
|
59
47
|
// TODO consider including requirements id
|
|
60
48
|
// TODO sanitize prId
|
|
61
|
-
await review(`PR-${prId}`,
|
|
49
|
+
await review(`PR-${prId}`, getReviewSystemPrompt(config), content.join('\n'), config, 'pr');
|
|
62
50
|
if (requirementsId &&
|
|
63
51
|
(config.commands?.pr?.requirementsProvider ?? config.requirementsProvider) === 'jira' &&
|
|
64
52
|
config.commands?.pr?.logWorkForReviewInSeconds) {
|
|
@@ -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,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,
|
|
1
|
+
{"version":3,"file":"prCommand.js","sourceRoot":"","sources":["../../src/commands/prCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Option } from 'commander';
|
|
2
2
|
import { getStringFromStdin } from '#src/utils/systemUtils.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { getCommandProviderInput, getEffectiveContentProvider, getEffectiveRequirementsProvider, getReviewSystemPrompt, } from '#src/commands/commandIntrospection.js';
|
|
4
|
+
import { REQUIREMENTS_PROVIDERS, CONTENT_PROVIDERS, } from '#src/commands/commandUtils.js';
|
|
5
|
+
import { wrapContent } from '#src/utils/llmUtils.js';
|
|
5
6
|
import { readMultipleFilesFromProjectDir } from '#src/utils/fileUtils.js';
|
|
6
7
|
export function reviewCommand(program, cliConfigOverrides) {
|
|
7
8
|
program
|
|
@@ -19,29 +20,16 @@ export function reviewCommand(program, cliConfigOverrides) {
|
|
|
19
20
|
.action(async (contentId, options) => {
|
|
20
21
|
const { initConfig } = await import('#src/config.js');
|
|
21
22
|
const config = await initConfig(cliConfigOverrides); // Initialize and get config
|
|
22
|
-
const systemPrompt = readSystemPrompt(config);
|
|
23
|
-
const systemMessage = [
|
|
24
|
-
readBackstory(config),
|
|
25
|
-
readGuidelines(config),
|
|
26
|
-
readReviewInstructions(config),
|
|
27
|
-
];
|
|
28
|
-
if (systemPrompt) {
|
|
29
|
-
systemMessage.push(systemPrompt);
|
|
30
|
-
}
|
|
31
23
|
const content = [];
|
|
32
24
|
const requirementsId = options.requirements;
|
|
33
|
-
const requirementsProvider = options.requirementsProvider
|
|
34
|
-
|
|
35
|
-
config?.requirementsProvider;
|
|
36
|
-
const contentProvider = options.contentProvider ??
|
|
37
|
-
config?.commands?.review?.contentProvider ??
|
|
38
|
-
config?.contentProvider;
|
|
25
|
+
const requirementsProvider = getEffectiveRequirementsProvider('review', config, options.requirementsProvider);
|
|
26
|
+
const contentProvider = getEffectiveContentProvider('review', config, options.contentProvider);
|
|
39
27
|
// TODO consider calling these in parallel
|
|
40
|
-
const requirements = await
|
|
28
|
+
const requirements = await getCommandProviderInput('review', 'requirements', requirementsId, config, requirementsProvider);
|
|
41
29
|
if (requirements) {
|
|
42
30
|
content.push(requirements);
|
|
43
31
|
}
|
|
44
|
-
const providedContent = await
|
|
32
|
+
const providedContent = await getCommandProviderInput('review', 'content', contentId, config, contentProvider);
|
|
45
33
|
if (providedContent) {
|
|
46
34
|
content.push(providedContent);
|
|
47
35
|
}
|
|
@@ -56,7 +44,7 @@ export function reviewCommand(program, cliConfigOverrides) {
|
|
|
56
44
|
content.push(wrapContent(options.message, 'message', 'user message'));
|
|
57
45
|
}
|
|
58
46
|
const { review } = await import('#src/modules/reviewModule.js');
|
|
59
|
-
await review('REVIEW',
|
|
47
|
+
await review('REVIEW', getReviewSystemPrompt(config), content.join('\n'), config);
|
|
60
48
|
});
|
|
61
49
|
}
|
|
62
50
|
//# sourceMappingURL=reviewCommand.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reviewCommand.js","sourceRoot":"","sources":["../../src/commands/reviewCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"reviewCommand.js","sourceRoot":"","sources":["../../src/commands/reviewCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { JiraConfig } from '#src/providers/types.js';
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
export interface ResolvedJiraCredentials {
|
|
3
|
+
cloudId: string;
|
|
4
|
+
username?: string;
|
|
5
|
+
token?: string;
|
|
6
|
+
fullBase64Token?: string;
|
|
7
|
+
displayUrl?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function getJiraCredentials(config: Partial<JiraConfig> | null): ResolvedJiraCredentials;
|
|
10
|
+
export declare function getJiraHeaders(config: ResolvedJiraCredentials): Record<string, string>;
|
|
11
|
+
export declare function jiraRequest<T>(config: ResolvedJiraCredentials, endpoint: string, options?: RequestInit, showProgress?: boolean): Promise<T>;
|
|
@@ -4,6 +4,18 @@ export function getJiraCredentials(config) {
|
|
|
4
4
|
if (!config) {
|
|
5
5
|
throw new Error('No Jira config provided');
|
|
6
6
|
}
|
|
7
|
+
const cloudId = env.JIRA_CLOUD_ID || config.cloudId;
|
|
8
|
+
if (!cloudId) {
|
|
9
|
+
throw new Error('Missing JIRA Cloud ID. The Cloud ID can be defined as JIRA_CLOUD_ID environment variable or as "cloudId" in config.');
|
|
10
|
+
}
|
|
11
|
+
const fullBase64Token = env.JIRA_FULL_BASE64_TOKEN || config.fullBase64Token;
|
|
12
|
+
if (fullBase64Token) {
|
|
13
|
+
return {
|
|
14
|
+
cloudId,
|
|
15
|
+
fullBase64Token,
|
|
16
|
+
displayUrl: config.displayUrl,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
7
19
|
const username = env.JIRA_USERNAME || config.username;
|
|
8
20
|
if (!username) {
|
|
9
21
|
throw new Error('Missing JIRA username. The username can be defined as JIRA_USERNAME environment variable or as "username" in config.');
|
|
@@ -12,21 +24,17 @@ export function getJiraCredentials(config) {
|
|
|
12
24
|
if (!token) {
|
|
13
25
|
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
26
|
}
|
|
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
27
|
return {
|
|
28
|
+
cloudId,
|
|
20
29
|
username,
|
|
21
30
|
token,
|
|
22
|
-
cloudId,
|
|
23
31
|
displayUrl: config.displayUrl,
|
|
24
32
|
};
|
|
25
33
|
}
|
|
26
34
|
export function getJiraHeaders(config) {
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
35
|
+
const authHeader = config.fullBase64Token
|
|
36
|
+
? `Basic ${config.fullBase64Token}`
|
|
37
|
+
: `Basic ${Buffer.from(`${config.username}:${config.token}`).toString('base64')}`;
|
|
30
38
|
return {
|
|
31
39
|
Authorization: authHeader,
|
|
32
40
|
Accept: 'application/json; charset=utf-8',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jiraClient.js","sourceRoot":"","sources":["../../../src/helpers/jira/jiraClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"jiraClient.js","sourceRoot":"","sources":["../../../src/helpers/jira/jiraClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { display, displayError, displayWarning } from '#src/utils/consoleUtils.js';
|
|
2
|
-
import { getJiraCredentials, jiraRequest } from '#src/helpers/jira/jiraClient.js';
|
|
2
|
+
import { getJiraCredentials, jiraRequest, } from '#src/helpers/jira/jiraClient.js';
|
|
3
3
|
/**
|
|
4
4
|
* Gets Jira issue using Atlassian REST API v3 with Personal Access Token
|
|
5
5
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jiraIssueProvider.js","sourceRoot":"","sources":["../../src/providers/jiraIssueProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEnF,OAAO,
|
|
1
|
+
{"version":3,"file":"jiraIssueProvider.js","sourceRoot":"","sources":["../../src/providers/jiraIssueProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEnF,OAAO,EACL,kBAAkB,EAClB,WAAW,GAEZ,MAAM,iCAAiC,CAAC;AAYzC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,MAAkC,EAClC,OAA2B;IAE3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,cAAc,CAAC,yBAAyB,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,cAAc,CAAC,sBAAsB,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACrC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC;QAE7C,OAAO,eAAe,OAAO,cAAc,OAAO,qBAAqB,WAAW,EAAE,CAAC;IACvF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,CACV,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,YAAY,CACzB,WAAoC,EACpC,OAAe;IAEf,sGAAsG;IAEtG,0KAA0K;IAC1K,sHAAsH;IACtH,8CAA8C;IAC9C,qHAAqH;IACrH,qGAAqG;IAErG,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,CAAC,sBAAsB,WAAW,CAAC,UAAU,GAAG,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,wFAAwF;IACxF,MAAM,OAAO,GAAG,6BAA6B,CAAC,CAAC,wCAAwC;IAEvF,OAAO,WAAW,CAAoB,WAAW,EAAE,qBAAqB,OAAO,GAAG,OAAO,EAAE,EAAE;QAC3F,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -12,9 +12,10 @@ export interface JiraLegacyConfig extends ProviderConfig {
|
|
|
12
12
|
}
|
|
13
13
|
export interface JiraConfig extends ProviderConfig {
|
|
14
14
|
cloudId: string;
|
|
15
|
-
username
|
|
15
|
+
username?: string;
|
|
16
16
|
displayUrl?: string;
|
|
17
|
-
token
|
|
17
|
+
token?: string;
|
|
18
|
+
fullBase64Token?: string;
|
|
18
19
|
}
|
|
19
20
|
/**
|
|
20
21
|
* Configuration for an A2A (Agent-to-Agent) protocol agent.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gaunt-sloth-assistant",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Andrew Kondratev",
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"build": "tsc -b -clean && tsc",
|
|
27
27
|
"test": "npm run build && npx tsc -p spec/tsconfig.json --noEmit && vitest run",
|
|
28
28
|
"it": "npm run build && node it.js",
|
|
29
|
+
"it-verbose": "npm run build && GSLOTH_IT_VERBOSE=1 node it.js",
|
|
29
30
|
"lint": "eslint . --ext .js,.ts",
|
|
30
31
|
"lint-n-fix": "eslint . --ext .js,.ts --fix",
|
|
31
32
|
"format": "prettier --write 'src/**/*.{js,ts}'",
|