@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.
Files changed (118) hide show
  1. package/README.md +182 -8
  2. package/dist/cli/commands/analysis.d.ts +3 -0
  3. package/dist/cli/commands/analysis.d.ts.map +1 -0
  4. package/dist/cli/commands/analysis.js +324 -0
  5. package/dist/cli/commands/analysis.js.map +1 -0
  6. package/dist/cli/commands/arguments.d.ts +3 -0
  7. package/dist/cli/commands/arguments.d.ts.map +1 -0
  8. package/dist/cli/commands/arguments.js +118 -0
  9. package/dist/cli/commands/arguments.js.map +1 -0
  10. package/dist/cli/commands/expressions.d.ts +3 -0
  11. package/dist/cli/commands/expressions.d.ts.map +1 -0
  12. package/dist/cli/commands/expressions.js +240 -0
  13. package/dist/cli/commands/expressions.js.map +1 -0
  14. package/dist/cli/commands/meta.d.ts +3 -0
  15. package/dist/cli/commands/meta.d.ts.map +1 -0
  16. package/dist/cli/commands/meta.js +14 -0
  17. package/dist/cli/commands/meta.js.map +1 -0
  18. package/dist/cli/commands/premises.d.ts +3 -0
  19. package/dist/cli/commands/premises.d.ts.map +1 -0
  20. package/dist/cli/commands/premises.js +214 -0
  21. package/dist/cli/commands/premises.js.map +1 -0
  22. package/dist/cli/commands/render.d.ts +3 -0
  23. package/dist/cli/commands/render.d.ts.map +1 -0
  24. package/dist/cli/commands/render.js +25 -0
  25. package/dist/cli/commands/render.js.map +1 -0
  26. package/dist/cli/commands/roles.d.ts +3 -0
  27. package/dist/cli/commands/roles.d.ts.map +1 -0
  28. package/dist/cli/commands/roles.js +94 -0
  29. package/dist/cli/commands/roles.js.map +1 -0
  30. package/dist/cli/commands/variables.d.ts +3 -0
  31. package/dist/cli/commands/variables.d.ts.map +1 -0
  32. package/dist/cli/commands/variables.js +173 -0
  33. package/dist/cli/commands/variables.js.map +1 -0
  34. package/dist/cli/commands/versionShow.d.ts +3 -0
  35. package/dist/cli/commands/versionShow.d.ts.map +1 -0
  36. package/dist/cli/commands/versionShow.js +31 -0
  37. package/dist/cli/commands/versionShow.js.map +1 -0
  38. package/dist/cli/config.d.ts +7 -0
  39. package/dist/cli/config.d.ts.map +1 -0
  40. package/dist/cli/config.js +21 -0
  41. package/dist/cli/config.js.map +1 -0
  42. package/dist/cli/engine.d.ts +13 -0
  43. package/dist/cli/engine.d.ts.map +1 -0
  44. package/dist/cli/engine.js +71 -0
  45. package/dist/cli/engine.js.map +1 -0
  46. package/dist/cli/output.d.ts +5 -0
  47. package/dist/cli/output.d.ts.map +1 -0
  48. package/dist/cli/output.js +34 -0
  49. package/dist/cli/output.js.map +1 -0
  50. package/dist/cli/router.d.ts +14 -0
  51. package/dist/cli/router.d.ts.map +1 -0
  52. package/dist/cli/router.js +56 -0
  53. package/dist/cli/router.js.map +1 -0
  54. package/dist/cli/storage/analysis.d.ts +8 -0
  55. package/dist/cli/storage/analysis.d.ts.map +1 -0
  56. package/dist/cli/storage/analysis.js +70 -0
  57. package/dist/cli/storage/analysis.js.map +1 -0
  58. package/dist/cli/storage/arguments.d.ts +12 -0
  59. package/dist/cli/storage/arguments.d.ts.map +1 -0
  60. package/dist/cli/storage/arguments.js +80 -0
  61. package/dist/cli/storage/arguments.js.map +1 -0
  62. package/dist/cli/storage/premises.d.ts +9 -0
  63. package/dist/cli/storage/premises.d.ts.map +1 -0
  64. package/dist/cli/storage/premises.js +67 -0
  65. package/dist/cli/storage/premises.js.map +1 -0
  66. package/dist/cli/storage/roles.d.ts +4 -0
  67. package/dist/cli/storage/roles.d.ts.map +1 -0
  68. package/dist/cli/storage/roles.js +26 -0
  69. package/dist/cli/storage/roles.js.map +1 -0
  70. package/dist/cli/storage/variables.d.ts +4 -0
  71. package/dist/cli/storage/variables.d.ts.map +1 -0
  72. package/dist/cli/storage/variables.js +28 -0
  73. package/dist/cli/storage/variables.js.map +1 -0
  74. package/dist/cli.d.ts +3 -0
  75. package/dist/cli.d.ts.map +1 -0
  76. package/dist/cli.js +51 -0
  77. package/dist/cli.js.map +1 -0
  78. package/dist/lib/core/ArgumentEngine.d.ts +4 -3
  79. package/dist/lib/core/ArgumentEngine.d.ts.map +1 -1
  80. package/dist/lib/core/ArgumentEngine.js +11 -3
  81. package/dist/lib/core/ArgumentEngine.js.map +1 -1
  82. package/dist/lib/core/ExpressionManager.d.ts +1 -1
  83. package/dist/lib/core/ExpressionManager.d.ts.map +1 -1
  84. package/dist/lib/core/ExpressionManager.js +1 -1
  85. package/dist/lib/core/ExpressionManager.js.map +1 -1
  86. package/dist/lib/core/PremiseManager.d.ts +3 -2
  87. package/dist/lib/core/PremiseManager.d.ts.map +1 -1
  88. package/dist/lib/core/PremiseManager.js +9 -10
  89. package/dist/lib/core/PremiseManager.js.map +1 -1
  90. package/dist/lib/core/VariableManager.d.ts +3 -2
  91. package/dist/lib/core/VariableManager.d.ts.map +1 -1
  92. package/dist/lib/core/VariableManager.js +13 -0
  93. package/dist/lib/core/VariableManager.js.map +1 -1
  94. package/dist/lib/core/evaluation/shared.d.ts +1 -1
  95. package/dist/lib/core/evaluation/shared.d.ts.map +1 -1
  96. package/dist/lib/index.d.ts +3 -3
  97. package/dist/lib/index.d.ts.map +1 -1
  98. package/dist/lib/index.js +3 -3
  99. package/dist/lib/index.js.map +1 -1
  100. package/dist/lib/schemata/analysis.d.ts +8 -0
  101. package/dist/lib/schemata/analysis.d.ts.map +1 -0
  102. package/dist/lib/schemata/analysis.js +10 -0
  103. package/dist/lib/schemata/analysis.js.map +1 -0
  104. package/dist/lib/schemata/argument.d.ts +36 -2
  105. package/dist/lib/schemata/argument.d.ts.map +1 -1
  106. package/dist/lib/schemata/argument.js +34 -3
  107. package/dist/lib/schemata/argument.js.map +1 -1
  108. package/dist/lib/schemata/index.d.ts +4 -3
  109. package/dist/lib/schemata/index.d.ts.map +1 -1
  110. package/dist/lib/schemata/index.js +4 -3
  111. package/dist/lib/schemata/index.js.map +1 -1
  112. package/dist/lib/schemata/propositional.d.ts +37 -6
  113. package/dist/lib/schemata/propositional.d.ts.map +1 -1
  114. package/dist/lib/schemata/propositional.js +13 -7
  115. package/dist/lib/schemata/propositional.js.map +1 -1
  116. package/dist/lib/types/evaluation.d.ts +2 -5
  117. package/dist/lib/types/evaluation.d.ts.map +1 -1
  118. 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,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerExpressionCommands(versionedCmd: Command, argumentId: string, version: number): void;
3
+ //# sourceMappingURL=expressions.d.ts.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerMetaCommands(program: Command): void;
3
+ //# sourceMappingURL=meta.d.ts.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerPremiseCommands(versionedCmd: Command, argumentId: string, version: number): void;
3
+ //# sourceMappingURL=premises.d.ts.map
@@ -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