@polintpro/proposit-core 0.1.1 → 0.1.2
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 +182 -8
- package/dist/cli/commands/analysis.d.ts +3 -0
- package/dist/cli/commands/analysis.d.ts.map +1 -0
- package/dist/cli/commands/analysis.js +324 -0
- package/dist/cli/commands/analysis.js.map +1 -0
- package/dist/cli/commands/arguments.d.ts +3 -0
- package/dist/cli/commands/arguments.d.ts.map +1 -0
- package/dist/cli/commands/arguments.js +118 -0
- package/dist/cli/commands/arguments.js.map +1 -0
- package/dist/cli/commands/expressions.d.ts +3 -0
- package/dist/cli/commands/expressions.d.ts.map +1 -0
- package/dist/cli/commands/expressions.js +240 -0
- package/dist/cli/commands/expressions.js.map +1 -0
- package/dist/cli/commands/meta.d.ts +3 -0
- package/dist/cli/commands/meta.d.ts.map +1 -0
- package/dist/cli/commands/meta.js +14 -0
- package/dist/cli/commands/meta.js.map +1 -0
- package/dist/cli/commands/premises.d.ts +3 -0
- package/dist/cli/commands/premises.d.ts.map +1 -0
- package/dist/cli/commands/premises.js +214 -0
- package/dist/cli/commands/premises.js.map +1 -0
- package/dist/cli/commands/render.d.ts +3 -0
- package/dist/cli/commands/render.d.ts.map +1 -0
- package/dist/cli/commands/render.js +25 -0
- package/dist/cli/commands/render.js.map +1 -0
- package/dist/cli/commands/roles.d.ts +3 -0
- package/dist/cli/commands/roles.d.ts.map +1 -0
- package/dist/cli/commands/roles.js +94 -0
- package/dist/cli/commands/roles.js.map +1 -0
- package/dist/cli/commands/variables.d.ts +3 -0
- package/dist/cli/commands/variables.d.ts.map +1 -0
- package/dist/cli/commands/variables.js +173 -0
- package/dist/cli/commands/variables.js.map +1 -0
- package/dist/cli/commands/versionShow.d.ts +3 -0
- package/dist/cli/commands/versionShow.d.ts.map +1 -0
- package/dist/cli/commands/versionShow.js +31 -0
- package/dist/cli/commands/versionShow.js.map +1 -0
- package/dist/cli/config.d.ts +7 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +21 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/engine.d.ts +13 -0
- package/dist/cli/engine.d.ts.map +1 -0
- package/dist/cli/engine.js +71 -0
- package/dist/cli/engine.js.map +1 -0
- package/dist/cli/output.d.ts +5 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +34 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/router.d.ts +14 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +56 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/storage/analysis.d.ts +8 -0
- package/dist/cli/storage/analysis.d.ts.map +1 -0
- package/dist/cli/storage/analysis.js +70 -0
- package/dist/cli/storage/analysis.js.map +1 -0
- package/dist/cli/storage/arguments.d.ts +12 -0
- package/dist/cli/storage/arguments.d.ts.map +1 -0
- package/dist/cli/storage/arguments.js +80 -0
- package/dist/cli/storage/arguments.js.map +1 -0
- package/dist/cli/storage/premises.d.ts +9 -0
- package/dist/cli/storage/premises.d.ts.map +1 -0
- package/dist/cli/storage/premises.js +67 -0
- package/dist/cli/storage/premises.js.map +1 -0
- package/dist/cli/storage/roles.d.ts +4 -0
- package/dist/cli/storage/roles.d.ts.map +1 -0
- package/dist/cli/storage/roles.js +26 -0
- package/dist/cli/storage/roles.js.map +1 -0
- package/dist/cli/storage/variables.d.ts +4 -0
- package/dist/cli/storage/variables.d.ts.map +1 -0
- package/dist/cli/storage/variables.js +28 -0
- package/dist/cli/storage/variables.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +51 -0
- package/dist/cli.js.map +1 -0
- package/dist/lib/core/ArgumentEngine.d.ts +4 -3
- package/dist/lib/core/ArgumentEngine.d.ts.map +1 -1
- package/dist/lib/core/ArgumentEngine.js +11 -3
- package/dist/lib/core/ArgumentEngine.js.map +1 -1
- package/dist/lib/core/ExpressionManager.d.ts +1 -1
- package/dist/lib/core/ExpressionManager.d.ts.map +1 -1
- package/dist/lib/core/ExpressionManager.js +1 -1
- package/dist/lib/core/ExpressionManager.js.map +1 -1
- package/dist/lib/core/PremiseManager.d.ts +3 -2
- package/dist/lib/core/PremiseManager.d.ts.map +1 -1
- package/dist/lib/core/PremiseManager.js +9 -10
- package/dist/lib/core/PremiseManager.js.map +1 -1
- package/dist/lib/core/VariableManager.d.ts +3 -2
- package/dist/lib/core/VariableManager.d.ts.map +1 -1
- package/dist/lib/core/VariableManager.js +13 -0
- package/dist/lib/core/VariableManager.js.map +1 -1
- package/dist/lib/core/evaluation/shared.d.ts +1 -1
- package/dist/lib/core/evaluation/shared.d.ts.map +1 -1
- package/dist/lib/index.d.ts +3 -3
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +3 -3
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/schemata/analysis.d.ts +8 -0
- package/dist/lib/schemata/analysis.d.ts.map +1 -0
- package/dist/lib/schemata/analysis.js +10 -0
- package/dist/lib/schemata/analysis.js.map +1 -0
- package/dist/lib/schemata/argument.d.ts +36 -2
- package/dist/lib/schemata/argument.d.ts.map +1 -1
- package/dist/lib/schemata/argument.js +34 -3
- package/dist/lib/schemata/argument.js.map +1 -1
- package/dist/lib/schemata/index.d.ts +4 -3
- package/dist/lib/schemata/index.d.ts.map +1 -1
- package/dist/lib/schemata/index.js +4 -3
- package/dist/lib/schemata/index.js.map +1 -1
- package/dist/lib/schemata/propositional.d.ts +37 -6
- package/dist/lib/schemata/propositional.d.ts.map +1 -1
- package/dist/lib/schemata/propositional.js +13 -7
- package/dist/lib/schemata/propositional.js.map +1 -1
- package/dist/lib/types/evaluation.d.ts +2 -5
- package/dist/lib/types/evaluation.d.ts.map +1 -1
- package/package.json +7 -2
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
import { getVersionDir } from "../config.js";
|
|
6
|
+
import { errorExit, printJson, printLine, requireConfirmation, } from "../output.js";
|
|
7
|
+
import { copyVersionDir, deleteArgumentDir, deleteVersionDir, latestVersionNumber, listArgumentIds, listVersionNumbers, readArgumentMeta, readVersionMeta, writeArgumentMeta, writeVersionMeta, } from "../storage/arguments.js";
|
|
8
|
+
import { writeVariables } from "../storage/variables.js";
|
|
9
|
+
import { writeRoles } from "../storage/roles.js";
|
|
10
|
+
import { getPremisesDir } from "../config.js";
|
|
11
|
+
export function registerArgumentCommands(program) {
|
|
12
|
+
const args = program.command("arguments").description("Manage arguments");
|
|
13
|
+
args.command("create <title> <description>")
|
|
14
|
+
.description("Create a new argument")
|
|
15
|
+
.action(async (title, description) => {
|
|
16
|
+
const id = randomUUID();
|
|
17
|
+
const createdAt = Date.now();
|
|
18
|
+
await writeArgumentMeta({ id, title, description });
|
|
19
|
+
await writeVersionMeta(id, {
|
|
20
|
+
version: 0,
|
|
21
|
+
createdAt,
|
|
22
|
+
published: false,
|
|
23
|
+
});
|
|
24
|
+
await writeVariables(id, 0, []);
|
|
25
|
+
await writeRoles(id, 0, { supportingPremiseIds: [] });
|
|
26
|
+
await fs.mkdir(getPremisesDir(id, 0), { recursive: true });
|
|
27
|
+
printLine(id);
|
|
28
|
+
});
|
|
29
|
+
args.command("list")
|
|
30
|
+
.description("List all arguments")
|
|
31
|
+
.option("--json", "Output as JSON")
|
|
32
|
+
.action(async (opts) => {
|
|
33
|
+
const ids = await listArgumentIds();
|
|
34
|
+
const items = await Promise.all(ids.map(async (id) => {
|
|
35
|
+
const meta = await readArgumentMeta(id);
|
|
36
|
+
const versions = await listVersionNumbers(id);
|
|
37
|
+
const latestV = versions[versions.length - 1] ?? 0;
|
|
38
|
+
const vMeta = await readVersionMeta(id, latestV);
|
|
39
|
+
return { meta, vMeta };
|
|
40
|
+
}));
|
|
41
|
+
// Sort newest first by createdAt
|
|
42
|
+
items.sort((a, b) => b.vMeta.createdAt - a.vMeta.createdAt);
|
|
43
|
+
if (opts.json) {
|
|
44
|
+
printJson(items.map(({ meta, vMeta }) => ({
|
|
45
|
+
id: meta.id,
|
|
46
|
+
title: meta.title,
|
|
47
|
+
description: meta.description,
|
|
48
|
+
latestVersion: vMeta.version,
|
|
49
|
+
latestCreatedAt: vMeta.createdAt,
|
|
50
|
+
latestPublished: vMeta.published,
|
|
51
|
+
})));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
for (const { meta, vMeta } of items) {
|
|
55
|
+
printLine(`${meta.id} | ${meta.title} (created ${new Date(vMeta.createdAt).toLocaleString()})`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
args.command("delete <argument_id>")
|
|
60
|
+
.description("Delete an argument or its latest version")
|
|
61
|
+
.option("--confirm", "Skip confirmation prompt")
|
|
62
|
+
.option("--all", "Delete all versions")
|
|
63
|
+
.action(async (argumentId, opts) => {
|
|
64
|
+
if (!opts.confirm) {
|
|
65
|
+
await requireConfirmation(`Delete argument "${argumentId}"?`);
|
|
66
|
+
}
|
|
67
|
+
const versions = await listVersionNumbers(argumentId);
|
|
68
|
+
if (versions.length === 0) {
|
|
69
|
+
errorExit(`Argument "${argumentId}" not found.`);
|
|
70
|
+
}
|
|
71
|
+
let deleted = 0;
|
|
72
|
+
if (opts.all || versions.length === 1) {
|
|
73
|
+
deleted = versions.length;
|
|
74
|
+
await deleteArgumentDir(argumentId);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const latest = versions[versions.length - 1];
|
|
78
|
+
await deleteVersionDir(argumentId, latest);
|
|
79
|
+
deleted = 1;
|
|
80
|
+
}
|
|
81
|
+
printLine(`${deleted} argument(s) deleted`);
|
|
82
|
+
});
|
|
83
|
+
args.command("publish <argument_id>")
|
|
84
|
+
.description("Publish the latest version and prepare a new draft")
|
|
85
|
+
.action(async (argumentId) => {
|
|
86
|
+
const V = await latestVersionNumber(argumentId);
|
|
87
|
+
const vMeta = await readVersionMeta(argumentId, V);
|
|
88
|
+
if (vMeta.published) {
|
|
89
|
+
errorExit(`Version ${V} of argument "${argumentId}" is already published.`);
|
|
90
|
+
}
|
|
91
|
+
// Mark old version as published
|
|
92
|
+
await writeVersionMeta(argumentId, {
|
|
93
|
+
...vMeta,
|
|
94
|
+
published: true,
|
|
95
|
+
publishedAt: Date.now(),
|
|
96
|
+
});
|
|
97
|
+
// Copy to new version
|
|
98
|
+
const newV = V + 1;
|
|
99
|
+
await copyVersionDir(argumentId, V, newV);
|
|
100
|
+
// Overwrite new version's meta
|
|
101
|
+
await writeVersionMeta(argumentId, {
|
|
102
|
+
version: newV,
|
|
103
|
+
createdAt: Date.now(),
|
|
104
|
+
published: false,
|
|
105
|
+
});
|
|
106
|
+
// Remove publishedAt from the new version's meta file if it was copied
|
|
107
|
+
const newMetaPath = path.join(getVersionDir(argumentId, newV), "meta.json");
|
|
108
|
+
const newMeta = await readVersionMeta(argumentId, newV);
|
|
109
|
+
const cleanMeta = {
|
|
110
|
+
version: newMeta.version,
|
|
111
|
+
createdAt: newMeta.createdAt,
|
|
112
|
+
published: false,
|
|
113
|
+
};
|
|
114
|
+
await fs.writeFile(newMetaPath, JSON.stringify(cleanMeta, null, 2));
|
|
115
|
+
printLine(`Version ${V} published, draft version ${newV} prepared`);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=arguments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../../src/cli/commands/arguments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/expressions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgCnC,wBAAgB,0BAA0B,CACtC,YAAY,EAAE,OAAO,EACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAChB,IAAI,CAkTN"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { hydrateEngine } from "../engine.js";
|
|
4
|
+
import { errorExit, printJson, printLine } from "../output.js";
|
|
5
|
+
import { readVersionMeta } from "../storage/arguments.js";
|
|
6
|
+
import { premiseExists, readPremiseData, writePremiseData, } from "../storage/premises.js";
|
|
7
|
+
async function assertNotPublished(argumentId, version) {
|
|
8
|
+
const meta = await readVersionMeta(argumentId, version);
|
|
9
|
+
if (meta.published) {
|
|
10
|
+
errorExit(`Version ${version} of argument "${argumentId}" is published and cannot be modified.`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function typeSpecificInfo(expr) {
|
|
14
|
+
if (expr.type === "variable")
|
|
15
|
+
return `variableId=${expr.variableId}`;
|
|
16
|
+
if (expr.type === "operator")
|
|
17
|
+
return `operator=${expr.operator}`;
|
|
18
|
+
return "";
|
|
19
|
+
}
|
|
20
|
+
export function registerExpressionCommands(versionedCmd, argumentId, version) {
|
|
21
|
+
const exprs = versionedCmd
|
|
22
|
+
.command("expressions")
|
|
23
|
+
.description("Manage premise expressions");
|
|
24
|
+
exprs
|
|
25
|
+
.command("create <premise_id>")
|
|
26
|
+
.description("Add an expression to a premise")
|
|
27
|
+
.requiredOption("--type <type>", "Expression type: variable, operator, formula")
|
|
28
|
+
.option("--id <id>", "Expression ID (default: generated UUID)")
|
|
29
|
+
.option("--parent-id <parent_id>", "Parent expression ID (omit for root)")
|
|
30
|
+
.option("--position <n>", "Position among siblings")
|
|
31
|
+
.option("--variable-id <variable_id>", "Variable ID (for type=variable)")
|
|
32
|
+
.option("--operator <op>", "Operator (for type=operator): not,and,or,implies,iff")
|
|
33
|
+
.action(async (premiseId, opts) => {
|
|
34
|
+
await assertNotPublished(argumentId, version);
|
|
35
|
+
if (!(await premiseExists(argumentId, version, premiseId))) {
|
|
36
|
+
errorExit(`Premise "${premiseId}" not found.`);
|
|
37
|
+
}
|
|
38
|
+
const engine = await hydrateEngine(argumentId, version);
|
|
39
|
+
const pm = engine.getPremise(premiseId);
|
|
40
|
+
if (!pm)
|
|
41
|
+
errorExit(`Premise "${premiseId}" not found in engine.`);
|
|
42
|
+
const id = opts.id ?? randomUUID();
|
|
43
|
+
const parentId = opts.parentId ?? null;
|
|
44
|
+
const position = opts.position !== undefined ? Number(opts.position) : null;
|
|
45
|
+
let expression;
|
|
46
|
+
if (opts.type === "variable") {
|
|
47
|
+
if (!opts.variableId)
|
|
48
|
+
errorExit("--variable-id is required for type=variable");
|
|
49
|
+
expression = {
|
|
50
|
+
id,
|
|
51
|
+
argumentId,
|
|
52
|
+
argumentVersion: version,
|
|
53
|
+
parentId,
|
|
54
|
+
position,
|
|
55
|
+
type: "variable",
|
|
56
|
+
variableId: opts.variableId,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
else if (opts.type === "operator") {
|
|
60
|
+
if (!opts.operator)
|
|
61
|
+
errorExit("--operator is required for type=operator");
|
|
62
|
+
expression = {
|
|
63
|
+
id,
|
|
64
|
+
argumentId,
|
|
65
|
+
argumentVersion: version,
|
|
66
|
+
parentId,
|
|
67
|
+
position,
|
|
68
|
+
type: "operator",
|
|
69
|
+
operator: opts.operator,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
else if (opts.type === "formula") {
|
|
73
|
+
expression = {
|
|
74
|
+
id,
|
|
75
|
+
argumentId,
|
|
76
|
+
argumentVersion: version,
|
|
77
|
+
parentId,
|
|
78
|
+
position,
|
|
79
|
+
type: "formula",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
errorExit(`Unknown type "${opts.type}". Use variable, operator, or formula.`);
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
pm.addExpression(expression);
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
errorExit(e instanceof Error
|
|
90
|
+
? e.message
|
|
91
|
+
: "Failed to add expression.");
|
|
92
|
+
}
|
|
93
|
+
await writePremiseData(argumentId, version, premiseId, pm.toData());
|
|
94
|
+
printLine(id);
|
|
95
|
+
});
|
|
96
|
+
exprs
|
|
97
|
+
.command("insert <premise_id>")
|
|
98
|
+
.description("Insert an expression, wrapping existing nodes")
|
|
99
|
+
.requiredOption("--type <type>", "Expression type: variable, operator, formula")
|
|
100
|
+
.option("--id <id>", "Expression ID (default: generated UUID)")
|
|
101
|
+
.option("--parent-id <parent_id>", "Parent expression ID")
|
|
102
|
+
.option("--position <n>", "Position among siblings")
|
|
103
|
+
.option("--variable-id <variable_id>", "Variable ID (for type=variable)")
|
|
104
|
+
.option("--operator <op>", "Operator (for type=operator)")
|
|
105
|
+
.option("--left-node-id <id>", "Left node to wrap")
|
|
106
|
+
.option("--right-node-id <id>", "Right node to wrap")
|
|
107
|
+
.action(async (premiseId, opts) => {
|
|
108
|
+
await assertNotPublished(argumentId, version);
|
|
109
|
+
if (!opts.leftNodeId && !opts.rightNodeId) {
|
|
110
|
+
errorExit("At least one of --left-node-id or --right-node-id is required.");
|
|
111
|
+
}
|
|
112
|
+
if (!(await premiseExists(argumentId, version, premiseId))) {
|
|
113
|
+
errorExit(`Premise "${premiseId}" not found.`);
|
|
114
|
+
}
|
|
115
|
+
const engine = await hydrateEngine(argumentId, version);
|
|
116
|
+
const pm = engine.getPremise(premiseId);
|
|
117
|
+
if (!pm)
|
|
118
|
+
errorExit(`Premise "${premiseId}" not found in engine.`);
|
|
119
|
+
const id = opts.id ?? randomUUID();
|
|
120
|
+
const parentId = opts.parentId ?? null;
|
|
121
|
+
const position = opts.position !== undefined ? Number(opts.position) : null;
|
|
122
|
+
let expression;
|
|
123
|
+
if (opts.type === "variable") {
|
|
124
|
+
if (!opts.variableId)
|
|
125
|
+
errorExit("--variable-id is required for type=variable");
|
|
126
|
+
expression = {
|
|
127
|
+
id,
|
|
128
|
+
argumentId,
|
|
129
|
+
argumentVersion: version,
|
|
130
|
+
parentId,
|
|
131
|
+
position,
|
|
132
|
+
type: "variable",
|
|
133
|
+
variableId: opts.variableId,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
else if (opts.type === "operator") {
|
|
137
|
+
if (!opts.operator)
|
|
138
|
+
errorExit("--operator is required for type=operator");
|
|
139
|
+
expression = {
|
|
140
|
+
id,
|
|
141
|
+
argumentId,
|
|
142
|
+
argumentVersion: version,
|
|
143
|
+
parentId,
|
|
144
|
+
position,
|
|
145
|
+
type: "operator",
|
|
146
|
+
operator: opts.operator,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
else if (opts.type === "formula") {
|
|
150
|
+
expression = {
|
|
151
|
+
id,
|
|
152
|
+
argumentId,
|
|
153
|
+
argumentVersion: version,
|
|
154
|
+
parentId,
|
|
155
|
+
position,
|
|
156
|
+
type: "formula",
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
errorExit(`Unknown type "${opts.type}".`);
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
pm.insertExpression(expression, opts.leftNodeId, opts.rightNodeId);
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
errorExit(e instanceof Error
|
|
167
|
+
? e.message
|
|
168
|
+
: "Failed to insert expression.");
|
|
169
|
+
}
|
|
170
|
+
await writePremiseData(argumentId, version, premiseId, pm.toData());
|
|
171
|
+
printLine(id);
|
|
172
|
+
});
|
|
173
|
+
exprs
|
|
174
|
+
.command("delete <premise_id> <expression_id>")
|
|
175
|
+
.description("Remove an expression and its subtree")
|
|
176
|
+
.action(async (premiseId, expressionId) => {
|
|
177
|
+
await assertNotPublished(argumentId, version);
|
|
178
|
+
if (!(await premiseExists(argumentId, version, premiseId))) {
|
|
179
|
+
errorExit(`Premise "${premiseId}" not found.`);
|
|
180
|
+
}
|
|
181
|
+
const engine = await hydrateEngine(argumentId, version);
|
|
182
|
+
const pm = engine.getPremise(premiseId);
|
|
183
|
+
if (!pm)
|
|
184
|
+
errorExit(`Premise "${premiseId}" not found in engine.`);
|
|
185
|
+
const removed = pm.removeExpression(expressionId);
|
|
186
|
+
if (!removed)
|
|
187
|
+
errorExit(`Expression "${expressionId}" not found.`);
|
|
188
|
+
await writePremiseData(argumentId, version, premiseId, pm.toData());
|
|
189
|
+
printLine("success");
|
|
190
|
+
});
|
|
191
|
+
exprs
|
|
192
|
+
.command("list <premise_id>")
|
|
193
|
+
.description("List all expressions in a premise")
|
|
194
|
+
.option("--json", "Output as JSON")
|
|
195
|
+
.action(async (premiseId, opts) => {
|
|
196
|
+
if (!(await premiseExists(argumentId, version, premiseId))) {
|
|
197
|
+
errorExit(`Premise "${premiseId}" not found.`);
|
|
198
|
+
}
|
|
199
|
+
const data = await readPremiseData(argumentId, version, premiseId);
|
|
200
|
+
const sorted = [...data.expressions].sort((a, b) => a.id.localeCompare(b.id));
|
|
201
|
+
if (opts.json) {
|
|
202
|
+
printJson(sorted);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
for (const expr of sorted) {
|
|
206
|
+
const extra = typeSpecificInfo(expr);
|
|
207
|
+
printLine(`${expr.id} | ${expr.type} | parent=${expr.parentId ?? "null"} | position=${expr.position ?? "null"}${extra ? ` | ${extra}` : ""}`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
exprs
|
|
212
|
+
.command("show <premise_id> <expression_id>")
|
|
213
|
+
.description("Show a single expression")
|
|
214
|
+
.option("--json", "Output as JSON")
|
|
215
|
+
.action(async (premiseId, expressionId, opts) => {
|
|
216
|
+
if (!(await premiseExists(argumentId, version, premiseId))) {
|
|
217
|
+
errorExit(`Premise "${premiseId}" not found.`);
|
|
218
|
+
}
|
|
219
|
+
const data = await readPremiseData(argumentId, version, premiseId);
|
|
220
|
+
const expr = data.expressions.find((e) => e.id === expressionId);
|
|
221
|
+
if (!expr)
|
|
222
|
+
errorExit(`Expression "${expressionId}" not found.`);
|
|
223
|
+
if (opts.json) {
|
|
224
|
+
printJson(expr);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
printLine(`id: ${expr.id}`);
|
|
228
|
+
printLine(`type: ${expr.type}`);
|
|
229
|
+
printLine(`parentId: ${expr.parentId ?? "null"}`);
|
|
230
|
+
printLine(`position: ${expr.position ?? "null"}`);
|
|
231
|
+
if (expr.type === "variable") {
|
|
232
|
+
printLine(`variableId: ${expr.variableId}`);
|
|
233
|
+
}
|
|
234
|
+
if (expr.type === "operator") {
|
|
235
|
+
printLine(`operator: ${expr.operator}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=expressions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../../src/cli/commands/expressions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ3D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { printLine } from "../output.js";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
export function registerMetaCommands(program) {
|
|
6
|
+
program
|
|
7
|
+
.command("version")
|
|
8
|
+
.description("Print the current package version")
|
|
9
|
+
.action(() => {
|
|
10
|
+
const pkg = require("../../../package.json");
|
|
11
|
+
printLine(pkg.version);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/cli/commands/meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9C,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACjD,OAAO;SACF,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,GAAG,EAAE;QACT,MAAM,GAAG,GAAG,OAAO,CAAC,uBAAuB,CAAwB,CAAA;QACnE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"premises.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/premises.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6CnC,wBAAgB,uBAAuB,CACnC,YAAY,EAAE,OAAO,EACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAChB,IAAI,CA+NN"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { PremiseManager } from "../../lib/core/PremiseManager.js";
|
|
4
|
+
import { errorExit, printJson, printLine, requireConfirmation, } from "../output.js";
|
|
5
|
+
import { readArgumentMeta, readVersionMeta } from "../storage/arguments.js";
|
|
6
|
+
import { deletePremiseDir, listPremiseIds, premiseExists, readPremiseData, readPremiseMeta, writePremiseData, writePremiseMeta, } from "../storage/premises.js";
|
|
7
|
+
import { readRoles, writeRoles } from "../storage/roles.js";
|
|
8
|
+
import { readVariables } from "../storage/variables.js";
|
|
9
|
+
async function assertNotPublished(argumentId, version) {
|
|
10
|
+
const meta = await readVersionMeta(argumentId, version);
|
|
11
|
+
if (meta.published) {
|
|
12
|
+
errorExit(`Version ${version} of argument "${argumentId}" is published and cannot be modified.`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function buildArgument(argumentId, version) {
|
|
16
|
+
const [argMeta, vMeta] = await Promise.all([
|
|
17
|
+
readArgumentMeta(argumentId),
|
|
18
|
+
readVersionMeta(argumentId, version),
|
|
19
|
+
]);
|
|
20
|
+
return { ...argMeta, ...vMeta };
|
|
21
|
+
}
|
|
22
|
+
export function registerPremiseCommands(versionedCmd, argumentId, version) {
|
|
23
|
+
const premises = versionedCmd
|
|
24
|
+
.command("premises")
|
|
25
|
+
.description("Manage premises");
|
|
26
|
+
premises
|
|
27
|
+
.command("create")
|
|
28
|
+
.description("Create a new premise")
|
|
29
|
+
.option("--title <title>", "Optional title for the premise")
|
|
30
|
+
.action(async (opts) => {
|
|
31
|
+
await assertNotPublished(argumentId, version);
|
|
32
|
+
const id = randomUUID();
|
|
33
|
+
await writePremiseMeta(argumentId, version, {
|
|
34
|
+
id,
|
|
35
|
+
title: opts.title,
|
|
36
|
+
});
|
|
37
|
+
await writePremiseData(argumentId, version, id, {
|
|
38
|
+
variables: [],
|
|
39
|
+
expressions: [],
|
|
40
|
+
type: "constraint",
|
|
41
|
+
});
|
|
42
|
+
printLine(id);
|
|
43
|
+
});
|
|
44
|
+
premises
|
|
45
|
+
.command("list")
|
|
46
|
+
.description("List all premises")
|
|
47
|
+
.option("--json", "Output as JSON")
|
|
48
|
+
.action(async (opts) => {
|
|
49
|
+
const argument = await buildArgument(argumentId, version);
|
|
50
|
+
const allVariables = await readVariables(argumentId, version);
|
|
51
|
+
const premiseIds = await listPremiseIds(argumentId, version);
|
|
52
|
+
const results = await Promise.all(premiseIds.map(async (pid) => {
|
|
53
|
+
const [meta, data] = await Promise.all([
|
|
54
|
+
readPremiseMeta(argumentId, version, pid),
|
|
55
|
+
readPremiseData(argumentId, version, pid),
|
|
56
|
+
]);
|
|
57
|
+
// Hydrate a temporary PremiseManager for display string
|
|
58
|
+
const pm = new PremiseManager(pid, argument, meta.title);
|
|
59
|
+
for (const v of allVariables)
|
|
60
|
+
pm.addVariable(v);
|
|
61
|
+
// Add expressions BFS-order
|
|
62
|
+
const remaining = [...data.expressions];
|
|
63
|
+
const added = new Set();
|
|
64
|
+
for (let i = remaining.length - 1; i >= 0; i--) {
|
|
65
|
+
const expr = remaining[i];
|
|
66
|
+
if (expr.parentId === null) {
|
|
67
|
+
pm.addExpression(expr);
|
|
68
|
+
added.add(expr.id);
|
|
69
|
+
remaining.splice(i, 1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
let progress = true;
|
|
73
|
+
while (remaining.length > 0 && progress) {
|
|
74
|
+
progress = false;
|
|
75
|
+
for (let i = remaining.length - 1; i >= 0; i--) {
|
|
76
|
+
const expr = remaining[i];
|
|
77
|
+
if (expr.parentId !== null &&
|
|
78
|
+
added.has(expr.parentId)) {
|
|
79
|
+
pm.addExpression(expr);
|
|
80
|
+
added.add(expr.id);
|
|
81
|
+
remaining.splice(i, 1);
|
|
82
|
+
progress = true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { meta, data, pm };
|
|
87
|
+
}));
|
|
88
|
+
if (opts.json) {
|
|
89
|
+
printJson(results.map(({ meta, data }) => ({
|
|
90
|
+
...meta,
|
|
91
|
+
...data,
|
|
92
|
+
})));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
for (const { meta, data, pm } of results) {
|
|
96
|
+
const display = pm.toDisplayString() || "(empty)";
|
|
97
|
+
const title = meta.title ?? "(untitled)";
|
|
98
|
+
printLine(`${meta.id} | ${data.type} | ${display} | ${title}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
premises
|
|
103
|
+
.command("delete <premise_id>")
|
|
104
|
+
.description("Delete a premise")
|
|
105
|
+
.option("--confirm", "Skip confirmation prompt")
|
|
106
|
+
.action(async (premiseId, opts) => {
|
|
107
|
+
await assertNotPublished(argumentId, version);
|
|
108
|
+
if (!(await premiseExists(argumentId, version, premiseId))) {
|
|
109
|
+
errorExit(`Premise "${premiseId}" not found.`);
|
|
110
|
+
}
|
|
111
|
+
if (!opts.confirm) {
|
|
112
|
+
await requireConfirmation(`Delete premise "${premiseId}"?`);
|
|
113
|
+
}
|
|
114
|
+
// Clean up roles
|
|
115
|
+
const roles = await readRoles(argumentId, version);
|
|
116
|
+
const updated = { ...roles };
|
|
117
|
+
if (roles.conclusionPremiseId === premiseId) {
|
|
118
|
+
updated.conclusionPremiseId = undefined;
|
|
119
|
+
}
|
|
120
|
+
updated.supportingPremiseIds = roles.supportingPremiseIds.filter((id) => id !== premiseId);
|
|
121
|
+
await writeRoles(argumentId, version, updated);
|
|
122
|
+
await deletePremiseDir(argumentId, version, premiseId);
|
|
123
|
+
printLine("success");
|
|
124
|
+
});
|
|
125
|
+
premises
|
|
126
|
+
.command("update <premise_id>")
|
|
127
|
+
.description("Update premise metadata")
|
|
128
|
+
.option("--title <new_title>", "New title")
|
|
129
|
+
.option("--clear-title", "Remove the title")
|
|
130
|
+
.action(async (premiseId, opts) => {
|
|
131
|
+
await assertNotPublished(argumentId, version);
|
|
132
|
+
if (opts.title !== undefined && opts.clearTitle) {
|
|
133
|
+
errorExit("--title and --clear-title cannot both be specified.");
|
|
134
|
+
}
|
|
135
|
+
if (!(await premiseExists(argumentId, version, premiseId))) {
|
|
136
|
+
errorExit(`Premise "${premiseId}" not found.`);
|
|
137
|
+
}
|
|
138
|
+
const meta = await readPremiseMeta(argumentId, version, premiseId);
|
|
139
|
+
if (opts.clearTitle) {
|
|
140
|
+
meta.title = undefined;
|
|
141
|
+
}
|
|
142
|
+
else if (opts.title !== undefined) {
|
|
143
|
+
meta.title = opts.title;
|
|
144
|
+
}
|
|
145
|
+
await writePremiseMeta(argumentId, version, meta);
|
|
146
|
+
printLine("success");
|
|
147
|
+
});
|
|
148
|
+
premises
|
|
149
|
+
.command("show <premise_id>")
|
|
150
|
+
.description("Show a single premise")
|
|
151
|
+
.option("--json", "Output as JSON")
|
|
152
|
+
.action(async (premiseId, opts) => {
|
|
153
|
+
if (!(await premiseExists(argumentId, version, premiseId))) {
|
|
154
|
+
errorExit(`Premise "${premiseId}" not found.`);
|
|
155
|
+
}
|
|
156
|
+
const [meta, data] = await Promise.all([
|
|
157
|
+
readPremiseMeta(argumentId, version, premiseId),
|
|
158
|
+
readPremiseData(argumentId, version, premiseId),
|
|
159
|
+
]);
|
|
160
|
+
if (opts.json) {
|
|
161
|
+
printJson({ ...meta, ...data });
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
printLine(`id: ${meta.id}`);
|
|
165
|
+
printLine(`title: ${meta.title ?? "(untitled)"}`);
|
|
166
|
+
printLine(`type: ${data.type}`);
|
|
167
|
+
printLine(`root expr id: ${data.rootExpressionId ?? "(none)"}`);
|
|
168
|
+
printLine(`variables: ${data.variables.length}`);
|
|
169
|
+
printLine(`expressions: ${data.expressions.length}`);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
premises
|
|
173
|
+
.command("render <premise_id>")
|
|
174
|
+
.description("Render the premise as a logical expression string")
|
|
175
|
+
.action(async (premiseId) => {
|
|
176
|
+
if (!(await premiseExists(argumentId, version, premiseId))) {
|
|
177
|
+
errorExit(`Premise "${premiseId}" not found.`);
|
|
178
|
+
}
|
|
179
|
+
const argument = await buildArgument(argumentId, version);
|
|
180
|
+
const allVariables = await readVariables(argumentId, version);
|
|
181
|
+
const [meta, data] = await Promise.all([
|
|
182
|
+
readPremiseMeta(argumentId, version, premiseId),
|
|
183
|
+
readPremiseData(argumentId, version, premiseId),
|
|
184
|
+
]);
|
|
185
|
+
const pm = new PremiseManager(premiseId, argument, meta.title);
|
|
186
|
+
for (const v of allVariables)
|
|
187
|
+
pm.addVariable(v);
|
|
188
|
+
const remaining = [...data.expressions];
|
|
189
|
+
const added = new Set();
|
|
190
|
+
for (let i = remaining.length - 1; i >= 0; i--) {
|
|
191
|
+
const expr = remaining[i];
|
|
192
|
+
if (expr.parentId === null) {
|
|
193
|
+
pm.addExpression(expr);
|
|
194
|
+
added.add(expr.id);
|
|
195
|
+
remaining.splice(i, 1);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
let progress = true;
|
|
199
|
+
while (remaining.length > 0 && progress) {
|
|
200
|
+
progress = false;
|
|
201
|
+
for (let i = remaining.length - 1; i >= 0; i--) {
|
|
202
|
+
const expr = remaining[i];
|
|
203
|
+
if (expr.parentId !== null && added.has(expr.parentId)) {
|
|
204
|
+
pm.addExpression(expr);
|
|
205
|
+
added.add(expr.id);
|
|
206
|
+
remaining.splice(i, 1);
|
|
207
|
+
progress = true;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
printLine(pm.toDisplayString());
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=premises.js.map
|