sysprom 1.19.0 → 1.21.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.
Files changed (75) hide show
  1. package/README.md +3 -0
  2. package/dist/schema.json +4 -43
  3. package/dist/src/cli/commands/add.js +6 -2
  4. package/dist/src/cli/commands/query.js +5 -3
  5. package/dist/src/cli/commands/speckit.js +2 -2
  6. package/dist/src/cli/commands/update.js +6 -4
  7. package/dist/src/endpoint-types.d.ts +4 -0
  8. package/dist/src/endpoint-types.js +22 -116
  9. package/dist/src/json-to-md.js +2 -16
  10. package/dist/src/lifecycle-state.d.ts +9 -0
  11. package/dist/src/lifecycle-state.js +22 -0
  12. package/dist/src/mcp/server.js +3 -6
  13. package/dist/src/md-to-json.js +1 -19
  14. package/dist/src/operations/add-node.d.ts +21 -132
  15. package/dist/src/operations/add-plan-task.d.ts +14 -88
  16. package/dist/src/operations/add-relationship.d.ts +16 -102
  17. package/dist/src/operations/check.d.ts +7 -44
  18. package/dist/src/operations/graph-decision.d.ts +7 -44
  19. package/dist/src/operations/graph-decision.js +0 -1
  20. package/dist/src/operations/graph-dependency.d.ts +7 -44
  21. package/dist/src/operations/graph-dependency.js +3 -23
  22. package/dist/src/operations/graph-refinement.d.ts +7 -44
  23. package/dist/src/operations/graph-shared.js +1 -3
  24. package/dist/src/operations/graph.d.ts +7 -44
  25. package/dist/src/operations/infer-completeness.d.ts +10 -53
  26. package/dist/src/operations/infer-derived.d.ts +7 -44
  27. package/dist/src/operations/infer-derived.js +28 -4
  28. package/dist/src/operations/infer-impact.d.ts +49 -308
  29. package/dist/src/operations/infer-impact.js +22 -3
  30. package/dist/src/operations/infer-lifecycle.d.ts +8 -105
  31. package/dist/src/operations/infer-lifecycle.js +4 -10
  32. package/dist/src/operations/init-document.d.ts +7 -44
  33. package/dist/src/operations/json-to-markdown.d.ts +7 -44
  34. package/dist/src/operations/mark-task-done.d.ts +14 -88
  35. package/dist/src/operations/mark-task-undone.d.ts +14 -88
  36. package/dist/src/operations/markdown-to-json.d.ts +7 -44
  37. package/dist/src/operations/next-id.d.ts +8 -47
  38. package/dist/src/operations/node-history.d.ts +7 -44
  39. package/dist/src/operations/plan-add-task.d.ts +14 -88
  40. package/dist/src/operations/plan-gate.d.ts +7 -44
  41. package/dist/src/operations/plan-init.d.ts +7 -44
  42. package/dist/src/operations/plan-progress.d.ts +7 -44
  43. package/dist/src/operations/plan-status.d.ts +7 -44
  44. package/dist/src/operations/query-node.d.ts +29 -188
  45. package/dist/src/operations/query-nodes.d.ts +15 -89
  46. package/dist/src/operations/query-nodes.js +6 -4
  47. package/dist/src/operations/query-relationships.d.ts +9 -58
  48. package/dist/src/operations/remove-node.d.ts +21 -132
  49. package/dist/src/operations/remove-node.js +11 -1
  50. package/dist/src/operations/remove-relationship.d.ts +15 -101
  51. package/dist/src/operations/rename.d.ts +14 -88
  52. package/dist/src/operations/search.d.ts +14 -88
  53. package/dist/src/operations/speckit-diff.d.ts +7 -44
  54. package/dist/src/operations/speckit-export.d.ts +7 -44
  55. package/dist/src/operations/speckit-import.d.ts +7 -44
  56. package/dist/src/operations/speckit-sync.d.ts +22 -133
  57. package/dist/src/operations/speckit-sync.js +3 -3
  58. package/dist/src/operations/state-at.d.ts +7 -44
  59. package/dist/src/operations/stats.d.ts +7 -44
  60. package/dist/src/operations/sync.d.ts +21 -132
  61. package/dist/src/operations/task-list.d.ts +7 -44
  62. package/dist/src/operations/timeline.d.ts +7 -44
  63. package/dist/src/operations/trace-from-node.d.ts +21 -132
  64. package/dist/src/operations/update-metadata.d.ts +14 -88
  65. package/dist/src/operations/update-node.d.ts +20 -152
  66. package/dist/src/operations/update-plan-task.d.ts +14 -88
  67. package/dist/src/operations/validate.d.ts +7 -44
  68. package/dist/src/operations/validate.js +8 -6
  69. package/dist/src/schema.d.ts +22 -159
  70. package/dist/src/schema.js +4 -26
  71. package/dist/src/speckit/generate.js +10 -7
  72. package/dist/src/speckit/parse.js +6 -3
  73. package/dist/src/speckit/plan.js +1 -1
  74. package/package.json +12 -1
  75. package/schema.json +4 -43
