gaunt-sloth 2.0.0-alpha.5 → 2.0.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/askCommand.js +4 -1
- package/dist/commands/askCommand.js.map +1 -1
- package/dist/commands/configCommand.d.ts +24 -0
- package/dist/commands/configCommand.js +108 -0
- package/dist/commands/configCommand.js.map +1 -0
- package/dist/commands/configSetup.d.ts +1 -1
- package/dist/commands/configSetup.js +17 -2
- package/dist/commands/configSetup.js.map +1 -1
- package/dist/commands/execCommand.js +4 -1
- package/dist/commands/execCommand.js.map +1 -1
- package/dist/commands/firstRunDialog.d.ts +17 -3
- package/dist/commands/firstRunDialog.js +28 -7
- package/dist/commands/firstRunDialog.js.map +1 -1
- package/dist/commands/historyCommand.d.ts +13 -0
- package/dist/commands/historyCommand.js +72 -0
- package/dist/commands/historyCommand.js.map +1 -0
- package/dist/commands/initCommand.d.ts +3 -0
- package/dist/commands/initCommand.js +8 -3
- package/dist/commands/initCommand.js.map +1 -1
- package/dist/commands/insightsCommand.d.ts +8 -0
- package/dist/commands/insightsCommand.js +32 -0
- package/dist/commands/insightsCommand.js.map +1 -0
- package/dist/tui/components/App.js +13 -3
- package/dist/tui/components/App.js.map +1 -1
- package/dist/tui/components/LiveTurn.d.ts +4 -4
- package/dist/tui/components/LiveTurn.js +21 -5
- package/dist/tui/components/LiveTurn.js.map +1 -1
- package/dist/tui/components/PromptInput.d.ts +16 -1
- package/dist/tui/components/PromptInput.js +67 -7
- package/dist/tui/components/PromptInput.js.map +1 -1
- package/dist/tui/components/SelectList.d.ts +28 -3
- package/dist/tui/components/SelectList.js +78 -7
- package/dist/tui/components/SelectList.js.map +1 -1
- package/dist/tui/components/SlashCommandMenu.d.ts +20 -0
- package/dist/tui/components/SlashCommandMenu.js +28 -0
- package/dist/tui/components/SlashCommandMenu.js.map +1 -0
- package/dist/tui/slashCommands.d.ts +81 -0
- package/dist/tui/slashCommands.js +126 -0
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/tuiSessionModule.js +85 -4
- package/dist/tui/tuiSessionModule.js.map +1 -1
- package/dist/tui/types.d.ts +15 -0
- package/package.json +4 -4
package/dist/cli.js
CHANGED
|
@@ -8,6 +8,9 @@ import { chatCommand } from '#src/commands/chatCommand.js';
|
|
|
8
8
|
import { codeCommand } from '#src/commands/codeCommand.js';
|
|
9
9
|
import { apiCommand } from '#src/commands/apiCommand.js';
|
|
10
10
|
import { getCommand } from '#src/commands/getCommand.js';
|
|
11
|
+
import { configCommand } from '#src/commands/configCommand.js';
|
|
12
|
+
import { historyCommand } from '#src/commands/historyCommand.js';
|
|
13
|
+
import { insightsCommand } from '#src/commands/insightsCommand.js';
|
|
11
14
|
import { argv, getSlothVersion, readStdin } from '@gaunt-sloth/core/utils/systemUtils.js';
|
|
12
15
|
import { coerceBooleanOrString } from '@gaunt-sloth/core/utils/consoleUtils.js';
|
|
13
16
|
const program = new Command();
|
|
@@ -66,5 +69,10 @@ chatCommand(program, cliConfigOverrides);
|
|
|
66
69
|
codeCommand(program, cliConfigOverrides);
|
|
67
70
|
apiCommand(program, cliConfigOverrides);
|
|
68
71
|
getCommand(program, cliConfigOverrides);
|
|
72
|
+
configCommand(program, cliConfigOverrides);
|
|
73
|
+
// GS2-7 (B20) — read-only, local history/insights surfaces. They resolve their own DB path (global
|
|
74
|
+
// default or --db) and do not build the LLM, so they stay decoupled from config/provider setup.
|
|
75
|
+
historyCommand(program);
|
|
76
|
+
insightsCommand(program);
|
|
69
77
|
await readStdin(program);
|
|
70
78
|
//# 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":"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
|
|
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,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,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAG1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAEhF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,gCAAgC,CAAC;KAC7C,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,MAAM,CAAC,OAAO,EAAE,8EAA8E,CAAC;KAC/F,MAAM,CAAC,UAAU,EAAE,kEAAkE,CAAC;KACtF,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,4FAA4F;AAC5F,4FAA4F;AAC5F,mFAAmF;AACnF,IAAI,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;IAClD,kBAAkB,CAAC,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AACzD,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,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACzC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACxC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACxC,aAAa,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAC3C,mGAAmG;AACnG,gGAAgG;AAChG,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,eAAe,CAAC,OAAO,CAAC,CAAC;AAEzB,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC"}
|
|
@@ -67,7 +67,10 @@ export function askCommand(program, commandLineConfigOverrides) {
|
|
|
67
67
|
}
|
|
68
68
|
const { runSingleShot } = await import('@gaunt-sloth/core/runtime/singleShot.js');
|
|
69
69
|
const { createResolvers } = await import('@gaunt-sloth/agent/resolvers.js');
|
|
70
|
-
await
|
|
70
|
+
const { resolveAgentFactory } = await import('@gaunt-sloth/agent/core/resolveAgentFactory.js');
|
|
71
|
+
await runSingleShot('ASK', getAskSystemPrompt(config), content.join('\n'), config, createResolvers(), 'ask',
|
|
72
|
+
// ask defaults to the lean backend; an explicit config.agent.backend overrides it.
|
|
73
|
+
resolveAgentFactory(config, 'lean'));
|
|
71
74
|
});
|
|
72
75
|
}
|
|
73
76
|
//# 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,
|
|
1
|
+
{"version":3,"file":"askCommand.js","sourceRoot":"","sources":["../../src/commands/askCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { type CommandLineConfigOverrides, type GthConfig } from '@gaunt-sloth/core/config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Produce a plain, printable, secret-free view of a fully-resolved {@link GthConfig}.
|
|
5
|
+
*
|
|
6
|
+
* The resolved config carries live, non-serializable objects (the instantiated `llm`, tool
|
|
7
|
+
* instances, middleware); those are replaced with short descriptors so the output is readable
|
|
8
|
+
* and JSON-safe. Every value under a secret-looking key is redacted. Pure — returns a fresh
|
|
9
|
+
* object and never mutates the input.
|
|
10
|
+
*/
|
|
11
|
+
export declare function redactConfigForPrint(config: GthConfig): Record<string, unknown>;
|
|
12
|
+
/**
|
|
13
|
+
* Adds the `config` command group (GS2-1 read-side):
|
|
14
|
+
*
|
|
15
|
+
* - `gth config print [--json]` — resolve the config exactly as a run would (up-tree discovery
|
|
16
|
+
* + global base + defaults merge) and print it, with secrets redacted. `--json` emits only the
|
|
17
|
+
* JSON object (machine-readable); the default adds a source header.
|
|
18
|
+
* - `gth config validate` — validate the effective raw config against the schema WITHOUT building
|
|
19
|
+
* the LLM. Unknown keys warn; a schema violation prints a path-scoped message and exits non-zero.
|
|
20
|
+
*
|
|
21
|
+
* Both honour the global `--config` / `--identity-profile` overrides via
|
|
22
|
+
* `commandLineConfigOverrides`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function configCommand(program: Command, commandLineConfigOverrides: CommandLineConfigOverrides): void;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { initConfig, validateConfig, } from '@gaunt-sloth/core/config.js';
|
|
2
|
+
import { display, displayError, displayInfo, displaySuccess, displayWarning, } from '@gaunt-sloth/core/utils/consoleUtils.js';
|
|
3
|
+
import { setExitCode } from '@gaunt-sloth/core/utils/systemUtils.js';
|
|
4
|
+
/**
|
|
5
|
+
* Config keys whose VALUES must never be printed. Matched case-insensitively against the key
|
|
6
|
+
* name at any depth, so an accidental inline secret (an API key pasted into `configuration`,
|
|
7
|
+
* a bearer token, …) is redacted rather than echoed by `gth config print`.
|
|
8
|
+
*/
|
|
9
|
+
const SECRET_KEY_RE = /(api[-_]?key|secret|token|password|passwd|authorization|bearer|credential)/i;
|
|
10
|
+
const REDACTED = '***REDACTED***';
|
|
11
|
+
/**
|
|
12
|
+
* Produce a plain, printable, secret-free view of a fully-resolved {@link GthConfig}.
|
|
13
|
+
*
|
|
14
|
+
* The resolved config carries live, non-serializable objects (the instantiated `llm`, tool
|
|
15
|
+
* instances, middleware); those are replaced with short descriptors so the output is readable
|
|
16
|
+
* and JSON-safe. Every value under a secret-looking key is redacted. Pure — returns a fresh
|
|
17
|
+
* object and never mutates the input.
|
|
18
|
+
*/
|
|
19
|
+
export function redactConfigForPrint(config) {
|
|
20
|
+
// `llm` (the live BaseChatModel) is intentionally stripped and re-added below as a descriptor.
|
|
21
|
+
const { llm: _llm, tools, middleware, ...rest } = config;
|
|
22
|
+
void _llm;
|
|
23
|
+
// Deep-clone the JSON-safe remainder through a redacting replacer. Functions are dropped by
|
|
24
|
+
// JSON.stringify (fine — a printed config is documentation, not an executable). A defensive
|
|
25
|
+
// fallback keeps `print` working even if some exotic value is not serializable.
|
|
26
|
+
let out;
|
|
27
|
+
try {
|
|
28
|
+
out = JSON.parse(JSON.stringify(rest, (key, value) => (SECRET_KEY_RE.test(key) ? REDACTED : value)));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
out = {};
|
|
32
|
+
}
|
|
33
|
+
// Reinstate the stripped live fields as human descriptors (never the instances themselves).
|
|
34
|
+
out.llm = config.modelDisplayName ? `[chat model: ${config.modelDisplayName}]` : '[chat model]';
|
|
35
|
+
if (Array.isArray(tools))
|
|
36
|
+
out.tools = `[${tools.length} tool instance(s)]`;
|
|
37
|
+
if (Array.isArray(middleware))
|
|
38
|
+
out.middleware = `[${middleware.length} middleware]`;
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Adds the `config` command group (GS2-1 read-side):
|
|
43
|
+
*
|
|
44
|
+
* - `gth config print [--json]` — resolve the config exactly as a run would (up-tree discovery
|
|
45
|
+
* + global base + defaults merge) and print it, with secrets redacted. `--json` emits only the
|
|
46
|
+
* JSON object (machine-readable); the default adds a source header.
|
|
47
|
+
* - `gth config validate` — validate the effective raw config against the schema WITHOUT building
|
|
48
|
+
* the LLM. Unknown keys warn; a schema violation prints a path-scoped message and exits non-zero.
|
|
49
|
+
*
|
|
50
|
+
* Both honour the global `--config` / `--identity-profile` overrides via
|
|
51
|
+
* `commandLineConfigOverrides`.
|
|
52
|
+
*/
|
|
53
|
+
export function configCommand(program, commandLineConfigOverrides) {
|
|
54
|
+
const config = program
|
|
55
|
+
.command('config')
|
|
56
|
+
.description('Inspect and validate the resolved Gaunt Sloth configuration');
|
|
57
|
+
config
|
|
58
|
+
.command('print')
|
|
59
|
+
.description('Print the fully-resolved configuration (secrets redacted)')
|
|
60
|
+
.option('--json', 'Emit only the JSON object (machine-readable), no header')
|
|
61
|
+
.action(async (options) => {
|
|
62
|
+
try {
|
|
63
|
+
const resolved = await initConfig(commandLineConfigOverrides);
|
|
64
|
+
const printable = redactConfigForPrint(resolved);
|
|
65
|
+
const json = JSON.stringify(printable, null, 2);
|
|
66
|
+
if (options.json) {
|
|
67
|
+
display(json);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
displayInfo('Resolved Gaunt Sloth configuration (secrets redacted):');
|
|
71
|
+
display(json);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
displayError(error instanceof Error ? error.message : String(error));
|
|
76
|
+
setExitCode(1);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
config
|
|
80
|
+
.command('validate')
|
|
81
|
+
.description('Validate the configuration against the schema; exits non-zero when invalid')
|
|
82
|
+
.action(async () => {
|
|
83
|
+
try {
|
|
84
|
+
const report = await validateConfig(commandLineConfigOverrides);
|
|
85
|
+
if (!report.found) {
|
|
86
|
+
displayError('No configuration file found to validate. Run `gth init` to create one, ' +
|
|
87
|
+
'or pass --config <path>.');
|
|
88
|
+
setExitCode(1);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
for (const warning of report.warnings) {
|
|
92
|
+
displayWarning(warning);
|
|
93
|
+
}
|
|
94
|
+
if (report.ok) {
|
|
95
|
+
displaySuccess(`Configuration is valid: ${report.sourceLabel}`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
displayError(`Invalid configuration in ${report.sourceLabel}:\n${report.errorMessage ?? ''}`);
|
|
99
|
+
setExitCode(1);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// A JSONC/module parse failure lands here — surface it as an invalid-config error.
|
|
103
|
+
displayError(`Failed to read configuration: ${error instanceof Error ? error.message : String(error)}`);
|
|
104
|
+
setExitCode(1);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=configCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configCommand.js","sourceRoot":"","sources":["../../src/commands/configCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare function createProjectConfig(configType: string): Promise<void>;
|
|
1
|
+
export declare function createProjectConfig(configType: string, force?: boolean): Promise<void>;
|
|
2
2
|
/**
|
|
3
3
|
* Ensures that the .gsloth directory exists in the project root.
|
|
4
4
|
* Creates it if it does not exist.
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { GSLOTH_DIR, PROJECT_GUIDELINES, PROJECT_REVIEW_INSTRUCTIONS, USER_PROJECT_CONFIG_JSON, } from '@gaunt-sloth/core/constants.js';
|
|
2
2
|
import { availableDefaultConfigs } from '@gaunt-sloth/core/config.js';
|
|
3
|
+
import { resolveInitModel } from '@gaunt-sloth/core/providers/modelDiscovery.js';
|
|
3
4
|
import { displayError, displayInfo, displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
|
|
4
5
|
import { getGslothConfigWritePath, writeFileIfNotExistsWithMessages, } from '@gaunt-sloth/review/utils/fileUtils.js';
|
|
5
6
|
import { exit, getCurrentWorkDir } from '@gaunt-sloth/core/utils/systemUtils.js';
|
|
6
7
|
import { existsSync, mkdirSync } from 'node:fs';
|
|
7
8
|
import { resolve } from 'node:path';
|
|
8
|
-
export async function createProjectConfig(configType) {
|
|
9
|
+
export async function createProjectConfig(configType, force = false) {
|
|
9
10
|
if (!availableDefaultConfigs.includes(configType)) {
|
|
10
11
|
displayError(`Unknown config type: ${configType}. Available options: ${availableDefaultConfigs.join(', ')}`);
|
|
11
12
|
exit(1);
|
|
@@ -14,9 +15,23 @@ export async function createProjectConfig(configType) {
|
|
|
14
15
|
displayInfo(`Setting up your project\n`);
|
|
15
16
|
writeProjectReviewPreamble();
|
|
16
17
|
displayWarning(`Make sure you add as much detail as possible to your ${PROJECT_GUIDELINES}.\n`);
|
|
18
|
+
// The config file is the only artefact that gets an overwrite path; the preamble files above stay
|
|
19
|
+
// no-clobber. Without --force, keep an existing config (and say so honestly) rather than running
|
|
20
|
+
// the provider init, whose no-clobber write would silently skip and leave a misleading trail.
|
|
21
|
+
const configPath = getGslothConfigWritePath(USER_PROJECT_CONFIG_JSON);
|
|
22
|
+
if (!force && existsSync(configPath)) {
|
|
23
|
+
displayWarning(`${configPath} already exists and was kept (not overwritten). Re-run with --force to overwrite it.`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
17
26
|
displayInfo(`Creating project config for ${configType}`);
|
|
27
|
+
// CFG-14: resolve the model to write from live `/v1/models` discovery when a key/daemon is
|
|
28
|
+
// present (a verified-present id, never a speculative literal). When live discovery is
|
|
29
|
+
// impossible this returns undefined and `init` omits `model`, deferring to the provider's
|
|
30
|
+
// single curated run-time fallback (getCuratedFallbackModel) rather than baking a stale id that
|
|
31
|
+
// 404s once the model is retired.
|
|
32
|
+
const model = await resolveInitModel(configType);
|
|
18
33
|
const vendorConfig = await import(`@gaunt-sloth/core/providers/${configType}.js`);
|
|
19
|
-
vendorConfig.init(
|
|
34
|
+
vendorConfig.init(configPath, force, model);
|
|
20
35
|
}
|
|
21
36
|
/**
|
|
22
37
|
* Ensures that the .gsloth directory exists in the project root.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configSetup.js","sourceRoot":"","sources":["../../src/commands/configSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAmB,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACpG,OAAO,EACL,wBAAwB,EACxB,gCAAgC,GACjC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB;
|
|
1
|
+
{"version":3,"file":"configSetup.js","sourceRoot":"","sources":["../../src/commands/configSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAmB,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAmB,MAAM,+CAA+C,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACpG,OAAO,EACL,wBAAwB,EACxB,gCAAgC,GACjC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB,EAAE,KAAK,GAAG,KAAK;IACzE,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,UAAwB,CAAC,EAAE,CAAC;QAChE,YAAY,CACV,wBAAwB,UAAU,wBAAwB,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/F,CAAC;QACF,IAAI,CAAC,CAAC,CAAC,CAAC;IACV,CAAC;IAED,eAAe,EAAE,CAAC;IAElB,WAAW,CAAC,2BAA2B,CAAC,CAAC;IACzC,0BAA0B,EAAE,CAAC;IAC7B,cAAc,CAAC,wDAAwD,kBAAkB,KAAK,CAAC,CAAC;IAEhG,kGAAkG;IAClG,iGAAiG;IACjG,8FAA8F;IAC9F,MAAM,UAAU,GAAG,wBAAwB,CAAC,wBAAwB,CAAC,CAAC;IACtE,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,cAAc,CACZ,GAAG,UAAU,sFAAsF,CACpG,CAAC;QACF,OAAO;IACT,CAAC;IAED,WAAW,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;IACzD,2FAA2F;IAC3F,uFAAuF;IACvF,0FAA0F;IAC1F,gGAAgG;IAChG,kCAAkC;IAClC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,UAAwB,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,+BAA+B,UAAU,KAAK,CAAC,CAAC;IAClF,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,WAAW,CAAC,WAAW,UAAU,YAAY,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,MAAM,cAAc,GAAG,wBAAwB,CAAC,kBAAkB,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,wBAAwB,CAAC,2BAA2B,CAAC,CAAC;IAEzE,MAAM,kBAAkB,GAAG;;;;2EAI8C,kBAAkB;;qBAExE,kBAAkB;CACtC,CAAC;IAEA,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;CAexB,CAAC;IAEA,gCAAgC,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IACrE,gCAAgC,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -94,9 +94,12 @@ export function execCommand(program, commandLineConfigOverrides) {
|
|
|
94
94
|
const execConfig = buildExecConfig(config, options);
|
|
95
95
|
const { runSingleShot } = await import('@gaunt-sloth/core/runtime/singleShot.js');
|
|
96
96
|
const { createResolvers } = await import('@gaunt-sloth/agent/resolvers.js');
|
|
97
|
+
const { resolveAgentFactory } = await import('@gaunt-sloth/agent/core/resolveAgentFactory.js');
|
|
97
98
|
let ok = false;
|
|
98
99
|
try {
|
|
99
|
-
ok = await runSingleShot('EXEC', getExecSystemPrompt(execConfig), content.join('\n'), execConfig, createResolvers(), 'exec'
|
|
100
|
+
ok = await runSingleShot('EXEC', getExecSystemPrompt(execConfig), content.join('\n'), execConfig, createResolvers(), 'exec',
|
|
101
|
+
// exec defaults to the lean backend; an explicit config.agent.backend overrides it.
|
|
102
|
+
resolveAgentFactory(execConfig, 'lean'));
|
|
100
103
|
}
|
|
101
104
|
catch (error) {
|
|
102
105
|
displayError(error instanceof Error ? error.message : String(error));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execCommand.js","sourceRoot":"","sources":["../../src/commands/execCommand.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"execCommand.js","sourceRoot":"","sources":["../../src/commands/execCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,14 @@ export interface FirstRunDialogDeps {
|
|
|
25
25
|
listModels: typeof listModels;
|
|
26
26
|
ensureGslothDir: typeof ensureGslothDir;
|
|
27
27
|
writeProjectReviewPreamble: typeof writeProjectReviewPreamble;
|
|
28
|
-
/**
|
|
28
|
+
/** Resolves the config file path for the chosen scope (does not write). */
|
|
29
|
+
resolveConfigPath: (scope: ConfigScope) => string;
|
|
30
|
+
/** True when a config file already exists at `path`. */
|
|
31
|
+
configExists: (path: string) => boolean;
|
|
32
|
+
/**
|
|
33
|
+
* (Over)writes the config content at the scope's path and returns that path. The dialog only
|
|
34
|
+
* calls this once it has decided to write, so this always writes (never a silent no-clobber skip).
|
|
35
|
+
*/
|
|
29
36
|
writeConfig: (scope: ConfigScope, content: string) => string;
|
|
30
37
|
/** Prompts the user and resolves with their (untrimmed) answer. */
|
|
31
38
|
ask: AskFn;
|
|
@@ -44,7 +51,14 @@ export declare function orderProviders(providers: DetectedProvider[]): DetectedP
|
|
|
44
51
|
export declare function parseMenuSelection(answer: string, count: number): number | null;
|
|
45
52
|
/** The index of the first ⭐ preferred model, or 0 when none are flagged. */
|
|
46
53
|
export declare function defaultModelIndex(models: ModelInfo[]): number;
|
|
47
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* Builds the `.gsloth.config.json` body for a chosen provider + model. Delegates to the shared
|
|
56
|
+
* {@link buildInitConfigContent} so the interactive first-run path stamps the same `$schema`
|
|
57
|
+
* pointer (GS2-1) as the per-provider template writers. Previously this local builder omitted
|
|
58
|
+
* `$schema`, so a config created through the first-run dialog got no editor autocomplete/validation.
|
|
59
|
+
* First-run always has an explicit model chosen, so it is written into the config (unlike a bare
|
|
60
|
+
* `init <provider>` template, which omits the model to track the curated fallback, CFG-14).
|
|
61
|
+
*/
|
|
48
62
|
export declare function buildConfigContent(providerId: ProviderId, model: string): string;
|
|
49
63
|
/** Resolves the config write path for the chosen scope (CFG-3 layering). */
|
|
50
64
|
export declare function resolveConfigWritePath(scope: ConfigScope): string;
|
|
@@ -62,5 +76,5 @@ export declare function providerReadinessLabel(provider: DetectedProvider): stri
|
|
|
62
76
|
* globally (CFG-3). Writes a minimal `{ llm: { type, model } }` config and, for
|
|
63
77
|
* the project scope, scaffolds the review/guidelines preamble.
|
|
64
78
|
*/
|
|
65
|
-
export declare function runFirstRunDialog(overrides?: Partial<FirstRunDialogDeps
|
|
79
|
+
export declare function runFirstRunDialog(overrides?: Partial<FirstRunDialogDeps>, force?: boolean): Promise<void>;
|
|
66
80
|
export {};
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { USER_PROJECT_CONFIG_JSON } from '@gaunt-sloth/core/constants.js';
|
|
2
|
-
import { detectProviders, listModels, } from '@gaunt-sloth/core/providers/modelDiscovery.js';
|
|
2
|
+
import { buildInitConfigContent, detectProviders, listModels, } from '@gaunt-sloth/core/providers/modelDiscovery.js';
|
|
3
3
|
import { getGlobalGslothConfigWritePath } from '@gaunt-sloth/core/utils/globalConfigUtils.js';
|
|
4
4
|
import { displayInfo, displaySuccess, displayWarning, } from '@gaunt-sloth/core/utils/consoleUtils.js';
|
|
5
5
|
import { createInterface, env, stdin, stdout, } from '@gaunt-sloth/core/utils/systemUtils.js';
|
|
6
|
-
import { getGslothConfigWritePath,
|
|
6
|
+
import { getGslothConfigWritePath, writeFileWithMessages, } from '@gaunt-sloth/review/utils/fileUtils.js';
|
|
7
7
|
import { ensureGslothDir, writeProjectReviewPreamble } from '#src/commands/configSetup.js';
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
8
9
|
import { shouldUseTui } from '#src/tui/shouldUseTui.js';
|
|
9
10
|
import { isInkAvailable } from '#src/tui/loadInk.js';
|
|
10
11
|
/**
|
|
@@ -29,9 +30,16 @@ export function defaultModelIndex(models) {
|
|
|
29
30
|
const preferred = models.findIndex((m) => m.preferred);
|
|
30
31
|
return preferred >= 0 ? preferred : 0;
|
|
31
32
|
}
|
|
32
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Builds the `.gsloth.config.json` body for a chosen provider + model. Delegates to the shared
|
|
35
|
+
* {@link buildInitConfigContent} so the interactive first-run path stamps the same `$schema`
|
|
36
|
+
* pointer (GS2-1) as the per-provider template writers. Previously this local builder omitted
|
|
37
|
+
* `$schema`, so a config created through the first-run dialog got no editor autocomplete/validation.
|
|
38
|
+
* First-run always has an explicit model chosen, so it is written into the config (unlike a bare
|
|
39
|
+
* `init <provider>` template, which omits the model to track the curated fallback, CFG-14).
|
|
40
|
+
*/
|
|
33
41
|
export function buildConfigContent(providerId, model) {
|
|
34
|
-
return `${
|
|
42
|
+
return `${buildInitConfigContent(providerId, model)}\n`;
|
|
35
43
|
}
|
|
36
44
|
/** Resolves the config write path for the chosen scope (CFG-3 layering). */
|
|
37
45
|
export function resolveConfigWritePath(scope) {
|
|
@@ -77,7 +85,7 @@ async function promptMenu(ask, question, count, defaultIdx) {
|
|
|
77
85
|
}
|
|
78
86
|
function defaultWriteConfig(scope, content) {
|
|
79
87
|
const path = resolveConfigWritePath(scope);
|
|
80
|
-
|
|
88
|
+
writeFileWithMessages(path, content);
|
|
81
89
|
return path;
|
|
82
90
|
}
|
|
83
91
|
/**
|
|
@@ -129,7 +137,7 @@ function makeDefaultSelect(ask) {
|
|
|
129
137
|
* globally (CFG-3). Writes a minimal `{ llm: { type, model } }` config and, for
|
|
130
138
|
* the project scope, scaffolds the review/guidelines preamble.
|
|
131
139
|
*/
|
|
132
|
-
export async function runFirstRunDialog(overrides = {}) {
|
|
140
|
+
export async function runFirstRunDialog(overrides = {}, force = false) {
|
|
133
141
|
// The readline interface is created LAZILY, only when a readline prompt is actually needed
|
|
134
142
|
// (the non-TTY number-menu fallback, or free-text model entry). On the Ink-select path it is
|
|
135
143
|
// never created, so readline never binds stdin/raw-mode alongside Ink — two owners on the same
|
|
@@ -145,6 +153,8 @@ export async function runFirstRunDialog(overrides = {}) {
|
|
|
145
153
|
listModels,
|
|
146
154
|
ensureGslothDir,
|
|
147
155
|
writeProjectReviewPreamble,
|
|
156
|
+
resolveConfigPath: resolveConfigWritePath,
|
|
157
|
+
configExists: existsSync,
|
|
148
158
|
writeConfig: defaultWriteConfig,
|
|
149
159
|
ask,
|
|
150
160
|
select: makeDefaultSelect(ask),
|
|
@@ -186,7 +196,18 @@ export async function runFirstRunDialog(overrides = {}) {
|
|
|
186
196
|
const scope = (await deps.select('Where should this configuration be stored?', ['This project only (.gsloth/.gsloth-settings/)', 'Globally for all projects (~/.gsloth/)'], 0)) === 1
|
|
187
197
|
? 'global'
|
|
188
198
|
: 'project';
|
|
189
|
-
// 4.
|
|
199
|
+
// 4. Overwrite guard. If a config already exists at the chosen scope's path and the user did
|
|
200
|
+
// not pass --force, ask whether to overwrite (default No). On No we keep the existing file
|
|
201
|
+
// and print an honest line — never the misleading "Configured / Config written" on a skip.
|
|
202
|
+
const configPath = deps.resolveConfigPath(scope);
|
|
203
|
+
if (deps.configExists(configPath) && !force) {
|
|
204
|
+
const overwrite = (await deps.select(`A config already exists at ${configPath}. Overwrite it?`, ['No, keep the existing config', 'Yes, overwrite it'], 0)) === 1;
|
|
205
|
+
if (!overwrite) {
|
|
206
|
+
displayInfo(`Kept existing config at ${configPath} (not modified).`);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// 5. Scaffold (project only) + write.
|
|
190
211
|
if (scope === 'project') {
|
|
191
212
|
deps.ensureGslothDir();
|
|
192
213
|
deps.writeProjectReviewPreamble();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firstRunDialog.js","sourceRoot":"","sources":["../../src/commands/firstRunDialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EACL,eAAe,EACf,UAAU,GAIX,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,8CAA8C,CAAC;AAC9F,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,eAAe,EACf,GAAG,EACH,KAAK,EACL,MAAM,GAEP,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,
|
|
1
|
+
{"version":3,"file":"firstRunDialog.js","sourceRoot":"","sources":["../../src/commands/firstRunDialog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* GS2-7 (B20) — the `gth history` command group over the local, opt-in session store.
|
|
4
|
+
*
|
|
5
|
+
* - `gth history search <query...>` — FTS5 full-text search across past sessions.
|
|
6
|
+
* - `gth history list` — the most recent sessions.
|
|
7
|
+
*
|
|
8
|
+
* Both are READ-ONLY and fail-soft: they open the store with `create: false`, so a missing DB
|
|
9
|
+
* (history never enabled) simply reports "no history yet" instead of materialising an empty file.
|
|
10
|
+
* The DB defaults to the global `~/.gsloth/history.db`; `--db <path>` overrides it. Local only —
|
|
11
|
+
* nothing here touches the network.
|
|
12
|
+
*/
|
|
13
|
+
export declare function historyCommand(program: Command): void;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { openHistoryStore, resolveHistoryDbPath } from '@gaunt-sloth/core/history/historyStore.js';
|
|
2
|
+
import { formatHistoryList, formatSearchResults } from '@gaunt-sloth/core/history/historyFormat.js';
|
|
3
|
+
import { display, displayInfo, displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
|
|
4
|
+
/**
|
|
5
|
+
* GS2-7 (B20) — the `gth history` command group over the local, opt-in session store.
|
|
6
|
+
*
|
|
7
|
+
* - `gth history search <query...>` — FTS5 full-text search across past sessions.
|
|
8
|
+
* - `gth history list` — the most recent sessions.
|
|
9
|
+
*
|
|
10
|
+
* Both are READ-ONLY and fail-soft: they open the store with `create: false`, so a missing DB
|
|
11
|
+
* (history never enabled) simply reports "no history yet" instead of materialising an empty file.
|
|
12
|
+
* The DB defaults to the global `~/.gsloth/history.db`; `--db <path>` overrides it. Local only —
|
|
13
|
+
* nothing here touches the network.
|
|
14
|
+
*/
|
|
15
|
+
export function historyCommand(program) {
|
|
16
|
+
const history = program
|
|
17
|
+
.command('history')
|
|
18
|
+
.description('Search and list locally-recorded session history (opt-in; local only)');
|
|
19
|
+
history
|
|
20
|
+
.command('search')
|
|
21
|
+
.description('Full-text search past sessions (SQLite FTS5)')
|
|
22
|
+
.argument('<query...>', 'search terms')
|
|
23
|
+
.option('--db <path>', 'path to the history DB (defaults to ~/.gsloth/history.db)')
|
|
24
|
+
.option('--limit <n>', 'maximum results', '20')
|
|
25
|
+
.action((queryParts, options) => {
|
|
26
|
+
const store = openHistoryStore(resolveHistoryDbPath(options.db), { create: false });
|
|
27
|
+
if (!store) {
|
|
28
|
+
displayWarning('No session history found. Enable it with `history.enabled: true` in your config.');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const limit = clampLimit(options.limit);
|
|
33
|
+
const results = store.search(queryParts.join(' '), limit);
|
|
34
|
+
displayInfo(`History search: "${queryParts.join(' ')}"`);
|
|
35
|
+
for (const line of formatSearchResults(results))
|
|
36
|
+
display(line);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
store.close();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
history
|
|
43
|
+
.command('list')
|
|
44
|
+
.description('List the most recent recorded sessions')
|
|
45
|
+
.option('--db <path>', 'path to the history DB (defaults to ~/.gsloth/history.db)')
|
|
46
|
+
.option('--limit <n>', 'maximum results', '20')
|
|
47
|
+
.action((options) => {
|
|
48
|
+
const store = openHistoryStore(resolveHistoryDbPath(options.db), { create: false });
|
|
49
|
+
if (!store) {
|
|
50
|
+
displayWarning('No session history found. Enable it with `history.enabled: true` in your config.');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const limit = clampLimit(options.limit);
|
|
55
|
+
const results = store.listRecent(limit);
|
|
56
|
+
displayInfo('Recent sessions:');
|
|
57
|
+
for (const line of formatHistoryList(results))
|
|
58
|
+
display(line);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
store.close();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/** Parse and bound a `--limit` option (1..500); falls back to 20 on a bad value. */
|
|
66
|
+
function clampLimit(raw) {
|
|
67
|
+
const n = Number.parseInt(raw ?? '', 10);
|
|
68
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
69
|
+
return 20;
|
|
70
|
+
return Math.min(n, 500);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=historyCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historyCommand.js","sourceRoot":"","sources":["../../src/commands/historyCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,9 @@ import { Command } from 'commander';
|
|
|
7
7
|
* detects usable providers, lets the user pick a provider + model and choose
|
|
8
8
|
* whether to store the config for this project or globally.
|
|
9
9
|
*
|
|
10
|
+
* `--force` overwrites an existing config: on the scriptable path it skips the
|
|
11
|
+
* warn-and-keep guard, and in the interactive dialog it skips the overwrite prompt.
|
|
12
|
+
*
|
|
10
13
|
* @param program - The commander program
|
|
11
14
|
*/
|
|
12
15
|
export declare function initCommand(program: Command): void;
|
|
@@ -10,6 +10,9 @@ import { Argument } from 'commander';
|
|
|
10
10
|
* detects usable providers, lets the user pick a provider + model and choose
|
|
11
11
|
* whether to store the config for this project or globally.
|
|
12
12
|
*
|
|
13
|
+
* `--force` overwrites an existing config: on the scriptable path it skips the
|
|
14
|
+
* warn-and-keep guard, and in the interactive dialog it skips the overwrite prompt.
|
|
15
|
+
*
|
|
13
16
|
* @param program - The commander program
|
|
14
17
|
*/
|
|
15
18
|
export function initCommand(program) {
|
|
@@ -17,12 +20,14 @@ export function initCommand(program) {
|
|
|
17
20
|
.command('init')
|
|
18
21
|
.description('Initialize Gaunt Sloth in your project. This will write necessary config files.')
|
|
19
22
|
.addArgument(new Argument('[type]', 'Config type (optional, runs the interactive dialog if omitted)').choices(availableDefaultConfigs))
|
|
20
|
-
.
|
|
23
|
+
.option('-f, --force', 'Overwrite an existing config file')
|
|
24
|
+
.action(async (config, options) => {
|
|
25
|
+
const force = !!options.force;
|
|
21
26
|
if (config) {
|
|
22
|
-
await createProjectConfig(config);
|
|
27
|
+
await createProjectConfig(config, force);
|
|
23
28
|
}
|
|
24
29
|
else {
|
|
25
|
-
await runFirstRunDialog();
|
|
30
|
+
await runFirstRunDialog({}, force);
|
|
26
31
|
}
|
|
27
32
|
});
|
|
28
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initCommand.js","sourceRoot":"","sources":["../../src/commands/initCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAW,MAAM,WAAW,CAAC;AAE9C
|
|
1
|
+
{"version":3,"file":"initCommand.js","sourceRoot":"","sources":["../../src/commands/initCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAW,MAAM,WAAW,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iFAAiF,CAAC;SAC9F,WAAW,CACV,IAAI,QAAQ,CACV,QAAQ,EACR,gEAAgE,CACjE,CAAC,OAAO,CAAC,uBAAuB,CAAC,CACnC;SACA,MAAM,CAAC,aAAa,EAAE,mCAAmC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,MAA8B,EAAE,OAA4B,EAAE,EAAE;QAC7E,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,MAAM,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* GS2-7 (B20) — `gth insights`: lightweight, LOCAL analytics over the opt-in session store
|
|
4
|
+
* (token/cost totals, a top-tool tally, and a per-command breakdown). Read-only and fail-soft:
|
|
5
|
+
* opens with `create: false`, so a missing DB just prints "no history yet" rather than creating
|
|
6
|
+
* one. Nothing leaves the machine. `--db <path>` overrides the default `~/.gsloth/history.db`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function insightsCommand(program: Command): void;
|