promptscout 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,6 +4,9 @@ A CLI tool that enriches your coding agent prompts with codebase context using a
4
4
 
5
5
  **Designed as a Claude Code plugin.** It hooks into your prompt submission flow and adds codebase context before Claude sees it.
6
6
 
7
+ <img width="1715" height="1230" alt="CleanShot 2026-02-13 at 02 49 39" src="https://github.com/user-attachments/assets/d37eba7d-8697-4a2a-b231-b4217b90692e" />
8
+
9
+
7
10
  ## Motivation
8
11
 
9
12
  When you ask a coding agent like Claude Code, Cursor, or Copilot to work on your codebase, the agent spends time and tokens discovering which files matter. It greps, reads, explores, all on your dime.
@@ -178,6 +181,70 @@ promptscout history show 42
178
181
  promptscout history clear
179
182
  ```
180
183
 
184
+ ## Templates
185
+
186
+ promptscout supports per-directory prompt templates. A template wraps your enriched prompt with custom instructions using the `<@prompt>` placeholder.
187
+
188
+ ### Example template
189
+
190
+ ```
191
+ You are an expert developer working on a React Native project.
192
+ Always prefer functional components and hooks.
193
+
194
+ <@prompt>
195
+
196
+ Follow the project's ESLint rules and use TypeScript strictly.
197
+ ```
198
+
199
+ When you run `promptscout "fix the navigation bug"`, the output becomes:
200
+
201
+ ```
202
+ You are an expert developer working on a React Native project.
203
+ Always prefer functional components and hooks.
204
+
205
+ fix the navigation bug
206
+
207
+ Context from codebase:
208
+ <file_finder query="navigation">
209
+ ...
210
+ </file_finder>
211
+
212
+ Follow the project's ESLint rules and use TypeScript strictly.
213
+ ```
214
+
215
+ ### Managing templates
216
+
217
+ ```bash
218
+ # Create or edit a template for the current directory (opens $EDITOR)
219
+ promptscout template edit
220
+
221
+ # Create or edit a template for a specific directory
222
+ promptscout template edit -d /path/to/project
223
+
224
+ # View the template for a directory
225
+ promptscout template show -d /path/to/project
226
+
227
+ # Delete a template
228
+ promptscout template delete -d /path/to/project
229
+
230
+ # List all templates
231
+ promptscout template list
232
+ ```
233
+
234
+ Templates are stored in the promptscout database (`~/.promptscout/promptscout.db`), not in your project files.
235
+
236
+ ### Directory resolution
237
+
238
+ Templates use nearest-ancestor matching. If you set a template for `/projects/monorepo`, it also applies when running from `/projects/monorepo/packages/api` or any subdirectory, unless that subdirectory has its own template.
239
+
240
+ ### Claude Code plugin
241
+
242
+ When the Claude Code plugin detects a template was used, it shows an indicator in the status message:
243
+
244
+ ```
245
+ promptscout: (template used) enriched context (+5 files) (+3 sections)
246
+ ```
247
+
181
248
  ## Examples
182
249
 
183
250
  ### Swift project (macOS audio capture tool)
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ import type { TemplateService } from "../core/template-service.js";
3
+ export declare function registerTemplateCommand(program: Command, templateService: TemplateService): void;
@@ -0,0 +1,62 @@
1
+ export function registerTemplateCommand(program, templateService) {
2
+ const tmpl = program
3
+ .command("template")
4
+ .description("Manage per-directory prompt templates");
5
+ // promptscout template edit [-d <dir>]
6
+ tmpl
7
+ .command("edit")
8
+ .option("-d, --dir <dir>", "Target directory", process.cwd())
9
+ .action((opts) => {
10
+ const dir = opts.dir;
11
+ const saved = templateService.edit(dir);
12
+ if (saved) {
13
+ console.log(`Template saved for ${dir}`);
14
+ }
15
+ else {
16
+ console.log("Template not saved (empty content).");
17
+ }
18
+ });
19
+ // promptscout template show [-d <dir>]
20
+ tmpl
21
+ .command("show")
22
+ .option("-d, --dir <dir>", "Target directory", process.cwd())
23
+ .action((opts) => {
24
+ const dir = opts.dir;
25
+ const content = templateService.get(dir);
26
+ if (content) {
27
+ console.log(content);
28
+ }
29
+ else {
30
+ console.log(`No template found for ${dir}`);
31
+ }
32
+ });
33
+ // promptscout template delete [-d <dir>]
34
+ tmpl
35
+ .command("delete")
36
+ .option("-d, --dir <dir>", "Target directory", process.cwd())
37
+ .action((opts) => {
38
+ const dir = opts.dir;
39
+ const deleted = templateService.delete(dir);
40
+ if (deleted) {
41
+ console.log(`Template deleted for ${dir}`);
42
+ }
43
+ else {
44
+ console.log(`No template found for ${dir}`);
45
+ }
46
+ });
47
+ // promptscout template list
48
+ tmpl
49
+ .command("list")
50
+ .action(() => {
51
+ const entries = templateService.list();
52
+ if (entries.length === 0) {
53
+ console.log("No templates defined.");
54
+ return;
55
+ }
56
+ for (const entry of entries) {
57
+ const preview = entry.content.split("\n")[0]?.slice(0, 60) ?? "";
58
+ console.log(` ${entry.directory} ${preview}...`);
59
+ }
60
+ });
61
+ }
62
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/commands/templates.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,uBAAuB,CACrC,OAAgB,EAChB,eAAgC;IAEhC,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,uCAAuC,CAAC,CAAC;IAExD,uCAAuC;IACvC,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC5D,MAAM,CAAC,CAAC,IAA6B,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;QAC/B,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,uCAAuC;IACvC,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC5D,MAAM,CAAC,CAAC,IAA6B,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;QAC/B,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,yCAAyC;IACzC,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC5D,MAAM,CAAC,CAAC,IAA6B,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;QAC/B,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,4BAA4B;IAC5B,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,10 +1,12 @@
1
1
  import type { ProcessOptions } from "../types.js";
2
2
  import type { HistoryRepo } from "../storage/history-repo.js";
3
3
  import type { Rewriter } from "./rewriter.js";
4
+ import type { TemplateService } from "./template-service.js";
4
5
  export declare class Orchestrator {
5
6
  private historyRepo;
6
7
  private rewriter;
7
- constructor(historyRepo: HistoryRepo, rewriter: Rewriter);
8
+ private templateService;
9
+ constructor(historyRepo: HistoryRepo, rewriter: Rewriter, templateService: TemplateService);
8
10
  processPrompt(options: ProcessOptions): Promise<{
9
11
  improved: string;
10
12
  }>;
@@ -4,21 +4,25 @@ import ora from "ora";
4
4
  export class Orchestrator {
5
5
  historyRepo;
6
6
  rewriter;
7
- constructor(historyRepo, rewriter) {
7
+ templateService;
8
+ constructor(historyRepo, rewriter, templateService) {
8
9
  this.historyRepo = historyRepo;
9
10
  this.rewriter = rewriter;
11
+ this.templateService = templateService;
10
12
  }
11
13
  async processPrompt(options) {
12
14
  const { rawPrompt, dryRun, outputFile, jsonOutput, noClipboard, projectDir, } = options;
15
+ const searchDir = projectDir ?? process.cwd();
16
+ const template = this.templateService.resolve(searchDir);
13
17
  const spinner = jsonOutput ? null : ora().start();
14
18
  const onStatus = spinner
15
19
  ? (message) => { spinner.text = message; }
16
20
  : undefined;
17
- const improved = await this.rewriter.rewrite(rawPrompt, projectDir, onStatus);
21
+ const { text: improved, templateUsed } = await this.rewriter.rewrite(rawPrompt, projectDir, onStatus, template);
18
22
  spinner?.stop();
19
23
  console.log("");
20
24
  if (jsonOutput) {
21
- console.log(JSON.stringify({ improved }));
25
+ console.log(JSON.stringify({ improved, templateUsed }));
22
26
  }
23
27
  else {
24
28
  console.log(improved);
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,OAAO,YAAY;IAEb;IACA;IAFV,YACU,WAAwB,EACxB,QAAkB;QADlB,gBAAW,GAAX,WAAW,CAAa;QACxB,aAAQ,GAAR,QAAQ,CAAU;IACzB,CAAC;IAEJ,KAAK,CAAC,aAAa,CAAC,OAAuB;QAGzC,MAAM,EACJ,SAAS,EACT,MAAM,EACN,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,GACX,GAAG,OAAO,CAAC;QAEZ,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO;YACtB,CAAC,CAAC,CAAC,OAAe,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAE9E,OAAO,EAAE,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtB,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACtB,SAAS,EAAE,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE;YACtC,SAAS,EAAE,SAAS;YACpB,eAAe,EAAE,QAAQ;YACzB,YAAY,EAAE,QAAQ;YACtB,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;SACxC,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;CACF"}
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,OAAO,YAAY;IAEb;IACA;IACA;IAHV,YACU,WAAwB,EACxB,QAAkB,EAClB,eAAgC;QAFhC,gBAAW,GAAX,WAAW,CAAa;QACxB,aAAQ,GAAR,QAAQ,CAAU;QAClB,oBAAe,GAAf,eAAe,CAAiB;IACvC,CAAC;IAEJ,KAAK,CAAC,aAAa,CAAC,OAAuB;QAGzC,MAAM,EACJ,SAAS,EACT,MAAM,EACN,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,GACX,GAAG,OAAO,CAAC;QAEZ,MAAM,SAAS,GAAG,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO;YACtB,CAAC,CAAC,CAAC,OAAe,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEhH,OAAO,EAAE,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtB,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACtB,SAAS,EAAE,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE;YACtC,SAAS,EAAE,SAAS;YACpB,eAAe,EAAE,QAAQ;YACzB,YAAY,EAAE,QAAQ;YACtB,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;SACxC,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;CACF"}
@@ -3,5 +3,8 @@ export declare class Rewriter {
3
3
  private configRepo;
4
4
  constructor(configRepo: ConfigRepo);
5
5
  getModelUri(): string;
6
- rewrite(rawPrompt: string, projectDir?: string, onStatus?: (message: string) => void): Promise<string>;
6
+ rewrite(rawPrompt: string, projectDir?: string, onStatus?: (message: string) => void, template?: string): Promise<{
7
+ text: string;
8
+ templateUsed: boolean;
9
+ }>;
7
10
  }
@@ -30,7 +30,7 @@ export class Rewriter {
30
30
  getModelUri() {
31
31
  return this.configRepo.getModelHfUri();
32
32
  }
33
- async rewrite(rawPrompt, projectDir, onStatus) {
33
+ async rewrite(rawPrompt, projectDir, onStatus, template) {
34
34
  const hfUri = this.configRepo.getModelHfUri();
35
35
  const contextSize = this.configRepo.getModelContextSize();
36
36
  const searchDir = projectDir ?? process.cwd();
@@ -39,8 +39,11 @@ export class Rewriter {
39
39
  const systemPrompt = buildToolCallingPrompt(tree);
40
40
  const raw = await generate(systemPrompt, rawPrompt, hfUri, contextSize, TOOL_CALLING_PARAMS);
41
41
  const calls = parseToolCalls(raw);
42
- if (calls.length === 0)
43
- return rawPrompt;
42
+ if (calls.length === 0) {
43
+ if (template)
44
+ return { text: template.replace("<@prompt>", rawPrompt), templateUsed: true };
45
+ return { text: rawPrompt, templateUsed: false };
46
+ }
44
47
  onStatus?.(`Running ${calls.length} tool calls`);
45
48
  const settled = await Promise.all(calls.map(async (call) => {
46
49
  const result = await executeToolCall(call, searchDir);
@@ -49,13 +52,20 @@ export class Rewriter {
49
52
  return formatToolResult(call, result);
50
53
  }));
51
54
  const results = settled.filter((r) => r !== null);
52
- if (results.length === 0)
53
- return rawPrompt;
55
+ if (results.length === 0) {
56
+ if (template)
57
+ return { text: template.replace("<@prompt>", rawPrompt), templateUsed: true };
58
+ return { text: rawPrompt, templateUsed: false };
59
+ }
54
60
  const outputs = [];
55
61
  outputs.push(rawPrompt);
56
62
  outputs.push("Context from codebase:");
57
63
  outputs.push(results.join("\n\n"));
58
- return outputs.join("\n\n");
64
+ const assembled = outputs.join("\n\n");
65
+ if (template) {
66
+ return { text: template.replace("<@prompt>", assembled), templateUsed: true };
67
+ }
68
+ return { text: assembled, templateUsed: false };
59
69
  }
60
70
  }
61
71
  //# sourceMappingURL=rewriter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rewriter.js","sourceRoot":"","sources":["../../src/core/rewriter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rewriter.js","sourceRoot":"","sources":["../../src/core/rewriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { TemplateRepo } from "../storage/template-repo.js";
2
+ export declare class TemplateService {
3
+ private templateRepo;
4
+ constructor(templateRepo: TemplateRepo);
5
+ edit(directory: string): boolean;
6
+ delete(directory: string): boolean;
7
+ get(directory: string): string | undefined;
8
+ list(): {
9
+ directory: string;
10
+ content: string;
11
+ }[];
12
+ resolve(directory: string): string | undefined;
13
+ apply(template: string, content: string): string;
14
+ }
@@ -0,0 +1,57 @@
1
+ import { resolve, dirname, join } from "node:path";
2
+ import { writeFileSync, readFileSync, unlinkSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { execFileSync } from "node:child_process";
5
+ const PLACEHOLDER = "<@prompt>";
6
+ export class TemplateService {
7
+ templateRepo;
8
+ constructor(templateRepo) {
9
+ this.templateRepo = templateRepo;
10
+ }
11
+ edit(directory) {
12
+ const absDir = resolve(directory);
13
+ const existing = this.templateRepo.get(absDir);
14
+ const editor = process.env.EDITOR || process.env.VISUAL || "vi";
15
+ const tmpFile = join(tmpdir(), `promptscout-template-${Date.now()}.txt`);
16
+ writeFileSync(tmpFile, existing?.content ?? `\n${PLACEHOLDER}\n\n`, "utf-8");
17
+ try {
18
+ execFileSync(editor, [tmpFile], { stdio: "inherit" });
19
+ }
20
+ catch {
21
+ unlinkSync(tmpFile);
22
+ return false;
23
+ }
24
+ const content = readFileSync(tmpFile, "utf-8");
25
+ unlinkSync(tmpFile);
26
+ if (!content.trim())
27
+ return false;
28
+ this.templateRepo.upsert(absDir, content);
29
+ return true;
30
+ }
31
+ delete(directory) {
32
+ return this.templateRepo.delete(resolve(directory));
33
+ }
34
+ get(directory) {
35
+ return this.templateRepo.get(resolve(directory))?.content;
36
+ }
37
+ list() {
38
+ return this.templateRepo.list();
39
+ }
40
+ resolve(directory) {
41
+ let current = resolve(directory);
42
+ const root = resolve("/");
43
+ while (true) {
44
+ const entry = this.templateRepo.get(current);
45
+ if (entry)
46
+ return entry.content;
47
+ if (current === root)
48
+ break;
49
+ current = dirname(current);
50
+ }
51
+ return undefined;
52
+ }
53
+ apply(template, content) {
54
+ return template.replace(PLACEHOLDER, content);
55
+ }
56
+ }
57
+ //# sourceMappingURL=template-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-service.js","sourceRoot":"","sources":["../../src/core/template-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,GAAG,WAAW,CAAC;AAEhC,MAAM,OAAO,eAAe;IACN;IAApB,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAElD,IAAI,CAAC,SAAiB;QACpB,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,wBAAwB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEzE,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,KAAK,WAAW,MAAM,EAAE,OAAO,CAAC,CAAC;QAE7E,IAAI,CAAC;YACH,YAAY,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,UAAU,CAAC,OAAO,CAAC,CAAC;QAEpB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC;QAElC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC;IAC5D,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,CAAC,SAAiB;QACvB,IAAI,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC,OAAO,CAAC;YAChC,IAAI,OAAO,KAAK,IAAI;gBAAE,MAAM;YAC5B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,QAAgB,EAAE,OAAe;QACrC,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;CACF"}
package/dist/index.js CHANGED
@@ -12,6 +12,9 @@ import { HistoryService } from "./core/history-service.js";
12
12
  import { registerSetupCommand } from "./commands/setup.js";
13
13
  import { registerRewriteCommand } from "./commands/rewrite.js";
14
14
  import { registerHistoryCommand } from "./commands/history.js";
15
+ import { TemplateRepo } from "./storage/template-repo.js";
16
+ import { TemplateService } from "./core/template-service.js";
17
+ import { registerTemplateCommand } from "./commands/templates.js";
15
18
  const __dirname = dirname(fileURLToPath(import.meta.url));
16
19
  const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
17
20
  const program = new Command();
@@ -24,14 +27,17 @@ const db = getDrizzle();
24
27
  // 2. Repositories
25
28
  const historyRepo = new HistoryRepo(db);
26
29
  const configRepo = new ConfigRepo(db);
30
+ const templateRepo = new TemplateRepo(db);
27
31
  // 3. Services
28
32
  const rewriter = new Rewriter(configRepo);
29
- const orchestrator = new Orchestrator(historyRepo, rewriter);
33
+ const templateService = new TemplateService(templateRepo);
34
+ const orchestrator = new Orchestrator(historyRepo, rewriter, templateService);
30
35
  const historyService = new HistoryService(historyRepo);
31
36
  // 4. Commands
32
37
  registerSetupCommand(program);
33
38
  registerRewriteCommand(program, orchestrator);
34
39
  registerHistoryCommand(program, historyService);
40
+ registerTemplateCommand(program, templateService);
35
41
  async function main() {
36
42
  try {
37
43
  await program.parseAsync(process.argv);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAErF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,cAAc;AACd,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;AAExB,kBAAkB;AAClB,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;AACxC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;AAEtC,cAAc;AACd,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC1C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC7D,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;AAEvD,cAAc;AACd,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC9C,sBAAsB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAEhD,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,18 @@ function migrate(database) {
30
30
  PRAGMA user_version = 2;
31
31
  `);
