Skip to content

Commit 8e91994

Browse files
aborrusoclaude
andcommitted
fix(cli): capabilityScore si difende da query vuota, no-match su stderr
Da review Copilot su PR #48 (estensioni coerenti dei fix precedenti): - capabilityScore e' esportata: normalizza e valida la query internamente (vuota -> 0, trim+lowercase, match case-insensitive sui terms) invece di affidarsi alla guardia del solo chiamante which - il messaggio "nessun comando trovato" usciva su stdout: spostato su stderr come il messaggio d'uso (stdout riservato a risultati/JSON) +2 test (query vuota/spazi -> 0, case-insensitive). 130/130 verdi, tsc pulito. Verificato: which zzz-inesistente 2>/dev/null -> stdout vuoto, exit 2. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent bf5f85d commit 8e91994

3 files changed

Lines changed: 22 additions & 3 deletions

File tree

src/cli.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1635,7 +1635,8 @@ const whichCmd = defineCommand({
16351635
if (args.json) {
16361636
process.stdout.write(JSON.stringify(ranked) + "\n");
16371637
} else if (ranked.length === 0) {
1638-
process.stdout.write(
1638+
// Su stderr: stdout resta per risultati/JSON (pipeline-friendly).
1639+
process.stderr.write(
16391640
`Nessun comando trovato per "${q}". Prova 'italianparliament guide' per il flusso completo, o '--help'.\n`,
16401641
);
16411642
} else {

src/core/capabilities.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,16 @@ describe("capabilityScore", () => {
4141
const cap = CAPABILITIES.find((c) => c.cmd === "search find")!;
4242
expect(capabilityScore(cap, "zzz-inesistente")).toBe(0);
4343
});
44+
45+
it("query vuota o di soli spazi dà 0 (la funzione si difende da sola, è esportata)", () => {
46+
const cap = CAPABILITIES.find((c) => c.cmd === "search find")!;
47+
expect(capabilityScore(cap, "")).toBe(0);
48+
expect(capabilityScore(cap, " ")).toBe(0);
49+
});
50+
51+
it("match case-insensitive sui terms", () => {
52+
const cap = CAPABILITIES.find((c) => c.cmd === "person-career show")!;
53+
expect(capabilityScore(cap, "CARRIERA")).toBe(100);
54+
expect(capabilityScore(cap, " Carriera ")).toBe(100);
55+
});
4456
});

src/core/capabilities.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,15 @@ export const CAPABILITIES: Capability[] = [
4242
];
4343

4444

45-
export function capabilityScore(cap: Capability, q: string): number {
45+
// Normalizza e valida la query internamente: la funzione è esportata e deve
46+
// difendersi da sola — con q vuota `t.includes("")` sarebbe sempre vero e
47+
// ogni capability otterrebbe punteggio. Match case-insensitive sui terms.
48+
export function capabilityScore(cap: Capability, query: string): number {
49+
const q = query.toLowerCase().trim();
50+
if (!q) return 0;
4651
let s = 0;
47-
for (const t of cap.terms) {
52+
for (const term of cap.terms) {
53+
const t = term.toLowerCase();
4854
if (t === q) s = Math.max(s, 100);
4955
else if (t.includes(q)) s = Math.max(s, 70);
5056
else if (q.includes(t)) s = Math.max(s, 60);

0 commit comments

Comments
 (0)