gaunt-sloth 2.0.0-alpha.2 → 2.0.0-alpha.21

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 (127) hide show
  1. package/README.md +55 -5
  2. package/cli.js +43 -10
  3. package/dist/cli.js +33 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/adkEvalRunner.d.ts +66 -0
  6. package/dist/commands/adkEvalRunner.js +69 -0
  7. package/dist/commands/adkEvalRunner.js.map +1 -0
  8. package/dist/commands/agUiEvalRunner.d.ts +73 -0
  9. package/dist/commands/agUiEvalRunner.js +216 -0
  10. package/dist/commands/agUiEvalRunner.js.map +1 -0
  11. package/dist/commands/askCommand.d.ts +3 -2
  12. package/dist/commands/askCommand.js +26 -7
  13. package/dist/commands/askCommand.js.map +1 -1
  14. package/dist/commands/batchCommand.d.ts +78 -0
  15. package/dist/commands/batchCommand.js +245 -0
  16. package/dist/commands/batchCommand.js.map +1 -0
  17. package/dist/commands/cliOptionParsers.d.ts +12 -0
  18. package/dist/commands/cliOptionParsers.js +18 -0
  19. package/dist/commands/cliOptionParsers.js.map +1 -0
  20. package/dist/commands/commandIntrospection.d.ts +6 -6
  21. package/dist/commands/commandIntrospection.js +12 -12
  22. package/dist/commands/commandIntrospection.js.map +1 -1
  23. package/dist/commands/commandUtils.d.ts +16 -16
  24. package/dist/commands/commandUtils.js +20 -20
  25. package/dist/commands/commandUtils.js.map +1 -1
  26. package/dist/commands/configCommand.d.ts +24 -0
  27. package/dist/commands/configCommand.js +117 -0
  28. package/dist/commands/configCommand.js.map +1 -0
  29. package/dist/commands/configSetup.d.ts +1 -1
  30. package/dist/commands/configSetup.js +17 -2
  31. package/dist/commands/configSetup.js.map +1 -1
  32. package/dist/commands/evalCommand.d.ts +41 -0
  33. package/dist/commands/evalCommand.js +483 -0
  34. package/dist/commands/evalCommand.js.map +1 -0
  35. package/dist/commands/execCommand.js +4 -1
  36. package/dist/commands/execCommand.js.map +1 -1
  37. package/dist/commands/firstRunDialog.d.ts +39 -5
  38. package/dist/commands/firstRunDialog.js +72 -10
  39. package/dist/commands/firstRunDialog.js.map +1 -1
  40. package/dist/commands/getCommand.js +7 -7
  41. package/dist/commands/getCommand.js.map +1 -1
  42. package/dist/commands/historyCommand.d.ts +17 -0
  43. package/dist/commands/historyCommand.js +102 -0
  44. package/dist/commands/historyCommand.js.map +1 -0
  45. package/dist/commands/initCommand.d.ts +3 -0
  46. package/dist/commands/initCommand.js +9 -4
  47. package/dist/commands/initCommand.js.map +1 -1
  48. package/dist/commands/insightsCommand.d.ts +8 -0
  49. package/dist/commands/insightsCommand.js +32 -0
  50. package/dist/commands/insightsCommand.js.map +1 -0
  51. package/dist/commands/modelsCommand.d.ts +25 -0
  52. package/dist/commands/modelsCommand.js +96 -0
  53. package/dist/commands/modelsCommand.js.map +1 -0
  54. package/dist/commands/prCommand.js +14 -15
  55. package/dist/commands/prCommand.js.map +1 -1
  56. package/dist/commands/prDiscovery.d.ts +2 -2
  57. package/dist/commands/prDiscovery.js +27 -29
  58. package/dist/commands/prDiscovery.js.map +1 -1
  59. package/dist/commands/reviewCommand.js +15 -10
  60. package/dist/commands/reviewCommand.js.map +1 -1
  61. package/dist/commands/workflowCommand.d.ts +19 -0
  62. package/dist/commands/workflowCommand.js +77 -0
  63. package/dist/commands/workflowCommand.js.map +1 -0
  64. package/dist/helpers/jira/jiraLogWork.js.map +1 -1
  65. package/dist/modules/startSession.js +9 -7
  66. package/dist/modules/startSession.js.map +1 -1
  67. package/dist/tools/gthJiraLogWorkTool.js +3 -3
  68. package/dist/tools/gthJiraLogWorkTool.js.map +1 -1
  69. package/dist/tui/components/App.js +321 -21
  70. package/dist/tui/components/App.js.map +1 -1
  71. package/dist/tui/components/ApprovalPrompt.d.ts +18 -0
  72. package/dist/tui/components/ApprovalPrompt.js +26 -0
  73. package/dist/tui/components/ApprovalPrompt.js.map +1 -0
  74. package/dist/tui/components/DebugPanel.d.ts +29 -9
  75. package/dist/tui/components/DebugPanel.js +46 -23
  76. package/dist/tui/components/DebugPanel.js.map +1 -1
  77. package/dist/tui/components/FetchProgress.d.ts +36 -0
  78. package/dist/tui/components/FetchProgress.js +39 -0
  79. package/dist/tui/components/FetchProgress.js.map +1 -0
  80. package/dist/tui/components/LiveTurn.d.ts +26 -4
  81. package/dist/tui/components/LiveTurn.js +104 -18
  82. package/dist/tui/components/LiveTurn.js.map +1 -1
  83. package/dist/tui/components/NoticeBar.d.ts +32 -0
  84. package/dist/tui/components/NoticeBar.js +39 -0
  85. package/dist/tui/components/NoticeBar.js.map +1 -0
  86. package/dist/tui/components/PromptInput.d.ts +26 -1
  87. package/dist/tui/components/PromptInput.js +93 -7
  88. package/dist/tui/components/PromptInput.js.map +1 -1
  89. package/dist/tui/components/Rule.js.map +1 -1
  90. package/dist/tui/components/SelectList.d.ts +98 -9
  91. package/dist/tui/components/SelectList.js +209 -26
  92. package/dist/tui/components/SelectList.js.map +1 -1
  93. package/dist/tui/components/SlashCommandMenu.d.ts +20 -0
  94. package/dist/tui/components/SlashCommandMenu.js +28 -0
  95. package/dist/tui/components/SlashCommandMenu.js.map +1 -0
  96. package/dist/tui/components/StatusBar.d.ts +7 -1
  97. package/dist/tui/components/StatusBar.js +7 -3
  98. package/dist/tui/components/StatusBar.js.map +1 -1
  99. package/dist/tui/components/Transcript.js +6 -1
  100. package/dist/tui/components/Transcript.js.map +1 -1
  101. package/dist/tui/debugRender.d.ts +41 -6
  102. package/dist/tui/debugRender.js +126 -12
  103. package/dist/tui/debugRender.js.map +1 -1
  104. package/dist/tui/debugSearch.d.ts +40 -0
  105. package/dist/tui/debugSearch.js +73 -0
  106. package/dist/tui/debugSearch.js.map +1 -0
  107. package/dist/tui/markdown.js +0 -0
  108. package/dist/tui/markdown.js.map +1 -1
  109. package/dist/tui/pasteParser.d.ts +21 -0
  110. package/dist/tui/pasteParser.js +24 -0
  111. package/dist/tui/pasteParser.js.map +1 -0
  112. package/dist/tui/selectCancelled.d.ts +13 -0
  113. package/dist/tui/selectCancelled.js +17 -0
  114. package/dist/tui/selectCancelled.js.map +1 -0
  115. package/dist/tui/slashCommands.d.ts +220 -1
  116. package/dist/tui/slashCommands.js +408 -1
  117. package/dist/tui/slashCommands.js.map +1 -1
  118. package/dist/tui/tuiSessionModule.js +249 -24
  119. package/dist/tui/tuiSessionModule.js.map +1 -1
  120. package/dist/tui/types.d.ts +96 -7
  121. package/dist/tui/viewModel.d.ts +34 -0
  122. package/dist/tui/viewModel.js +67 -0
  123. package/dist/tui/viewModel.js.map +1 -1
  124. package/dist/utils/stdinPolicy.d.ts +31 -0
  125. package/dist/utils/stdinPolicy.js +37 -0
  126. package/dist/utils/stdinPolicy.js.map +1 -0
  127. package/package.json +21 -17
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agUiEvalRunner.js","sourceRoot":"","sources":["../../src/commands/agUiEvalRunner.ts"],"names":[],"mappings":"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"}
@@ -16,8 +16,9 @@ interface AskCommandOptions {
16
16
  *
17
17
  * Filesystem mode is overridden on the per-command `commands.ask` slice (where
18
18
  * `getEffectiveConfig` reads it from), and `askWriteMode` is set so the agent's tool resolution
19
- * enables dev tools for `ask`. Dev tools reuse exec's (falling back to code's) `devTools` config
20
- * so users don't have to configure a separate `commands.ask.devTools`. Returns the config
19
+ * enables dev tools for `ask`. CFG-18: the dev/shell tools live in the unified `builtInTools`
20
+ * registry, so `ask --write` reuses exec's (falling back to code's) `builtInTools` config — copied
21
+ * onto `commands.ask.builtInTools` — rather than a separate `devTools` key. Returns the config
21
22
  * untouched when `--write` is not set.
