gaunt-sloth 0.0.1 → 1.5.8

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.
Files changed (214) hide show
  1. package/.gsloth.pr-discovery.md +23 -0
  2. package/README.md +50 -3
  3. package/cli.js +23 -0
  4. package/dist/builtInToolsConfig.d.ts +1 -0
  5. package/dist/builtInToolsConfig.js +2 -0
  6. package/dist/builtInToolsConfig.js.map +1 -0
  7. package/dist/cli.d.ts +1 -0
  8. package/dist/cli.js +60 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/apiCommand.d.ts +3 -0
  11. package/dist/commands/apiCommand.js +25 -0
  12. package/dist/commands/apiCommand.js.map +1 -0
  13. package/dist/commands/askCommand.d.ts +8 -0
  14. package/dist/commands/askCommand.js +39 -0
  15. package/dist/commands/askCommand.js.map +1 -0
  16. package/dist/commands/chatCommand.d.ts +3 -0
  17. package/dist/commands/chatCommand.js +24 -0
  18. package/dist/commands/chatCommand.js.map +1 -0
  19. package/dist/commands/codeCommand.d.ts +3 -0
  20. package/dist/commands/codeCommand.js +19 -0
  21. package/dist/commands/codeCommand.js.map +1 -0
  22. package/dist/commands/commandIntrospection.d.ts +11 -0
  23. package/dist/commands/commandIntrospection.js +64 -0
  24. package/dist/commands/commandIntrospection.js.map +1 -0
  25. package/dist/commands/commandUtils.d.ts +23 -0
  26. package/dist/commands/commandUtils.js +49 -0
  27. package/dist/commands/commandUtils.js.map +1 -0
  28. package/dist/commands/configSetup.d.ts +7 -0
  29. package/dist/commands/configSetup.js +63 -0
  30. package/dist/commands/configSetup.js.map +1 -0
  31. package/dist/commands/getCommand.d.ts +3 -0
  32. package/dist/commands/getCommand.js +45 -0
  33. package/dist/commands/getCommand.js.map +1 -0
  34. package/dist/commands/initCommand.d.ts +16 -0
  35. package/dist/commands/initCommand.js +90 -0
  36. package/dist/commands/initCommand.js.map +1 -0
  37. package/dist/commands/prCommand.d.ts +3 -0
  38. package/dist/commands/prCommand.js +106 -0
  39. package/dist/commands/prCommand.js.map +1 -0
  40. package/dist/commands/prDiscovery.d.ts +54 -0
  41. package/dist/commands/prDiscovery.js +451 -0
  42. package/dist/commands/prDiscovery.js.map +1 -0
  43. package/dist/commands/reviewCommand.d.ts +3 -0
  44. package/dist/commands/reviewCommand.js +51 -0
  45. package/dist/commands/reviewCommand.js.map +1 -0
  46. package/dist/config.d.ts +1 -0
  47. package/dist/config.js +2 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/constants.d.ts +1 -0
  50. package/dist/constants.js +2 -0
  51. package/dist/constants.js.map +1 -0
  52. package/dist/core/GthAgentRunner.d.ts +1 -0
  53. package/dist/core/GthAgentRunner.js +2 -0
  54. package/dist/core/GthAgentRunner.js.map +1 -0
  55. package/dist/core/GthLangChainAgent.d.ts +1 -0
  56. package/dist/core/GthLangChainAgent.js +2 -0
  57. package/dist/core/GthLangChainAgent.js.map +1 -0
  58. package/dist/core/types.d.ts +1 -0
  59. package/dist/core/types.js +2 -0
  60. package/dist/core/types.js.map +1 -0
  61. package/dist/helpers/jira/jiraClient.d.ts +1 -0
  62. package/dist/helpers/jira/jiraClient.js +2 -0
  63. package/dist/helpers/jira/jiraClient.js.map +1 -0
  64. package/dist/helpers/jira/jiraLogWork.d.ts +2 -0
  65. package/dist/helpers/jira/jiraLogWork.js +53 -0
  66. package/dist/helpers/jira/jiraLogWork.js.map +1 -0
  67. package/dist/mcp/OAuthClientProviderImpl.d.ts +1 -0
  68. package/dist/mcp/OAuthClientProviderImpl.js +2 -0
  69. package/dist/mcp/OAuthClientProviderImpl.js.map +1 -0
  70. package/dist/middleware/binaryContentInjectionMiddleware.d.ts +1 -0
  71. package/dist/middleware/binaryContentInjectionMiddleware.js +2 -0
  72. package/dist/middleware/binaryContentInjectionMiddleware.js.map +1 -0
  73. package/dist/middleware/registry.d.ts +1 -0
  74. package/dist/middleware/registry.js +2 -0
  75. package/dist/middleware/registry.js.map +1 -0
  76. package/dist/middleware/reviewRateMiddleware.d.ts +1 -0
  77. package/dist/middleware/reviewRateMiddleware.js +2 -0
  78. package/dist/middleware/reviewRateMiddleware.js.map +1 -0
  79. package/dist/middleware/types.d.ts +1 -0
  80. package/dist/middleware/types.js +2 -0
  81. package/dist/middleware/types.js.map +1 -0
  82. package/dist/modules/a2a/A2AClientWrapper.d.ts +1 -0
  83. package/dist/modules/a2a/A2AClientWrapper.js +2 -0
  84. package/dist/modules/a2a/A2AClientWrapper.js.map +1 -0
  85. package/dist/modules/apiAgUiModule.d.ts +1 -0
  86. package/dist/modules/apiAgUiModule.js +2 -0
  87. package/dist/modules/apiAgUiModule.js.map +1 -0
  88. package/dist/modules/interactiveSessionModule.d.ts +1 -0
  89. package/dist/modules/interactiveSessionModule.js +2 -0
  90. package/dist/modules/interactiveSessionModule.js.map +1 -0
  91. package/dist/modules/questionAnsweringModule.d.ts +1 -0
  92. package/dist/modules/questionAnsweringModule.js +2 -0
  93. package/dist/modules/questionAnsweringModule.js.map +1 -0
  94. package/dist/modules/reviewModule.d.ts +1 -0
  95. package/dist/modules/reviewModule.js +2 -0
  96. package/dist/modules/reviewModule.js.map +1 -0
  97. package/dist/modules/types.d.ts +1 -0
  98. package/dist/modules/types.js +2 -0
  99. package/dist/modules/types.js.map +1 -0
  100. package/dist/presets/anthropic.d.ts +1 -0
  101. package/dist/presets/anthropic.js +2 -0
  102. package/dist/presets/anthropic.js.map +1 -0
  103. package/dist/presets/deepseek.d.ts +1 -0
  104. package/dist/presets/deepseek.js +2 -0
  105. package/dist/presets/deepseek.js.map +1 -0
  106. package/dist/presets/fake.d.ts +1 -0
  107. package/dist/presets/fake.js +2 -0
  108. package/dist/presets/fake.js.map +1 -0
  109. package/dist/presets/google-genai.d.ts +1 -0
  110. package/dist/presets/google-genai.js +2 -0
  111. package/dist/presets/google-genai.js.map +1 -0
  112. package/dist/presets/groq.d.ts +1 -0
  113. package/dist/presets/groq.js +2 -0
  114. package/dist/presets/groq.js.map +1 -0
  115. package/dist/presets/openai.d.ts +1 -0
  116. package/dist/presets/openai.js +2 -0
  117. package/dist/presets/openai.js.map +1 -0
  118. package/dist/presets/openrouter.d.ts +1 -0
  119. package/dist/presets/openrouter.js +2 -0
  120. package/dist/presets/openrouter.js.map +1 -0
  121. package/dist/presets/vertexai.d.ts +1 -0
  122. package/dist/presets/vertexai.js +2 -0
  123. package/dist/presets/vertexai.js.map +1 -0
  124. package/dist/presets/xai.d.ts +1 -0
  125. package/dist/presets/xai.js +2 -0
  126. package/dist/presets/xai.js.map +1 -0
  127. package/dist/providers/file.d.ts +1 -0
  128. package/dist/providers/file.js +2 -0
  129. package/dist/providers/file.js.map +1 -0
  130. package/dist/providers/ghIssueProvider.d.ts +1 -0
  131. package/dist/providers/ghIssueProvider.js +2 -0
  132. package/dist/providers/ghIssueProvider.js.map +1 -0
  133. package/dist/providers/ghPrDiffProvider.d.ts +1 -0
  134. package/dist/providers/ghPrDiffProvider.js +2 -0
  135. package/dist/providers/ghPrDiffProvider.js.map +1 -0
  136. package/dist/providers/jiraIssueLegacyProvider.d.ts +1 -0
  137. package/dist/providers/jiraIssueLegacyProvider.js +2 -0
  138. package/dist/providers/jiraIssueLegacyProvider.js.map +1 -0
  139. package/dist/providers/jiraIssueProvider.d.ts +1 -0
  140. package/dist/providers/jiraIssueProvider.js +2 -0
  141. package/dist/providers/jiraIssueProvider.js.map +1 -0
  142. package/dist/providers/text.d.ts +1 -0
  143. package/dist/providers/text.js +2 -0
  144. package/dist/providers/text.js.map +1 -0
  145. package/dist/providers/types.d.ts +1 -0
  146. package/dist/providers/types.js +2 -0
  147. package/dist/providers/types.js.map +1 -0
  148. package/dist/state/artifactStore.d.ts +1 -0
  149. package/dist/state/artifactStore.js +2 -0
  150. package/dist/state/artifactStore.js.map +1 -0
  151. package/dist/tools/A2AAgentTool.d.ts +1 -0
  152. package/dist/tools/A2AAgentTool.js +2 -0
  153. package/dist/tools/A2AAgentTool.js.map +1 -0
  154. package/dist/tools/GthCustomToolkit.d.ts +1 -0
  155. package/dist/tools/GthCustomToolkit.js +2 -0
  156. package/dist/tools/GthCustomToolkit.js.map +1 -0
  157. package/dist/tools/GthDevToolkit.d.ts +1 -0
  158. package/dist/tools/GthDevToolkit.js +2 -0
  159. package/dist/tools/GthDevToolkit.js.map +1 -0
  160. package/dist/tools/GthFileSystemToolkit.d.ts +1 -0
  161. package/dist/tools/GthFileSystemToolkit.js +2 -0
  162. package/dist/tools/GthFileSystemToolkit.js.map +1 -0
  163. package/dist/tools/binaryUtils.d.ts +1 -0
  164. package/dist/tools/binaryUtils.js +2 -0
  165. package/dist/tools/binaryUtils.js.map +1 -0
  166. package/dist/tools/gthJiraLogWorkTool.d.ts +3 -0
  167. package/dist/tools/gthJiraLogWorkTool.js +37 -0
  168. package/dist/tools/gthJiraLogWorkTool.js.map +1 -0
  169. package/dist/tools/gthStatusUpdateTool.d.ts +1 -0
  170. package/dist/tools/gthStatusUpdateTool.js +2 -0
  171. package/dist/tools/gthStatusUpdateTool.js.map +1 -0
  172. package/dist/tools/gthWebFetchTool.d.ts +1 -0
  173. package/dist/tools/gthWebFetchTool.js +2 -0
  174. package/dist/tools/gthWebFetchTool.js.map +1 -0
  175. package/dist/tools/showA2UISurfaceTool.d.ts +1 -0
  176. package/dist/tools/showA2UISurfaceTool.js +2 -0
  177. package/dist/tools/showA2UISurfaceTool.js.map +1 -0
  178. package/dist/utils/ProgressIndicator.d.ts +1 -0
  179. package/dist/utils/ProgressIndicator.js +2 -0
  180. package/dist/utils/ProgressIndicator.js.map +1 -0
  181. package/dist/utils/aiignoreUtils.d.ts +1 -0
  182. package/dist/utils/aiignoreUtils.js +2 -0
  183. package/dist/utils/aiignoreUtils.js.map +1 -0
  184. package/dist/utils/binaryOutputUtils.d.ts +1 -0
  185. package/dist/utils/binaryOutputUtils.js +2 -0
  186. package/dist/utils/binaryOutputUtils.js.map +1 -0
  187. package/dist/utils/consoleUtils.d.ts +1 -0
  188. package/dist/utils/consoleUtils.js +2 -0
  189. package/dist/utils/consoleUtils.js.map +1 -0
  190. package/dist/utils/debugUtils.d.ts +1 -0
  191. package/dist/utils/debugUtils.js +2 -0
  192. package/dist/utils/debugUtils.js.map +1 -0
  193. package/dist/utils/fileUtils.d.ts +1 -0
  194. package/dist/utils/fileUtils.js +2 -0
  195. package/dist/utils/fileUtils.js.map +1 -0
  196. package/dist/utils/globalConfigUtils.d.ts +1 -0
  197. package/dist/utils/globalConfigUtils.js +2 -0
  198. package/dist/utils/globalConfigUtils.js.map +1 -0
  199. package/dist/utils/llmUtils.d.ts +1 -0
  200. package/dist/utils/llmUtils.js +2 -0
  201. package/dist/utils/llmUtils.js.map +1 -0
  202. package/dist/utils/mcpUtils.d.ts +1 -0
  203. package/dist/utils/mcpUtils.js +2 -0
  204. package/dist/utils/mcpUtils.js.map +1 -0
  205. package/dist/utils/stringUtils.d.ts +1 -0
  206. package/dist/utils/stringUtils.js +2 -0
  207. package/dist/utils/stringUtils.js.map +1 -0
  208. package/dist/utils/systemUtils.d.ts +1 -0
  209. package/dist/utils/systemUtils.js +2 -0
  210. package/dist/utils/systemUtils.js.map +1 -0
  211. package/dist/utils/vertexaiUtils.d.ts +1 -0
  212. package/dist/utils/vertexaiUtils.js +2 -0
  213. package/dist/utils/vertexaiUtils.js.map +1 -0
  214. package/package.json +56 -4
