sverklo 0.2.12 → 0.2.14

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 (116) hide show
  1. package/README.md +102 -13
  2. package/dist/bin/sverklo.js +69 -1
  3. package/dist/bin/sverklo.js.map +1 -1
  4. package/dist/src/audit-prompt.d.ts +2 -0
  5. package/dist/src/audit-prompt.js +91 -0
  6. package/dist/src/audit-prompt.js.map +1 -0
  7. package/dist/src/doctor.js +55 -0
  8. package/dist/src/doctor.js.map +1 -1
  9. package/dist/src/indexer/embedding-providers.d.ts +34 -0
  10. package/dist/src/indexer/embedding-providers.js +215 -0
  11. package/dist/src/indexer/embedding-providers.js.map +1 -0
  12. package/dist/src/indexer/embedding-providers.test.d.ts +1 -0
  13. package/dist/src/indexer/embedding-providers.test.js +83 -0
  14. package/dist/src/indexer/embedding-providers.test.js.map +1 -0
  15. package/dist/src/indexer/indexer-freshness.test.d.ts +1 -0
  16. package/dist/src/indexer/indexer-freshness.test.js +109 -0
  17. package/dist/src/indexer/indexer-freshness.test.js.map +1 -0
  18. package/dist/src/indexer/indexer-provider-integration.test.d.ts +1 -0
  19. package/dist/src/indexer/indexer-provider-integration.test.js +142 -0
  20. package/dist/src/indexer/indexer-provider-integration.test.js.map +1 -0
  21. package/dist/src/indexer/indexer.d.ts +44 -0
  22. package/dist/src/indexer/indexer.js +153 -10
  23. package/dist/src/indexer/indexer.js.map +1 -1
  24. package/dist/src/indexer/migration.test.d.ts +1 -0
  25. package/dist/src/indexer/migration.test.js +144 -0
  26. package/dist/src/indexer/migration.test.js.map +1 -0
  27. package/dist/src/indexer/symbol-extractor.js +17 -5
  28. package/dist/src/indexer/symbol-extractor.js.map +1 -1
  29. package/dist/src/indexer/symbol-extractor.test.d.ts +1 -0
  30. package/dist/src/indexer/symbol-extractor.test.js +88 -0
  31. package/dist/src/indexer/symbol-extractor.test.js.map +1 -0
  32. package/dist/src/indexer/watcher.js +4 -0
  33. package/dist/src/indexer/watcher.js.map +1 -1
  34. package/dist/src/memory/journal.d.ts +62 -0
  35. package/dist/src/memory/journal.js +136 -0
  36. package/dist/src/memory/journal.js.map +1 -0
  37. package/dist/src/memory/journal.test.d.ts +1 -0
  38. package/dist/src/memory/journal.test.js +98 -0
  39. package/dist/src/memory/journal.test.js.map +1 -0
  40. package/dist/src/modes.d.ts +16 -0
  41. package/dist/src/modes.js +104 -0
  42. package/dist/src/modes.js.map +1 -0
  43. package/dist/src/modes.test.d.ts +1 -0
  44. package/dist/src/modes.test.js +48 -0
  45. package/dist/src/modes.test.js.map +1 -0
  46. package/dist/src/search/hybrid-search.d.ts +22 -0
  47. package/dist/src/search/hybrid-search.js +169 -7
  48. package/dist/src/search/hybrid-search.js.map +1 -1
  49. package/dist/src/search/hybrid-search.test.d.ts +1 -0
  50. package/dist/src/search/hybrid-search.test.js +112 -0
  51. package/dist/src/search/hybrid-search.test.js.map +1 -0
  52. package/dist/src/search/token-budget.d.ts +1 -0
  53. package/dist/src/search/token-budget.js +34 -6
  54. package/dist/src/search/token-budget.js.map +1 -1
  55. package/dist/src/server/mcp-server.js +32 -25
  56. package/dist/src/server/mcp-server.js.map +1 -1
  57. package/dist/src/server/tool-overrides.d.ts +16 -0
  58. package/dist/src/server/tool-overrides.js +102 -0
  59. package/dist/src/server/tool-overrides.js.map +1 -0
  60. package/dist/src/server/tool-overrides.test.d.ts +1 -0
  61. package/dist/src/server/tool-overrides.test.js +124 -0
  62. package/dist/src/server/tool-overrides.test.js.map +1 -0
  63. package/dist/src/server/tools/context-budget.test.d.ts +1 -0
  64. package/dist/src/server/tools/context-budget.test.js +150 -0
  65. package/dist/src/server/tools/context-budget.test.js.map +1 -0
  66. package/dist/src/server/tools/context.d.ts +11 -1
  67. package/dist/src/server/tools/context.js +202 -8
  68. package/dist/src/server/tools/context.js.map +1 -1
  69. package/dist/src/server/tools/diff-heuristics.d.ts +28 -0
  70. package/dist/src/server/tools/diff-heuristics.js +213 -0
  71. package/dist/src/server/tools/diff-heuristics.js.map +1 -0
  72. package/dist/src/server/tools/diff-heuristics.test.d.ts +1 -0
  73. package/dist/src/server/tools/diff-heuristics.test.js +151 -0
  74. package/dist/src/server/tools/diff-heuristics.test.js.map +1 -0
  75. package/dist/src/server/tools/find-references.d.ts +4 -0
  76. package/dist/src/server/tools/find-references.js +46 -6
  77. package/dist/src/server/tools/find-references.js.map +1 -1
  78. package/dist/src/server/tools/find-references.test.d.ts +1 -0
  79. package/dist/src/server/tools/find-references.test.js +98 -0
  80. package/dist/src/server/tools/find-references.test.js.map +1 -0
  81. package/dist/src/server/tools/forget.js +3 -0
  82. package/dist/src/server/tools/forget.js.map +1 -1
  83. package/dist/src/server/tools/index-status.js +16 -0
  84. package/dist/src/server/tools/index-status.js.map +1 -1
  85. package/dist/src/server/tools/lookup.js +21 -13
  86. package/dist/src/server/tools/lookup.js.map +1 -1
  87. package/dist/src/server/tools/lookup.test.d.ts +1 -0
  88. package/dist/src/server/tools/lookup.test.js +110 -0
  89. package/dist/src/server/tools/lookup.test.js.map +1 -0
  90. package/dist/src/server/tools/recall.d.ts +5 -1
  91. package/dist/src/server/tools/recall.js +68 -6
  92. package/dist/src/server/tools/recall.js.map +1 -1
  93. package/dist/src/server/tools/recall.test.d.ts +1 -0
  94. package/dist/src/server/tools/recall.test.js +116 -0
  95. package/dist/src/server/tools/recall.test.js.map +1 -0
  96. package/dist/src/server/tools/remember.js +16 -2
  97. package/dist/src/server/tools/remember.js.map +1 -1
  98. package/dist/src/server/tools/review-diff.js +31 -0
  99. package/dist/src/server/tools/review-diff.js.map +1 -1
  100. package/dist/src/server/tools/search.js +29 -4
  101. package/dist/src/server/tools/search.js.map +1 -1
  102. package/dist/src/server/tools/search.test.d.ts +1 -0
  103. package/dist/src/server/tools/search.test.js +118 -0
  104. package/dist/src/server/tools/search.test.js.map +1 -0
  105. package/dist/src/server/tools/tier.js +25 -1
  106. package/dist/src/server/tools/tier.js.map +1 -1
  107. package/dist/src/storage/chunk-store.d.ts +12 -0
  108. package/dist/src/storage/chunk-store.js +16 -0
  109. package/dist/src/storage/chunk-store.js.map +1 -1
  110. package/dist/src/storage/chunk-store.test.d.ts +1 -0
  111. package/dist/src/storage/chunk-store.test.js +69 -0
  112. package/dist/src/storage/chunk-store.test.js.map +1 -0
  113. package/dist/src/storage/database.d.ts +13 -0
  114. package/dist/src/storage/database.js +47 -0
  115. package/dist/src/storage/database.js.map +1 -1
  116. package/package.json +5 -2
