chiasmus 0.1.8 → 0.1.10
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 +92 -1
- package/dist/formalize/engine.d.ts +1 -1
- package/dist/formalize/engine.d.ts.map +1 -1
- package/dist/formalize/engine.js +25 -16
- package/dist/formalize/engine.js.map +1 -1
- package/dist/formalize/index.d.ts +7 -0
- package/dist/formalize/index.d.ts.map +1 -0
- package/dist/formalize/index.js +5 -0
- package/dist/formalize/index.js.map +1 -0
- package/dist/formalize/prolog-input.d.ts +9 -0
- package/dist/formalize/prolog-input.d.ts.map +1 -0
- package/dist/formalize/prolog-input.js +19 -0
- package/dist/formalize/prolog-input.js.map +1 -0
- package/dist/formalize/validate.js +9 -4
- package/dist/formalize/validate.js.map +1 -1
- package/dist/graph/analyses.js +6 -6
- package/dist/graph/analyses.js.map +1 -1
- package/dist/graph/extractor.d.ts.map +1 -1
- package/dist/graph/extractor.js +23 -12
- package/dist/graph/extractor.js.map +1 -1
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +6 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/index.d.ts +6 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +3 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +14 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/skills/craft.d.ts.map +1 -1
- package/dist/skills/craft.js +2 -11
- package/dist/skills/craft.js.map +1 -1
- package/dist/skills/index.d.ts +7 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +4 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/learner.d.ts.map +1 -1
- package/dist/skills/learner.js +3 -1
- package/dist/skills/learner.js.map +1 -1
- package/dist/solvers/index.d.ts +7 -0
- package/dist/solvers/index.d.ts.map +1 -0
- package/dist/solvers/index.js +5 -0
- package/dist/solvers/index.js.map +1 -0
- package/dist/solvers/prolog-solver.d.ts.map +1 -1
- package/dist/solvers/prolog-solver.js +124 -14
- package/dist/solvers/prolog-solver.js.map +1 -1
- package/dist/solvers/z3-solver.d.ts.map +1 -1
- package/dist/solvers/z3-solver.js +1 -8
- package/dist/solvers/z3-solver.js.map +1 -1
- package/package.json +20 -16
package/README.md
CHANGED
|
@@ -214,7 +214,7 @@ Add tree-sitter support for any language by publishing an npm package named `chi
|
|
|
214
214
|
|
|
215
215
|
```ts
|
|
216
216
|
// chiasmus-adapter-rust/index.ts
|
|
217
|
-
import type { LanguageAdapter } from "chiasmus/
|
|
217
|
+
import type { LanguageAdapter } from "chiasmus/graph";
|
|
218
218
|
|
|
219
219
|
const adapter: LanguageAdapter = {
|
|
220
220
|
language: "rust",
|
|
@@ -272,6 +272,97 @@ export default {
|
|
|
272
272
|
|
|
273
273
|
Built-in languages always take precedence over adapters with the same extensions.
|
|
274
274
|
|
|
275
|
+
## Library Usage
|
|
276
|
+
|
|
277
|
+
Chiasmus can be used as a library in any Node.js project:
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
npm install chiasmus
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Quick Start
|
|
284
|
+
|
|
285
|
+
```ts
|
|
286
|
+
import { SolverSession, lintSpec, SkillLibrary, FormalizationEngine } from "chiasmus";
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Or import from specific subpaths:
|
|
290
|
+
|
|
291
|
+
```ts
|
|
292
|
+
import { createZ3Solver, createPrologSolver } from "chiasmus/solvers";
|
|
293
|
+
import { extractGraph, runAnalysis } from "chiasmus/graph";
|
|
294
|
+
import { lintSpec, FormalizationEngine } from "chiasmus/formalize";
|
|
295
|
+
import { SkillLibrary, SkillLearner } from "chiasmus/skills";
|
|
296
|
+
import { createLLMFromEnv } from "chiasmus/llm";
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Solvers
|
|
300
|
+
|
|
301
|
+
```ts
|
|
302
|
+
import { SolverSession } from "chiasmus/solvers";
|
|
303
|
+
|
|
304
|
+
const session = await SolverSession.create("z3");
|
|
305
|
+
try {
|
|
306
|
+
const result = await session.solve({
|
|
307
|
+
type: "z3",
|
|
308
|
+
smtlib: `(declare-const x Int) (assert (> x 5))`,
|
|
309
|
+
});
|
|
310
|
+
if (result.status === "sat") {
|
|
311
|
+
console.log("Satisfiable:", result.model);
|
|
312
|
+
}
|
|
313
|
+
} finally {
|
|
314
|
+
session.dispose();
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Graph Analysis
|
|
319
|
+
|
|
320
|
+
```ts
|
|
321
|
+
import { extractGraph, runAnalysis } from "chiasmus/graph";
|
|
322
|
+
|
|
323
|
+
const result = await runAnalysis(
|
|
324
|
+
["src/server.ts", "src/db.ts"],
|
|
325
|
+
{ analysis: "dead-code" }
|
|
326
|
+
);
|
|
327
|
+
console.log(result.result);
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Lint & Validation
|
|
331
|
+
|
|
332
|
+
```ts
|
|
333
|
+
import { lintSpec } from "chiasmus/formalize";
|
|
334
|
+
|
|
335
|
+
const { spec, fixes, errors } = lintSpec(rawSpec, "z3");
|
|
336
|
+
if (errors.length > 0) {
|
|
337
|
+
console.error("Lint errors:", errors);
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### Skill Library
|
|
342
|
+
|
|
343
|
+
```ts
|
|
344
|
+
import { SkillLibrary } from "chiasmus/skills";
|
|
345
|
+
import { join } from "node:path";
|
|
346
|
+
import { homedir } from "node:os";
|
|
347
|
+
|
|
348
|
+
const library = await SkillLibrary.create(join(homedir(), ".chiasmus"));
|
|
349
|
+
const results = library.search("access control policy conflict");
|
|
350
|
+
console.log(results);
|
|
351
|
+
library.close();
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Exports
|
|
355
|
+
|
|
356
|
+
| Subpath | Exports |
|
|
357
|
+
|---------|---------|
|
|
358
|
+
| `chiasmus` | All public APIs (barrel export) |
|
|
359
|
+
| `chiasmus/solvers` | `SolverSession`, `createZ3Solver`, `createPrologSolver`, `correctionLoop`, solver types |
|
|
360
|
+
| `chiasmus/graph` | `extractGraph`, `runAnalysis`, `runAnalysisFromGraph`, `parseMermaid`, `graphToProlog`, adapter registry, graph types |
|
|
361
|
+
| `chiasmus/formalize` | `lintSpec`, `classifyFeedback`, `extractPrologQuery`, `FormalizationEngine`, result types |
|
|
362
|
+
| `chiasmus/skills` | `SkillLibrary`, `SkillLearner`, `craftTemplate`, `validateTemplate`, skill types |
|
|
363
|
+
| `chiasmus/llm` | `createLLMFromEnv`, `AnthropicAdapter`, `OpenAICompatibleAdapter`, LLM types |
|
|
364
|
+
| `chiasmus/mcp` | `createChiasmusServer`, `getChiasmusHome` |
|
|
365
|
+
|
|
275
366
|
## Configuration
|
|
276
367
|
|
|
277
368
|
| Variable | Default | Purpose |
|
|
@@ -26,7 +26,7 @@ export declare class FormalizationEngine {
|
|
|
26
26
|
* Formalize a problem: select a template and return it with
|
|
27
27
|
* fill instructions. Does NOT execute or call the LLM for filling.
|
|
28
28
|
*/
|
|
29
|
-
formalize(problem: string): Promise<FormalizeResult>;
|
|
29
|
+
formalize(problem: string): Promise<FormalizeResult | null>;
|
|
30
30
|
/**
|
|
31
31
|
* End-to-end solve: select template, ask LLM to fill slots,
|
|
32
32
|
* submit to solver with correction loop.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/formalize/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAe,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/formalize/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAe,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAKvE,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,wDAAwD;IACxD,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAmBD,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,GAAG;gBADH,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,UAAU;IAGzB;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAejE;;;OAGG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAI,GAAG,OAAO,CAAC,WAAW,CAAC;IAmDjE,OAAO,CAAC,iBAAiB;YAwCX,OAAO;YAUP,MAAM;IAwBpB,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;YACW,QAAQ;IAuCtB,gEAAgE;IAChE,OAAO,CAAC,aAAa;CAMtB"}
|
package/dist/formalize/engine.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { correctionLoop } from "../solvers/correction-loop.js";
|
|
2
2
|
import { lintSpec } from "./validate.js";
|
|
3
3
|
import { classifyFeedback } from "./feedback.js";
|
|
4
|
+
import { extractPrologQuery } from "./prolog-input.js";
|
|
4
5
|
const FORMALIZE_SYSTEM = `Formalization engine. Translate natural language → formal logic.
|
|
5
6
|
|
|
6
7
|
Template = starting point. Fill slots, but adapt structure if needed. Add/remove variables, assertions, rules.
|
|
@@ -29,9 +30,17 @@ export class FormalizationEngine {
|
|
|
29
30
|
*/
|
|
30
31
|
async formalize(problem) {
|
|
31
32
|
const results = this.library.search(problem, { limit: 1 });
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
let template = null;
|
|
34
|
+
if (results.length > 0) {
|
|
35
|
+
template = results[0].template;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const fallback = this.library.list()[0];
|
|
39
|
+
if (fallback)
|
|
40
|
+
template = fallback.template;
|
|
41
|
+
}
|
|
42
|
+
if (!template)
|
|
43
|
+
return null;
|
|
35
44
|
const instructions = this.buildInstructions(problem, template);
|
|
36
45
|
return { template, instructions };
|
|
37
46
|
}
|
|
@@ -40,7 +49,18 @@ export class FormalizationEngine {
|
|
|
40
49
|
* submit to solver with correction loop.
|
|
41
50
|
*/
|
|
42
51
|
async solve(problem, maxRounds = 5) {
|
|
43
|
-
const
|
|
52
|
+
const formalized = await this.formalize(problem);
|
|
53
|
+
if (!formalized) {
|
|
54
|
+
return {
|
|
55
|
+
result: { status: "error", error: "No matching template found in the skill library" },
|
|
56
|
+
converged: false,
|
|
57
|
+
rounds: 0,
|
|
58
|
+
history: [],
|
|
59
|
+
templateUsed: null,
|
|
60
|
+
answers: [],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const { template } = formalized;
|
|
44
64
|
// Ask LLM to fill the template
|
|
45
65
|
let filledSpec = await this.llmFill(problem, template);
|
|
46
66
|
// Lint loop: auto-fix what we can, ask LLM to fix the rest
|
|
@@ -130,18 +150,7 @@ Fix the specification and return only the corrected version.`,
|
|
|
130
150
|
if (template.solver === "z3") {
|
|
131
151
|
return { type: "z3", smtlib: spec };
|
|
132
152
|
}
|
|
133
|
-
|
|
134
|
-
const lines = spec.split("\n");
|
|
135
|
-
let program = spec;
|
|
136
|
-
let query = "true.";
|
|
137
|
-
for (let i = lines.length - 1; i >= 0; i--) {
|
|
138
|
-
const trimmed = lines[i].trim();
|
|
139
|
-
if (trimmed.startsWith("?-")) {
|
|
140
|
-
query = trimmed.replace(/^\?\-\s*/, "");
|
|
141
|
-
program = lines.slice(0, i).join("\n").trim();
|
|
142
|
-
break;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
153
|
+
const { program, query } = extractPrologQuery(spec);
|
|
145
154
|
return { type: "prolog", program, query };
|
|
146
155
|
}
|
|
147
156
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/formalize/engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/formalize/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { lintSpec } from "./validate.js";
|
|
2
|
+
export type { LintResult } from "./validate.js";
|
|
3
|
+
export { classifyFeedback } from "./feedback.js";
|
|
4
|
+
export { extractPrologQuery } from "./prolog-input.js";
|
|
5
|
+
export { FormalizationEngine } from "./engine.js";
|
|
6
|
+
export type { FormalizeResult, SolveResult } from "./engine.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formalize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formalize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility for extracting a Prolog query from a spec string.
|
|
3
|
+
* Looks for the last line starting with "?-" and separates program from query.
|
|
4
|
+
*/
|
|
5
|
+
export declare function extractPrologQuery(spec: string): {
|
|
6
|
+
program: string;
|
|
7
|
+
query: string;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=prolog-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prolog-input.d.ts","sourceRoot":"","sources":["../../src/formalize/prolog-input.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GACX;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAepC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility for extracting a Prolog query from a spec string.
|
|
3
|
+
* Looks for the last line starting with "?-" and separates program from query.
|
|
4
|
+
*/
|
|
5
|
+
export function extractPrologQuery(spec) {
|
|
6
|
+
const lines = spec.split("\n");
|
|
7
|
+
let program = spec;
|
|
8
|
+
let query = "true.";
|
|
9
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
10
|
+
const trimmed = lines[i].trim();
|
|
11
|
+
if (trimmed.startsWith("?-")) {
|
|
12
|
+
query = trimmed.replace(/^\?\-\s*/, "");
|
|
13
|
+
program = lines.slice(0, i).join("\n").trim();
|
|
14
|
+
break;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return { program, query };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=prolog-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prolog-input.js","sourceRoot":"","sources":["../../src/formalize/prolog-input.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAY;IAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,KAAK,GAAG,OAAO,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACxC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -57,12 +57,17 @@ function lintSmtlib(spec, fixes, errors) {
|
|
|
57
57
|
let depth = 0;
|
|
58
58
|
for (let i = 0; i < cleaned.length; i++) {
|
|
59
59
|
const ch = cleaned[i];
|
|
60
|
-
// Skip string literals
|
|
60
|
+
// Skip string literals (SMT-LIB uses "" to escape " within strings)
|
|
61
61
|
if (ch === '"') {
|
|
62
62
|
i++;
|
|
63
|
-
while (i < cleaned.length
|
|
64
|
-
if (cleaned[i] === '
|
|
65
|
-
i
|
|
63
|
+
while (i < cleaned.length) {
|
|
64
|
+
if (cleaned[i] === '"') {
|
|
65
|
+
if (i + 1 < cleaned.length && cleaned[i + 1] === '"') {
|
|
66
|
+
i += 2; // skip doubled quote
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
break; // end of string
|
|
70
|
+
}
|
|
66
71
|
i++;
|
|
67
72
|
}
|
|
68
73
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/formalize/validate.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/formalize/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/graph/analyses.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { extractGraph } from "./extractor.js";
|
|
3
|
-
import { graphToProlog } from "./facts.js";
|
|
3
|
+
import { graphToProlog, escapeAtom } from "./facts.js";
|
|
4
4
|
import { createPrologSolver } from "../solvers/prolog-solver.js";
|
|
5
5
|
/** Run a graph analysis on the given source files */
|
|
6
6
|
export async function runAnalysis(filePaths, request) {
|
|
@@ -73,15 +73,15 @@ function buildQuery(request) {
|
|
|
73
73
|
case "callers":
|
|
74
74
|
if (!request.target)
|
|
75
75
|
return null;
|
|
76
|
-
return `caller_of(${request.target}, X).`;
|
|
76
|
+
return `caller_of(${escapeAtom(request.target)}, X).`;
|
|
77
77
|
case "callees":
|
|
78
78
|
if (!request.target)
|
|
79
79
|
return null;
|
|
80
|
-
return `callee_of(${request.target}, X).`;
|
|
80
|
+
return `callee_of(${escapeAtom(request.target)}, X).`;
|
|
81
81
|
case "reachability":
|
|
82
82
|
if (!request.from || !request.to)
|
|
83
83
|
return null;
|
|
84
|
-
return `reaches(${request.from}, ${request.to}).`;
|
|
84
|
+
return `reaches(${escapeAtom(request.from)}, ${escapeAtom(request.to)}).`;
|
|
85
85
|
case "dead-code":
|
|
86
86
|
return "dead(X).";
|
|
87
87
|
case "cycles":
|
|
@@ -89,11 +89,11 @@ function buildQuery(request) {
|
|
|
89
89
|
case "path":
|
|
90
90
|
if (!request.from || !request.to)
|
|
91
91
|
return null;
|
|
92
|
-
return `path(${request.from}, ${request.to}, Path).`;
|
|
92
|
+
return `path(${escapeAtom(request.from)}, ${escapeAtom(request.to)}, Path).`;
|
|
93
93
|
case "impact":
|
|
94
94
|
if (!request.target)
|
|
95
95
|
return null;
|
|
96
|
-
return `reaches(X, ${request.target}).`;
|
|
96
|
+
return `reaches(X, ${escapeAtom(request.target)}).`;
|
|
97
97
|
default:
|
|
98
98
|
return null;
|
|
99
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyses.js","sourceRoot":"","sources":["../../src/graph/analyses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"analyses.js","sourceRoot":"","sources":["../../src/graph/analyses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAqBjE,qDAAqD;AACrD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAmB,EACnB,OAAwB;IAExB,uBAAuB;IACvB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,EAAE,CAAC;QACP,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;KAClC,CAAC,CAAC,CAAC;IAEJ,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE1D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,EAAE,CAAC;IAC1F,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5E,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;IAC9F,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAgB,EAChB,OAAwB;IAExB,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE1D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,EAAE,CAAC;IAC1F,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5E,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;IAC9F,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAgB;IACpC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACnG,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACvE,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,SAAS;QACT,OAAO;QACP,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;QAC7B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;QAC7B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,OAAwB;IAC1C,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,SAAS;YACZ,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACjC,OAAO,aAAa,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAExD,KAAK,SAAS;YACZ,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACjC,OAAO,aAAa,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAExD,KAAK,cAAc;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YAC9C,OAAO,WAAW,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;QAE5E,KAAK,WAAW;YACd,OAAO,UAAU,CAAC;QAEpB,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC;QAE1B,KAAK,MAAM;YACT,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YAC9C,OAAO,QAAQ,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC;QAE/E,KAAK,QAAQ;YACX,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACjC,OAAO,cAAc,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAEtD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,QAAsB,EAAE,YAA0B;IACtE,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,6BAA6B,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;IAErC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS,CAAC;QACf,KAAK,SAAS,CAAC;QACf,KAAK,WAAW;YACd,OAAO,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE3C,KAAK,cAAc;YACjB,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAE3C,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC/C,2CAA2C;YAC3C,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC;aAC1D,CAAC;QACJ,CAAC;QAED,KAAK,QAAQ;YACX,OAAO,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE3C;YACE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAuB,EAAE,QAAgB;IACpE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/graph/extractor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAkE,MAAM,YAAY,CAAC;AAE5G,8DAA8D;AAC9D,wBAAsB,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/graph/extractor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAkE,MAAM,YAAY,CAAC;AAE5G,8DAA8D;AAC9D,wBAAsB,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CA2CtG"}
|
package/dist/graph/extractor.js
CHANGED
|
@@ -7,8 +7,8 @@ export async function extractGraph(files) {
|
|
|
7
7
|
const imports = [];
|
|
8
8
|
const exports = [];
|
|
9
9
|
const contains = [];
|
|
10
|
-
const callSet = new Set(); // deduplicate caller→callee
|
|
11
10
|
for (const file of files) {
|
|
11
|
+
const callSet = new Set(); // deduplicate caller→callee per file
|
|
12
12
|
const lang = getLanguageForFile(file.path);
|
|
13
13
|
if (!lang)
|
|
14
14
|
continue;
|
|
@@ -88,12 +88,16 @@ function walkNode(node, filePath, language, scopeStack, defines, calls, imports,
|
|
|
88
88
|
const name = node.childForFieldName("name")?.text;
|
|
89
89
|
if (name) {
|
|
90
90
|
defines.push({ file: filePath, name, kind: "class", line: node.startPosition.row + 1 });
|
|
91
|
+
scopeStack.push(name);
|
|
92
|
+
walkChildren(node, filePath, language, scopeStack, defines, calls, imports, exports, contains, callSet);
|
|
93
|
+
scopeStack.pop();
|
|
94
|
+
return;
|
|
91
95
|
}
|
|
92
|
-
break;
|
|
96
|
+
break;
|
|
93
97
|
}
|
|
94
98
|
case "lexical_declaration":
|
|
95
99
|
case "variable_declaration": {
|
|
96
|
-
|
|
100
|
+
let foundArrow = false;
|
|
97
101
|
for (let i = 0; i < node.childCount; i++) {
|
|
98
102
|
const child = node.child(i);
|
|
99
103
|
if (child.type === "variable_declarator") {
|
|
@@ -105,10 +109,15 @@ function walkNode(node, filePath, language, scopeStack, defines, calls, imports,
|
|
|
105
109
|
scopeStack.push(name);
|
|
106
110
|
walkChildren(valueNode, filePath, language, scopeStack, defines, calls, imports, exports, contains, callSet);
|
|
107
111
|
scopeStack.pop();
|
|
108
|
-
|
|
112
|
+
foundArrow = true;
|
|
113
|
+
}
|
|
114
|
+
else if (valueNode) {
|
|
115
|
+
walkChildren(child, filePath, language, scopeStack, defines, calls, imports, exports, contains, callSet);
|
|
109
116
|
}
|
|
110
117
|
}
|
|
111
118
|
}
|
|
119
|
+
if (foundArrow)
|
|
120
|
+
return;
|
|
112
121
|
break;
|
|
113
122
|
}
|
|
114
123
|
case "call_expression": {
|
|
@@ -271,12 +280,12 @@ function extractStringContent(node) {
|
|
|
271
280
|
return child.text;
|
|
272
281
|
}
|
|
273
282
|
}
|
|
274
|
-
// Fallback: strip quotes from the full text
|
|
283
|
+
// Fallback: strip quotes/backticks from the full text
|
|
275
284
|
const text = node.text;
|
|
276
|
-
if ((text.startsWith("'") && text.endsWith("'")) || (text.startsWith('"') && text.endsWith('"'))) {
|
|
285
|
+
if ((text.startsWith("'") && text.endsWith("'")) || (text.startsWith('"') && text.endsWith('"')) || (text.startsWith("`") && text.endsWith("`"))) {
|
|
277
286
|
return text.slice(1, -1);
|
|
278
287
|
}
|
|
279
|
-
return
|
|
288
|
+
return null;
|
|
280
289
|
}
|
|
281
290
|
// ── Python extraction ───────────────────────────────────────────────
|
|
282
291
|
function walkPython(node, filePath, scopeStack, defines, calls, imports, exports, contains, callSet) {
|
|
@@ -310,7 +319,7 @@ function walkPython(node, filePath, scopeStack, defines, calls, imports, exports
|
|
|
310
319
|
break;
|
|
311
320
|
}
|
|
312
321
|
case "decorated_definition": {
|
|
313
|
-
//
|
|
322
|
+
// Falls through to walkPythonChildren to process the definition inside
|
|
314
323
|
break;
|
|
315
324
|
}
|
|
316
325
|
case "call": {
|
|
@@ -688,11 +697,11 @@ function walkClojure(rootNode, filePath, defines, calls, imports, exports, callS
|
|
|
688
697
|
if (!defn)
|
|
689
698
|
continue;
|
|
690
699
|
// Walk the body looking for call sites (list_lit starting with sym_lit)
|
|
691
|
-
cljExtractCalls(child, defn.name, calls, callSet
|
|
700
|
+
cljExtractCalls(child, defn.name, calls, callSet);
|
|
692
701
|
}
|
|
693
702
|
}
|
|
694
703
|
/** Recursively extract function calls from a Clojure form */
|
|
695
|
-
function cljExtractCalls(node, enclosingFn, calls, callSet
|
|
704
|
+
function cljExtractCalls(node, enclosingFn, calls, callSet) {
|
|
696
705
|
for (let i = 0; i < node.childCount; i++) {
|
|
697
706
|
const child = node.child(i);
|
|
698
707
|
if (child.type === "list_lit") {
|
|
@@ -715,8 +724,10 @@ function cljExtractCalls(node, enclosingFn, calls, callSet, skipSelf) {
|
|
|
715
724
|
break;
|
|
716
725
|
}
|
|
717
726
|
}
|
|
718
|
-
|
|
719
|
-
|
|
727
|
+
}
|
|
728
|
+
// Recurse into nested forms (list, vec, map, set)
|
|
729
|
+
if (child.type === "list_lit" || child.type === "vec_lit" || child.type === "map_lit" || child.type === "set_lit") {
|
|
730
|
+
cljExtractCalls(child, enclosingFn, calls, callSet);
|
|
720
731
|
}
|
|
721
732
|
}
|
|
722
733
|
}
|