32
32
  }
33
+ if (version < 3) {
34
+ database.exec(`
35
+ CREATE TABLE IF NOT EXISTS templates (
36
+ directory TEXT PRIMARY KEY,
37
+ content TEXT NOT NULL,
38
+ created_at TEXT DEFAULT (datetime('now')),
39
+ updated_at TEXT DEFAULT (datetime('now'))
40
+ );
41
+
42
+ PRAGMA user_version = 3;
43
+ `);
44
+ }
33
45
  }
34
46
  export function getDatabase() {
35
47
  if (db)
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,IAAI,EAAE,GAA6B,IAAI,CAAC;AACxC,IAAI,SAAS,GAAiC,IAAI,CAAC;AAEnD,SAAS,OAAO,CAAC,QAA2B;IAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAW,CAAC;IAE5E,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;KAgBb,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC;;;KAGb,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,SAAS,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,IAAI,EAAE,GAA6B,IAAI,CAAC;AACxC,IAAI,SAAS,GAAiC,IAAI,CAAC;AAEnD,SAAS,OAAO,CAAC,QAA2B;IAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAW,CAAC;IAE5E,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;KAgBb,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC;;;KAGb,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;KASb,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,SAAS,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -181,3 +181,86 @@ export declare const config: import("drizzle-orm/sqlite-core").SQLiteTableWithCo
181
181
  };