@@ -89,39 +89,18 @@ export declare const inferDerivedOp: import("./define-operation.js").DefinedOper
89
89
  gate: "gate";
90
90
  mode: "mode";
91
91
  artefact: "artefact";
92
- artefact_flow: "artefact_flow";
93
92
  decision: "decision";
94
93
  change: "change";
95
94
  view: "view";
96
95
  milestone: "milestone";
97
- version: "version";
98
96
  }> & {
99
- is(value: unknown): value is "intent" | "concept" | "capability" | "element" | "realisation" | "invariant" | "principle" | "policy" | "protocol" | "stage" | "role" | "gate" | "mode" | "artefact" | "artefact_flow" | "decision" | "change" | "view" | "milestone" | "version";
97
+ is(value: unknown): value is "intent" | "concept" | "capability" | "element" | "realisation" | "invariant" | "principle" | "policy" | "protocol" | "stage" | "role" | "gate" | "mode" | "artefact" | "decision" | "change" | "view" | "milestone";
100
98
  };
101
99
  name: z.ZodString;
102
100
  description: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]> & {
103
101
  is(value: unknown): value is string | string[];
104
102
  }>;
105
- status: z.ZodOptional<z.ZodEnum<{
106
- deprecated: "deprecated";
107
- proposed: "proposed";
108
- accepted: "accepted";
109
- active: "active";
110
- implemented: "implemented";
111
- adopted: "adopted";
112
- defined: "defined";
113
- introduced: "introduced";
114
- in_progress: "in_progress";
115
- complete: "complete";
116
- consolidated: "consolidated";
117
- experimental: "experimental";
118
- retired: "retired";
119
- superseded: "superseded";
120
- abandoned: "abandoned";
121
- deferred: "deferred";
122
- }> & {
123
- is(value: unknown): value is "deprecated" | "proposed" | "accepted" | "active" | "implemented" | "adopted" | "defined" | "introduced" | "in_progress" | "complete" | "consolidated" | "experimental" | "retired" | "superseded" | "abandoned" | "deferred";
124
- }>;
103
+ status: z.ZodOptional<z.ZodNever>;
125
104
  lifecycle: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>>;
126
105
  context: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]> & {
127
106
  is(value: unknown): value is string | string[];
@@ -176,8 +155,6 @@ export declare const inferDerivedOp: import("./define-operation.js").DefinedOper
176
155
  }>>;
177
156
  propagation: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodBoolean>>;
178
157
  includes: z.ZodOptional<z.ZodArray<z.ZodString>>;
