Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 75 additions & 36 deletions src/commands/search.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ export const search: Command = new CommanderCommand("search")
"Disable reranking of search results",
parseBooleanEnv(process.env.MGREP_RERANK, true), // `true` here means that reranking is enabled by default
)
.option("--json", "Output results in JSON format", false)
.argument("<pattern>", "The pattern to search for")
.argument("[path]", "The path to search in")
.allowUnknownOption(true)
Expand All @@ -157,6 +158,7 @@ export const search: Command = new CommanderCommand("search")
sync: boolean;
dryRun: boolean;
rerank: boolean;
json: boolean;
} = cmd.optsWithGlobals();
if (exec_path?.startsWith("--")) {
exec_path = "";
Expand Down Expand Up @@ -202,44 +204,81 @@ export const search: Command = new CommanderCommand("search")
? exec_path
: normalize(join(root, exec_path ?? ""));

let response: string;
if (!options.answer) {
const results = await store.search(
options.store,
pattern,
parseInt(options.maxCount, 10),
{ rerank: options.rerank },
{
all: [
{
key: "path",
operator: "starts_with",
value: search_path,
},
],
},
);
response = formatSearchResponse(results, options.content);
if (options.json) {
if (!options.answer) {
const results = await store.search(
options.store,
pattern,
parseInt(options.maxCount, 10),
{ rerank: options.rerank },
{
all: [
{
key: "path",
operator: "starts_with",
value: search_path,
},
],
},
);
console.log(JSON.stringify(results, null, 2));
} else {
const results = await store.ask(
options.store,
pattern,
parseInt(options.maxCount, 10),
{ rerank: options.rerank },
{
all: [
{
key: "path",
operator: "starts_with",
value: search_path,
},
],
},
);
console.log(JSON.stringify(results, null, 2));
}
} else {
const results = await store.ask(
options.store,
pattern,
parseInt(options.maxCount, 10),
{ rerank: options.rerank },
{
all: [
{
key: "path",
operator: "starts_with",
value: search_path,
},
],
},
);
response = formatAskResponse(results, options.content);
let response: string;
if (!options.answer) {
const results = await store.search(
options.store,
pattern,
parseInt(options.maxCount, 10),
{ rerank: options.rerank },
{
all: [
{
key: "path",
operator: "starts_with",
value: search_path,
},
],
},
);
response = formatSearchResponse(results, options.content);
} else {
const results = await store.ask(
options.store,
pattern,
parseInt(options.maxCount, 10),
{ rerank: options.rerank },
{
all: [
{
key: "path",
operator: "starts_with",
value: search_path,
},
],
},
);
response = formatAskResponse(results, options.content);
}
console.log(response);
}

console.log(response);
} catch (error) {
const message = error instanceof Error ? error.message : "Unknown error";
console.error("Failed to search:", message);
Expand Down
27 changes: 27 additions & 0 deletions test/test.bats
Original file line number Diff line number Diff line change
Expand Up @@ -298,3 +298,30 @@ teardown() {
assert_success
refute_output --partial 'test-2.txt'
}

@test "Search with json output" {
run mgrep search --json test

assert_success
assert_output --partial '"type": "text"'
assert_output --partial '"text":'
assert_output --partial '"metadata":'
}

@test "Search with json output and answer" {
run mgrep search --json --answer test

assert_success
assert_output --partial '"answer":'
assert_output --partial '"sources":'
assert_output --partial '"type": "text"'
}

@test "Search with json output and no results" {
run mgrep search --json "nonexistentstring12345"

assert_success
assert_output --partial '"data": []'
}