182
182
  dialect: "sqlite";
183
183
  }>;
184
+ export declare const templates: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
185
+ name: "templates";
186
+ schema: undefined;
187
+ columns: {
188
+ directory: import("drizzle-orm/sqlite-core").SQLiteColumn<{
189
+ name: "directory";
190
+ tableName: "templates";
191
+ dataType: "string";
192
+ columnType: "SQLiteText";
193
+ data: string;
194
+ driverParam: string;
195
+ notNull: true;
196
+ hasDefault: false;
197
+ isPrimaryKey: true;
198
+ isAutoincrement: false;
199
+ hasRuntimeDefault: false;
200
+ enumValues: [string, ...string[]];
201
+ baseColumn: never;
202
+ identity: undefined;
203
+ generated: undefined;
204
+ }, {}, {
205
+ length: number | undefined;
206
+ }>;
207
+ content: import("drizzle-orm/sqlite-core").SQLiteColumn<{
208
+ name: "content";
209
+ tableName: "templates";
210
+ dataType: "string";
211
+ columnType: "SQLiteText";
212
+ data: string;
213
+ driverParam: string;
214
+ notNull: true;
215
+ hasDefault: false;
216
+ isPrimaryKey: false;
217
+ isAutoincrement: false;
218
+ hasRuntimeDefault: false;
219
+ enumValues: [string, ...string[]];
220
+ baseColumn: never;
221
+ identity: undefined;
222
+ generated: undefined;
223
+ }, {}, {
224
+ length: number | undefined;
225
+ }>;
226
+ created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
227
+ name: "created_at";
228
+ tableName: "templates";
229
+ dataType: "string";
230
+ columnType: "SQLiteText";
231
+ data: string;
232
+ driverParam: string;
233
+ notNull: false;
234
+ hasDefault: true;
235
+ isPrimaryKey: false;
236
+ isAutoincrement: false;
237
+ hasRuntimeDefault: false;
238
+ enumValues: [string, ...string[]];
239
+ baseColumn: never;
240
+ identity: undefined;
241
+ generated: undefined;
242
+ }, {}, {
243
+ length: number | undefined;
244
+ }>;
245
+ updated_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
246
+ name: "updated_at";
247
+ tableName: "templates";
248
+ dataType: "string";
249
+ columnType: "SQLiteText";
250
+ data: string;
251
+ driverParam: string;
252
+ notNull: false;
253
+ hasDefault: true;
254
+ isPrimaryKey: false;
255
+ isAutoincrement: false;
256
+ hasRuntimeDefault: false;
257
+ enumValues: [string, ...string[]];
258
+ baseColumn: never;
259
+ identity: undefined;
260
+ generated: undefined;
261
+ }, {}, {
262
+ length: number | undefined;
263
+ }>;
264
+ };
265
+ dialect: "sqlite";
266
+ }>;
@@ -13,4 +13,10 @@ export const config = sqliteTable("config", {
13
13
  key: text("key").primaryKey(),
14
14
  value: text("value").notNull(),
15
15
  });
