prolog-trace-viz 2.1.2 → 2.3.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/dist/build-info.d.ts +3 -3
- package/dist/build-info.js +3 -3
- package/dist/cli.d.ts +3 -3
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/timeline-formatter.d.ts +4 -2
- package/dist/timeline-formatter.d.ts.map +1 -1
- package/dist/timeline-formatter.js +80 -138
- package/dist/timeline-formatter.js.map +1 -1
- package/dist/timeline.d.ts +46 -90
- package/dist/timeline.d.ts.map +1 -1
- package/dist/timeline.js +304 -594
- package/dist/timeline.js.map +1 -1
- package/package.json +1 -1
package/dist/build-info.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export declare const BUILD_INFO: {
|
|
2
|
-
readonly version: "2.
|
|
2
|
+
readonly version: "2.3.0";
|
|
3
3
|
readonly name: "prolog-trace-viz";
|
|
4
4
|
readonly description: "Generate enhanced visual trace diagrams for Prolog query execution";
|
|
5
5
|
readonly author: "Johnny Jarecsni <johnny.jarecsni@icloud.com>";
|
|
6
6
|
readonly license: "MIT";
|
|
7
|
-
readonly buildTimestamp: "
|
|
8
|
-
readonly gitCommit: "
|
|
7
|
+
readonly buildTimestamp: "2026-01-11T12:50:46.848Z";
|
|
8
|
+
readonly gitCommit: "002ebc3";
|
|
9
9
|
readonly gitBranch: "main";
|
|
10
10
|
readonly nodeVersion: "v22.17.0";
|
|
11
11
|
readonly platform: "darwin";
|
package/dist/build-info.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// This file is auto-generated during build
|
|
2
2
|
// Do not edit manually - regenerated on each build
|
|
3
3
|
export const BUILD_INFO = {
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.3.0",
|
|
5
5
|
"name": "prolog-trace-viz",
|
|
6
6
|
"description": "Generate enhanced visual trace diagrams for Prolog query execution",
|
|
7
7
|
"author": "Johnny Jarecsni <johnny.jarecsni@icloud.com>",
|
|
8
8
|
"license": "MIT",
|
|
9
|
-
"buildTimestamp": "
|
|
10
|
-
"gitCommit": "
|
|
9
|
+
"buildTimestamp": "2026-01-11T12:50:46.848Z",
|
|
10
|
+
"gitCommit": "002ebc3",
|
|
11
11
|
"gitBranch": "main",
|
|
12
12
|
"nodeVersion": "v22.17.0",
|
|
13
13
|
"platform": "darwin",
|
package/dist/cli.d.ts
CHANGED
|
@@ -17,13 +17,13 @@ export declare function getHelpText(): string;
|
|
|
17
17
|
export declare function getVersion(): string;
|
|
18
18
|
export declare function getCopyright(): string;
|
|
19
19
|
export declare function getBuildInfo(): {
|
|
20
|
-
readonly version: "2.
|
|
20
|
+
readonly version: "2.3.0";
|
|
21
21
|
readonly name: "prolog-trace-viz";
|
|
22
22
|
readonly description: "Generate enhanced visual trace diagrams for Prolog query execution";
|
|
23
23
|
readonly author: "Johnny Jarecsni <johnny.jarecsni@icloud.com>";
|
|
24
24
|
readonly license: "MIT";
|
|
25
|
-
readonly buildTimestamp: "
|
|
26
|
-
readonly gitCommit: "
|
|
25
|
+
readonly buildTimestamp: "2026-01-11T12:50:46.848Z";
|
|
26
|
+
readonly gitCommit: "002ebc3";
|
|
27
27
|
readonly gitBranch: "main";
|
|
28
28
|
readonly nodeVersion: "v22.17.0";
|
|
29
29
|
readonly platform: "darwin";
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import { executeTracer, checkDependencies } from './executor.js';
|
|
|
7
7
|
import * as path from 'node:path';
|
|
8
8
|
import { writeOutput, logVerbose, logInfo, logError } from './output.js';
|
|
9
9
|
import { parsePrologFile, buildSourceClauseMap } from './clauses.js';
|
|
10
|
-
import { TimelineBuilder } from './timeline.js';
|
|
10
|
+
import { TimelineBuilder, flattenTimeline } from './timeline.js';
|
|
11
11
|
import { TreeBuilder } from './tree.js';
|
|
12
12
|
import { generateMarkdown } from './markdown-generator.js';
|
|
13
13
|
/**
|
|
@@ -137,9 +137,10 @@ async function run(options) {
|
|
|
137
137
|
logVerbose('Building execution timeline...', options);
|
|
138
138
|
const timelineBuilder = new TimelineBuilder(traceEvents, sourceClauseMap, options.query);
|
|
139
139
|
const timeline = timelineBuilder.build();
|
|
140
|
+
const flatTimeline = flattenTimeline(timeline);
|
|
140
141
|
// Build tree
|
|
141
142
|
logVerbose('Building call tree...', options);
|
|
142
|
-
const treeBuilder = new TreeBuilder(traceEvents, sourceClauseMap,
|
|
143
|
+
const treeBuilder = new TreeBuilder(traceEvents, sourceClauseMap, flatTimeline);
|
|
143
144
|
const tree = treeBuilder.build();
|
|
144
145
|
// Prepare clause definitions
|
|
145
146
|
const clauseDefinitions = clauses.map(c => ({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAc,MAAM,UAAU,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,eAAe,EAAc,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Timeline Formatter - Formats timeline steps into markdown
|
|
2
|
+
* Timeline Formatter - Formats nested timeline steps into markdown
|
|
3
|
+
*
|
|
4
|
+
* Renders a hierarchical view where child calls are visually nested inside their parents.
|
|
3
5
|
*/
|
|
4
6
|
import { TimelineStep } from './timeline.js';
|
|
5
7
|
/**
|
|
6
|
-
* Format timeline steps into markdown
|
|
8
|
+
* Format timeline steps into markdown with nested structure
|
|
7
9
|
*/
|
|
8
10
|
export declare function formatTimeline(steps: TimelineStep[]): string;
|
|
9
11
|
//# sourceMappingURL=timeline-formatter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline-formatter.d.ts","sourceRoot":"","sources":["../src/timeline-formatter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"timeline-formatter.d.ts","sourceRoot":"","sources":["../src/timeline-formatter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAS5D"}
|
|
@@ -1,192 +1,134 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Timeline Formatter - Formats timeline steps into markdown
|
|
2
|
+
* Timeline Formatter - Formats nested timeline steps into markdown
|
|
3
|
+
*
|
|
4
|
+
* Renders a hierarchical view where child calls are visually nested inside their parents.
|
|
3
5
|
*/
|
|
4
6
|
/**
|
|
5
|
-
* Format timeline steps into markdown
|
|
7
|
+
* Format timeline steps into markdown with nested structure
|
|
6
8
|
*/
|
|
7
9
|
export function formatTimeline(steps) {
|
|
8
10
|
const lines = [];
|
|
9
11
|
for (const step of steps) {
|
|
10
|
-
lines.push(...
|
|
12
|
+
lines.push(...formatStepNested(step, 0));
|
|
11
13
|
lines.push('');
|
|
12
14
|
}
|
|
13
15
|
return lines.join('\n');
|
|
14
16
|
}
|
|
15
17
|
/**
|
|
16
|
-
* Format a single timeline step
|
|
18
|
+
* Format a single timeline step with nesting support
|
|
19
|
+
* @param step The step to format
|
|
20
|
+
* @param depth Current nesting depth (0 = root level)
|
|
17
21
|
*/
|
|
18
|
-
function
|
|
22
|
+
function formatStepNested(step, depth) {
|
|
19
23
|
const lines = [];
|
|
24
|
+
const indent = '│ '.repeat(depth);
|
|
20
25
|
// Step header with box drawing
|
|
21
26
|
const portLabel = step.port === 'merged' ? '' : step.port.toUpperCase() + ' ';
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
// subgoalLabel is like "[1.1]", strip brackets for cleaner display
|
|
28
|
+
const subgoalMarker = step.subgoalLabel ? ` [Goal ${step.subgoalLabel.slice(1, -1)}]` : '';
|
|
29
|
+
// Build goal display: show template → instantiated if we have binding context
|
|
30
|
+
let goalDisplay = `${portLabel}${step.goal}`;
|
|
31
|
+
if (step.subgoalTemplate && step.subgoalBindings && step.subgoalBindings.length > 0) {
|
|
32
|
+
goalDisplay = `${portLabel}${step.subgoalTemplate} → ${step.goal}`;
|
|
33
|
+
}
|
|
34
|
+
lines.push(`${indent}┌─ Step ${step.stepNumber}${subgoalMarker}: ${goalDisplay}`);
|
|
35
|
+
// Show binding context if we have bindings from sibling steps
|
|
36
|
+
if (step.subgoalBindings && step.subgoalBindings.length > 0) {
|
|
37
|
+
for (const binding of step.subgoalBindings) {
|
|
38
|
+
lines.push(`${indent}│ where ${binding.variable} = ${binding.value} (from Step ${binding.fromStep})`);
|
|
39
|
+
}
|
|
26
40
|
}
|
|
27
41
|
// Format based on port type
|
|
28
42
|
switch (step.port) {
|
|
29
43
|
case 'call':
|
|
30
|
-
lines.push(...formatCallStep(step));
|
|
31
|
-
break;
|
|
32
44
|
case 'merged':
|
|
33
|
-
lines.push(...
|
|
34
|
-
break;
|
|
35
|
-
case 'exit':
|
|
36
|
-
lines.push(...formatExitStep(step));
|
|
45
|
+
lines.push(...formatMergedContent(step, indent));
|
|
37
46
|
break;
|
|
38
47
|
case 'redo':
|
|
39
|
-
lines.push(
|
|
48
|
+
lines.push(`${indent}│ Backtracking...`);
|
|
40
49
|
break;
|
|
41
50
|
case 'fail':
|
|
42
|
-
lines.push(
|
|
51
|
+
lines.push(`${indent}│ Failure`);
|
|
43
52
|
break;
|
|
44
53
|
}
|
|
45
|
-
|
|
54
|
+
// Render children (nested inside this step)
|
|
55
|
+
if (step.children.length > 0) {
|
|
56
|
+
lines.push(`${indent}│ `);
|
|
57
|
+
for (const child of step.children) {
|
|
58
|
+
lines.push(...formatStepNested(child, depth + 1));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Show result AFTER children (this is the key insight!)
|
|
62
|
+
if (step.port === 'merged' && step.result) {
|
|
63
|
+
// Extract the output variable from the goal (last argument, typically unbound)
|
|
64
|
+
const goalMatch = step.goal.match(/^[^(]+\((.+)\)$/);
|
|
65
|
+
let outputVar = '?';
|
|
66
|
+
if (goalMatch) {
|
|
67
|
+
const args = splitArgs(goalMatch[1]);
|
|
68
|
+
outputVar = args[args.length - 1] || '?';
|
|
69
|
+
}
|
|
70
|
+
lines.push(`${indent}│ => ${outputVar} = ${step.result}`);
|
|
71
|
+
// Show query variable state only on root-level steps (depth 0)
|
|
72
|
+
// This prevents showing "A = ?" on intermediate steps
|
|
73
|
+
if (depth === 0 && step.queryVarState) {
|
|
74
|
+
lines.push(`${indent}│ Query Variable: ${step.queryVarState}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
lines.push(`${indent}└─`);
|
|
46
78
|
return lines;
|
|
47
79
|
}
|
|
48
80
|
/**
|
|
49
|
-
*
|
|
81
|
+
* Split arguments respecting nested brackets
|
|
50
82
|
*/
|
|
51
|
-
function
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (step.unifications.length > 0) {
|
|
60
|
-
lines.push('│ Unifications:');
|
|
61
|
-
for (const unif of step.unifications) {
|
|
62
|
-
lines.push(`│ ${unif.variable} = ${unif.value}`);
|
|
63
|
-
}
|
|
83
|
+
function splitArgs(argsStr) {
|
|
84
|
+
const args = [];
|
|
85
|
+
let current = '';
|
|
86
|
+
let depth = 0;
|
|
87
|
+
for (const char of argsStr) {
|
|
88
|
+
if (char === '(' || char === '[') {
|
|
89
|
+
depth++;
|
|
90
|
+
current += char;
|
|
64
91
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
for (const subgoal of step.subgoals) {
|
|
69
|
-
lines.push(`│ ${subgoal.label} ${subgoal.goal}`);
|
|
70
|
-
}
|
|
92
|
+
else if (char === ')' || char === ']') {
|
|
93
|
+
depth--;
|
|
94
|
+
current += char;
|
|
71
95
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
96
|
+
else if (char === ',' && depth === 0) {
|
|
97
|
+
args.push(current.trim());
|
|
98
|
+
current = '';
|
|
75
99
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
lines.push('│ Query Variable: ' + step.queryVarState);
|
|
79
|
-
}
|
|
80
|
-
// Show parent context if available
|
|
81
|
-
if (step.parentContext) {
|
|
82
|
-
lines.push('│ ' + step.parentContext);
|
|
100
|
+
else {
|
|
101
|
+
current += char;
|
|
83
102
|
}
|
|
84
103
|
}
|
|
85
|
-
|
|
104
|
+
if (current.trim()) {
|
|
105
|
+
args.push(current.trim());
|
|
106
|
+
}
|
|
107
|
+
return args;
|
|
86
108
|
}
|
|
87
109
|
/**
|
|
88
|
-
* Format CALL step
|
|
110
|
+
* Format merged CALL/EXIT step content (before children)
|
|
89
111
|
*/
|
|
90
|
-
function
|
|
112
|
+
function formatMergedContent(step, indent) {
|
|
91
113
|
const lines = [];
|
|
92
|
-
// Show pattern match if clause available
|
|
93
114
|
if (step.clause) {
|
|
94
|
-
|
|
95
|
-
lines.push(
|
|
96
|
-
lines.push(`│ Goal: ${step.goal}`);
|
|
97
|
-
lines.push(`│ Head: ${step.clause.head}`);
|
|
115
|
+
const clauseLabel = step.clause.body && step.clause.body !== 'true' ? 'Clause' : 'Fact';
|
|
116
|
+
lines.push(`${indent}│ ${clauseLabel}: ${step.clause.head} [line ${step.clause.line}]`);
|
|
98
117
|
// Show unifications if any
|
|
99
118
|
if (step.unifications.length > 0) {
|
|
119
|
+
lines.push(`${indent}│ Unifications:`);
|
|
100
120
|
for (const unif of step.unifications) {
|
|
101
|
-
lines.push(
|
|
121
|
+
lines.push(`${indent}│ ${unif.variable} = ${unif.value}`);
|
|
102
122
|
}
|
|
103
123
|
}
|
|
104
|
-
|
|
105
|
-
// Display clause head and body separately
|
|
106
|
-
if (step.clause.body && step.clause.body !== 'true') {
|
|
107
|
-
// Clause with body
|
|
108
|
-
lines.push(`│ Clause: ${step.clause.head} :- ${step.clause.body} [line ${step.clause.line}]`);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
// Fact (no body)
|
|
112
|
-
lines.push(`│ Clause: ${step.clause.head} [line ${step.clause.line}] (fact)`);
|
|
113
|
-
}
|
|
114
|
-
// Show spawned subgoals
|
|
124
|
+
// Show spawned subgoals (these will be solved by children)
|
|
115
125
|
if (step.subgoals.length > 0) {
|
|
116
|
-
lines.push(
|
|
126
|
+
lines.push(`${indent}│ Subgoals:`);
|
|
117
127
|
for (const subgoal of step.subgoals) {
|
|
118
|
-
lines.push(
|
|
128
|
+
lines.push(`${indent}│ ${subgoal.label} ${subgoal.goal}`);
|
|
119
129
|
}
|
|
120
130
|
}
|
|
121
131
|
}
|
|
122
132
|
return lines;
|
|
123
133
|
}
|
|
124
|
-
/**
|
|
125
|
-
* Format EXIT step
|
|
126
|
-
*/
|
|
127
|
-
function formatExitStep(step) {
|
|
128
|
-
const lines = [];
|
|
129
|
-
// Show completed subgoal marker
|
|
130
|
-
if (step.subgoalLabel) {
|
|
131
|
-
lines.push(`│ ◀── Completed subgoal ${step.subgoalLabel}`);
|
|
132
|
-
}
|
|
133
|
-
// Show bindings
|
|
134
|
-
if (step.unifications.length > 0) {
|
|
135
|
-
lines.push('│ Bindings:');
|
|
136
|
-
for (const unif of step.unifications) {
|
|
137
|
-
lines.push(`│ ${unif.variable} = ${unif.value}`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
// Show return-to reference
|
|
141
|
-
if (step.returnsTo) {
|
|
142
|
-
lines.push(`│ Returns to: Step ${step.returnsTo}`);
|
|
143
|
-
}
|
|
144
|
-
// Show variable flow notes
|
|
145
|
-
if (step.variableFlowNotes && step.variableFlowNotes.length > 0) {
|
|
146
|
-
for (const note of step.variableFlowNotes) {
|
|
147
|
-
lines.push(`│ Note: ${note}`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
// Show general note (if any)
|
|
151
|
-
if (step.note) {
|
|
152
|
-
lines.push(`│ Note: ${step.note}`);
|
|
153
|
-
}
|
|
154
|
-
// Show next subgoal
|
|
155
|
-
if (step.nextSubgoal) {
|
|
156
|
-
lines.push(`│ Next: ${step.nextSubgoal}`);
|
|
157
|
-
}
|
|
158
|
-
return lines;
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Format REDO step
|
|
162
|
-
*/
|
|
163
|
-
function formatRedoStep(step) {
|
|
164
|
-
const lines = [];
|
|
165
|
-
if (step.note) {
|
|
166
|
-
lines.push(`│ ${step.note}`);
|
|
167
|
-
}
|
|
168
|
-
if (step.clause) {
|
|
169
|
-
lines.push(`│ Trying clause: ${step.clause.head} [line ${step.clause.line}]`);
|
|
170
|
-
}
|
|
171
|
-
return lines;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Format FAIL step
|
|
175
|
-
*/
|
|
176
|
-
function formatFailStep(step) {
|
|
177
|
-
const lines = [];
|
|
178
|
-
lines.push('│ Failure');
|
|
179
|
-
if (step.note) {
|
|
180
|
-
lines.push(`│ ${step.note}`);
|
|
181
|
-
}
|
|
182
|
-
return lines;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Format built-in predicates concisely
|
|
186
|
-
*/
|
|
187
|
-
function isBuiltIn(goal) {
|
|
188
|
-
const builtins = ['>', '<', '>=', '=<', '=:=', '=\\=', 'is', '=', '\\=', 'true'];
|
|
189
|
-
const predicate = goal.match(/^([^(]+)/)?.[1];
|
|
190
|
-
return predicate ? builtins.includes(predicate) : false;
|
|
191
|
-
}
|
|
192
134
|
//# sourceMappingURL=timeline-formatter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline-formatter.js","sourceRoot":"","sources":["../src/timeline-formatter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"timeline-formatter.js","sourceRoot":"","sources":["../src/timeline-formatter.ts"],"names":[],"mappings":"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"}
|