dsh-model-everything 0.5.0 → 0.5.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.en-US.md +12 -0
- package/README.md +4 -0
- package/lib/client.js +2829 -224
- package/lib/render/channels.js +243 -0
- package/lib/render/collapse.js +12 -20
- package/lib/render/components.js +99 -0
- package/lib/render/coords.js +288 -0
- package/lib/render/cycle-break.js +147 -0
- package/lib/render/dummy.js +43 -0
- package/lib/render/from-mermaid.js +34 -10
- package/lib/render/from-plantuml.js +318 -46
- package/lib/render/layer.js +91 -0
- package/lib/render/layout.js +27 -11
- package/lib/render/network-simplex.js +272 -0
- package/lib/render/order.js +122 -0
- package/lib/render/paint.js +1227 -69
- package/lib/render/place.js +393 -121
- package/lib/render/route.js +225 -0
- package/lib/render/svg.js +146 -21
- package/lib/render/symbol.js +108 -0
- package/lib/render/text.js +74 -0
- package/lib/render/trunk.js +213 -0
- package/lib/render/wrap.js +87 -0
- package/lib/types/render/channels.d.ts +63 -0
- package/lib/types/render/components.d.ts +57 -0
- package/lib/types/render/coords.d.ts +64 -0
- package/lib/types/render/cycle-break.d.ts +45 -0
- package/lib/types/render/dummy.d.ts +32 -0
- package/lib/types/render/from-plantuml.d.ts +12 -6
- package/lib/types/render/layer.d.ts +28 -0
- package/lib/types/render/layout.d.ts +43 -11
- package/lib/types/render/model.d.ts +17 -0
- package/lib/types/render/network-simplex.d.ts +54 -0
- package/lib/types/render/order.d.ts +27 -0
- package/lib/types/render/paint.d.ts +157 -10
- package/lib/types/render/place.d.ts +40 -19
- package/lib/types/render/route.d.ts +77 -0
- package/lib/types/render/svg.d.ts +1 -1
- package/lib/types/render/symbol.d.ts +73 -0
- package/lib/types/render/text.d.ts +38 -0
- package/lib/types/render/trunk.d.ts +104 -0
- package/lib/types/render/wrap.d.ts +27 -0
- package/package.json +148 -148
- package/skills/model-everything-diagram/SKILL.md +85 -82
- package/src/render/channels.ts +309 -0
- package/src/render/collapse.ts +150 -155
- package/src/render/components.ts +126 -0
- package/src/render/coords.ts +328 -0
- package/src/render/cycle-break.ts +164 -0
- package/src/render/dummy.ts +65 -0
- package/src/render/from-mermaid.ts +261 -236
- package/src/render/from-plantuml.ts +469 -178
- package/src/render/layer.ts +98 -0
- package/src/render/layout.ts +101 -62
- package/src/render/model.ts +86 -67
- package/src/render/network-simplex.ts +290 -0
- package/src/render/order.ts +139 -0
- package/src/render/paint.ts +1570 -290
- package/src/render/place.ts +532 -234
- package/src/render/route.ts +269 -0
- package/src/render/svg.ts +274 -127
- package/src/render/symbol.ts +137 -0
- package/src/render/text.ts +86 -0
- package/src/render/trunk.ts +275 -0
- package/src/render/wrap.ts +103 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The geometry of a node's symbol, shared by the module that draws it and the module that attaches edges to it.
|
|
3
|
+
*
|
|
4
|
+
* A box is a rectangle, but a symbol is not: the diamond's side midpoints are its vertices, a circle has no side at
|
|
5
|
+
* all, and a cylinder's top is an arc. Any rule that decides where an edge may meet a node therefore needs the
|
|
6
|
+
* symbol's own points - and the module that draws the symbol needs the same numbers, or the anchor and the outline
|
|
7
|
+
* disagree and an edge ends in the air.
|
|
8
|
+
*
|
|
9
|
+
* So the arithmetic lives here once: the painter reads a port from it, the writer draws the shape from it, and a
|
|
10
|
+
* change to a symbol's outline moves both. Pure data and pure functions, no SVG markup.
|
|
11
|
+
*/
|
|
12
|
+
import type { Box, Point } from './place.js';
|
|
13
|
+
import type { NodeShape } from './model.js';
|
|
14
|
+
/** A cubic Bezier, as the writer draws a curve and the painter reads a point from it. */
|
|
15
|
+
export interface Cubic {
|
|
16
|
+
from: Point;
|
|
17
|
+
c1: Point;
|
|
18
|
+
c2: Point;
|
|
19
|
+
to: Point;
|
|
20
|
+
}
|
|
21
|
+
/** Where the two caps of a cylinder start and end, and how deep each one is. */
|
|
22
|
+
export interface CylinderCaps {
|
|
23
|
+
/** How far the cap reaches into the box: the writer's `min(10, h / 3)`. */
|
|
24
|
+
cap: number;
|
|
25
|
+
/** The top cap, drawn from its left shoulder to its right shoulder. */
|
|
26
|
+
top: Cubic;
|
|
27
|
+
/** The bottom cap, drawn from its right shoulder to its left shoulder. */
|
|
28
|
+
bottom: Cubic;
|
|
29
|
+
}
|
|
30
|
+
/** A point on a cubic Bezier at parameter `t`, which is what makes "the top of the cap" a shared fact. */
|
|
31
|
+
export declare function cubicPoint(curve: Cubic, t: number): Point;
|
|
32
|
+
/**
|
|
33
|
+
* A diamond's four points, in drawing order: top, right, bottom, left.
|
|
34
|
+
*
|
|
35
|
+
* These are the only four places an edge may meet a diamond: each side of the box meets the symbol at exactly that
|
|
36
|
+
* point, and every other point on the side is in the air inside or outside the outline.
|
|
37
|
+
*/
|
|
38
|
+
export declare function diamondPoints(box: Box): [Point, Point, Point, Point];
|
|
39
|
+
/**
|
|
40
|
+
* Does this symbol meet each of its four sides at exactly one point?
|
|
41
|
+
*
|
|
42
|
+
* A diamond's side midpoints are its four vertices, and an ellipse's are its four cardinal points: both offer one legal
|
|
43
|
+
* port per side and no run to spread along. Every other symbol offers a run on at least one side - a rectangle along
|
|
44
|
+
* its whole side, a hexagon along the flat between its cut corners, a stadium between its end caps, a cylinder along
|
|
45
|
+
* its straight flank - so a port there has a place to sit rather than a point to take.
|
|
46
|
+
*
|
|
47
|
+
* This is the distinction the painter needs: a node with one legal point per side can give its edges a point each,
|
|
48
|
+
* and a node with a run can only give them places along it. The two points the discrete shapes offer are the same
|
|
49
|
+
* four points of the box, which is why one answer serves both.
|
|
50
|
+
*/
|
|
51
|
+
export declare function hasDiscretePorts(shape: NodeShape | undefined): boolean;
|
|
52
|
+
/** How much of each end of a hexagon the corner cuts away. */
|
|
53
|
+
export declare function hexagonCut(width: number): number;
|
|
54
|
+
/**
|
|
55
|
+
* A hexagon's six points, in drawing order: top-left, top-right, right, bottom-right, bottom-left, left.
|
|
56
|
+
*
|
|
57
|
+
* The top and bottom are flat runs between the first two and the last two points; the left and right sides are the
|
|
58
|
+
* single points at index 5 and 2, because the corner cut removed everything else.
|
|
59
|
+
*/
|
|
60
|
+
export declare function hexagonPoints(box: Box): [Point, Point, Point, Point, Point, Point];
|
|
61
|
+
/** The radius of a stadium's end caps: half its height, unless the box is narrower than that. */
|
|
62
|
+
export declare function stadiumRadius(box: Box): number;
|
|
63
|
+
/**
|
|
64
|
+
* A cylinder's two caps.
|
|
65
|
+
*
|
|
66
|
+
* The writer draws the top cap from the left shoulder to the right shoulder with the box's own top edge as the
|
|
67
|
+
* control line, and the bottom cap mirrored. The cap curve's apex - the point the painter attaches a top or bottom
|
|
68
|
+
* port to - is therefore a property of this curve, not a constant: it sits a quarter of the cap's depth inside the
|
|
69
|
+
* box, not `cap` inside it.
|
|
70
|
+
*/
|
|
71
|
+
export declare function cylinderCaps(box: Box): CylinderCaps;
|
|
72
|
+
/** The apex of a cylinder's top or bottom cap: the only point on that side an edge meets the outline at. */
|
|
73
|
+
export declare function cylinderApex(box: Box, side: 'top' | 'bottom'): Point;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text as the layout sees it: measured, broken into lines, and turned into a box.
|
|
3
|
+
*
|
|
4
|
+
* Mermaid and Graphviz both measure a label in the platform's own text engine and then lay out around that
|
|
5
|
+
* measurement - a node's size is its text plus padding, and a label too long for its maximum width is wrapped
|
|
6
|
+
* before anything is placed. There is no DOM here, so the measurement is an estimate over a per-character width
|
|
7
|
+
* table; what matters is that the *order* is the same: text first, geometry second. A renderer that fixes the box
|
|
8
|
+
* and pours text into it cannot help overflowing.
|
|
9
|
+
*
|
|
10
|
+
* Explicit breaks (`<br>`, `<br/>`, `<br />`, a real newline) are honoured as written, because a source that put
|
|
11
|
+
* one there wanted that line to end.
|
|
12
|
+
*/
|
|
13
|
+
/** A line longer than this wraps on a space, or breaks in the middle when it has none. */
|
|
14
|
+
export declare const MAX_LINE_CHARS = 30;
|
|
15
|
+
/** Height of one line of box text, and the breathing room around the block. */
|
|
16
|
+
export declare const LINE_HEIGHT = 15;
|
|
17
|
+
export declare const TEXT_PADDING = 12;
|
|
18
|
+
/** The smallest and largest box a label may produce. */
|
|
19
|
+
export declare const MIN_NODE_WIDTH = 88;
|
|
20
|
+
export declare const MAX_NODE_WIDTH = 260;
|
|
21
|
+
/** The lines a label asks for, before wrapping: an explicit break is a line end, not a space. */
|
|
22
|
+
export declare function explicitLines(label: string): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Wrap one line to the maximum width.
|
|
25
|
+
*
|
|
26
|
+
* A word longer than the limit is broken rather than allowed to overflow: a single token with no spaces is the
|
|
27
|
+
* common case in identifiers, and letting it run off the box is the defect this function exists to prevent.
|
|
28
|
+
*/
|
|
29
|
+
export declare function wrapLine(line: string, limit?: number): string[];
|
|
30
|
+
export interface Measured {
|
|
31
|
+
lines: string[];
|
|
32
|
+
width: number;
|
|
33
|
+
height: number;
|
|
34
|
+
}
|
|
35
|
+
/** The text block a label produces: its lines, and the box it needs. */
|
|
36
|
+
export declare function measure(label: string): Measured;
|
|
37
|
+
/** Rough width of a single-line piece of text, for placing an edge label without a box. */
|
|
38
|
+
export declare function textWidth(text: string): number;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fan-in trunks: a batch of arrows into one box from one side, drawn as one bundle.
|
|
3
|
+
*
|
|
4
|
+
* A node that four relations point at is drawn as four ports along its side and four lines converging on it. Each
|
|
5
|
+
* line is right on its own, and the picture is wrong: the bundle reads as a comb, and a reader counts ports to count
|
|
6
|
+
* arrows. The mature layered implementations solve this by merging the edges - ELK's *Merge Edges* with junction
|
|
7
|
+
* points, Graphviz's `concentrate` - and the shape they produce is one straight run outside the node, with a branch
|
|
8
|
+
* joining it wherever a separate edge arrives, and one shared stub into the node.
|
|
9
|
+
*
|
|
10
|
+
* This module decides only which ends may merge, where the shared run sits and which of the branches becomes the
|
|
11
|
+
* shared entry. It is pure geometry over boxes and ports, so the rules can be asserted without a canvas; the painter
|
|
12
|
+
* draws the answer.
|
|
13
|
+
*
|
|
14
|
+
* The rules, and why each one exists:
|
|
15
|
+
*
|
|
16
|
+
* - **One target, one entry side.** Edges that arrive from different sides are travelling in different directions,
|
|
17
|
+
* and a trunk that changed axis would be two trunks.
|
|
18
|
+
* - **The exit faces the trunk.** A branch arrives at the trunk along the direction its own port leaves by, so the
|
|
19
|
+
* trunk is outside the source as well as outside the target. An end that does not face the trunk is not merged: it
|
|
20
|
+
* would have to turn before it got there, which is the bend the merge was supposed to save.
|
|
21
|
+
* - **Distinct sources, three or more.** Two merged edges read as one thick line. A pair of relations about one pair
|
|
22
|
+
* has its own, older rule - they stay visibly apart - and that rule is the distinct-source rule here: two
|
|
23
|
+
* statements about one pair share their source, so they can never both be a branch of one trunk.
|
|
24
|
+
* - **One arrow semantics.** A composition and an association are different statements about the relation; drawn on
|
|
25
|
+
* one trunk they would be read as one statement. Ends that disagree on their arrow are not merged with each other.
|
|
26
|
+
* - **Clear of every box.** A trunk that crosses a box is the same defect as a route that does, and it is worse here
|
|
27
|
+
* because it is drawn once for the whole bundle.
|
|
28
|
+
* - **One trunk per line.** Two groups whose trunks would be drawn on one line would read as one bundle between two
|
|
29
|
+
* unrelated targets, so the later group is refused.
|
|
30
|
+
*
|
|
31
|
+
* The shared entry is the middle of the target's side. A bundle enters the target through one port, and a side that
|
|
32
|
+
* carries one port is centred on it, so the trunk runs to the middle and every branch joins it there: the branches
|
|
33
|
+
* that are not in the middle bend, which is the price of one entry that reads as centred rather than one that leans
|
|
34
|
+
* towards whichever branch happened to arrive straightest.
|
|
35
|
+
*
|
|
36
|
+
* Merging forces every branch but one to bend twice, so an unmerged drawing of `k` straight branches costs
|
|
37
|
+
* `2 * (n - k)` bends and a merged one costs `2 * (n - 1)`; the branch nearest the middle is the lead because it is
|
|
38
|
+
* the only one that can still reach the shared port without a horizontal leg, and on a target whose middle happens
|
|
39
|
+
* to fall on a branch's own line that branch is free, as before.
|
|
40
|
+
*
|
|
41
|
+
* What this module does not decide: the colour of a branch, the text of its label, and how a branch's own route
|
|
42
|
+
* reaches the trunk. Those belong to the painter.
|
|
43
|
+
*/
|
|
44
|
+
import { type Side } from './route.js';
|
|
45
|
+
import type { Box } from './place.js';
|
|
46
|
+
import type { EdgeArrow } from './model.js';
|
|
47
|
+
/** One edge end, as the trunk planner reads it. */
|
|
48
|
+
export interface TrunkEnd {
|
|
49
|
+
/** The edge's index in the diagram, so the painter can key its answer back to the edge. */
|
|
50
|
+
index: number;
|
|
51
|
+
from: string;
|
|
52
|
+
to: string;
|
|
53
|
+
/** The side the edge's port leaves by, and the side it arrives at, as the port stage decided them. */
|
|
54
|
+
exit: Side;
|
|
55
|
+
entry: Side;
|
|
56
|
+
/** The arrow the notation stated. Ends merge only when they agree on it; two unset arrows agree. */
|
|
57
|
+
arrow?: EdgeArrow;
|
|
58
|
+
/** The height of the run the channel stage gave the edge. An edge without one is not drawn by a run. */
|
|
59
|
+
runY?: number;
|
|
60
|
+
}
|
|
61
|
+
/** A port in the drawing's coordinates. Structural, so this module needs no import from the painter. */
|
|
62
|
+
export interface TrunkPoint {
|
|
63
|
+
x: number;
|
|
64
|
+
y: number;
|
|
65
|
+
}
|
|
66
|
+
export interface TrunkInput {
|
|
67
|
+
ends: TrunkEnd[];
|
|
68
|
+
/** The box of a node, and nothing else: a boundary is not a trunk target, because an arrow points past it. */
|
|
69
|
+
boxOf: (id: string) => Box | undefined;
|
|
70
|
+
/** Every box the trunk and its branches must keep clear of. A boundary is not an obstacle, as on any route. */
|
|
71
|
+
boxes: Iterable<Box>;
|
|
72
|
+
/** Where an edge's own exit port sits, when it has one. The branch joins the trunk at that port's coordinate. */
|
|
73
|
+
exitPortOf: (index: number) => TrunkPoint | undefined;
|
|
74
|
+
}
|
|
75
|
+
/** One accepted bundle: what it merges, where its run sits, and which branch the target is entered by. */
|
|
76
|
+
export interface TrunkGroup {
|
|
77
|
+
/** Position in `groups`, which is also the id a junction dot carries. */
|
|
78
|
+
id: number;
|
|
79
|
+
target: string;
|
|
80
|
+
side: Side;
|
|
81
|
+
/** The coordinate of the trunk line: a y when the trunk runs across, an x when it runs down. */
|
|
82
|
+
at: number;
|
|
83
|
+
/** The coordinate of the one port the bundle enters by: the middle of the target's side. */
|
|
84
|
+
entryAlong: number;
|
|
85
|
+
/** The two ends of the run, along the axis it moves on. A branch joins it between them. */
|
|
86
|
+
from: number;
|
|
87
|
+
to: number;
|
|
88
|
+
/** The member whose own exit is nearest the shared entry, and therefore the only branch that may still be a straight drop. */
|
|
89
|
+
lead: number;
|
|
90
|
+
/** The edges in the bundle, in the order the source wrote them. */
|
|
91
|
+
members: number[];
|
|
92
|
+
}
|
|
93
|
+
export interface TrunkPlan {
|
|
94
|
+
groups: TrunkGroup[];
|
|
95
|
+
/** By edge index: the id of the group it joined. An edge not in here travels alone. */
|
|
96
|
+
groupOf: Map<number, number>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Decide which ends merge, and where each accepted trunk runs.
|
|
100
|
+
*
|
|
101
|
+
* Ends that cannot merge are simply absent from the plan; the painter draws them as it always has. Groups are
|
|
102
|
+
* ordered by the first member the source wrote, so the answer does not depend on map iteration order.
|
|
103
|
+
*/
|
|
104
|
+
export declare function planTrunks(input: TrunkInput): TrunkPlan;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrapping: turning one endless column into a page.
|
|
3
|
+
*
|
|
4
|
+
* A chain of twelve boxes has twelve layers, and layering alone draws it as a single column taller than anything a
|
|
5
|
+
* reader can take in - a strip, not a drawing. Graphviz and ELK both answer this with a wrapping pass: cut the layer
|
|
6
|
+
* sequence into bands and stand the bands side by side, so reading order becomes "down the page, then the next
|
|
7
|
+
* column", the way text wraps.
|
|
8
|
+
*
|
|
9
|
+
* The cut is chosen, not guessed: each candidate number of bands is scored by how close the packed page gets to the
|
|
10
|
+
* aspect ratio a page and a landscape screen share, and the best one wins. A drawing that is already close to that
|
|
11
|
+
* shape is left alone - wrapping exists for the strip, not for every tall drawing.
|
|
12
|
+
*
|
|
13
|
+
* Pure: layer sizes in, band ranges and offsets out. The caller applies them.
|
|
14
|
+
*/
|
|
15
|
+
export interface BandRange {
|
|
16
|
+
/** The first and last layer the band holds, inclusive. */
|
|
17
|
+
first: number;
|
|
18
|
+
last: number;
|
|
19
|
+
/** How far right the band stands, relative to the first one. */
|
|
20
|
+
offsetX: number;
|
|
21
|
+
}
|
|
22
|
+
export interface BandPlan {
|
|
23
|
+
bands: BandRange[];
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
}
|
|
27
|
+
export declare function planBands(layerWidth: number[], layerHeight: number[], gap: number, aspect?: number): BandPlan;
|
package/package.json
CHANGED
|
@@ -1,148 +1,148 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dsh-model-everything",
|
|
3
|
-
"version": "0.5.
|
|
4
|
-
"description": "Modeling abstraction, architecture visualisation and automated review for designs and code, including a refactoring harness: draw a Mermaid or PlantUML source and measure its structure, executable verification of machines and protocols with before/after regression, data-model and migration checks, concurrency claim routing, export to external checkers, dependency-graph review, and report diffing. Native plugin for DeepSeek Harness (dsh).",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "lib/index.js",
|
|
7
|
-
"types": "lib/types/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"types": "./lib/types/index.d.ts",
|
|
11
|
-
"default": "./lib/index.js"
|
|
12
|
-
},
|
|
13
|
-
"./gate": {
|
|
14
|
-
"types": "./lib/types/gate.d.ts",
|
|
15
|
-
"default": "./lib/gate.js"
|
|
16
|
-
},
|
|
17
|
-
"./gate/package.json": "./gate/package.json",
|
|
18
|
-
"./gate/locale/*.json": "./gate/locale/*.json",
|
|
19
|
-
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
20
|
-
"./package.json": "./package.json",
|
|
21
|
-
"./locale/*.json": "./locale/*.json",
|
|
22
|
-
"./client": "./lib/client.js",
|
|
23
|
-
"./diagram": {
|
|
24
|
-
"types": "./lib/types/diagram.d.ts",
|
|
25
|
-
"default": "./lib/diagram.js"
|
|
26
|
-
},
|
|
27
|
-
"./diagram/package.json": "./diagram/package.json"
|
|
28
|
-
},
|
|
29
|
-
"files": [
|
|
30
|
-
"lib",
|
|
31
|
-
"src",
|
|
32
|
-
"skills",
|
|
33
|
-
"cordis.patch.yml",
|
|
34
|
-
"examples",
|
|
35
|
-
"gate",
|
|
36
|
-
"locale",
|
|
37
|
-
"diagram"
|
|
38
|
-
],
|
|
39
|
-
"dsh": {
|
|
40
|
-
"engines": {
|
|
41
|
-
"dsh": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4"
|
|
42
|
-
},
|
|
43
|
-
"category": "tools/dev",
|
|
44
|
-
"displayName": "dsh-model-everything",
|
|
45
|
-
"bundle": {
|
|
46
|
-
"patch": "./cordis.patch.yml"
|
|
47
|
-
},
|
|
48
|
-
"compatibility": {
|
|
49
|
-
"dsh": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
50
|
-
"dshReleases": {
|
|
51
|
-
"0.1.7-alpha.2": "compatible",
|
|
52
|
-
"0.1.7-rc.1": "compatible",
|
|
53
|
-
"0.1.7-rc.2": "compatible",
|
|
54
|
-
"0.2.0-rc.1": "compatible",
|
|
55
|
-
"0.2.0-rc.2": "compatible",
|
|
56
|
-
"0.2.1-alpha.1": "compatible",
|
|
57
|
-
"0.2.1-alpha.2": "compatible",
|
|
58
|
-
"0.2.1-alpha.3": "compatible",
|
|
59
|
-
"0.2.1-alpha.4": "compatible",
|
|
60
|
-
"0.2.1-alpha.5": "compatible",
|
|
61
|
-
"0.2.1-rc.2": "compatible",
|
|
62
|
-
"0.2.1-rc.3": "compatible",
|
|
63
|
-
"0.2.1-rc.4": "compatible"
|
|
64
|
-
},
|
|
65
|
-
"profiles": [
|
|
66
|
-
"headless",
|
|
67
|
-
"web"
|
|
68
|
-
]
|
|
69
|
-
},
|
|
70
|
-
"client": {
|
|
71
|
-
"platform": "web",
|
|
72
|
-
"immediately": true,
|
|
73
|
-
"inject": []
|
|
74
|
-
}
|
|
75
|
-
},
|
|
76
|
-
"scripts": {
|
|
77
|
-
"build": "tsc -p tsconfig.json && node scripts/build-client.mjs",
|
|
78
|
-
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
79
|
-
"lint:md": "markdownlint --dot --ignore \"**/node_modules/**\" .",
|
|
80
|
-
"bump": "node scripts/bump-version.mjs",
|
|
81
|
-
"test:cards": "node tests/presentation/run.mjs && node tests/automaton/run.mjs && node tests/routing/run.mjs",
|
|
82
|
-
"coverage": "c8 --reporter=text --exclude-after-remap=false npm run test:engine",
|
|
83
|
-
"test:engine": "npm run build && node tests/engine/run.mjs && node tests/design-engine/run.mjs && node tests/catalog/run.mjs && node tests/data-engine/run.mjs && node tests/concurrency/run.mjs && node tests/uml/run.mjs && node tests/apply-smoke.mjs && node tests/memory/run.mjs && node tests/skills/run.mjs && node tests/gate/run.mjs && node tests/skill-routing/run.mjs && node tests/toolset/run.mjs && node tests/principles/run.mjs && node tests/feature-checklist/run.mjs && node tests/usage/run.mjs && node tests/translation/run.mjs && node tests/documentation/run.mjs && node tests/contributing/run.mjs && node tests/routing-map/run.mjs && node tests/report-reading/run.mjs && node tests/structure/run.mjs && node tests/automaton/run.mjs && node tests/diagram/run.mjs && node tests/client/run.mjs && node tests/render/run.mjs && node tests/presentation/run.mjs && node tests/routing/run.mjs && node tests/tool-routing/run.mjs && node tests/tools/run.mjs && node tests/baseline/run.mjs && node tests/granularity/run.mjs && node tests/exporters/run.mjs && node tests/report-view/run.mjs && node tests/contracts/run.mjs && node tests/tool-boundary/run.mjs && node tests/negatives/run.mjs && node tests/external/run.mjs",
|
|
84
|
-
"test:full": "npm run build && node tests/full-suite.mjs",
|
|
85
|
-
"check": "npm run lint:md && npm run test:engine",
|
|
86
|
-
"build:client": "node scripts/build-client.mjs"
|
|
87
|
-
},
|
|
88
|
-
"peerDependencies": {
|
|
89
|
-
"@deepseek-ai/cordis": "^4.0.5",
|
|
90
|
-
"@deepseek-ai/dsh-agent": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
91
|
-
"@deepseek-ai/dsh-llm": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
92
|
-
"@deepseek-ai/dsh-session": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
93
|
-
"@deepseek-ai/dsh-skill-filesystem": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
94
|
-
"@deepseek-ai/dsh-tools": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
95
|
-
"@deepseek-ai/schemastery": "^3.18.5",
|
|
96
|
-
"dsh": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4"
|
|
97
|
-
},
|
|
98
|
-
"devDependencies": {
|
|
99
|
-
"@deepseek-ai/cordis": "^4.0.5",
|
|
100
|
-
"@deepseek-ai/dsh-agent": "^0.2.0-rc.2",
|
|
101
|
-
"@deepseek-ai/dsh-cordis-host-runner": "^0.2.0-rc.2",
|
|
102
|
-
"@deepseek-ai/dsh-home-paths": "^0.2.0-rc.2",
|
|
103
|
-
"@deepseek-ai/dsh-invariants": "^0.2.0-rc.2",
|
|
104
|
-
"@deepseek-ai/dsh-llm": "^0.2.0-rc.2",
|
|
105
|
-
"@deepseek-ai/dsh-ptc-runtime": "^0.2.0-rc.2",
|
|
106
|
-
"@deepseek-ai/dsh-sandbox": "^0.2.0-rc.2",
|
|
107
|
-
"@deepseek-ai/dsh-sandbox-policy": "^0.2.0-rc.2",
|
|
108
|
-
"@deepseek-ai/dsh-scope": "^0.2.0-rc.2",
|
|
109
|
-
"@deepseek-ai/dsh-session": "^0.2.0-rc.2",
|
|
110
|
-
"@deepseek-ai/dsh-skill": "^0.2.0-rc.2",
|
|
111
|
-
"@deepseek-ai/dsh-skill-filesystem": "^0.2.0-rc.2",
|
|
112
|
-
"@deepseek-ai/dsh-system-prompt": "^0.2.0-rc.2",
|
|
113
|
-
"@deepseek-ai/dsh-tools": "^0.2.0-rc.2",
|
|
114
|
-
"@deepseek-ai/dsh-user-approval": "^0.2.0-rc.2",
|
|
115
|
-
"@deepseek-ai/schemastery": "^3.18.5",
|
|
116
|
-
"@types/node": "^26.6.5",
|
|
117
|
-
"esbuild": "^0.28.2",
|
|
118
|
-
"markdownlint-cli": "0.49.1",
|
|
119
|
-
"typescript": "^7.0.2"
|
|
120
|
-
},
|
|
121
|
-
"author": {
|
|
122
|
-
"name": "AmethystLuna",
|
|
123
|
-
"url": "https://github.com/AmethystLuna"
|
|
124
|
-
},
|
|
125
|
-
"license": "MIT",
|
|
126
|
-
"repository": "https://github.com/AmethystLuna/dsh-model-everything",
|
|
127
|
-
"funding": {
|
|
128
|
-
"type": "custom",
|
|
129
|
-
"url": "https://afdian.com/a/amethystluna"
|
|
130
|
-
},
|
|
131
|
-
"keywords": [
|
|
132
|
-
"verification",
|
|
133
|
-
"model-checking",
|
|
134
|
-
"uml",
|
|
135
|
-
"diagrams",
|
|
136
|
-
"state-machine",
|
|
137
|
-
"data-model",
|
|
138
|
-
"concurrency",
|
|
139
|
-
"mermaid",
|
|
140
|
-
"plantuml",
|
|
141
|
-
"dsh",
|
|
142
|
-
"dsh-plugin",
|
|
143
|
-
"plugin"
|
|
144
|
-
],
|
|
145
|
-
"engines": {
|
|
146
|
-
"node": ">=20"
|
|
147
|
-
}
|
|
148
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-model-everything",
|
|
3
|
+
"version": "0.5.2",
|
|
4
|
+
"description": "Modeling abstraction, architecture visualisation and automated review for designs and code, including a refactoring harness: draw a Mermaid or PlantUML source and measure its structure, executable verification of machines and protocols with before/after regression, data-model and migration checks, concurrency claim routing, export to external checkers, dependency-graph review, and report diffing. Native plugin for DeepSeek Harness (dsh).",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"types": "lib/types/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./lib/types/index.d.ts",
|
|
11
|
+
"default": "./lib/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./gate": {
|
|
14
|
+
"types": "./lib/types/gate.d.ts",
|
|
15
|
+
"default": "./lib/gate.js"
|
|
16
|
+
},
|
|
17
|
+
"./gate/package.json": "./gate/package.json",
|
|
18
|
+
"./gate/locale/*.json": "./gate/locale/*.json",
|
|
19
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
20
|
+
"./package.json": "./package.json",
|
|
21
|
+
"./locale/*.json": "./locale/*.json",
|
|
22
|
+
"./client": "./lib/client.js",
|
|
23
|
+
"./diagram": {
|
|
24
|
+
"types": "./lib/types/diagram.d.ts",
|
|
25
|
+
"default": "./lib/diagram.js"
|
|
26
|
+
},
|
|
27
|
+
"./diagram/package.json": "./diagram/package.json"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"lib",
|
|
31
|
+
"src",
|
|
32
|
+
"skills",
|
|
33
|
+
"cordis.patch.yml",
|
|
34
|
+
"examples",
|
|
35
|
+
"gate",
|
|
36
|
+
"locale",
|
|
37
|
+
"diagram"
|
|
38
|
+
],
|
|
39
|
+
"dsh": {
|
|
40
|
+
"engines": {
|
|
41
|
+
"dsh": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4"
|
|
42
|
+
},
|
|
43
|
+
"category": "tools/dev",
|
|
44
|
+
"displayName": "dsh-model-everything",
|
|
45
|
+
"bundle": {
|
|
46
|
+
"patch": "./cordis.patch.yml"
|
|
47
|
+
},
|
|
48
|
+
"compatibility": {
|
|
49
|
+
"dsh": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
50
|
+
"dshReleases": {
|
|
51
|
+
"0.1.7-alpha.2": "compatible",
|
|
52
|
+
"0.1.7-rc.1": "compatible",
|
|
53
|
+
"0.1.7-rc.2": "compatible",
|
|
54
|
+
"0.2.0-rc.1": "compatible",
|
|
55
|
+
"0.2.0-rc.2": "compatible",
|
|
56
|
+
"0.2.1-alpha.1": "compatible",
|
|
57
|
+
"0.2.1-alpha.2": "compatible",
|
|
58
|
+
"0.2.1-alpha.3": "compatible",
|
|
59
|
+
"0.2.1-alpha.4": "compatible",
|
|
60
|
+
"0.2.1-alpha.5": "compatible",
|
|
61
|
+
"0.2.1-rc.2": "compatible",
|
|
62
|
+
"0.2.1-rc.3": "compatible",
|
|
63
|
+
"0.2.1-rc.4": "compatible"
|
|
64
|
+
},
|
|
65
|
+
"profiles": [
|
|
66
|
+
"headless",
|
|
67
|
+
"web"
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
"client": {
|
|
71
|
+
"platform": "web",
|
|
72
|
+
"immediately": true,
|
|
73
|
+
"inject": []
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"scripts": {
|
|
77
|
+
"build": "tsc -p tsconfig.json && node scripts/build-client.mjs",
|
|
78
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
79
|
+
"lint:md": "markdownlint --dot --ignore \"**/node_modules/**\" .",
|
|
80
|
+
"bump": "node scripts/bump-version.mjs",
|
|
81
|
+
"test:cards": "node tests/presentation/run.mjs && node tests/automaton/run.mjs && node tests/routing/run.mjs",
|
|
82
|
+
"coverage": "c8 --reporter=text --exclude-after-remap=false npm run test:engine",
|
|
83
|
+
"test:engine": "npm run build && node tests/engine/run.mjs && node tests/design-engine/run.mjs && node tests/catalog/run.mjs && node tests/data-engine/run.mjs && node tests/concurrency/run.mjs && node tests/uml/run.mjs && node tests/apply-smoke.mjs && node tests/memory/run.mjs && node tests/skills/run.mjs && node tests/gate/run.mjs && node tests/skill-routing/run.mjs && node tests/toolset/run.mjs && node tests/principles/run.mjs && node tests/feature-checklist/run.mjs && node tests/usage/run.mjs && node tests/translation/run.mjs && node tests/documentation/run.mjs && node tests/contributing/run.mjs && node tests/routing-map/run.mjs && node tests/report-reading/run.mjs && node tests/structure/run.mjs && node tests/automaton/run.mjs && node tests/diagram/run.mjs && node tests/client/run.mjs && node tests/render/run.mjs && node tests/cycle-break/run.mjs && node tests/layering/run.mjs && node tests/ordering/run.mjs && node tests/coords/run.mjs && node tests/channels/run.mjs && node tests/components/run.mjs && node tests/placement/run.mjs && node tests/presentation/run.mjs && node tests/routing/run.mjs && node tests/tool-routing/run.mjs && node tests/tools/run.mjs && node tests/baseline/run.mjs && node tests/granularity/run.mjs && node tests/exporters/run.mjs && node tests/report-view/run.mjs && node tests/contracts/run.mjs && node tests/tool-boundary/run.mjs && node tests/negatives/run.mjs && node tests/external/run.mjs",
|
|
84
|
+
"test:full": "npm run build && node tests/full-suite.mjs",
|
|
85
|
+
"check": "npm run lint:md && npm run test:engine",
|
|
86
|
+
"build:client": "node scripts/build-client.mjs"
|
|
87
|
+
},
|
|
88
|
+
"peerDependencies": {
|
|
89
|
+
"@deepseek-ai/cordis": "^4.0.5",
|
|
90
|
+
"@deepseek-ai/dsh-agent": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
91
|
+
"@deepseek-ai/dsh-llm": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
92
|
+
"@deepseek-ai/dsh-session": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
93
|
+
"@deepseek-ai/dsh-skill-filesystem": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
94
|
+
"@deepseek-ai/dsh-tools": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4",
|
|
95
|
+
"@deepseek-ai/schemastery": "^3.18.5",
|
|
96
|
+
"dsh": "^0.1.7-alpha.2 || ^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1 || ^0.2.1-rc.4"
|
|
97
|
+
},
|
|
98
|
+
"devDependencies": {
|
|
99
|
+
"@deepseek-ai/cordis": "^4.0.5",
|
|
100
|
+
"@deepseek-ai/dsh-agent": "^0.2.0-rc.2",
|
|
101
|
+
"@deepseek-ai/dsh-cordis-host-runner": "^0.2.0-rc.2",
|
|
102
|
+
"@deepseek-ai/dsh-home-paths": "^0.2.0-rc.2",
|
|
103
|
+
"@deepseek-ai/dsh-invariants": "^0.2.0-rc.2",
|
|
104
|
+
"@deepseek-ai/dsh-llm": "^0.2.0-rc.2",
|
|
105
|
+
"@deepseek-ai/dsh-ptc-runtime": "^0.2.0-rc.2",
|
|
106
|
+
"@deepseek-ai/dsh-sandbox": "^0.2.0-rc.2",
|
|
107
|
+
"@deepseek-ai/dsh-sandbox-policy": "^0.2.0-rc.2",
|
|
108
|
+
"@deepseek-ai/dsh-scope": "^0.2.0-rc.2",
|
|
109
|
+
"@deepseek-ai/dsh-session": "^0.2.0-rc.2",
|
|
110
|
+
"@deepseek-ai/dsh-skill": "^0.2.0-rc.2",
|
|
111
|
+
"@deepseek-ai/dsh-skill-filesystem": "^0.2.0-rc.2",
|
|
112
|
+
"@deepseek-ai/dsh-system-prompt": "^0.2.0-rc.2",
|
|
113
|
+
"@deepseek-ai/dsh-tools": "^0.2.0-rc.2",
|
|
114
|
+
"@deepseek-ai/dsh-user-approval": "^0.2.0-rc.2",
|
|
115
|
+
"@deepseek-ai/schemastery": "^3.18.5",
|
|
116
|
+
"@types/node": "^26.6.5",
|
|
117
|
+
"esbuild": "^0.28.2",
|
|
118
|
+
"markdownlint-cli": "0.49.1",
|
|
119
|
+
"typescript": "^7.0.2"
|
|
120
|
+
},
|
|
121
|
+
"author": {
|
|
122
|
+
"name": "AmethystLuna",
|
|
123
|
+
"url": "https://github.com/AmethystLuna"
|
|
124
|
+
},
|
|
125
|
+
"license": "MIT",
|
|
126
|
+
"repository": "https://github.com/AmethystLuna/dsh-model-everything",
|
|
127
|
+
"funding": {
|
|
128
|
+
"type": "custom",
|
|
129
|
+
"url": "https://afdian.com/a/amethystluna"
|
|
130
|
+
},
|
|
131
|
+
"keywords": [
|
|
132
|
+
"verification",
|
|
133
|
+
"model-checking",
|
|
134
|
+
"uml",
|
|
135
|
+
"diagrams",
|
|
136
|
+
"state-machine",
|
|
137
|
+
"data-model",
|
|
138
|
+
"concurrency",
|
|
139
|
+
"mermaid",
|
|
140
|
+
"plantuml",
|
|
141
|
+
"dsh",
|
|
142
|
+
"dsh-plugin",
|
|
143
|
+
"plugin"
|
|
144
|
+
],
|
|
145
|
+
"engines": {
|
|
146
|
+
"node": ">=20"
|
|
147
|
+
}
|
|
148
|
+
}
|