179
- input: z.ZodOptional<z.ZodString>;
180
- output: z.ZodOptional<z.ZodString>;
181
158
  external_references: z.ZodOptional<z.ZodArray<z.ZodObject<{
182
159
  role: z.ZodEnum<{
183
160
  output: "output";
@@ -221,26 +198,14 @@ export declare const inferDerivedOp: import("./define-operation.js").DefinedOper
221
198
  affects: "affects";
222
199
  supersedes: "supersedes";
223
200
  must_preserve: "must_preserve";
224
- performs: "performs";
225
201
  part_of: "part_of";
226
202
  precedes: "precedes";
227
203
  must_follow: "must_follow";
228
- blocks: "blocks";
229
- routes_to: "routes_to";
230
204
  governed_by: "governed_by";
231
205
  modifies: "modifies";
232
- triggered_by: "triggered_by";
233
- applies_to: "applies_to";
234
206
  produces: "produces";
235
- consumes: "consumes";
236
- transforms_into: "transforms_into";
237
- selects: "selects";
238
- requires: "requires";
239
- disables: "disables";
240
- influence: "influence";
241
- justifies: "justifies";
242
207
  }> & {
243
- is(value: unknown): value is "refines" | "realises" | "implements" | "depends_on" | "constrained_by" | "affects" | "supersedes" | "must_preserve" | "performs" | "part_of" | "precedes" | "must_follow" | "blocks" | "routes_to" | "governed_by" | "modifies" | "triggered_by" | "applies_to" | "produces" | "consumes" | "transforms_into" | "selects" | "requires" | "disables" | "influence" | "justifies";
208
+ is(value: unknown): value is "refines" | "realises" | "implements" | "depends_on" | "constrained_by" | "affects" | "supersedes" | "must_preserve" | "part_of" | "precedes" | "must_follow" | "governed_by" | "modifies" | "produces";
244
209
  };
245
210
  description: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]> & {
246
211
  is(value: unknown): value is string | string[];
@@ -259,7 +224,7 @@ export declare const inferDerivedOp: import("./define-operation.js").DefinedOper
259
224
  [x: string]: unknown;
260
225
  from: string;
261
226
  to: string;
262
- type: "refines" | "realises" | "implements" | "depends_on" | "constrained_by" | "affects" | "supersedes" | "must_preserve" | "performs" | "part_of" | "precedes" | "must_follow" | "blocks" | "routes_to" | "governed_by" | "modifies" | "triggered_by" | "applies_to" | "produces" | "consumes" | "transforms_into" | "selects" | "requires" | "disables" | "influence" | "justifies";
227
+ type: "refines" | "realises" | "implements" | "depends_on" | "constrained_by" | "affects" | "supersedes" | "must_preserve" | "part_of" | "precedes" | "must_follow" | "governed_by" | "modifies" | "produces";
263
228
  description?: string | string[] | undefined;
264
229
  polarity?: "positive" | "negative" | "neutral" | "uncertain" | undefined;
265
230
  strength?: number | undefined;
@@ -299,10 +264,10 @@ export declare const inferDerivedOp: import("./define-operation.js").DefinedOper
299
264
  nodes: {
300
265
  [x: string]: unknown;
301
266
  id: string;
302
- type: "intent" | "concept" | "capability" | "element" | "realisation" | "invariant" | "principle" | "policy" | "protocol" | "stage" | "role" | "gate" | "mode" | "artefact" | "artefact_flow" | "decision" | "change" | "view" | "milestone" | "version";
267
+ type: "intent" | "concept" | "capability" | "element" | "realisation" | "invariant" | "principle" | "policy" | "protocol" | "stage" | "role" | "gate" | "mode" | "artefact" | "decision" | "change" | "view" | "milestone";
303
268
  name: string;
304
269
  description?: string | string[] | undefined;
305
- status?: "deprecated" | "proposed" | "accepted" | "active" | "implemented" | "adopted" | "defined" | "introduced" | "in_progress" | "complete" | "consolidated" | "experimental" | "retired" | "superseded" | "abandoned" | "deferred" | undefined;
270
+ status?: undefined;
306
271
  lifecycle?: Record<string, string | boolean> | undefined;
307
272
  context?: string | string[] | undefined;
308
273
  options?: {
@@ -326,8 +291,6 @@ export declare const inferDerivedOp: import("./define-operation.js").DefinedOper
326
291
  }[] | undefined;
327
292
  propagation?: Record<string, boolean> | undefined;
328
293
  includes?: string[] | undefined;
329
- input?: string | undefined;
330
- output?: string | undefined;
331
294
  external_references?: {
332
295
  role: "output" | "input" | "context" | "evidence" | "source" | "standard" | "prior_art";
333
296
  identifier: string;
@@ -350,7 +313,7 @@ export declare const inferDerivedOp: import("./define-operation.js").DefinedOper
350
313
  [x: string]: unknown;
351
314
  from: string;
352
315
  to: string;
353
- type: "refines" | "realises" | "implements" | "depends_on" | "constrained_by" | "affects" | "supersedes" | "must_preserve" | "performs" | "part_of" | "precedes" | "must_follow" | "blocks" | "routes_to" | "governed_by" | "modifies" | "triggered_by" | "applies_to" | "produces" | "consumes" | "transforms_into" | "selects" | "requires" | "disables" | "influence" | "justifies";
316
+ type: "refines" | "realises" | "implements" | "depends_on" | "constrained_by" | "affects" | "supersedes" | "must_preserve" | "part_of" | "precedes" | "must_follow" | "governed_by" | "modifies" | "produces";
354
317
  description?: string | string[] | undefined;
355
318
  polarity?: "positive" | "negative" | "neutral" | "uncertain" | undefined;
356
319
  strength?: number | undefined;
@@ -1,6 +1,7 @@
1
1
  import * as z from "zod";
2
2
  import { defineOperation } from "./define-operation.js";
3
3
  import { SysProMDocument } from "../schema.js";
4
+ import { isViewReadModelDependsOnRelationship } from "../endpoint-types.js";
4
5
  /**
5
6
  * A derived relationship inferred from transitive closure or composition.
6
7
  */
@@ -61,8 +62,17 @@ export const inferDerivedOp = defineOperation({
61
62
  output: DerivedOutput,
62
63
  fn: (input) => {
63
64
  const derived = [];
65
+ const nodeMap = new Map(input.doc.nodes.map((n) => [n.id, n]));
64
66
  const existingKeys = new Set((input.doc.relationships ?? []).map((r) => `${r.from}:${r.type}:${r.to}`));
65
67
  const derivedKeys = new Set();
68
+ const relationships = input.doc.relationships ?? [];
69
+ const isReadModelViewDependsOn = (rel) => {
70
+ const fromNode = nodeMap.get(rel.from);
71
+ const toNode = nodeMap.get(rel.to);
72
+ if (!fromNode || !toNode)
73
+ return false;
74
+ return isViewReadModelDependsOnRelationship(rel.type, fromNode.type, toNode.type);
75
+ };
66
76
  // Helper to add derived relationship if not already existing
67
77
  const addDerived = (from, to, type, derivedFrom, derivationType) => {
68
78
  const key = `${from}:${type}:${to}`;
@@ -73,7 +83,14 @@ export const inferDerivedOp = defineOperation({
73
83
  };
74
84
  // 1. Transitive relationships - compute full transitive closure with path tracking
75
85
  for (const [relType, derivedType] of Object.entries(TRANSITIVE_RELATIONSHIPS)) {
76
- const rels = (input.doc.relationships ?? []).filter((r) => r.type === relType);
86
+ const rels = relationships.filter((r) => {
87
+ if (r.type !== relType)
88
+ return false;
89
+ if (relType === "depends_on" && isReadModelViewDependsOn(r)) {
90
+ return false;
91
+ }
92
+ return true;
93
+ });
77
94
  // Build adjacency list
78
95
  const adj = new Map();
79
96
  for (const r of rels) {
@@ -123,14 +140,21 @@ export const inferDerivedOp = defineOperation({
123
140
  }
124
141
  // 2. Inverse relationships
125
142
  for (const [relType, inverseType] of Object.entries(INVERSE_RELATIONSHIPS)) {
126
- const rels = (input.doc.relationships ?? []).filter((r) => r.type === relType);
143
+ const rels = relationships.filter((r) => {
144
+ if (r.type !== relType)
145
+ return false;
146
+ if (relType === "depends_on" && isReadModelViewDependsOn(r)) {
147
+ return false;
148
+ }
149
+ return true;
150
+ });
127
151
  for (const r of rels) {
128
152
  addDerived(r.to, r.from, inverseType, [{ from: r.from, to: r.to, type: r.type }], "inverse");
129
153
  }
130
154
  }
131
155
  // 3. Composite patterns (A affects B, B depends_on C => A potentially_affects C)
132
- const affectsRels = (input.doc.relationships ?? []).filter((r) => r.type === "affects");
133
- const dependsRels = (input.doc.relationships ?? []).filter((r) => r.type === "depends_on");
156
+ const affectsRels = relationships.filter((r) => r.type === "affects");
157
+ const dependsRels = relationships.filter((r) => r.type === "depends_on" && !isReadModelViewDependsOn(r));
134
158
  const dependsMap = new Map();
135
159
  for (const r of dependsRels) {
136
160
  const deps = dependsMap.get(r.from) ?? [];