16
+ export const templates = sqliteTable("templates", {
17
+ directory: text("directory").primaryKey(),
18
+ content: text("content").notNull(),
19
+ created_at: text("created_at").default(sql `(datetime('now'))`),
20
+ updated_at: text("updated_at").default(sql `(datetime('now'))`),
21
+ });
16
22
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE;IAC5C,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACrD,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;IACtC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;IACtC,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE;IAClD,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;IAC5C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC;IAC9B,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,CAAA,mBAAmB,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE;IAC1C,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE;IAC7B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;CAC/B,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE;IAC5C,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACrD,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;IACtC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;IACtC,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE;IAClD,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;IAC5C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC;IAC9B,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,CAAA,mBAAmB,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE;IAC1C,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE;IAC7B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;CAC/B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE;IAChD,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE;IACzC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IAClC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,CAAA,mBAAmB,CAAC;IAC9D,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,CAAA,mBAAmB,CAAC;CAC/D,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
2
+ export declare class TemplateRepo {
3
+ private db;
4
+ constructor(db: BetterSQLite3Database);
5
+ get(directory: string): {
6
+ directory: string;
7
+ content: string;
8
+ } | undefined;
9
+ upsert(directory: string, content: string): void;
10
+ delete(directory: string): boolean;
11
+ list(): {
12
+ directory: string;
13
+ content: string;
14
+ }[];
15
+ }
@@ -0,0 +1,36 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { templates } from "./schema.js";
3
+ export class TemplateRepo {
4
+ db;
5
+ constructor(db) {
6
+ this.db = db;
7
+ }
8
+ get(directory) {
9
+ return this.db
10
+ .select()
11
+ .from(templates)
12
+ .where(eq(templates.directory, directory))
13
+ .get();
14
+ }
15
+ upsert(directory, content) {
16
+ this.db
17
+ .insert(templates)
18
+ .values({ directory, content })
19
+ .onConflictDoUpdate({
20
+ target: templates.directory,
21
+ set: { content, updated_at: new Date().toISOString() },
22
+ })
23
+ .run();
24
+ }
25
+ delete(directory) {
26
+ const result = this.db
27
+ .delete(templates)
28
+ .where(eq(templates.directory, directory))
29
+ .run();
30
+ return result.changes > 0;
31
+ }
32
+ list() {
33
+ return this.db.select().from(templates).all();
34
+ }
35
+ }
36
+ //# sourceMappingURL=template-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-repo.js","sourceRoot":"","sources":["../../src/storage/template-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,OAAO,YAAY;IACH;IAApB,YAAoB,EAAyB;QAAzB,OAAE,GAAF,EAAE,CAAuB;IAAG,CAAC;IAEjD,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,EAAE;aACX,MAAM,EAAE;aACR,IAAI,CAAC,SAAS,CAAC;aACf,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aACzC,GAAG,EAAE,CAAC;IACX,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,OAAe;QACvC,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,SAAS,CAAC;aACjB,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;aAC9B,kBAAkB,CAAC;YAClB,MAAM,EAAE,SAAS,CAAC,SAAS;YAC3B,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;SACvD,CAAC;aACD,GAAG,EAAE,CAAC;IACX,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,MAAM,CAAC,SAAS,CAAC;aACjB,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aACzC,GAAG,EAAE,CAAC;QACT,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;IAChD,CAAC;CACF"}
@@ -2,6 +2,7 @@ import { escapeRegex, stripDirPrefix, rgSync, gitSync, } from "./search-utils.js
2
2
  const MAX_FILES = 10;