@@ -0,0 +1,102 @@
1
+ // Runtime-overridable tool descriptions and enable/disable flags.
2
+ //
3
+ // Power users frequently want to repurpose sverklo tools without forking.
4
+ // The two levers exposed here are:
5
+ //
6
+ // 1. Description overrides via `SVERKLO_TOOL_<NAME>_DESCRIPTION`
7
+ // Override the description text the agent sees for any tool. Useful
8
+ // for re-scoping `sverklo_remember` into an architecture-decision log,
9
+ // or for adding project-specific guidance the model will follow.
10
+ //
11
+ // 2. Disable-list via `SVERKLO_DISABLED_TOOLS`
12
+ // Comma-separated list of tool names to hide from the `tools/list`
13
+ // response. Useful when a project doesn't want memory tools exposed,
14
+ // or when a user wants to shrink the tool surface for a specific
15
+ // agent that gets overwhelmed by 20 options.
16
+ //
17
+ // Design notes:
18
+ //
19
+ // - The env var is read once at process startup and cached. Restart the
20
+ // MCP server to pick up changes — this matches how agents already
21
+ // expect tool metadata to work (stable per session).
22
+ // - Description overrides are applied AFTER we copy the tool object, so
23
+ // the underlying tool definitions stay pristine and unit tests against
24
+ // them remain stable.
25
+ // - Name normalisation: SVERKLO_TOOL_SEARCH_DESCRIPTION and
26
+ // SVERKLO_TOOL_sverklo_search_DESCRIPTION both target `sverklo_search`.
27
+ // We strip the `sverklo_` prefix before matching, upper-case, and
28
+ // replace underscores with nothing. This keeps env var names short.
29
+ //
30
+ // Inspired by the Qdrant MCP server's `TOOL_*_DESCRIPTION` pattern.
31
+ let cache = null;
32
+ function normalizeEnvSuffix(name) {
33
+ // "sverklo_search" -> "SEARCH"
34
+ // "sverklo_review_diff" -> "REVIEW_DIFF"
35
+ // "search_code" (compat alias) -> "SEARCH_CODE"
36
+ const stripped = name.startsWith("sverklo_") ? name.slice("sverklo_".length) : name;
37
+ return stripped.toUpperCase();
38
+ }
39
+ function buildCache() {
40
+ const disabled = new Set();
41
+ const descriptions = new Map();
42
+ const disabledList = process.env.SVERKLO_DISABLED_TOOLS;
43
+ if (disabledList) {
44
+ for (const raw of disabledList.split(",")) {
45
+ const name = raw.trim();
46
+ if (name)
47
+ disabled.add(name);
48
+ }
49
+ }
50
+ // Description overrides. We scan process.env for any key starting with
51
+ // `SVERKLO_TOOL_` and ending in `_DESCRIPTION`. Everything between is the
52
+ // normalized tool-name suffix.
53
+ const prefix = "SVERKLO_TOOL_";
54
+ const suffix = "_DESCRIPTION";
55
+ for (const key of Object.keys(process.env)) {
56
+ if (!key.startsWith(prefix) || !key.endsWith(suffix))
57
+ continue;
58
+ const mid = key.slice(prefix.length, key.length - suffix.length);
59
+ if (!mid)
60
+ continue;
61
+ const value = process.env[key];
62
+ if (typeof value !== "string" || value.length === 0)
63
+ continue;
64
+ descriptions.set(mid, value);
65
+ }
66
+ return { disabled, descriptions };
67
+ }
68
+ function getCache() {
69
+ if (!cache)
70
+ cache = buildCache();
71
+ return cache;
72
+ }
73
+ /**
74
+ * Apply env-var overrides to a list of tool definitions. Returns a new
75
+ * array — never mutates the input. Tools whose names appear in
76
+ * `SVERKLO_DISABLED_TOOLS` are dropped entirely.
77
+ */
78
+ export function applyToolOverrides(tools) {
79
+ const { disabled, descriptions } = getCache();
80
+ const out = [];
81
+ for (const tool of tools) {
82
+ if (disabled.has(tool.name))
83
+ continue;
84
+ const suffix = normalizeEnvSuffix(tool.name);
85
+ const override = descriptions.get(suffix);
86
+ if (override) {
87
+ out.push({ ...tool, description: override });
88
+ }
89
+ else {
90
+ out.push(tool);
91
+ }
92
+ }
93
+ return out;
94
+ }
95
+ /**
96
+ * Test-only: reset the cached env-var parse so unit tests can flip
97
+ * env vars mid-run and see the change.
98
+ */
99
+ export function __resetToolOverrideCache() {
100
+ cache = null;
101
+ }
102
+ //# sourceMappingURL=tool-overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-overrides.js","sourceRoot":"","sources":["../../../src/server/tool-overrides.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,0EAA0E;AAC1E,mCAAmC;AACnC,EAAE;AACF,mEAAmE;AACnE,yEAAyE;AACzE,4EAA4E;AAC5E,sEAAsE;AACtE,EAAE;AACF,iDAAiD;AACjD,wEAAwE;AACxE,0EAA0E;AAC1E,sEAAsE;AACtE,kDAAkD;AAClD,EAAE;AACF,gBAAgB;AAChB,EAAE;AACF,0EAA0E;AAC1E,sEAAsE;AACtE,yDAAyD;AACzD,0EAA0E;AAC1E,2EAA2E;AAC3E,0BAA0B;AAC1B,8DAA8D;AAC9D,4EAA4E;AAC5E,sEAAsE;AACtE,wEAAwE;AACxE,EAAE;AACF,oEAAoE;AAapE,IAAI,KAAK,GAAyB,IAAI,CAAC;AAEvC,SAAS,kBAAkB,CAAC,IAAY;IACtC,+BAA+B;IAC/B,yCAAyC;IACzC,gDAAgD;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE/C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACxD,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,IAAI;gBAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,0EAA0E;IAC1E,+BAA+B;IAC/B,MAAM,MAAM,GAAG,eAAe,CAAC;IAC/B,MAAM,MAAM,GAAG,cAAc,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS;QAC/D,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAC9D,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,QAAQ;IACf,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,UAAU,EAAE,CAAC;IACjC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAqB,KAAU;IAC/D,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACtC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,KAAK,GAAG,IAAI,CAAC;AACf,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,124 @@
1
+ import { describe, it, expect, beforeEach } from "vitest";
2
+ import { applyToolOverrides, __resetToolOverrideCache } from "./tool-overrides.js";
3
+ // applyToolOverrides ships on every MCP session start and previously
4
+ // had zero test coverage. These tests lock in the env-var override +
5
+ // disable-list contract so a refactor can't silently change how tool
6
+ // visibility or descriptions are controlled.
7
+ const fixture = () => [
8
+ { name: "sverklo_search", description: "orig search", inputSchema: {} },
9
+ { name: "sverklo_refs", description: "orig refs", inputSchema: {} },
10
+ { name: "sverklo_forget", description: "orig forget", inputSchema: {} },
11
+ { name: "sverklo_remember", description: "orig remember", inputSchema: {} },
12
+ ];
13
+ describe("applyToolOverrides — description overrides", () => {
14
+ beforeEach(() => {
15
+ // Strip any SVERKLO_TOOL_* env vars from a previous test.
16
+ for (const key of Object.keys(process.env)) {
17
+ if (key.startsWith("SVERKLO_TOOL_") || key === "SVERKLO_DISABLED_TOOLS") {
18
+ delete process.env[key];
19
+ }
20
+ }
21
+ __resetToolOverrideCache();
22
+ });
23
+ it("returns tools unchanged when no env vars are set", () => {
24
+ const result = applyToolOverrides(fixture());
25
+ expect(result).toHaveLength(4);
26
+ expect(result.find((t) => t.name === "sverklo_search")?.description).toBe("orig search");
27
+ });
28
+ it("overrides a tool description via SVERKLO_TOOL_<NAME>_DESCRIPTION", () => {
29
+ process.env.SVERKLO_TOOL_SEARCH_DESCRIPTION = "use only for architecture decisions";
30
+ __resetToolOverrideCache();
31
+ const result = applyToolOverrides(fixture());
32
+ expect(result.find((t) => t.name === "sverklo_search")?.description).toBe("use only for architecture decisions");
33
+ // Other tools unchanged
34
+ expect(result.find((t) => t.name === "sverklo_refs")?.description).toBe("orig refs");
35
+ });
36
+ it("strips sverklo_ prefix when matching env var suffix", () => {
37
+ // Both SEARCH and REVIEW_DIFF-style names should work.
38
+ process.env.SVERKLO_TOOL_REMEMBER_DESCRIPTION = "project decision log only";
39
+ __resetToolOverrideCache();
40
+ const result = applyToolOverrides(fixture());
41
+ expect(result.find((t) => t.name === "sverklo_remember")?.description).toBe("project decision log only");
42
+ });
43
+ it("handles multi-word tool names (underscore-separated)", () => {
44
+ const tools = [
45
+ { name: "sverklo_review_diff", description: "orig", inputSchema: {} },
46
+ ];
47
+ process.env.SVERKLO_TOOL_REVIEW_DIFF_DESCRIPTION = "strict review";
48
+ __resetToolOverrideCache();
49
+ const result = applyToolOverrides(tools);
50
+ expect(result[0].description).toBe("strict review");
51
+ });
52
+ it("never mutates the input array or its objects", () => {
53
+ const input = fixture();
54
+ const inputRef = input[0];
55
+ const inputDescription = inputRef.description;
56
+ process.env.SVERKLO_TOOL_SEARCH_DESCRIPTION = "mutated";
57
+ __resetToolOverrideCache();
58
+ applyToolOverrides(input);
59
+ // Source object must be unchanged — overrides return fresh objects.
60
+ expect(inputRef.description).toBe(inputDescription);
61
+ });
62
+ it("ignores empty-string overrides (treats as unset)", () => {
63
+ process.env.SVERKLO_TOOL_SEARCH_DESCRIPTION = "";
64
+ __resetToolOverrideCache();
65
+ const result = applyToolOverrides(fixture());
66
+ expect(result.find((t) => t.name === "sverklo_search")?.description).toBe("orig search");
67
+ });
68
+ });
69
+ describe("applyToolOverrides — disable list", () => {
70
+ beforeEach(() => {
71
+ for (const key of Object.keys(process.env)) {
72
+ if (key.startsWith("SVERKLO_TOOL_") || key === "SVERKLO_DISABLED_TOOLS") {
73
+ delete process.env[key];
74
+ }
75
+ }
76
+ __resetToolOverrideCache();
77
+ });
78
+ it("hides a single tool named in SVERKLO_DISABLED_TOOLS", () => {
79
+ process.env.SVERKLO_DISABLED_TOOLS = "sverklo_forget";
80
+ __resetToolOverrideCache();
81
+ const result = applyToolOverrides(fixture());
82
+ expect(result.map((t) => t.name)).not.toContain("sverklo_forget");
83
+ expect(result).toHaveLength(3);
84
+ });
85
+ it("hides multiple comma-separated tools", () => {
86
+ process.env.SVERKLO_DISABLED_TOOLS = "sverklo_forget,sverklo_remember";
87
+ __resetToolOverrideCache();
88
+ const result = applyToolOverrides(fixture());
89
+ expect(result.map((t) => t.name)).toEqual(["sverklo_search", "sverklo_refs"]);
90
+ });
91
+ it("trims whitespace in the disabled list", () => {
92
+ process.env.SVERKLO_DISABLED_TOOLS = " sverklo_forget , sverklo_remember ";
93
+ __resetToolOverrideCache();
94
+ const result = applyToolOverrides(fixture());
95
+ expect(result).toHaveLength(2);
96
+ });
97
+ it("ignores unknown tool names in the disabled list (no-op)", () => {
98
+ process.env.SVERKLO_DISABLED_TOOLS = "sverklo_nonexistent,sverklo_search";
99
+ __resetToolOverrideCache();
100
+ const result = applyToolOverrides(fixture());
101
+ expect(result).toHaveLength(3);
102
+ expect(result.map((t) => t.name)).not.toContain("sverklo_search");
103
+ });
104
+ });
105
+ describe("applyToolOverrides — combined overrides", () => {
106
+ beforeEach(() => {
107
+ for (const key of Object.keys(process.env)) {
108
+ if (key.startsWith("SVERKLO_TOOL_") || key === "SVERKLO_DISABLED_TOOLS") {
109
+ delete process.env[key];
110
+ }
111
+ }
112
+ __resetToolOverrideCache();
113
+ });
114
+ it("applies description overrides and disable list together", () => {
115
+ process.env.SVERKLO_TOOL_SEARCH_DESCRIPTION = "custom";
116
+ process.env.SVERKLO_DISABLED_TOOLS = "sverklo_forget";
117
+ __resetToolOverrideCache();
118
+ const result = applyToolOverrides(fixture());
119
+ expect(result).toHaveLength(3);
120
+ expect(result.find((t) => t.name === "sverklo_search")?.description).toBe("custom");
121
+ expect(result.find((t) => t.name === "sverklo_forget")).toBeUndefined();
122
+ });
123
+ });
124
+ //# sourceMappingURL=tool-overrides.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-overrides.test.js","sourceRoot":"","sources":["../../../src/server/tool-overrides.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,150 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { Indexer } from "../../indexer/indexer.js";
6
+ import { getProjectConfig } from "../../utils/config.js";
7
+ import { handleContext } from "./context.js";
8
+ // Tests for the sverklo_context --budget N repo-map mode (issue #8).
9
+ // These lock in the deterministic-ordering contract (same index +
10
+ // same budget = same output), the budget clamping behavior, and the
11
+ // exclude filter. We build a tiny real project so the tests exercise
12
+ // the actual PageRank + chunk iteration, not a mock.
13
+ describe("handleContext (budget mode)", () => {
14
+ let tmpRoot;
15
+ let indexer;
16
+ beforeEach(async () => {
17
+ tmpRoot = mkdtempSync(join(tmpdir(), "sverklo-context-budget-"));
18
+ mkdirSync(join(tmpRoot, "src"), { recursive: true });
19
+ mkdirSync(join(tmpRoot, "test"), { recursive: true });
20
+ // Seed a few files with different sizes so PageRank has something
21
+ // to differentiate. The exact rankings don't matter — we only
22
+ // assert that output is stable and contains expected path markers.
23
+ writeFileSync(join(tmpRoot, "src", "core.ts"), [
24
+ "export function load() { return 1; }",
25
+ "export function save() { return 2; }",
26
+ "export function reset() { return 3; }",
27
+ ].join("\n"), "utf-8");
28
+ writeFileSync(join(tmpRoot, "src", "helpers.ts"), [
29
+ "import { load } from './core';",
30
+ "export function helper1() { return load(); }",
31
+ "export function helper2() { return load(); }",
32
+ ].join("\n"), "utf-8");
33
+ writeFileSync(join(tmpRoot, "test", "core.test.ts"), [
34
+ "export function runTests() { return 'all-green'; }",
35
+ "export function setupSuite() { return {}; }",
36
+ ].join("\n"), "utf-8");
37
+ const cfg = getProjectConfig(tmpRoot);
38
+ indexer = new Indexer(cfg);
39
+ await indexer.index();
40
+ });
41
+ afterEach(() => {
42
+ try {
43
+ indexer.close();
44
+ }
45
+ catch { }
46
+ try {
47
+ rmSync(tmpRoot, { recursive: true, force: true });
48
+ }
49
+ catch { }
50
+ });
51
+ it("returns a repo-map-shaped response when budget is set", async () => {
52
+ const out = await handleContext(indexer, { budget: 2000 });
53
+ expect(out).toContain("# Repo map");
54
+ expect(out).toContain("Budget: 2000 tokens");
55
+ expect(out).toContain("PageRank");
56
+ });
57
+ it("produces identical output for identical inputs (determinism contract)", async () => {
58
+ const a = await handleContext(indexer, { budget: 2000 });
59
+ const b = await handleContext(indexer, { budget: 2000 });
60
+ expect(a).toBe(b);
61
+ });
62
+ it("works without a task (pure PageRank ordering)", async () => {
63
+ const out = await handleContext(indexer, { budget: 2000 });
64
+ expect(out).not.toContain("centered on");
65
+ expect(out).toContain("PageRank");
66
+ });
67
+ it("accepts a task parameter and advertises the bias in the header", async () => {
68
+ const out = await handleContext(indexer, {
69
+ budget: 2000,
70
+ task: "understand loading logic",
71
+ });
72
+ expect(out).toContain("centered on: understand loading logic");
73
+ expect(out).toContain("task relevance");
74
+ });
75
+ it("respects the exclude filter", async () => {
76
+ const withTests = await handleContext(indexer, { budget: 4000, exclude: [] });
77
+ const withoutTests = await handleContext(indexer, {
78
+ budget: 4000,
79
+ exclude: ["test"],
80
+ });
81
+ // The test file should appear in the unfiltered version but not
82
+ // in the filtered one.
83
+ expect(withTests).toContain("core.test.ts");
84
+ expect(withoutTests).not.toContain("core.test.ts");
85
+ });
86
+ it("clamps budgets above the max and emits a warning line", async () => {
87
+ const out = await handleContext(indexer, { budget: 100_000 });
88
+ expect(out).toContain("clamped");
89
+ // The stated budget in the header should be the clamp ceiling,
90
+ // not the original request.
91
+ expect(out).toContain("32000");
92
+ });
93
+ it("rejects budgets below the minimum with a helpful message", async () => {
94
+ const out = await handleContext(indexer, { budget: 100 });
95
+ expect(out).toContain("Budget too small");
96
+ expect(out).toContain("Minimum");
97
+ });
98
+ it("scope filter restricts the map to matching paths", async () => {
99
+ const out = await handleContext(indexer, { budget: 2000, scope: "src/" });
100
+ expect(out).toContain("src/");
101
+ expect(out).not.toContain("test/core.test.ts");
102
+ });
103
+ it("reports a footer with rendered count and remaining-files hint", async () => {
104
+ const out = await handleContext(indexer, { budget: 2000 });
105
+ // "Rendered N of M files" footer is always present when the mode
106
+ // ran to completion.
107
+ expect(out).toMatch(/Rendered \d+ of \d+ files/);
108
+ });
109
+ it("falls back gracefully when task search fails internally", async () => {
110
+ // Even if search blows up, the map must still render in pure
111
+ // PageRank mode rather than returning an error. We can't easily
112
+ // force hybridSearch to throw here without monkey-patching, so
113
+ // we assert the contract indirectly: a task with zero meaningful
114
+ // matches should still produce a valid map.
115
+ const out = await handleContext(indexer, {
116
+ budget: 2000,
117
+ task: "zzzzz totally unrelated gibberish query",
118
+ });
119
+ expect(out).toContain("# Repo map");
120
+ expect(out).toMatch(/Rendered \d+ of \d+ files/);
121
+ });
122
+ });
123
+ // Separate suite: error / missing-task behavior when budget is NOT set.
124
+ describe("handleContext (non-budget mode)", () => {
125
+ let tmpRoot;
126
+ let indexer;
127
+ beforeEach(async () => {
128
+ tmpRoot = mkdtempSync(join(tmpdir(), "sverklo-context-nobudget-"));
129
+ mkdirSync(join(tmpRoot, "src"), { recursive: true });
130
+ writeFileSync(join(tmpRoot, "src", "a.ts"), "export const a = 1;\n", "utf-8");
131
+ const cfg = getProjectConfig(tmpRoot);
132
+ indexer = new Indexer(cfg);
133
+ await indexer.index();
134
+ });
135
+ afterEach(() => {
136
+ try {
137
+ indexer.close();
138
+ }
139
+ catch { }
140
+ try {
141
+ rmSync(tmpRoot, { recursive: true, force: true });
142
+ }
143
+ catch { }
144
+ });
145
+ it("still requires a task when budget is not set", async () => {
146
+ const out = await handleContext(indexer, {});
147
+ expect(out).toContain("required");
148
+ });
149
+ });
150
+ //# sourceMappingURL=context-budget.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-budget.test.js","sourceRoot":"","sources":["../../../../src/server/tools/context-budget.test.ts"],"names":[],"mappings":"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"}
@@ -18,8 +18,18 @@ export declare const contextTool: {
18
18
  type: string;
19
19
  description: string;
20
20
  };
21
+ budget: {
22
+ type: string;
23
+ description: string;
24
+ };
25
+ exclude: {
26
+ type: string;
27
+ items: {
28
+ type: string;
29
+ };
30
+ description: string;
31
+ };
21
32
  };
22
- required: string[];
23
33
  };
24
34
  };
25
35
  export declare function handleContext(indexer: Indexer, args: Record<string, unknown>): Promise<string>;