@@ -0,0 +1,45 @@
1
+ import { initConfig } from '@gaunt-sloth/core/config.js';
2
+ import { getCommandProviderInput, getCommandSystemPrompt, } from '#src/commands/commandIntrospection.js';
3
+ import { display, displayError } from '@gaunt-sloth/core/utils/consoleUtils.js';
4
+ import { setExitCode } from '@gaunt-sloth/core/utils/systemUtils.js';
5
+ const PROMPT_COMMANDS = ['ask', 'review', 'pr', 'pr-discovery', '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,6BAA6B,CAAC;AACrF,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GAIvB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAErE,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AACzF,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"}
@@ -0,0 +1,16 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Map of provider names to their expected API key environment variable names.
4
+ * vertexai uses gcloud auth and does not require an API key env var.
5
+ */
6
+ export declare const providerApiKeyMap: Record<string, string | null>;
7
+ /**
8
+ * Detects which providers have API keys set in the environment.
9
+ * Returns list of provider names with available keys.
10
+ */
11
+ export declare function detectAvailableProviders(): string[];
12
+ /**
13
+ * Adds the init command to the program
14
+ * @param program - The commander program
15
+ */
16
+ export declare function initCommand(program: Command): void;
@@ -0,0 +1,90 @@
1
+ import { availableDefaultConfigs } from '@gaunt-sloth/core/config.js';
2
+ import { createProjectConfig } from '#src/commands/configSetup.js';
3
+ import { displayInfo, displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
4
+ import { createInterface, env, stdin, stdout } from '@gaunt-sloth/core/utils/systemUtils.js';
5
+ import { Argument } from 'commander';
6
+ /**
7
+ * Map of provider names to their expected API key environment variable names.
8
+ * vertexai uses gcloud auth and does not require an API key env var.
9
+ */
10
+ export const providerApiKeyMap = {
11
+ anthropic: 'ANTHROPIC_API_KEY',
12
+ openai: 'OPENAI_API_KEY',
13
+ 'google-genai': 'GOOGLE_API_KEY',
14
+ groq: 'GROQ_API_KEY',
15
+ deepseek: 'DEEPSEEK_API_KEY',
16
+ xai: 'XAI_API_KEY',
17
+ openrouter: 'OPEN_ROUTER_API_KEY',
18
+ vertexai: null,
19
+ };
20
+ /**
21
+ * Detects which providers have API keys set in the environment.
22
+ * Returns list of provider names with available keys.
23
+ */
24
+ export function detectAvailableProviders() {
25
+ const available = [];
26
+ for (const provider of availableDefaultConfigs) {
27
+ const keyName = providerApiKeyMap[provider];
28
+ if (keyName === null) {
29
+ // Provider like vertexai that doesn't need an API key
30
+ available.push(provider);
31
+ }
32
+ else if (keyName && env[keyName]) {
33
+ available.push(provider);
34
+ }
35
+ }
36
+ return available;
37
+ }
38
+ /**
39
+ * Prompts the user to select a provider from a numbered list.
40
+ */
41
+ async function promptProviderSelection(providers) {
42
+ displayInfo('Available providers:');
43
+ providers.forEach((provider, index) => {
44
+ const keyName = providerApiKeyMap[provider];
45
+ const keyInfo = keyName ? ` (${keyName})` : ' (gcloud auth)';
46
+ displayInfo(` ${index + 1}. ${provider}${keyInfo}`);
47
+ });
48
+ const rl = createInterface({ input: stdin, output: stdout });
49
+ try {
50
+ const answer = await rl.question('\nSelect a provider by number: ');
51
+ const selection = parseInt(answer.trim(), 10);
52
+ if (isNaN(selection) || selection < 1 || selection > providers.length) {
53
+ displayWarning(`Invalid selection. Please enter a number between 1 and ${providers.length}.`);
54
+ rl.close();
55
+ return promptProviderSelection(providers);
56
+ }
57
+ return providers[selection - 1];
58
+ }
59
+ finally {
60
+ rl.close();
61
+ }
62
+ }
63
+ /**
64
+ * Adds the init command to the program
65
+ * @param program - The commander program
66
+ */
67
+ export function initCommand(program) {
68
+ program
69
+ .command('init')
70
+ .description('Initialize the Gaunt Sloth Assistant in your project. This will write necessary config files.')
71
+ .addArgument(new Argument('[type]', 'Config type (optional, will auto-detect if omitted)').choices(availableDefaultConfigs))
72
+ .action(async (config) => {
73
+ if (config) {
74
+ await createProjectConfig(config);
75
+ }
76
+ else {
77
+ const available = detectAvailableProviders();
78
+ if (available.length === 0) {
79
+ displayWarning('No API keys detected in environment. Available providers: ' +
80
+ availableDefaultConfigs.join(', '));
81
+ displayInfo('Please set an API key environment variable and try again, or run:');
82
+ displayInfo(' gsloth init <type>');
83
+ return;
84
+ }
85
+ const selected = await promptProviderSelection(available);
86
+ await createProjectConfig(selected);
87
+ }
88
+ });
89
+ }
90
+ //# sourceMappingURL=initCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initCommand.js","sourceRoot":"","sources":["../../src/commands/initCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ import { CommandLineConfigOverrides } from '@gaunt-sloth/core/config.js';
3
+ export declare function prCommand(program: Command, commandLineConfigOverrides: CommandLineConfigOverrides): void;
@@ -0,0 +1,106 @@
1
+ import { Option } from 'commander';
2
+ import { displayError } from '@gaunt-sloth/core/utils/consoleUtils.js';
3
+ import { setExitCode } from '@gaunt-sloth/core/utils/systemUtils.js';
4
+ import { getCommandProviderInput, getEffectiveContentProvider, getEffectiveRequirementsProvider, getReviewSystemPrompt, } from '#src/commands/commandIntrospection.js';
5
+ import { REQUIREMENTS_PROVIDERS } from './commandUtils.js';
6
+ import jiraLogWork from '#src/helpers/jira/jiraLogWork.js';
7
+ import { wrapContent } from '@gaunt-sloth/core/utils/llmUtils.js';
8
+ import { runPrDiscovery } from '#src/commands/prDiscovery.js';
9
+ import { readMultipleFilesFromProjectDir } from '@gaunt-sloth/review/utils/fileUtils.js';
10
+ export function prCommand(program, commandLineConfigOverrides) {
11
+ program
12
+ .command('pr')
13
+ .description('Review provided Pull Request in current directory. ' +
14
+ 'This command is similar to `review`, but default content provider is `github`. ' +
15
+ '(assuming that GitHub CLI is installed and authenticated for current project')
16
+ .argument('[prId]', "Pull request ID to review. Omit both prId and requirementsId to discover the change requirements from the current branch's PR.")
17
+ .argument('[requirementsId]', 'Optional requirements ID argument to retrieve requirements with requirements provider')
18
+ .addOption(new Option('-p, --requirements-provider <requirementsProvider>', 'Requirements provider for this review.').choices(Object.keys(REQUIREMENTS_PROVIDERS)))
19
+ .option('-f, --file [files...]', 'Input files. Content of these files will be added BEFORE the diff, but after requirements')
20
+ .option('-m, --message <message>', 'Extra message to provide just before the content')
21
+ .action(async (prId, requirementsId, options) => {
22
+ const { initConfig } = await import('@gaunt-sloth/core/config.js');
23
+ const config = await initConfig(commandLineConfigOverrides); // Initialize and get config
24
+ const content = [];
25
+ const requirementsProvider = getEffectiveRequirementsProvider('pr', config, options.requirementsProvider);
26
+ const contentProvider = getEffectiveContentProvider('pr', config);
27
+ if (options.file) {
28
+ content.push(readMultipleFilesFromProjectDir(options.file));
29
+ }
30
+ const isDiscovery = !prId && !requirementsId;
31
+ const looksLikeRequirementsOnlyMode = contentProvider === 'github' && Boolean(prId) && !requirementsId && !/^\d+$/.test(prId);
32
+ if (looksLikeRequirementsOnlyMode) {
33
+ displayError(`Unsupported PR command arguments: "${prId}" was provided as the pull request ID. ` +
34
+ '`gth pr <requirementsId>` requirements-only mode is not supported. ' +
35
+ 'Use `gth pr` with no arguments to discover change requirements automatically, or provide both a numeric PR ID and requirements ID: `gth pr <prId> <requirementsId>`.');
36
+ setExitCode(1);
37
+ return;
38
+ }
39
+ if (isDiscovery) {
40
+ if (config.commands?.pr?.discovery?.enabled === false) {
41
+ displayError('Change requirements discovery is disabled. Provide a pull request ID to run `gth pr`.');
42
+ setExitCode(1);
43
+ return;
44
+ }
45
+ try {
46
+ const discoveryResult = await runPrDiscovery(config);
47
+ if (discoveryResult.requirements) {
48
+ content.push(wrapContent(discoveryResult.requirements, 'discovered-requirements', 'requirements'));
49
+ }
50
+ if (!discoveryResult.diff) {
51
+ displayError('Change requirements discovery did not produce a diff. Cannot continue with review.');
52
+ setExitCode(1);
53
+ return;
54
+ }
55
+ content.push(wrapContent(discoveryResult.diff, 'discovered-diff', 'GitHub diff'));
56
+ }
57
+ catch (error) {
58
+ displayError(error instanceof Error ? error.message : String(error));
59
+ setExitCode(1);
60
+ return;
61
+ }
62
+ }
63
+ else {
64
+ // Handle requirements
65
+ const requirements = await getCommandProviderInput('pr', 'requirements', requirementsId, config, requirementsProvider);
66
+ if (requirements) {
67
+ content.push(requirements);
68
+ }
69
+ // Get PR diff using the provider
70
+ try {
71
+ const prContent = await getCommandProviderInput('pr', 'content', prId, config, contentProvider);
72
+ // A provider may resolve to an empty result instead of throwing - e.g. ghPrDiffSource
73
+ // returns null (with a warning) for an invalid PR number. Without this guard the review
74
+ // would silently proceed against no diff; fail loudly as the throwing path used to.
75
+ if (!prContent) {
76
+ displayError(`Could not retrieve PR content for "${prId}". Cannot continue with review.`);
77
+ setExitCode(1);
78
+ return;
79
+ }
80
+ content.push(prContent);
81
+ }
82
+ catch (error) {
83
+ displayError(error instanceof Error ? error.message : String(error));
84
+ setExitCode(1);
85
+ return;
86
+ }
87
+ }
88
+ if (options.message) {
89
+ content.push(wrapContent(options.message, 'message', 'user message'));
90
+ }
91
+ const { review } = await import('@gaunt-sloth/review/modules/reviewModule.js');
92
+ const { createResolvers } = await import('@gaunt-sloth/api/resolvers.js');
93
+ // TODO consider including requirements id
94
+ // TODO sanitize prId
95
+ await review(prId ? `PR-${prId}` : 'PR-discovery', getReviewSystemPrompt(config), content.join('\n'), config, 'pr', createResolvers());
96
+ if (requirementsId &&
97
+ (config.commands?.pr?.requirementsProvider ?? config.requirementsProvider) === 'jira' &&
98
+ config.commands?.pr?.logWorkForReviewInSeconds) {
99
+ // TODO we need to figure out some sort of post-processors
100
+ let jiraConfig = config.builtInToolsConfig?.jira ||
101
+ config.requirementsProviderConfig?.jira;
102
+ await jiraLogWork(jiraConfig, requirementsId, config.commands?.pr?.logWorkForReviewInSeconds, 'code review');
103
+ }
104
+ });
105
+ }
106
+ //# sourceMappingURL=prCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prCommand.js","sourceRoot":"","sources":["../../src/commands/prCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { CustomToolsConfig, GthConfig, ServerTool } from '@gaunt-sloth/core/config.js';
2
+ import { type BaseToolkit, StructuredToolInterface } from '@langchain/core/tools';
3
+ export declare const GSLOTH_PR_DISCOVERY_PROMPT = ".gsloth.pr-discovery.md";
4
+ export interface PrDiscoveryConfig {
5
+ /**
6
+ * Enable change requirements discovery when neither PR id nor requirements id is provided.
7
+ * @default true
8
+ */
9
+ enabled?: boolean;
10
+ /**
11
+ * Fetch the current-branch PR diff with `gh pr diff` before invoking the discovery agent.
12
+ * The discovery agent can still replace it with the `set_diff` tool if needed.
13
+ * @default true
14
+ */
15
+ deterministicDiff?: boolean;
16
+ /**
17
+ * Optional tool overrides used only while the discovery agent runs.
18
+ * When omitted, the normal configured tools remain available.
19
+ */
20
+ filesystem?: string[] | 'all' | 'read' | 'none';
21
+ builtInTools?: string[];
22
+ customTools?: CustomToolsConfig | false;
23
+ tools?: StructuredToolInterface[] | BaseToolkit[] | ServerTool[];
24
+ /**
25
+ * Restrict the discovery agent to this allow-list of tool names, applied after every tool
26
+ * source (filesystem, built-in, custom, MCP, A2A, and `tools`) is resolved. Unlike
27
+ * `builtInTools`/`customTools`/`filesystem` (which gate whole tool groups), this trims the
28
+ * final tool set by exact name, so it can pare down MCP server tools
29
+ * (e.g. "mcp__jira__getJiraIssue") and the discovery helper tools
30
+ * ("gh_pr"/"gh_diff"/"gh_issue"/"set_diff") to the minimum needed.
31
+ *
32
+ * `set_requirements` is always retained regardless, since it is how the discovery agent
33
+ * records the requirements it found. When omitted, all resolved tools remain available; an
34
+ * empty array keeps only `set_requirements`. The discovery agent never inherits the
35
+ * top-level {@link GthConfig.allowedTools}; this property is its only allow-list.
36
+ */
37
+ allowedTools?: string[];
38
+ }
39
+ declare module '@gaunt-sloth/core/config.js' {
40
+ interface PrCommandConfig {
41
+ /** Change requirements discovery (`gth pr` with no arguments) configuration. */
42
+ discovery?: PrDiscoveryConfig;
43
+ }
44
+ }
45
+ /**
46
+ * Read the PR discovery agent prompt, honouring project / identity-profile
47
+ * overrides and falling back to the default prompt shipped with the assistant package.
48
+ */
49
+ export declare function readPrDiscoveryPrompt(config: Pick<GthConfig, 'identityProfile' | 'noDefaultPrompts'>): string;
50
+ export interface PrDiscoveryResult {
51
+ diff: string;
52
+ requirements: string;
53
+ }
54
+ export declare function runPrDiscovery(config: GthConfig): Promise<PrDiscoveryResult>;