3
3
  const MAX_LINES = 20;
4
4
  const MAX_COMMITS = 10;
5
+ const MD_PENALTY = 0.5;
5
6
  // Multi-language definition patterns:
6
7
  // JS/TS: export, function, class, interface, type, const, enum
7
8
  // Python: def, class, async def
@@ -20,6 +21,8 @@ function scoreFilePath(filePath, lowerQuery) {
20
21
  score += 3;
21
22
  else if (lower.includes(lowerQuery))
22
23
  score += 1;
24
+ if (basename.endsWith(".md"))
25
+ score *= MD_PENALTY;
23
26
  return score;
24
27
  }
25
28
  export function fileFinder(query, dir) {
@@ -53,24 +56,32 @@ export function definitionFinder(query, dir) {
53
56
  if (!output)
54
57
  return "No definitions found.";
55
58
  const lowerQuery = query.toLowerCase();
56
- const filtered = output
59
+ const scored = output
57
60
  .split("\n")
58
61
  .filter(Boolean)
59
62
  .filter((line) => line.toLowerCase().includes(lowerQuery))
63
+ .map((l) => ({ line: stripDirPrefix(l, dir), score: scoreFilePath(l, lowerQuery) }))
64
+ .sort((a, b) => b.score - a.score)
60
65
  .slice(0, MAX_LINES);
61
- if (filtered.length === 0)
66
+ if (scored.length === 0)
62
67
  return "No matching definitions found.";
63
- return filtered.map((l) => stripDirPrefix(l, dir)).join("\n");
68
+ return scored.map((s) => s.line).join("\n");
64
69
  }
65
70
  export function importTracer(query, dir) {
66
71
  const escaped = escapeRegex(query);
67
72
  const output = rgSync(["-n", `(import|from|require|include|use).*${escaped}`], dir);
68
73
  if (!output)
69
74
  return "No matching imports found.";
70
- const lines = output.split("\n").filter(Boolean).slice(0, MAX_LINES);
71
- if (lines.length === 0)
75
+ const lowerQuery = query.toLowerCase();
76
+ const scored = output
77
+ .split("\n")
78
+ .filter(Boolean)
79
+ .map((l) => ({ line: stripDirPrefix(l, dir), score: scoreFilePath(l, lowerQuery) }))
80
+ .sort((a, b) => b.score - a.score)
81
+ .slice(0, MAX_LINES);
82
+ if (scored.length === 0)
72
83
  return "No matching imports found.";
73
- return lines.map((l) => stripDirPrefix(l, dir)).join("\n");
84
+ return scored.map((s) => s.line).join("\n");
74
85
  }
75
86
  export function gitHistory(query, dir) {
76
87
  const output = gitSync(["log", "--format=>> %h %s", "--name-only", "-n", String(MAX_COMMITS), "-S", query], dir);
@@ -1 +1 @@
1
- {"version":3,"file":"implementations.js","sourceRoot":"","sources":["../../src/tools/implementations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"implementations.js","sourceRoot":"","sources":["../../src/tools/implementations.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -11,6 +11,12 @@ export interface ConfigEntry {
11
11
  key: string;
12
12
  value: string;
13
13
  }
14
+ export interface TemplateEntry {
15
+ directory: string;
16
+ content: string;
17
+ created_at: string;
18
+ updated_at: string;
19
+ }
14
20
  export interface InferenceParams {
15
21
  temperature: number;
16
22
  topP: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "promptscout",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "Enrich coding agent prompts with codebase context using a local LLM",
5
5
  "type": "module",
6
6
  "bin": {