@shiftleftpt/sbd-toe-mcp 0.1.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/.env.example +35 -0
- package/LICENSE +201 -0
- package/README.md +323 -0
- package/data/publish/algolia_docs_records.json +148847 -0
- package/data/publish/algolia_docs_records_enriched.json +194004 -0
- package/data/publish/algolia_entities_records.json +74715 -0
- package/data/publish/algolia_entities_records_enriched.json +177587 -0
- package/data/publish/algolia_index_settings.json +102 -0
- package/data/publish/sbd-toe-index-compact.json +111 -0
- package/data/reports/run_manifest.json +10 -0
- package/dist/backend/semantic-index-gateway.d.ts +25 -0
- package/dist/backend/semantic-index-gateway.js +555 -0
- package/dist/backend/semantic-index-gateway.js.map +1 -0
- package/dist/backend/semantic-index-gateway.test.d.ts +1 -0
- package/dist/backend/semantic-index-gateway.test.js +384 -0
- package/dist/backend/semantic-index-gateway.test.js.map +1 -0
- package/dist/bootstrap/checkout-backend.d.ts +31 -0
- package/dist/bootstrap/checkout-backend.js +136 -0
- package/dist/bootstrap/checkout-backend.js.map +1 -0
- package/dist/bootstrap/checkout-backend.test.d.ts +1 -0
- package/dist/bootstrap/checkout-backend.test.js +158 -0
- package/dist/bootstrap/checkout-backend.test.js.map +1 -0
- package/dist/bootstrap/release-checkout.d.ts +8 -0
- package/dist/bootstrap/release-checkout.js +168 -0
- package/dist/bootstrap/release-checkout.js.map +1 -0
- package/dist/bootstrap/release-checkout.test.d.ts +1 -0
- package/dist/bootstrap/release-checkout.test.js +137 -0
- package/dist/bootstrap/release-checkout.test.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +81 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1063 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/ask-manual.d.ts +13 -0
- package/dist/orchestrator/ask-manual.js +202 -0
- package/dist/orchestrator/ask-manual.js.map +1 -0
- package/dist/prompt/build-answer-prompt.d.ts +2 -0
- package/dist/prompt/build-answer-prompt.js +51 -0
- package/dist/prompt/build-answer-prompt.js.map +1 -0
- package/dist/prompt/system-prompt.d.ts +1 -0
- package/dist/prompt/system-prompt.js +94 -0
- package/dist/prompt/system-prompt.js.map +1 -0
- package/dist/resources/sbd-toe-resources.d.ts +18 -0
- package/dist/resources/sbd-toe-resources.js +164 -0
- package/dist/resources/sbd-toe-resources.js.map +1 -0
- package/dist/resources/sbd-toe-resources.test.d.ts +1 -0
- package/dist/resources/sbd-toe-resources.test.js +134 -0
- package/dist/resources/sbd-toe-resources.test.js.map +1 -0
- package/dist/test-utils.d.ts +153 -0
- package/dist/test-utils.js +176 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/tools/generate-document.d.ts +22 -0
- package/dist/tools/generate-document.js +392 -0
- package/dist/tools/generate-document.js.map +1 -0
- package/dist/tools/generate-document.test.d.ts +1 -0
- package/dist/tools/generate-document.test.js +189 -0
- package/dist/tools/generate-document.test.js.map +1 -0
- package/dist/tools/map-review-scope.d.ts +20 -0
- package/dist/tools/map-review-scope.js +299 -0
- package/dist/tools/map-review-scope.js.map +1 -0
- package/dist/tools/map-review-scope.test.d.ts +1 -0
- package/dist/tools/map-review-scope.test.js +204 -0
- package/dist/tools/map-review-scope.test.js.map +1 -0
- package/dist/tools/plan-repo-governance.d.ts +41 -0
- package/dist/tools/plan-repo-governance.js +509 -0
- package/dist/tools/plan-repo-governance.js.map +1 -0
- package/dist/tools/plan-repo-governance.test.d.ts +1 -0
- package/dist/tools/plan-repo-governance.test.js +237 -0
- package/dist/tools/plan-repo-governance.test.js.map +1 -0
- package/dist/tools/structured-tools.d.ts +5 -0
- package/dist/tools/structured-tools.js +310 -0
- package/dist/tools/structured-tools.js.map +1 -0
- package/dist/tools/structured-tools.test.d.ts +1 -0
- package/dist/tools/structured-tools.test.js +459 -0
- package/dist/tools/structured-tools.test.js.map +1 -0
- package/dist/types.d.ts +160 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/upstream/backend-contract.d.ts +3 -0
- package/dist/upstream/backend-contract.js +37 -0
- package/dist/upstream/backend-contract.js.map +1 -0
- package/dist/validators/ai-disclosure.d.ts +39 -0
- package/dist/validators/ai-disclosure.js +183 -0
- package/dist/validators/ai-disclosure.js.map +1 -0
- package/dist/validators/ai-disclosure.test.d.ts +1 -0
- package/dist/validators/ai-disclosure.test.js +244 -0
- package/dist/validators/ai-disclosure.test.js.map +1 -0
- package/examples/claude-desktop.json +8 -0
- package/examples/vscode.mcp.json +9 -0
- package/package.json +50 -0
- package/prompts/sbd-toe-chat-system.md +71 -0
- package/smithery.yaml +44 -0
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { mockSnapshotPayload, emptySnapshotPayload, createMockNormalizedRecord, createMockRecordWithIntentTopics, createMockRecordWithAliases } from "../test-utils.js";
|
|
4
|
+
import { expandQueryWithAliases, classifyQueryIntent, computeIntentScore, buildEnrichedLookup, tryReadSnapshotFile, normalizeHit } from "../backend/semantic-index-gateway.js";
|
|
5
|
+
// --- Tests ---
|
|
6
|
+
describe("semantic-index-gateway.ts", () => {
|
|
7
|
+
describe("buildEnrichedLookup", () => {
|
|
8
|
+
it("builds map from snapshot with items", () => {
|
|
9
|
+
const result = buildEnrichedLookup(mockSnapshotPayload);
|
|
10
|
+
expect(result.size).toBe(4); // 4 items with objectID
|
|
11
|
+
expect(result.get("doc-001")).toBeDefined();
|
|
12
|
+
expect(result.get("doc-001")?.aliases_pt_en).toContain("repository initialization");
|
|
13
|
+
});
|
|
14
|
+
it("returns empty map for empty snapshot", () => {
|
|
15
|
+
const result = buildEnrichedLookup(emptySnapshotPayload);
|
|
16
|
+
expect(result.size).toBe(0);
|
|
17
|
+
});
|
|
18
|
+
it("skips items without objectID", () => {
|
|
19
|
+
const result = buildEnrichedLookup(mockSnapshotPayload);
|
|
20
|
+
// mockSnapshotPayload has one item without objectID; should be skipped
|
|
21
|
+
// Verify total count matches only items with valid objectID
|
|
22
|
+
expect(result.size).toBe(4); // Only 4 items have objectID
|
|
23
|
+
});
|
|
24
|
+
it("preserves enriched fields correctly", () => {
|
|
25
|
+
const result = buildEnrichedLookup(mockSnapshotPayload);
|
|
26
|
+
const doc001 = result.get("doc-001");
|
|
27
|
+
expect(doc001?.intent_topics).toContain("bootstrap");
|
|
28
|
+
expect(doc001?.canonical_control_ids).toContain("REQ-001");
|
|
29
|
+
expect(doc001?.authority_level).toBe("canonical");
|
|
30
|
+
});
|
|
31
|
+
it("handles undefined and empty arrays in enrichment fields", () => {
|
|
32
|
+
const result = buildEnrichedLookup(mockSnapshotPayload);
|
|
33
|
+
const doc003 = result.get("doc-003");
|
|
34
|
+
// artifact_ids is empty array
|
|
35
|
+
expect(doc003?.artifact_ids).toBeUndefined();
|
|
36
|
+
});
|
|
37
|
+
it("extracts only string values from arrays", () => {
|
|
38
|
+
const payload = {
|
|
39
|
+
items: [
|
|
40
|
+
{
|
|
41
|
+
objectID: "test-001",
|
|
42
|
+
aliases_pt_en: ["valid", 123, null, "also valid"] // Mixed types
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
};
|
|
46
|
+
const result = buildEnrichedLookup(payload);
|
|
47
|
+
const enriched = result.get("test-001");
|
|
48
|
+
expect(enriched?.aliases_pt_en).toEqual(["valid", "also valid"]);
|
|
49
|
+
});
|
|
50
|
+
it("sets authority_level when string", () => {
|
|
51
|
+
const payload = {
|
|
52
|
+
items: [
|
|
53
|
+
{
|
|
54
|
+
objectID: "test-001",
|
|
55
|
+
authority_level: "guidance"
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
};
|
|
59
|
+
const result = buildEnrichedLookup(payload);
|
|
60
|
+
expect(result.get("test-001")?.authority_level).toBe("guidance");
|
|
61
|
+
});
|
|
62
|
+
it("omits authority_level when not string", () => {
|
|
63
|
+
const payload = {
|
|
64
|
+
items: [
|
|
65
|
+
{
|
|
66
|
+
objectID: "test-001",
|
|
67
|
+
authority_level: 123 // Not a string
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
};
|
|
71
|
+
const result = buildEnrichedLookup(payload);
|
|
72
|
+
expect(result.get("test-001")?.authority_level).toBeUndefined();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe("tryReadSnapshotFile", () => {
|
|
76
|
+
it("returns undefined when file does not exist", () => {
|
|
77
|
+
const result = tryReadSnapshotFile("nonexistent/file.json");
|
|
78
|
+
expect(result).toBeUndefined();
|
|
79
|
+
});
|
|
80
|
+
it("returns undefined when JSON is invalid", () => {
|
|
81
|
+
// Create a temporary invalid JSON file
|
|
82
|
+
const tempPath = path.join(process.cwd(), "temp-invalid.json");
|
|
83
|
+
try {
|
|
84
|
+
// This will fail since we can't write files in test, but we simulate the behavior
|
|
85
|
+
// In a real scenario, we'd mock readFileSync
|
|
86
|
+
const result = tryReadSnapshotFile(tempPath);
|
|
87
|
+
expect(result).toBeUndefined();
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
// Cleanup would happen here
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
it("catches and silently returns undefined on any error", () => {
|
|
94
|
+
// Any error (file not found, permission denied, etc.) returns undefined
|
|
95
|
+
const result = tryReadSnapshotFile("/invalid/path/with/no/perms/file.json");
|
|
96
|
+
expect(result).toBeUndefined();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe("expandQueryWithAliases", () => {
|
|
100
|
+
it("expands 'repositório' with aliases", () => {
|
|
101
|
+
const query = "como configurar repositório de código";
|
|
102
|
+
const result = expandQueryWithAliases(query);
|
|
103
|
+
expect(result).toContain("repositório de código");
|
|
104
|
+
expect(result).toContain("code repository");
|
|
105
|
+
});
|
|
106
|
+
it("expands 'CI/CD' with aliases", () => {
|
|
107
|
+
const query = "configurar CI/CD gates";
|
|
108
|
+
const result = expandQueryWithAliases(query);
|
|
109
|
+
expect(result).toContain("CI/CD");
|
|
110
|
+
expect(result).toContain("continuous integration");
|
|
111
|
+
expect(result).toContain("continuous delivery");
|
|
112
|
+
});
|
|
113
|
+
it("returns original query when no aliases match", () => {
|
|
114
|
+
const query = "qual é a temperatura?";
|
|
115
|
+
const result = expandQueryWithAliases(query);
|
|
116
|
+
expect(result).toBe(query);
|
|
117
|
+
});
|
|
118
|
+
it("handles case-insensitive matching", () => {
|
|
119
|
+
const query = "REPOSITÓRIO DE CÓDIGO policies";
|
|
120
|
+
const result = expandQueryWithAliases(query);
|
|
121
|
+
expect(result).toContain("code repository");
|
|
122
|
+
});
|
|
123
|
+
it("expands multiple aliases in one query", () => {
|
|
124
|
+
const query = "dependência SBOM CI/CD";
|
|
125
|
+
const result = expandQueryWithAliases(query);
|
|
126
|
+
expect(result).toContain("dependency");
|
|
127
|
+
expect(result).toContain("software bill of materials");
|
|
128
|
+
expect(result).toContain("continuous integration");
|
|
129
|
+
});
|
|
130
|
+
it("handles empty query", () => {
|
|
131
|
+
const result = expandQueryWithAliases("");
|
|
132
|
+
expect(result).toBe("");
|
|
133
|
+
});
|
|
134
|
+
it("double-expand behavior is deterministic", () => {
|
|
135
|
+
const query = "repositório de código";
|
|
136
|
+
const result = expandQueryWithAliases(query);
|
|
137
|
+
const doubleExpand = expandQueryWithAliases(result);
|
|
138
|
+
// After first expand: "repositório de código code repository ..."
|
|
139
|
+
// After second expand: the pattern matches again and adds aliases again
|
|
140
|
+
// This is expected behavior - aliases are re-expanded for canonical terms
|
|
141
|
+
expect(result).toContain("code repository");
|
|
142
|
+
expect(doubleExpand).toContain("code repository");
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe("classifyQueryIntent", () => {
|
|
146
|
+
it("classifies bootstrap-related queries as repo_bootstrap", () => {
|
|
147
|
+
const intents = [
|
|
148
|
+
classifyQueryIntent("como fazer bootstrap"),
|
|
149
|
+
classifyQueryIntent("criar novo repositório"),
|
|
150
|
+
classifyQueryIntent("setup inicial")
|
|
151
|
+
];
|
|
152
|
+
expect(intents).toEqual(["repo_bootstrap", "repo_bootstrap", "repo_bootstrap"]);
|
|
153
|
+
});
|
|
154
|
+
it("classifies dependency queries as dependency_governance", () => {
|
|
155
|
+
const intents = [
|
|
156
|
+
classifyQueryIntent("como gerenciar dependência"),
|
|
157
|
+
classifyQueryIntent("SBOM requirements"),
|
|
158
|
+
classifyQueryIntent("SCA scanning")
|
|
159
|
+
];
|
|
160
|
+
expect(intents).toEqual(["dependency_governance", "dependency_governance", "dependency_governance"]);
|
|
161
|
+
});
|
|
162
|
+
it("classifies CI/CD queries as ci_cd_gates", () => {
|
|
163
|
+
const intents = [
|
|
164
|
+
classifyQueryIntent("configurar CI/CD gates"),
|
|
165
|
+
classifyQueryIntent("github actions pipeline"),
|
|
166
|
+
classifyQueryIntent("approval process")
|
|
167
|
+
];
|
|
168
|
+
expect(intents).toEqual(["ci_cd_gates", "ci_cd_gates", "ci_cd_gates"]);
|
|
169
|
+
});
|
|
170
|
+
it("classifies review queries as review_scope", () => {
|
|
171
|
+
const intents = [
|
|
172
|
+
classifyQueryIntent("o que rever em security"),
|
|
173
|
+
classifyQueryIntent("auditar compliance"),
|
|
174
|
+
classifyQueryIntent("verificar scope")
|
|
175
|
+
];
|
|
176
|
+
expect(intents).toEqual(["review_scope", "review_scope", "review_scope"]);
|
|
177
|
+
});
|
|
178
|
+
it("classifies guidance queries as canonical_guidance", () => {
|
|
179
|
+
const intents = [
|
|
180
|
+
classifyQueryIntent("how to implement best practices"),
|
|
181
|
+
classifyQueryIntent("when to apply controls"),
|
|
182
|
+
classifyQueryIntent("onde colocar this requirement")
|
|
183
|
+
];
|
|
184
|
+
expect(intents).toEqual(["canonical_guidance", "canonical_guidance", "canonical_guidance"]);
|
|
185
|
+
});
|
|
186
|
+
it("defaults to generic for unrelated queries", () => {
|
|
187
|
+
const result = classifyQueryIntent("qual é a capital de Portugal?");
|
|
188
|
+
expect(result).toBe("generic");
|
|
189
|
+
});
|
|
190
|
+
it("handles empty query as generic", () => {
|
|
191
|
+
const result = classifyQueryIntent("");
|
|
192
|
+
expect(result).toBe("generic");
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
describe("computeIntentScore", () => {
|
|
196
|
+
it("returns 0 for record with no enrichment fields", () => {
|
|
197
|
+
const record = createMockNormalizedRecord();
|
|
198
|
+
const score = computeIntentScore(record, "repo_bootstrap", ["bootstrap"]);
|
|
199
|
+
expect(score).toBe(0);
|
|
200
|
+
});
|
|
201
|
+
it("adds +3 for matching intent_topics in repo_bootstrap", () => {
|
|
202
|
+
const record = createMockRecordWithIntentTopics("bootstrap");
|
|
203
|
+
const score = computeIntentScore(record, "repo_bootstrap", []);
|
|
204
|
+
expect(score).toBeGreaterThanOrEqual(3);
|
|
205
|
+
});
|
|
206
|
+
it("adds +3 for matching intent_topics in dependency_governance", () => {
|
|
207
|
+
const record = createMockRecordWithIntentTopics("dependency_governance", {
|
|
208
|
+
intent_topics: ["dependency", "sbom"]
|
|
209
|
+
});
|
|
210
|
+
const score = computeIntentScore(record, "dependency_governance", []);
|
|
211
|
+
expect(score).toBeGreaterThanOrEqual(3);
|
|
212
|
+
});
|
|
213
|
+
it("adds +3 for matching intent_topics in ci_cd_gates", () => {
|
|
214
|
+
const record = createMockRecordWithIntentTopics("ci_cd_gates", {
|
|
215
|
+
intent_topics: ["pipeline"]
|
|
216
|
+
});
|
|
217
|
+
const score = computeIntentScore(record, "ci_cd_gates", []);
|
|
218
|
+
expect(score).toBeGreaterThanOrEqual(3);
|
|
219
|
+
});
|
|
220
|
+
it("adds +2 for matching aliases", () => {
|
|
221
|
+
const record = createMockRecordWithAliases(["continuous integration", "ci"]);
|
|
222
|
+
const score = computeIntentScore(record, "ci_cd_gates", ["continuous", "integration"]);
|
|
223
|
+
expect(score).toBeGreaterThanOrEqual(2);
|
|
224
|
+
});
|
|
225
|
+
it("adds +1 for canonical authority_level when intent is not generic", () => {
|
|
226
|
+
const record = createMockNormalizedRecord({
|
|
227
|
+
authority_level: "canonical"
|
|
228
|
+
});
|
|
229
|
+
const score = computeIntentScore(record, "repo_bootstrap", []);
|
|
230
|
+
expect(score).toBe(1);
|
|
231
|
+
});
|
|
232
|
+
it("reduces by -1 for demo authority_level when intent is not generic", () => {
|
|
233
|
+
const record = createMockNormalizedRecord({
|
|
234
|
+
authority_level: "demo"
|
|
235
|
+
});
|
|
236
|
+
const score = computeIntentScore(record, "repo_bootstrap", []);
|
|
237
|
+
expect(score).toBe(-1);
|
|
238
|
+
});
|
|
239
|
+
it("does not apply authority boost for generic intent", () => {
|
|
240
|
+
const record = createMockNormalizedRecord({
|
|
241
|
+
authority_level: "canonical"
|
|
242
|
+
});
|
|
243
|
+
const score = computeIntentScore(record, "generic", []);
|
|
244
|
+
expect(score).toBe(0); // No boost for generic
|
|
245
|
+
});
|
|
246
|
+
it("combines multiple scoring factors", () => {
|
|
247
|
+
const record = createMockRecordWithIntentTopics("ci_cd_gates", {
|
|
248
|
+
intent_topics: ["pipeline", "ci"],
|
|
249
|
+
aliases_pt_en: ["continuous integration"],
|
|
250
|
+
authority_level: "canonical"
|
|
251
|
+
});
|
|
252
|
+
const score = computeIntentScore(record, "ci_cd_gates", ["continuous", "integration"]);
|
|
253
|
+
// Should have: +3 (intent_topics) + 2 (aliases) + 1 (canonical) = at least 6
|
|
254
|
+
expect(score).toBeGreaterThanOrEqual(6);
|
|
255
|
+
});
|
|
256
|
+
it("handles normalized diacritics in aliases", () => {
|
|
257
|
+
const record = createMockRecordWithAliases(["integração contínua"]);
|
|
258
|
+
const score = computeIntentScore(record, "ci_cd_gates", ["integracao", "continua"]);
|
|
259
|
+
expect(score).toBeGreaterThanOrEqual(2);
|
|
260
|
+
});
|
|
261
|
+
it("score is 0 when no matching enrichment", () => {
|
|
262
|
+
const record = createMockRecordWithIntentTopics("review_scope");
|
|
263
|
+
const score = computeIntentScore(record, "dependency_governance", ["unknown"]);
|
|
264
|
+
expect(score).toBe(0);
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
describe("integration: normalizeHit with enrichment", () => {
|
|
268
|
+
it("populates enrichment fields from enrichedLookup", () => {
|
|
269
|
+
const enrichedLookup = buildEnrichedLookup(mockSnapshotPayload);
|
|
270
|
+
const hit = mockSnapshotPayload.items?.[0];
|
|
271
|
+
expect(hit).toBeDefined();
|
|
272
|
+
const enriched = enrichedLookup.get("doc-001");
|
|
273
|
+
expect(enriched?.intent_topics).toContain("bootstrap");
|
|
274
|
+
expect(enriched?.aliases_pt_en).toContain("repository initialization");
|
|
275
|
+
});
|
|
276
|
+
it("returns empty enrichedLookup for empty snapshot", () => {
|
|
277
|
+
const lookup = buildEnrichedLookup(emptySnapshotPayload);
|
|
278
|
+
expect(lookup.size).toBe(0);
|
|
279
|
+
});
|
|
280
|
+
it("merges raw hit data with enrichment without duplication", () => {
|
|
281
|
+
const enrichedLookup = buildEnrichedLookup(mockSnapshotPayload);
|
|
282
|
+
const hit = mockSnapshotPayload.items?.[0];
|
|
283
|
+
expect(hit).toBeDefined();
|
|
284
|
+
expect(hit?.objectID).toBe("doc-001");
|
|
285
|
+
const enriched = enrichedLookup.get("doc-001");
|
|
286
|
+
expect(enriched?.intent_topics).toBeDefined();
|
|
287
|
+
// Enrichment should not duplicate raw fields
|
|
288
|
+
expect(enriched?.aliases_pt_en?.some((a) => a === undefined)).toBe(false);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
describe("normalizeHit", () => {
|
|
292
|
+
it("returns correct source, indexName, citationId and algoliaRank", () => {
|
|
293
|
+
const hit = { objectID: "test-001", title: "Test" };
|
|
294
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "test query");
|
|
295
|
+
expect(result.source).toBe("docs");
|
|
296
|
+
expect(result.indexName).toBe("test_index");
|
|
297
|
+
expect(result.citationId).toBe("D1");
|
|
298
|
+
expect(result.algoliaRank).toBe(1);
|
|
299
|
+
});
|
|
300
|
+
it("derives title from title field", () => {
|
|
301
|
+
const hit = { objectID: "test-001", title: "My Title" };
|
|
302
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "query");
|
|
303
|
+
expect(result.title).toBe("My Title");
|
|
304
|
+
});
|
|
305
|
+
it("falls back to 'Record N' when no title key found", () => {
|
|
306
|
+
const hit = { objectID: "test-001", some_field: "value" };
|
|
307
|
+
const result = normalizeHit(hit, "docs", "test_index", 2, "D3", "query");
|
|
308
|
+
expect(result.title).toBe("Record 3");
|
|
309
|
+
});
|
|
310
|
+
it("derives excerpt from content field", () => {
|
|
311
|
+
const hit = { objectID: "test-001", title: "Title", content: "Some content here" };
|
|
312
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "query");
|
|
313
|
+
expect(result.excerpt).toContain("Some content here");
|
|
314
|
+
});
|
|
315
|
+
it("uses objectID from hit", () => {
|
|
316
|
+
const hit = { objectID: "hit-001", title: "Title" };
|
|
317
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "query");
|
|
318
|
+
expect(result.objectID).toBe("hit-001");
|
|
319
|
+
});
|
|
320
|
+
it("generates fallback objectID when hit has no id field", () => {
|
|
321
|
+
const hit = { title: "Title" };
|
|
322
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "query");
|
|
323
|
+
expect(result.objectID).toBe("test_index#1");
|
|
324
|
+
});
|
|
325
|
+
it("computes localScore as a positive number for a matching query", () => {
|
|
326
|
+
const hit = { objectID: "test-001", title: "bootstrap guide" };
|
|
327
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "bootstrap");
|
|
328
|
+
expect(typeof result.localScore).toBe("number");
|
|
329
|
+
expect(result.localScore).toBeGreaterThan(0);
|
|
330
|
+
});
|
|
331
|
+
it("extracts chapter and section from record", () => {
|
|
332
|
+
const hit = {
|
|
333
|
+
objectID: "test-001",
|
|
334
|
+
title: "Title",
|
|
335
|
+
chapter_title: "Cap. 01",
|
|
336
|
+
section_title: "Section A"
|
|
337
|
+
};
|
|
338
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "query");
|
|
339
|
+
expect(result.chapter).toBe("Cap. 01");
|
|
340
|
+
expect(result.section).toBe("Section A");
|
|
341
|
+
});
|
|
342
|
+
it("extracts tags as string array", () => {
|
|
343
|
+
const hit = {
|
|
344
|
+
objectID: "test-001",
|
|
345
|
+
title: "Title",
|
|
346
|
+
tags: ["bootstrap", "setup"]
|
|
347
|
+
};
|
|
348
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "query");
|
|
349
|
+
expect(result.tags).toContain("bootstrap");
|
|
350
|
+
expect(result.tags).toContain("setup");
|
|
351
|
+
});
|
|
352
|
+
it("raw field holds the original hit reference", () => {
|
|
353
|
+
const hit = { objectID: "test-001", title: "Title", custom: "value" };
|
|
354
|
+
const result = normalizeHit(hit, "entities", "entities_index", 0, "E1", "query");
|
|
355
|
+
expect(result.raw).toBe(hit);
|
|
356
|
+
});
|
|
357
|
+
it("populates enrichment fields from enrichedLookup when objectID matches", () => {
|
|
358
|
+
const enrichedLookup = buildEnrichedLookup(mockSnapshotPayload);
|
|
359
|
+
const hit = mockSnapshotPayload.items[0];
|
|
360
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "bootstrap", enrichedLookup);
|
|
361
|
+
expect(result.aliases_pt_en).toContain("repository initialization");
|
|
362
|
+
expect(result.intent_topics).toContain("bootstrap");
|
|
363
|
+
expect(result.authority_level).toBe("canonical");
|
|
364
|
+
});
|
|
365
|
+
it("leaves enrichment fields undefined when no enrichedLookup provided", () => {
|
|
366
|
+
const hit = { objectID: "doc-001", title: "Title" };
|
|
367
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "query");
|
|
368
|
+
expect(result.aliases_pt_en).toBeUndefined();
|
|
369
|
+
expect(result.intent_topics).toBeUndefined();
|
|
370
|
+
});
|
|
371
|
+
it("returns explicit url when url field present in hit", () => {
|
|
372
|
+
const hit = { objectID: "test-001", title: "Title", url: "https://example.com/page" };
|
|
373
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "query");
|
|
374
|
+
expect(result.url).toBe("https://example.com/page");
|
|
375
|
+
});
|
|
376
|
+
it("extracts role and phase from hit", () => {
|
|
377
|
+
const hit = { objectID: "test-001", title: "Title", role: "Developer", phase: "Build" };
|
|
378
|
+
const result = normalizeHit(hit, "docs", "test_index", 0, "D1", "query");
|
|
379
|
+
expect(result.role).toBe("Developer");
|
|
380
|
+
expect(result.phase).toBe("Build");
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
//# sourceMappingURL=semantic-index-gateway.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-index-gateway.test.js","sourceRoot":"","sources":["../../src/backend/semantic-index-gateway.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { PublishedIndexContract } from "../types.js";
|
|
2
|
+
interface UpstreamIndexSettingsPayload {
|
|
3
|
+
items?: Array<{
|
|
4
|
+
index_name?: string;
|
|
5
|
+
record_family?: string;
|
|
6
|
+
settings?: Record<string, unknown>;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
interface UpstreamRunManifestPayload {
|
|
10
|
+
run_id?: string;
|
|
11
|
+
generated_at?: string;
|
|
12
|
+
branch?: string;
|
|
13
|
+
commit_sha?: string;
|
|
14
|
+
corpus_root?: string;
|
|
15
|
+
repo_url?: string;
|
|
16
|
+
sync_mode?: string;
|
|
17
|
+
version?: string;
|
|
18
|
+
}
|
|
19
|
+
interface PublicRunManifestPayload {
|
|
20
|
+
run_id?: string;
|
|
21
|
+
generated_at?: string;
|
|
22
|
+
branch?: string;
|
|
23
|
+
commit_sha?: string;
|
|
24
|
+
corpus_root?: string;
|
|
25
|
+
repo_url?: string;
|
|
26
|
+
sync_mode?: string;
|
|
27
|
+
version?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function ensurePublishedIndex(items: UpstreamIndexSettingsPayload["items"], recordFamily: string, fallbackIndexName: string): PublishedIndexContract;
|
|
30
|
+
export declare function sanitizeRunManifest(upstream: UpstreamRunManifestPayload): PublicRunManifestPayload;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { copyFile, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { getAppRoot, getConfig, resolveAppPath } from "../config.js";
|
|
4
|
+
import { checkoutFromRelease } from "./release-checkout.js";
|
|
5
|
+
export function ensurePublishedIndex(items, recordFamily, fallbackIndexName) {
|
|
6
|
+
const match = items?.find((item) => item.record_family === recordFamily) ??
|
|
7
|
+
items?.find((item) => item.index_name === fallbackIndexName);
|
|
8
|
+
if (!match?.index_name) {
|
|
9
|
+
throw new Error(`O upstream não publicou um índice utilizável para "${recordFamily}" em data/publish/algolia_index_settings.json.`);
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
indexName: match.index_name,
|
|
13
|
+
recordFamily,
|
|
14
|
+
settings: match.settings ?? {}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async function readJsonFile(filePath) {
|
|
18
|
+
const raw = await readFile(filePath, "utf8");
|
|
19
|
+
return JSON.parse(raw);
|
|
20
|
+
}
|
|
21
|
+
async function ensureParent(filePath) {
|
|
22
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
function normalizePublicRepoUrl(value) {
|
|
25
|
+
if (!value) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const trimmed = value.trim();
|
|
29
|
+
const sshMatch = /^git@github\.com:(.+?)(?:\.git)?$/i.exec(trimmed);
|
|
30
|
+
if (sshMatch?.[1]) {
|
|
31
|
+
return `https://github.com/${sshMatch[1]}`;
|
|
32
|
+
}
|
|
33
|
+
return trimmed;
|
|
34
|
+
}
|
|
35
|
+
export function sanitizeRunManifest(upstream) {
|
|
36
|
+
const normalizedRepoUrl = normalizePublicRepoUrl(upstream.repo_url);
|
|
37
|
+
return {
|
|
38
|
+
...(upstream.run_id === undefined ? {} : { run_id: upstream.run_id }),
|
|
39
|
+
...(upstream.generated_at === undefined
|
|
40
|
+
? {}
|
|
41
|
+
: { generated_at: upstream.generated_at }),
|
|
42
|
+
...(upstream.branch === undefined ? {} : { branch: upstream.branch }),
|
|
43
|
+
...(upstream.commit_sha === undefined ? {} : { commit_sha: upstream.commit_sha }),
|
|
44
|
+
...(upstream.corpus_root === undefined ? {} : { corpus_root: upstream.corpus_root }),
|
|
45
|
+
...(normalizedRepoUrl === undefined ? {} : { repo_url: normalizedRepoUrl }),
|
|
46
|
+
...(upstream.sync_mode === undefined ? {} : { sync_mode: upstream.sync_mode }),
|
|
47
|
+
...(upstream.version === undefined ? {} : { version: upstream.version })
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async function main() {
|
|
51
|
+
const config = getConfig();
|
|
52
|
+
const source = config.backend.upstreamSource;
|
|
53
|
+
if (source === "release") {
|
|
54
|
+
await checkoutFromRelease(config, getAppRoot());
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// source === "local" → fluxo existente continua inalterado
|
|
58
|
+
const upstreamRepoPath = resolveAppPath(config.backend.upstreamRepoDir);
|
|
59
|
+
const checkoutFilePath = resolveAppPath(config.backend.checkoutFile);
|
|
60
|
+
const localDocsSnapshot = resolveAppPath(config.backend.docsSnapshotFile);
|
|
61
|
+
const localEntitiesSnapshot = resolveAppPath(config.backend.entitiesSnapshotFile);
|
|
62
|
+
const localDocsEnrichedSnapshot = resolveAppPath(config.backend.docsEnrichedSnapshotFile);
|
|
63
|
+
const localEntitiesEnrichedSnapshot = resolveAppPath(config.backend.entitiesEnrichedSnapshotFile);
|
|
64
|
+
const localIndexSettings = resolveAppPath(config.backend.indexSettingsFile);
|
|
65
|
+
const localRunManifest = resolveAppPath(config.backend.runManifestFile);
|
|
66
|
+
const upstreamDocsSnapshot = path.join(upstreamRepoPath, "data", "publish", "algolia_docs_records.json");
|
|
67
|
+
const upstreamEntitiesSnapshot = path.join(upstreamRepoPath, "data", "publish", "algolia_entities_records.json");
|
|
68
|
+
const upstreamDocsEnrichedSnapshot = path.join(upstreamRepoPath, "data", "publish", "algolia_docs_records_enriched.json");
|
|
69
|
+
const upstreamEntitiesEnrichedSnapshot = path.join(upstreamRepoPath, "data", "publish", "algolia_entities_records_enriched.json");
|
|
70
|
+
const upstreamIndexSettings = path.join(upstreamRepoPath, "data", "publish", "algolia_index_settings.json");
|
|
71
|
+
const upstreamRunManifest = path.join(upstreamRepoPath, "data", "reports", "run_manifest.json");
|
|
72
|
+
const [indexSettings, runManifest] = await Promise.all([
|
|
73
|
+
readJsonFile(upstreamIndexSettings),
|
|
74
|
+
readJsonFile(upstreamRunManifest)
|
|
75
|
+
]);
|
|
76
|
+
await Promise.all([
|
|
77
|
+
ensureParent(localDocsSnapshot),
|
|
78
|
+
ensureParent(localEntitiesSnapshot),
|
|
79
|
+
ensureParent(localDocsEnrichedSnapshot),
|
|
80
|
+
ensureParent(localEntitiesEnrichedSnapshot),
|
|
81
|
+
ensureParent(localIndexSettings),
|
|
82
|
+
ensureParent(localRunManifest),
|
|
83
|
+
ensureParent(checkoutFilePath)
|
|
84
|
+
]);
|
|
85
|
+
const publicRunManifest = sanitizeRunManifest(runManifest);
|
|
86
|
+
await Promise.all([
|
|
87
|
+
copyFile(upstreamDocsSnapshot, localDocsSnapshot),
|
|
88
|
+
copyFile(upstreamEntitiesSnapshot, localEntitiesSnapshot),
|
|
89
|
+
copyFile(upstreamDocsEnrichedSnapshot, localDocsEnrichedSnapshot),
|
|
90
|
+
copyFile(upstreamEntitiesEnrichedSnapshot, localEntitiesEnrichedSnapshot),
|
|
91
|
+
copyFile(upstreamIndexSettings, localIndexSettings),
|
|
92
|
+
writeFile(localRunManifest, `${JSON.stringify(publicRunManifest, null, 2)}\n`, "utf8")
|
|
93
|
+
]);
|
|
94
|
+
const checkout = {
|
|
95
|
+
schemaVersion: "0.1.0",
|
|
96
|
+
checkedOutAt: new Date().toISOString(),
|
|
97
|
+
upstreamRepoPath,
|
|
98
|
+
contractFiles: {
|
|
99
|
+
docsSnapshot: localDocsSnapshot,
|
|
100
|
+
entitiesSnapshot: localEntitiesSnapshot,
|
|
101
|
+
docsEnrichedSnapshot: localDocsEnrichedSnapshot,
|
|
102
|
+
entitiesEnrichedSnapshot: localEntitiesEnrichedSnapshot,
|
|
103
|
+
indexSettings: localIndexSettings,
|
|
104
|
+
runManifest: localRunManifest
|
|
105
|
+
},
|
|
106
|
+
runManifest: {
|
|
107
|
+
runId: runManifest.run_id,
|
|
108
|
+
generatedAt: runManifest.generated_at,
|
|
109
|
+
branch: runManifest.branch,
|
|
110
|
+
commitSha: runManifest.commit_sha,
|
|
111
|
+
repoUrl: runManifest.repo_url
|
|
112
|
+
},
|
|
113
|
+
indices: {
|
|
114
|
+
docs: ensurePublishedIndex(indexSettings.items, "documents", config.backend.docsIndex),
|
|
115
|
+
entities: ensurePublishedIndex(indexSettings.items, "entities", config.backend.entitiesIndex)
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
await writeFile(checkoutFilePath, `${JSON.stringify(checkout, null, 2)}\n`, "utf8");
|
|
119
|
+
process.stdout.write([
|
|
120
|
+
`Backend checkout criado em ${checkoutFilePath}`,
|
|
121
|
+
`docs_snapshot=${localDocsSnapshot}`,
|
|
122
|
+
`entities_snapshot=${localEntitiesSnapshot}`,
|
|
123
|
+
`docs_enriched_snapshot=${localDocsEnrichedSnapshot}`,
|
|
124
|
+
`entities_enriched_snapshot=${localEntitiesEnrichedSnapshot}`,
|
|
125
|
+
`run_id=${checkout.runManifest.runId ?? "n/d"}`,
|
|
126
|
+
`commit_sha=${checkout.runManifest.commitSha ?? "n/d"}`,
|
|
127
|
+
`docs_index=${checkout.indices.docs.indexName}`,
|
|
128
|
+
`entities_index=${checkout.indices.entities.indexName}`
|
|
129
|
+
].join("\n") + "\n");
|
|
130
|
+
}
|
|
131
|
+
main().catch((error) => {
|
|
132
|
+
const message = error instanceof Error ? error.stack ?? error.message : String(error);
|
|
133
|
+
process.stderr.write(`${message}\n`);
|
|
134
|
+
process.exit(1);
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=checkout-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkout-backend.js","sourceRoot":"","sources":["../../src/bootstrap/checkout-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|