22
23
  *
23
24
  * Exported for unit testing.
@@ -1,7 +1,7 @@
1
1
  import { initConfig } from '@gaunt-sloth/core/config.js';
2
2
  import { getAskSystemPrompt } from '#src/commands/commandIntrospection.js';
3
- import { getStringFromStdin } from '@gaunt-sloth/core/utils/systemUtils.js';
4
- import { displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
3
+ import { getStringFromStdin, setExitCode } from '@gaunt-sloth/core/utils/systemUtils.js';
4
+ import { displayError, displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
5
5
  import { wrapContent } from '@gaunt-sloth/core/utils/llmUtils.js';
6
6
  import { readMultipleFilesFromProjectDir } from '@gaunt-sloth/core/utils/fileUtils.js';
7
7
  /**
@@ -10,8 +10,9 @@ import { readMultipleFilesFromProjectDir } from '@gaunt-sloth/core/utils/fileUti
10
10
  *
11
11
  * Filesystem mode is overridden on the per-command `commands.ask` slice (where
12
12
  * `getEffectiveConfig` reads it from), and `askWriteMode` is set so the agent's tool resolution
13
- * enables dev tools for `ask`. Dev tools reuse exec's (falling back to code's) `devTools` config
14
- * so users don't have to configure a separate `commands.ask.devTools`. Returns the config
13
+ * enables dev tools for `ask`. CFG-18: the dev/shell tools live in the unified `builtInTools`
14
+ * registry, so `ask --write` reuses exec's (falling back to code's) `builtInTools` config — copied
15
+ * onto `commands.ask.builtInTools` — rather than a separate `devTools` key. Returns the config
15
16
  * untouched when `--write` is not set.
16
17
  *
17
18
  * Exported for unit testing.
@@ -21,7 +22,7 @@ export function applyAskWriteMode(config, options) {
21
22
  return config;
22
23
  }
23
24
  displayWarning('ask --write: filesystem and dev tools enabled — this run can read/write files and run commands.');
24
- const askDevTools = config.commands?.exec?.devTools ?? config.commands?.code?.devTools;
25
+ const askBuiltInTools = config.commands?.exec?.builtInTools ?? config.commands?.code?.builtInTools;
25
26
  return {
26
27
  ...config,
27
28
  askWriteMode: true,
@@ -30,7 +31,7 @@ export function applyAskWriteMode(config, options) {
30
31
  ask: {
31
32
  ...config.commands?.ask,
32
33
  filesystem: 'all',
33
- ...(askDevTools ? { devTools: askDevTools } : {}),
34
+ ...(askBuiltInTools ? { builtInTools: askBuiltInTools } : {}),
34
35
  },
35
36
  },
36
37
  };
@@ -48,6 +49,11 @@ export function askCommand(program, commandLineConfigOverrides) {
48
49
  .option('-f, --file [files...]', 'Input files. Content of these files will be added BEFORE the message')
49
50
  .option('--write', 'Let ask act, not just chat: enable full filesystem + dev tools (like exec/code) so it can ' +
50
51
  'read/write files and run commands. Grants write access — use with care.')
52
+ .addHelpText('after', '\n' +
53
+ 'Examples:\n' +
54
+ ' $ gsloth ask "which types of primitives are available in JavaScript?"\n' +
55
+ ' $ gsloth ask "Please explain this code" -f index.js\n' +
56
+ ' $ cat error.log | gsloth ask "What might be causing these errors?"\n')
51
57
  .action(async (message, options) => {
52
58
  const config = applyAskWriteMode(await initConfig(commandLineConfigOverrides), options);
53
59
  const content = [];
@@ -67,7 +73,20 @@ export function askCommand(program, commandLineConfigOverrides) {
67
73
  }
68
74
  const { runSingleShot } = await import('@gaunt-sloth/core/runtime/singleShot.js');
69
75
  const { createResolvers } = await import('@gaunt-sloth/agent/resolvers.js');
70
- await runSingleShot('ASK', getAskSystemPrompt(config), content.join('\n'), config, createResolvers());
76
+ const { resolveAgentFactory } = await import('@gaunt-sloth/agent/core/resolveAgentFactory.js');
77
+ let ok = false;
78
+ try {
79
+ ({ ok } = await runSingleShot('ASK', getAskSystemPrompt(config), content.join('\n'), config, createResolvers(), 'ask',
80
+ // ask defaults to the lean backend; an explicit config.agent.backend overrides it.
81
+ resolveAgentFactory(config, 'lean')));
82
+ }
83
+ catch (error) {
84
+ displayError(error instanceof Error ? error.message : String(error));
85
+ ok = false;
86
+ }
87
+ if (!ok) {
88
+ setExitCode(1);
89
+ }
71
90
  });
72
91
  }
73
92
  //# 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,6BAA6B,CAAC;AAErF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAElE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAYvF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,OAA0B;IAC7E,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,cAAc,CACZ,iGAAiG,CAClG,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC;IACvF,OAAO;QACL,GAAG,MAAM;QACT,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE;YACR,GAAG,MAAM,CAAC,QAAQ;YAClB,GAAG,EAAE;gBACH,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG;gBACvB,UAAU,EAAE,KAAK;gBACjB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClD;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;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,CACL,SAAS,EACT,4FAA4F;QAC1F,yEAAyE,CAC5E;SACA,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAA0B,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,UAAU,CAAC,0BAA0B,CAAC,EAAE,OAAO,CAAC,CAAC;QACxF,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,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;QAClF,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QAC5E,MAAM,aAAa,CACjB,KAAK,EACL,kBAAkB,CAAC,MAAM,CAAC,EAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAClB,MAAM,EACN,eAAe,EAAE,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"askCommand.js","sourceRoot":"","sources":["../../src/commands/askCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { Command } from 'commander';
2
+ import { CommandLineConfigOverrides } from '@gaunt-sloth/core/config.js';
3
+ import type { GthConfig } from '@gaunt-sloth/core/config.js';
4
+ import type { GthCommand } from '@gaunt-sloth/core/core/types.js';
5
+ import type { RunCellFn, RunConversationFn } from '@gaunt-sloth/batch';
6
+ /** Options for {@link buildProductionRunCell} — the bits that differ between `batch` (exec-mode,
7
+ * script content) and `eval` (ask-mode, a case's user-message prompt); everything else about the
8
+ * adapter (model-resolver cache, resolver cleanup, error handling) is shared. */
9
+ export interface ProductionRunCellOptions {
10
+ /** The `GthCommand` mode forwarded to `runSingleShot` — selects the agent's mode prompt/behavior
11
+ * (`'exec'` for `batch`, `'ask'` for `eval`). */
12
+ command: GthCommand;
13
+ /** Prefix for `runSingleShot`'s `source` naming (`<prefix>-<cell.id>`), used for output/session
14
+ * file naming — `'BATCH'` for `batch`, `'EVAL'` for `eval`. */
15
+ sourcePrefix: string;
16
+ /** `wrapContent` block-prefix label for the cell's content — `'script'` for `batch`'s
17
+ * prompt-executable scripts, `'message'` for `eval`'s case prompts. */
18
+ wrapBlockPrefix: string;
19
+ /** `wrapContent` human-readable prefix paired with {@link wrapBlockPrefix} (e.g.
20
+ * `'prompt-executable script'` / `'user message'`). */
21
+ wrapPrefix: string;
22
+ }
23
+ /**
24
+ * Build the injectable {@link RunCellFn} that adapts the shared single-shot runtime
25
+ * (`runSingleShot`) to one matrix cell. Isolated in its own function so each cell run gets a fresh
26
+ * `createResolvers()` (its own MCP client instance) — matching batch's "N isolated model calls"
27
+ * contract (docs/batch-mechanism-vs-judgment.md) rather than sharing one resolver/client across
28
+ * concurrent cells.
29
+ *
30
+ * Shared between `gth batch` and `gth eval` (BATCH-2): both run N isolated single-shot calls
31
+ * through this exact `runSingleShot` wiring (model-resolver cache, resolver cleanup-on-every-path,
32
+ * error containment), differing only in which agent mode/prompt they run cells through and how the
33
+ * cell's content is framed — see {@link ProductionRunCellOptions}. `gth eval`'s wiring lives in
34
+ * `evalCommand.ts`, which imports this function rather than re-deriving it.
35
+ *
36
+ * batch/eval each write their own structured JSON per cell/case (`writeBatchOutput`/
37
+ * `writeEvalOutput`), so `writeOutputToFile` is forced off for every cell run — the per-cell `.md`
38
+ * report `runSingleShot` would otherwise write is not wanted here.
39
+ */
40
+ export declare function buildProductionRunCell(baseConfig: GthConfig, preamble: string, commandLineConfigOverrides: CommandLineConfigOverrides, options: ProductionRunCellOptions): Promise<RunCellFn>;
41
+ /**
42
+ * BATCH-12 Task 2 — build the injectable {@link RunConversationFn} that adapts core's MULTI-TURN
43
+ * `runConversation` to `gth eval`'s conversation seam. The multi-turn analogue of
44
+ * {@link buildProductionRunCell}: same fresh-`createResolvers()` per conversation + cleanup-on-
45
+ * every-path discipline, but it runs a whole scripted conversation (agent/tools built ONCE, messages
46
+ * accumulated across turns) and returns one outcome per turn.
47
+ *
48
+ * No model axis (`gth eval` has no `--models`), so this takes the already-resolved SUT/identity
49
+ * `config` directly — mirroring how `evalCommand.ts` builds one config per identity and passes it in
50
+ * (it does NOT call `initConfig` here, so the command's `initConfig`-once-per-identity contract
51
+ * holds). `writeOutputToFile` is forced off (eval writes its own per-cell JSON via `writeEvalOutput`).
52
+ *
53
+ * A rare throw from `runConversation` (e.g. agent init failed) is deliberately NOT swallowed here:
54
+ * `runBatchMatrix` catches it as a failed cell and the runner surfaces the error on turn 1, which is
55
+ * more informative than an empty result. The `finally` still tears the resolvers down exactly once.
56
+ */
57
+ export declare function buildProductionRunConversation(config: GthConfig, preamble: string, options: ProductionRunCellOptions): Promise<RunConversationFn>;
58
+ /** Parse `--models a,b,c` into a trimmed, non-empty list; `undefined` when the flag is absent. */
59
+ export declare function parseModelsOption(models: string | undefined): string[] | undefined;
60
+ /** Default output dir when `-o/--output` is omitted: a timestamped dir next to other gth reports. */
61
+ export declare function defaultBatchOutputDir(): string;
62
+ /**
63
+ * Adds the `batch` command to the program.
64
+ *
65
+ * `gth batch <script.md> --over <csv|jsonl> [--models a,b,c] [-j 8] [--retry 2] [-o out/]` — runs a
66
+ * prompt-executable over a matrix (models × content-bound inputs), the way `exec` runs one. See
67
+ * docs/batch-eval-cli-surface.md and docs/batch-mechanism-vs-judgment.md for the design.
68
+ *
69
+ * Exit-code contract (BATCH-1, decisive design point): `gth batch` exits 0 iff the cells *ran* —
70
+ * it never fails because a cell's answer was poor quality (that is `gth eval`'s job, BATCH-2, not
71
+ * this command). Only a harness-level error (a malformed `--over` file, a missing script, etc.)
72
+ * sets a non-zero exit code; a per-cell failure is recorded in that cell's structured JSON output,
73
+ * never reflected in the process exit code.
74
+ *
75
+ * @param program - The commander program
76
+ * @param commandLineConfigOverrides - command line config overrides
77
+ */
78
+ export declare function batchCommand(program: Command, commandLineConfigOverrides: CommandLineConfigOverrides): void;
@@ -0,0 +1,245 @@
1
+ import { initConfig } from '@gaunt-sloth/core/config.js';
2
+ import { getExecSystemPrompt } from '#src/commands/commandIntrospection.js';
3
+ import { parseIntOption } from '#src/commands/cliOptionParsers.js';
4
+ import { displaySuccess, displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
5
+ import { wrapContent } from '@gaunt-sloth/core/utils/llmUtils.js';
6
+ import { fileSafeLocalDate, getGslothFilePath, readFileFromProjectDir, readMultipleFilesFromProjectDir, } from '@gaunt-sloth/core/utils/fileUtils.js';
7
+ /**
8
+ * Build a per-model {@link GthConfig} cache: one genuinely fresh `initConfig()` call (fresh `.llm`
9
+ * instance included) per DISTINCT `--models` value, not one per cell — a 20-cell matrix over 3
10
+ * models must only construct 3 model instances.
11
+ *
12
+ * BATCH-1 fix (CI review finding, critical): the previous approach gave a cell its own model by
13
+ * structurally cloning the shared `GthConfig.llm` instance (`Object.create` +
14
+ * `getOwnPropertyDescriptors`) and setting `.model` on the clone. That never runs the original
15
+ * class's constructor, so it never gets that instance's private (`#field`) slots — any LangChain
16
+ * chat-model class whose methods touch a `#privateField` internally (not just the public `model`
17
+ * field the old code checked for) would throw `TypeError: Cannot read private member from an
18
+ * object whose class did not declare it` the moment such a method ran on the clone. That risk is
19
+ * not provider-specific and cannot be ruled out by inspecting today's installed provider
20
+ * versions. This replaces cloning with construction: each distinct model gets a real
21
+ * `initConfig({ ...overrides, model })` call, which threads the override through
22
+ * `tryJsonConfig` (`packages/core/src/config/loader.ts`) so the provider's own
23
+ * `processJsonConfig()` builds the instance from scratch — the same supported path every other
24
+ * model comes from, correct for any provider.
25
+ *
26
+ * Cached by `Promise<GthConfig>` (not just by resolved value) so concurrent cells requesting the
27
+ * same not-yet-resolved model share one in-flight `initConfig()` call instead of racing to build
28
+ * the model twice.
29
+ */
30
+ function createCellConfigResolver(baseConfig, commandLineConfigOverrides) {
31
+ const configForModel = new Map();
32
+ return (model) => {
33
+ if (!model) {
34
+ return Promise.resolve(baseConfig);
35
+ }
36
+ let cached = configForModel.get(model);
37
+ if (!cached) {
38
+ cached = initConfig({ ...commandLineConfigOverrides, model });
39
+ configForModel.set(model, cached);
40
+ }
41
+ return cached;
42
+ };
43
+ }
44
+ /**
45
+ * Build the injectable {@link RunCellFn} that adapts the shared single-shot runtime
46
+ * (`runSingleShot`) to one matrix cell. Isolated in its own function so each cell run gets a fresh
47
+ * `createResolvers()` (its own MCP client instance) — matching batch's "N isolated model calls"
48
+ * contract (docs/batch-mechanism-vs-judgment.md) rather than sharing one resolver/client across
49
+ * concurrent cells.
50
+ *
51
+ * Shared between `gth batch` and `gth eval` (BATCH-2): both run N isolated single-shot calls
52
+ * through this exact `runSingleShot` wiring (model-resolver cache, resolver cleanup-on-every-path,
53
+ * error containment), differing only in which agent mode/prompt they run cells through and how the
54
+ * cell's content is framed — see {@link ProductionRunCellOptions}. `gth eval`'s wiring lives in
55
+ * `evalCommand.ts`, which imports this function rather than re-deriving it.
56
+ *
57
+ * batch/eval each write their own structured JSON per cell/case (`writeBatchOutput`/
58
+ * `writeEvalOutput`), so `writeOutputToFile` is forced off for every cell run — the per-cell `.md`
59
+ * report `runSingleShot` would otherwise write is not wanted here.
60
+ */
61
+ export async function buildProductionRunCell(baseConfig, preamble, commandLineConfigOverrides, options) {
62
+ const { runSingleShot } = await import('@gaunt-sloth/core/runtime/singleShot.js');
63
+ const { createResolvers } = await import('@gaunt-sloth/agent/resolvers.js');
64
+ const { resolveAgentFactory } = await import('@gaunt-sloth/agent/core/resolveAgentFactory.js');
65
+ const resolveCellModelConfig = createCellConfigResolver(baseConfig, commandLineConfigOverrides);
66
+ return async (cell) => {
67
+ const modelConfig = await resolveCellModelConfig(cell.model);
68
+ const cellConfig = {
69
+ ...modelConfig,
70
+ canInterruptInferenceWithEsc: false,
71
+ writeOutputToFile: false,
72
+ };
73
+ const content = wrapContent(cell.content, options.wrapBlockPrefix, options.wrapPrefix, true);
74
+ // BATCH-1 fix (CI review finding, critical): keep the resolvers reference and clean it up
75
+ // unconditionally (success or failure) — the previous code passed `createResolvers()` inline
76
+ // into `runSingleShot(...)` and discarded the reference, so `cleanupTools()` (which tears
77
+ // down any MCP-server-backed tools/processes the cell's resolution opened) was never called —
78
+ // an orphaned-process leak, one per cell.
79
+ const resolvers = createResolvers();
80
+ try {
81
+ const { ok, answer, tokensInput, tokensOutput, tools } = await runSingleShot(`${options.sourcePrefix}-${cell.id}`, preamble, content, cellConfig, resolvers, options.command,
82
+ // batch/eval default to the lean backend, same as exec/ask; an explicit
83
+ // config.agent.backend wins.
84
+ resolveAgentFactory(cellConfig, 'lean'));
85
+ return { ok, answer, tokensInput, tokensOutput, tools };
86
+ }
87
+ catch (error) {
88
+ // runSingleShot itself is documented to never throw for a normal LLM/tool failure (it
89
+ // returns false instead); this guards the rare case of a genuinely unexpected exception so
90
+ // one bad cell can never take the whole batch run down.
91
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
92
+ }
93
+ finally {
94
+ try {
95
+ await resolvers.cleanupTools?.();
96
+ }
97
+ catch (cleanupError) {
98
+ // A cleanup failure must never mask or override the cell's real result (already returned
99
+ // above) — surface it as a warning only.
100
+ displayWarning(`Failed to clean up tools for cell ${cell.id}: ` +
101
+ `${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`);
102
+ }
103
+ }
104
+ };
105
+ }
106
+ /**
107
+ * BATCH-12 Task 2 — build the injectable {@link RunConversationFn} that adapts core's MULTI-TURN
108
+ * `runConversation` to `gth eval`'s conversation seam. The multi-turn analogue of
109
+ * {@link buildProductionRunCell}: same fresh-`createResolvers()` per conversation + cleanup-on-
110
+ * every-path discipline, but it runs a whole scripted conversation (agent/tools built ONCE, messages
111
+ * accumulated across turns) and returns one outcome per turn.
112
+ *
113
+ * No model axis (`gth eval` has no `--models`), so this takes the already-resolved SUT/identity
114
+ * `config` directly — mirroring how `evalCommand.ts` builds one config per identity and passes it in
115
+ * (it does NOT call `initConfig` here, so the command's `initConfig`-once-per-identity contract
116
+ * holds). `writeOutputToFile` is forced off (eval writes its own per-cell JSON via `writeEvalOutput`).
117
+ *
118
+ * A rare throw from `runConversation` (e.g. agent init failed) is deliberately NOT swallowed here:
119
+ * `runBatchMatrix` catches it as a failed cell and the runner surfaces the error on turn 1, which is
120
+ * more informative than an empty result. The `finally` still tears the resolvers down exactly once.
121
+ */
122
+ export async function buildProductionRunConversation(config, preamble, options) {
123
+ const { runConversation } = await import('@gaunt-sloth/core/runtime/conversation.js');
124
+ const { createResolvers } = await import('@gaunt-sloth/agent/resolvers.js');
125
+ const { resolveAgentFactory } = await import('@gaunt-sloth/agent/core/resolveAgentFactory.js');
126
+ const cellConfig = {
127
+ ...config,
128
+ canInterruptInferenceWithEsc: false,
129
+ writeOutputToFile: false,
130
+ };
131
+ return async (userMessages) => {
132
+ // Wrap each turn's user message the same way single-turn cells wrap their content, so a turn's
133
+ // framing matches an equivalent single-turn case exactly.
134
+ const wrapped = userMessages.map((message) => wrapContent(message, options.wrapBlockPrefix, options.wrapPrefix, true));
135
+ // Fresh resolvers (its own MCP client) per conversation, torn down once when the whole
136
+ // conversation ends — the agent/tools persist ACROSS the turns inside `runConversation`.
137
+ const resolvers = createResolvers();
138
+ try {
139
+ const turns = await runConversation(`${options.sourcePrefix}-conversation`, preamble, wrapped, cellConfig, resolvers, options.command, resolveAgentFactory(cellConfig, 'lean'));
140
+ return turns.map(({ ok, answer, tokensInput, tokensOutput, tools, error }) => ({
141
+ ok,
142
+ answer,
143
+ tokensInput,
144
+ tokensOutput,
145
+ tools,
146
+ error,
147
+ }));
148
+ }
149
+ finally {
150
+ try {
151
+ await resolvers.cleanupTools?.();
152
+ }
153
+ catch (cleanupError) {
154
+ // A cleanup failure must never mask the conversation's real result — warn only.
155
+ displayWarning(`Failed to clean up tools for conversation: ` +
156
+ `${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`);
157
+ }
158
+ }
159
+ };
160
+ }
161
+ /** Parse `--models a,b,c` into a trimmed, non-empty list; `undefined` when the flag is absent. */
162
+ export function parseModelsOption(models) {
163
+ if (!models)
164
+ return undefined;
165
+ const list = models
166
+ .split(',')
167
+ .map((m) => m.trim())
168
+ .filter((m) => m.length > 0);
169
+ return list.length > 0 ? list : undefined;
170
+ }
171
+ /** Default output dir when `-o/--output` is omitted: a timestamped dir next to other gth reports. */
172
+ export function defaultBatchOutputDir() {
173
+ return getGslothFilePath(`gth_${fileSafeLocalDate()}_BATCH`);
174
+ }
175
+ /**
176
+ * Adds the `batch` command to the program.
177
+ *
178
+ * `gth batch <script.md> --over <csv|jsonl> [--models a,b,c] [-j 8] [--retry 2] [-o out/]` — runs a
179
+ * prompt-executable over a matrix (models × content-bound inputs), the way `exec` runs one. See
180
+ * docs/batch-eval-cli-surface.md and docs/batch-mechanism-vs-judgment.md for the design.
181
+ *
182
+ * Exit-code contract (BATCH-1, decisive design point): `gth batch` exits 0 iff the cells *ran* —
183
+ * it never fails because a cell's answer was poor quality (that is `gth eval`'s job, BATCH-2, not
184
+ * this command). Only a harness-level error (a malformed `--over` file, a missing script, etc.)
185
+ * sets a non-zero exit code; a per-cell failure is recorded in that cell's structured JSON output,
186
+ * never reflected in the process exit code.
187
+ *
188
+ * @param program - The commander program
189
+ * @param commandLineConfigOverrides - command line config overrides
190
+ */
191
+ export function batchCommand(program, commandLineConfigOverrides) {
192
+ program
193
+ .command('batch')
194
+ .description('Run a markdown prompt-executable over a matrix of models and/or content-bound inputs ' +
195
+ '("xargs for prompts"). Exits 0 iff the cells ran — a poor answer is not a harness failure.')
196
+ .argument('<script>', 'Path to the .md prompt-executable script to run over the matrix')
197
+ .option('--over <path>', 'CSV or JSONL file whose rows/records bind into the script content via {{field}} ' +
198
+ 'placeholders — one matrix cell per row (content binding only; a glob-of-files path ' +
199
+ 'binding is not supported by this command)')
200
+ .option('--models <list>', 'Comma-separated list of models to fan out over (omit to use the configured model, no fan-out)')
201
+ .option('-j, --concurrency <n>', 'Max in-flight cells', parseIntOption)
202
+ .option('--retry <n>', 'Retry a failed cell up to n times (default: 0, no retry)', parseIntOption)
203
+ .option('-o, --output <dir>', 'Directory to write structured per-cell JSON + results.json summary to ' +
204
+ '(default: a timestamped dir alongside other gth reports)')
205
+ .action(async (script, options) => {
206
+ const config = await initConfig(commandLineConfigOverrides);
207
+ // Specific `.js` subpaths (not the bare package root) — matches the house convention
208
+ // (`@gaunt-sloth/core/runtime/singleShot.js`, `@gaunt-sloth/review/utils/fileUtils.js`, …)
209
+ // that vitest's workspace-import resolver (vitest.config.ts) recognizes and resolves
210
+ // straight to source, so specs exercise live `packages/batch/src` rather than a `dist/`
211
+ // build that could go stale between an edit and a test run.
212
+ const { buildMatrix } = await import('@gaunt-sloth/batch/matrix.js');
213
+ const { parseOverFile } = await import('@gaunt-sloth/batch/parseOver.js');
214
+ const { runBatchMatrix } = await import('@gaunt-sloth/batch/BatchRunner.js');
215
+ const { writeBatchOutput } = await import('@gaunt-sloth/batch/output.js');
216
+ const scriptContent = readMultipleFilesFromProjectDir([script]);
217
+ const models = parseModelsOption(options.models);
218
+ const rows = options.over
219
+ ? parseOverFile(options.over, readFileFromProjectDir(options.over))
220
+ : undefined;
221
+ const cells = buildMatrix(scriptContent, models, rows);
222
+ const preamble = getExecSystemPrompt(config);
223
+ const runCell = await buildProductionRunCell(config, preamble, commandLineConfigOverrides, {
224
+ command: 'exec',
225
+ sourcePrefix: 'BATCH',
226
+ wrapBlockPrefix: 'script',
227
+ wrapPrefix: 'prompt-executable script',
228
+ });
229
+ const results = await runBatchMatrix(cells, {
230
+ runCell,
231
+ concurrency: options.concurrency,
232
+ retry: options.retry,
233
+ });
234
+ const outputDir = options.output ?? defaultBatchOutputDir();
235
+ const summary = writeBatchOutput(outputDir, results);
236
+ displaySuccess(`Batch complete: ${summary.passed}/${summary.total} cell(s) passed. ` +
237
+ `Results written to ${outputDir}`);
238
+ if (summary.failed > 0) {
239
+ // Visible, but deliberately does NOT set a non-zero exit code — see the exit-code
240
+ // contract above. A poor/failed cell is `eval`'s business, not batch's.
241
+ displayWarning(`${summary.failed} cell(s) failed — see ${outputDir}/results.json for details.`);
242
+ }
243
+ });
244
+ }
245
+ //# sourceMappingURL=batchCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batchCommand.js","sourceRoot":"","sources":["../../src/commands/batchCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Strict Commander option parser for a non-negative integer CLI flag (`-j/--concurrency`,
3
+ * `--retry`, …). Shared by `batchCommand.ts` and `evalCommand.ts`.
4
+ *
5
+ * Unlike a bare `parseInt(value, 10)`, this rejects trailing-garbage input such as `"10abc"` —
6
+ * `parseInt` stops at the first non-digit and returns `10`, and `Number.isFinite` on that result
7
+ * is still `true`, so the garbage silently passed through undetected. A regex pre-check (only
8
+ * ASCII digits, at least one) rejects that case, plus other loose inputs a bare `Number()`
9
+ * coercion would let through (`""` → `0`, `"1e3"` → `1000`, `" 5 "` → `5`, `"0x10"` → `16`) or
10
+ * that don't make sense for a concurrency/retry count (negative, fractional).
11
+ */
12
+ export declare function parseIntOption(value: string): number;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Strict Commander option parser for a non-negative integer CLI flag (`-j/--concurrency`,
3
+ * `--retry`, …). Shared by `batchCommand.ts` and `evalCommand.ts`.
4
+ *
5
+ * Unlike a bare `parseInt(value, 10)`, this rejects trailing-garbage input such as `"10abc"` —
6
+ * `parseInt` stops at the first non-digit and returns `10`, and `Number.isFinite` on that result
7
+ * is still `true`, so the garbage silently passed through undetected. A regex pre-check (only
8
+ * ASCII digits, at least one) rejects that case, plus other loose inputs a bare `Number()`
9
+ * coercion would let through (`""` → `0`, `"1e3"` → `1000`, `" 5 "` → `5`, `"0x10"` → `16`) or
10
+ * that don't make sense for a concurrency/retry count (negative, fractional).
11
+ */
12
+ export function parseIntOption(value) {
13
+ if (!/^\d+$/.test(value)) {
14
+ throw new Error(`Expected an integer, got "${value}"`);
15
+ }
16
+ return parseInt(value, 10);
17
+ }
18
+ //# sourceMappingURL=cliOptionParsers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliOptionParsers.js","sourceRoot":"","sources":["../../src/commands/cliOptionParsers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import type { GthConfig } from '@gaunt-sloth/core/config.js';
2
- import { type ContentProviderType, type RequirementsProviderType } from '#src/commands/commandUtils.js';
2
+ import { type ContentSourceType, type RequirementSourceType } from '#src/commands/commandUtils.js';
3
3
  export type PromptCommandType = 'ask' | 'review' | 'pr' | 'pr-discovery' | 'chat' | 'code' | 'exec';
4
- export type ProviderCommandType = 'review' | 'pr';
5
- export type ProviderInputType = 'content' | 'requirements';
4
+ export type SourceCommandType = 'review' | 'pr';
5
+ export type SourceInputType = 'content' | 'requirements';
6
6
  export declare function getAskSystemPrompt(config: GthConfig): string;
7
7
  export declare function getExecSystemPrompt(config: GthConfig): string;
8
8
  export declare function getReviewSystemPrompt(config: GthConfig): string;
9
9
  export declare function getCommandSystemPrompt(command: PromptCommandType, config: GthConfig): string;
10
- export declare function getEffectiveRequirementsProvider(command: ProviderCommandType, config: GthConfig, cliProvider?: RequirementsProviderType): RequirementsProviderType | undefined;
11
- export declare function getEffectiveContentProvider(command: ProviderCommandType, config: GthConfig, cliProvider?: ContentProviderType): ContentProviderType | undefined;
12
- export declare function getCommandProviderInput(command: ProviderCommandType, inputType: ProviderInputType, id: string | undefined, config: GthConfig, cliProvider?: RequirementsProviderType | ContentProviderType): Promise<string>;
10
+ export declare function getEffectiveRequirementSource(command: SourceCommandType, config: GthConfig, cliSource?: RequirementSourceType): RequirementSourceType | undefined;
11
+ export declare function getEffectiveContentSource(command: SourceCommandType, config: GthConfig, cliSource?: ContentSourceType): ContentSourceType | undefined;
12
+ export declare function getCommandSourceInput(command: SourceCommandType, inputType: SourceInputType, id: string | undefined, config: GthConfig, cliSource?: RequirementSourceType | ContentSourceType): Promise<string>;
@@ -1,4 +1,4 @@
1
- import { getContentFromProvider, getRequirementsFromProvider, } from '#src/commands/commandUtils.js';
1
+ import { getContentFromSource, getRequirementsFromSource, } from '#src/commands/commandUtils.js';
2
2
  import { buildSystemMessages, readBackstory, readChatPrompt, readCodePrompt, readExecPrompt, readGuidelines, readReviewInstructions, readSystemPrompt, } from '@gaunt-sloth/core/utils/llmUtils.js';
3
3
  import { readPrDiscoveryPrompt } from '#src/commands/prDiscovery.js';
4
4
  export function getAskSystemPrompt(config) {
@@ -50,21 +50,21 @@ function flattenSystemMessageContent(config, modePrompt) {
50
50
  }
51
51
  return '';
52
52
  }
53
- export function getEffectiveRequirementsProvider(command, config, cliProvider) {
54
- return (cliProvider ??
55
- config?.commands?.[command]?.requirementsProvider ??
56
- config?.requirementsProvider);
53
+ export function getEffectiveRequirementSource(command, config, cliSource) {
54
+ return (cliSource ??
55
+ config?.commands?.[command]?.requirementSource ??
56
+ config?.requirementSource);
57
57
  }
58
- export function getEffectiveContentProvider(command, config, cliProvider) {
59
- return (cliProvider ??
60
- config?.commands?.[command]?.contentProvider ??
61
- config?.contentProvider ??
58
+ export function getEffectiveContentSource(command, config, cliSource) {
59
+ return (cliSource ??
60
+ config?.commands?.[command]?.contentSource ??
61
+ config?.contentSource ??
62
62
  (command === 'pr' ? 'github' : undefined));
63
63
  }
64
- export async function getCommandProviderInput(command, inputType, id, config, cliProvider) {
64
+ export async function getCommandSourceInput(command, inputType, id, config, cliSource) {
65
65
  if (inputType === 'requirements') {
66
- return getRequirementsFromProvider(getEffectiveRequirementsProvider(command, config, cliProvider), id, config);
66
+ return getRequirementsFromSource(getEffectiveRequirementSource(command, config, cliSource), id, config);
67
67
  }
68
- return getContentFromProvider(getEffectiveContentProvider(command, config, cliProvider), id, config);
68
+ return getContentFromSource(getEffectiveContentSource(command, config, cliSource), id, config);
69
69
  }
70
70
  //# sourceMappingURL=commandIntrospection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commandIntrospection.js","sourceRoot":"","sources":["../../src/commands/commandIntrospection.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EACtB,2BAA2B,GAG5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAMrE,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,OAAO,2BAA2B,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9F,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAA0B,EAAE,MAAiB;IAClF,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,UAAU,GACd,OAAO,KAAK,cAAc;QACxB,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC;QAC/B,CAAC,CAAC,OAAO,KAAK,MAAM;YAClB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC;YACxB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,2BAA2B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,2BAA2B,CAAC,MAAiB,EAAE,UAAkB;IACxE,MAAM,CAAC,aAAa,CAAC,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,aAAa,EAAE,OAAO,CAAC;IAEvC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAClF,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,OAA4B,EAC5B,MAAiB,EACjB,WAAsC;IAEtC,OAAO,CACL,WAAW;QACV,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,oBAA6D;QAC1F,MAAM,EAAE,oBAA6D,CACvE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,OAA4B,EAC5B,MAAiB,EACjB,WAAiC;IAEjC,OAAO,CACL,WAAW;QACV,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,eAAmD;QAChF,MAAM,EAAE,eAAmD;QAC5D,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAC1C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAA4B,EAC5B,SAA4B,EAC5B,EAAsB,EACtB,MAAiB,EACjB,WAA4D;IAE5D,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QACjC,OAAO,2BAA2B,CAChC,gCAAgC,CAAC,OAAO,EAAE,MAAM,EAAE,WAAuC,CAAC,EAC1F,EAAE,EACF,MAAM,CACP,CAAC;IACJ,CAAC;IAED,OAAO,sBAAsB,CAC3B,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,WAAkC,CAAC,EAChF,EAAE,EACF,MAAM,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"commandIntrospection.js","sourceRoot":"","sources":["../../src/commands/commandIntrospection.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,23 @@
1
1
  import type { GthConfig } from '@gaunt-sloth/core/config.js';
2
2
  /**
3
- * Requirements providers. Aliases are mapped to actual package paths.
3
+ * Requirement sources. Aliases are mapped to actual package paths.
4
4
  */
5
- export declare const REQUIREMENTS_PROVIDERS: {
6
- readonly 'jira-legacy': "@gaunt-sloth/review/sources/jiraIssueLegacySource.js";
7
- readonly jira: "@gaunt-sloth/review/sources/jiraIssueSource.js";
8
- readonly github: "@gaunt-sloth/review/sources/ghIssueSource.js";
9
- readonly text: "@gaunt-sloth/review/sources/textSource.js";
10
- readonly file: "@gaunt-sloth/review/sources/fileSource.js";
5
+ export declare const REQUIREMENTS_SOURCES: {
6
+ readonly 'jira-legacy': '@gaunt-sloth/review/sources/jiraIssueLegacySource.js';
7
+ readonly jira: '@gaunt-sloth/review/sources/jiraIssueSource.js';
8
+ readonly github: '@gaunt-sloth/review/sources/ghIssueSource.js';
9
+ readonly text: '@gaunt-sloth/review/sources/textSource.js';
10
+ readonly file: '@gaunt-sloth/review/sources/fileSource.js';
11
11
  };
12
- export type RequirementsProviderType = keyof typeof REQUIREMENTS_PROVIDERS;
12
+ export type RequirementSourceType = keyof typeof REQUIREMENTS_SOURCES;
13
13
  /**
14
- * Content providers. Aliases are mapped to actual package paths.
14
+ * Content sources. Aliases are mapped to actual package paths.
15
15
  */
16
- export declare const CONTENT_PROVIDERS: {
17
- readonly github: "@gaunt-sloth/review/sources/ghPrDiffSource.js";
18
- readonly text: "@gaunt-sloth/review/sources/textSource.js";
19
- readonly file: "@gaunt-sloth/review/sources/fileSource.js";
16
+ export declare const CONTENT_SOURCES: {
17
+ readonly github: '@gaunt-sloth/review/sources/ghPrDiffSource.js';
18
+ readonly text: '@gaunt-sloth/review/sources/textSource.js';
19
+ readonly file: '@gaunt-sloth/review/sources/fileSource.js';
20
20
  };
21
- export type ContentProviderType = keyof typeof CONTENT_PROVIDERS;
22
- export declare function getRequirementsFromProvider(requirementsProvider: RequirementsProviderType | undefined, requirementsId: string | undefined, config: GthConfig): Promise<string>;
23
- export declare function getContentFromProvider(contentProvider: ContentProviderType | undefined, contentId: string | undefined, config: GthConfig): Promise<string>;
21
+ export type ContentSourceType = keyof typeof CONTENT_SOURCES;
22
+ export declare function getRequirementsFromSource(requirementSource: RequirementSourceType | undefined, requirementsId: string | undefined, config: GthConfig): Promise<string>;
23
+ export declare function getContentFromSource(contentSource: ContentSourceType | undefined, contentId: string | undefined, config: GthConfig): Promise<string>;