diagrampilot 0.1.5

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DiagramPilot contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,51 @@
1
+ export interface ValidateOptions {
2
+ json: boolean;
3
+ sourcePath: string;
4
+ }
5
+ export interface ExportOptions {
6
+ format: "d2" | "mermaid";
7
+ outPath?: string;
8
+ sourcePath: string;
9
+ }
10
+ export interface RenderCommandOptions {
11
+ outPath: string;
12
+ sourcePath: string;
13
+ }
14
+ export interface CheckCommandOptions {
15
+ json: boolean;
16
+ scopePath?: string;
17
+ }
18
+ type ValidateArgsResult = {
19
+ ok: true;
20
+ options: ValidateOptions;
21
+ } | {
22
+ ok: false;
23
+ message: string;
24
+ };
25
+ type ExportArgsResult = {
26
+ ok: true;
27
+ options: ExportOptions;
28
+ } | {
29
+ ok: false;
30
+ message: string;
31
+ };
32
+ type RenderArgsResult = {
33
+ ok: true;
34
+ options: RenderCommandOptions;
35
+ } | {
36
+ ok: false;
37
+ message: string;
38
+ };
39
+ type CheckArgsResult = {
40
+ ok: true;
41
+ options: CheckCommandOptions;
42
+ } | {
43
+ ok: false;
44
+ message: string;
45
+ };
46
+ export declare function parseValidateArgs(args: readonly string[]): ValidateArgsResult;
47
+ export declare function parseExportArgs(args: readonly string[]): ExportArgsResult;
48
+ export declare function parseRenderArgs(args: readonly string[]): RenderArgsResult;
49
+ export declare function parseCheckArgs(args: readonly string[]): CheckArgsResult;
50
+ export {};
51
+ //# sourceMappingURL=argument-parsing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argument-parsing.d.ts","sourceRoot":"","sources":["../src/argument-parsing.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,kBAAkB,GACnB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,eAAe,CAAC;CAC1B,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,KAAK,gBAAgB,GACjB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,aAAa,CAAC;CACxB,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,KAAK,gBAAgB,GACjB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,oBAAoB,CAAC;CAC/B,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,KAAK,eAAe,GAChB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,mBAAmB,CAAC;CAC9B,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,kBAAkB,CAyCpB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,CAoFzE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,CA4DzE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,CAkCvE"}
@@ -0,0 +1,189 @@
1
+ export function parseValidateArgs(args) {
2
+ let json = false;
3
+ let sourcePath;
4
+ for (const arg of args) {
5
+ if (arg === "--json") {
6
+ json = true;
7
+ continue;
8
+ }
9
+ if (arg.startsWith("-")) {
10
+ return {
11
+ ok: false,
12
+ message: `Unknown validate option: ${arg}`,
13
+ };
14
+ }
15
+ if (sourcePath !== undefined) {
16
+ return {
17
+ ok: false,
18
+ message: `Unexpected validate argument: ${arg}`,
19
+ };
20
+ }
21
+ sourcePath = arg;
22
+ }
23
+ if (sourcePath === undefined) {
24
+ return {
25
+ ok: false,
26
+ message: "Missing source path.",
27
+ };
28
+ }
29
+ return {
30
+ ok: true,
31
+ options: {
32
+ json,
33
+ sourcePath,
34
+ },
35
+ };
36
+ }
37
+ export function parseExportArgs(args) {
38
+ let format;
39
+ let outPath;
40
+ let sourcePath;
41
+ for (let index = 0; index < args.length; index += 1) {
42
+ const arg = args[index];
43
+ if (arg === "--format") {
44
+ const nextArg = args[index + 1];
45
+ if (nextArg === undefined) {
46
+ return {
47
+ ok: false,
48
+ message: "Missing export format.",
49
+ };
50
+ }
51
+ format = nextArg;
52
+ index += 1;
53
+ continue;
54
+ }
55
+ if (arg === "--out") {
56
+ const nextArg = args[index + 1];
57
+ if (nextArg === undefined) {
58
+ return {
59
+ ok: false,
60
+ message: "Missing export output path.",
61
+ };
62
+ }
63
+ outPath = nextArg;
64
+ index += 1;
65
+ continue;
66
+ }
67
+ if (arg.startsWith("-")) {
68
+ return {
69
+ ok: false,
70
+ message: `Unknown export option: ${arg}`,
71
+ };
72
+ }
73
+ if (sourcePath !== undefined) {
74
+ return {
75
+ ok: false,
76
+ message: `Unexpected export argument: ${arg}`,
77
+ };
78
+ }
79
+ sourcePath = arg;
80
+ }
81
+ if (sourcePath === undefined) {
82
+ return {
83
+ ok: false,
84
+ message: "Missing source path.",
85
+ };
86
+ }
87
+ if (format === undefined) {
88
+ return {
89
+ ok: false,
90
+ message: "Missing export format.",
91
+ };
92
+ }
93
+ if (format !== "mermaid" && format !== "d2") {
94
+ return {
95
+ ok: false,
96
+ message: `Unsupported export format: ${format}`,
97
+ };
98
+ }
99
+ return {
100
+ ok: true,
101
+ options: {
102
+ format,
103
+ outPath,
104
+ sourcePath,
105
+ },
106
+ };
107
+ }
108
+ export function parseRenderArgs(args) {
109
+ let outPath;
110
+ let sourcePath;
111
+ for (let index = 0; index < args.length; index += 1) {
112
+ const arg = args[index];
113
+ if (arg === "--out") {
114
+ const nextArg = args[index + 1];
115
+ if (nextArg === undefined) {
116
+ return {
117
+ ok: false,
118
+ message: "Missing render output path.",
119
+ };
120
+ }
121
+ outPath = nextArg;
122
+ index += 1;
123
+ continue;
124
+ }
125
+ if (arg.startsWith("-")) {
126
+ return {
127
+ ok: false,
128
+ message: `Unknown render option: ${arg}`,
129
+ };
130
+ }
131
+ if (sourcePath !== undefined) {
132
+ return {
133
+ ok: false,
134
+ message: `Unexpected render argument: ${arg}`,
135
+ };
136
+ }
137
+ sourcePath = arg;
138
+ }
139
+ if (sourcePath === undefined) {
140
+ return {
141
+ ok: false,
142
+ message: "Missing source path.",
143
+ };
144
+ }
145
+ if (outPath === undefined) {
146
+ return {
147
+ ok: false,
148
+ message: "Missing render output path.",
149
+ };
150
+ }
151
+ return {
152
+ ok: true,
153
+ options: {
154
+ outPath,
155
+ sourcePath,
156
+ },
157
+ };
158
+ }
159
+ export function parseCheckArgs(args) {
160
+ let json = false;
161
+ let scopePath;
162
+ for (const arg of args) {
163
+ if (arg === "--json") {
164
+ json = true;
165
+ continue;
166
+ }
167
+ if (arg.startsWith("-")) {
168
+ return {
169
+ ok: false,
170
+ message: `Unknown check option: ${arg}`,
171
+ };
172
+ }
173
+ if (scopePath !== undefined) {
174
+ return {
175
+ ok: false,
176
+ message: `Unexpected check argument: ${arg}`,
177
+ };
178
+ }
179
+ scopePath = arg;
180
+ }
181
+ return {
182
+ ok: true,
183
+ options: {
184
+ json,
185
+ scopePath,
186
+ },
187
+ };
188
+ }
189
+ //# sourceMappingURL=argument-parsing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argument-parsing.js","sourceRoot":"","sources":["../src/argument-parsing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { RepoWorkflowCheckSourceResult } from "@diagrampilot/core";
2
+ import type { Writable } from "./types.js";
3
+ export declare function writeLine(stream: Writable, message: string): void;
4
+ export declare function textLine(message: string): string;
5
+ export declare function jsonTextLine(value: unknown): string;
6
+ export declare function helpText(version: string): string;
7
+ export declare function checkUsageText(): string;
8
+ export declare function exportUsageText(): string;
9
+ export declare function formatCheckTextReport(sourceResults: readonly RepoWorkflowCheckSourceResult[]): string;
10
+ //# sourceMappingURL=cli-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-output.d.ts","sourceRoot":"","sources":["../src/cli-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAExE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAgB,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgBhD;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAMxC;AAmBD,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,SAAS,6BAA6B,EAAE,GACtD,MAAM,CAsDR"}
@@ -0,0 +1,81 @@
1
+ export function writeLine(stream, message) {
2
+ stream.write(`${message}\n`);
3
+ }
4
+ export function textLine(message) {
5
+ return `${message}\n`;
6
+ }
7
+ export function jsonTextLine(value) {
8
+ return `${JSON.stringify(value, null, 2)}\n`;
9
+ }
10
+ export function helpText(version) {
11
+ return [
12
+ `diagrampilot ${version}`,
13
+ "",
14
+ "Usage:",
15
+ " diagrampilot --version",
16
+ " diagrampilot --help",
17
+ "",
18
+ "MVP commands:",
19
+ " init",
20
+ " validate <path> [--json]",
21
+ " check [path] [--json]",
22
+ " render <path> --out <path>",
23
+ " export <path> --format mermaid [--out <path>]",
24
+ " export <path> --format d2 [--out <path>]",
25
+ ].join("\n");
26
+ }
27
+ export function checkUsageText() {
28
+ return "Usage: diagrampilot check [path] [--json]";
29
+ }
30
+ export function exportUsageText() {
31
+ return [
32
+ "Usage:",
33
+ " diagrampilot export <path> --format mermaid [--out <path>]",
34
+ " diagrampilot export <path> --format d2 [--out <path>]",
35
+ ].join("\n");
36
+ }
37
+ function formatSourceCount(count) {
38
+ return `${count} DiagramPilot Source File${count === 1 ? "" : "s"}`;
39
+ }
40
+ function isArtifactFailure(source) {
41
+ return source.validation.ok === false || source.artifact.status !== "fresh";
42
+ }
43
+ function isIssueArtifact(artifact) {
44
+ return artifact.status !== "fresh" && artifact.status !== "unchecked";
45
+ }
46
+ export function formatCheckTextReport(sourceResults) {
47
+ const issueSources = sourceResults.filter(isArtifactFailure);
48
+ if (issueSources.length === 0) {
49
+ return `Checked ${formatSourceCount(sourceResults.length)}. All expected SVG artifacts are fresh.`;
50
+ }
51
+ const lines = [
52
+ `Checked ${formatSourceCount(sourceResults.length)}. Found ${issueSources.length} workflow issues.`,
53
+ ];
54
+ for (const source of issueSources) {
55
+ if (source.validation.ok === false) {
56
+ lines.push(`Invalid source: ${source.sourcePath}. Run \`diagrampilot validate ${source.sourcePath}\`.`);
57
+ continue;
58
+ }
59
+ if (!isIssueArtifact(source.artifact)) {
60
+ continue;
61
+ }
62
+ if (source.artifact.status === "missing-artifact") {
63
+ lines.push(`Missing SVG artifact: ${source.artifact.path} for ${source.sourcePath}. Run \`diagrampilot render ${source.sourcePath} --out ${source.artifact.path}\`.`);
64
+ continue;
65
+ }
66
+ if (source.artifact.status === "stale") {
67
+ lines.push(`Stale SVG artifact: ${source.artifact.path} for ${source.sourcePath} (${source.artifact.reasons.join(", ")}). Run \`diagrampilot render ${source.sourcePath} --out ${source.artifact.path}\`.`);
68
+ continue;
69
+ }
70
+ if (source.artifact.status === "missing-provenance") {
71
+ lines.push(`Missing DiagramPilot provenance: ${source.artifact.path} for ${source.sourcePath}. Run \`diagrampilot render ${source.sourcePath} --out ${source.artifact.path}\`.`);
72
+ continue;
73
+ }
74
+ const artifactLabel = source.artifact.status === "unreadable-artifact"
75
+ ? "Unreadable SVG artifact"
76
+ : "Malformed SVG artifact";
77
+ lines.push(`${artifactLabel}: ${source.artifact.path} for ${source.sourcePath}. Run \`diagrampilot render ${source.sourcePath} --out ${source.artifact.path}\`.`);
78
+ }
79
+ return lines.join("\n");
80
+ }
81
+ //# sourceMappingURL=cli-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../src/cli-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type DiagramSpec, type RepoWorkflowCheckOptions, type RepoWorkflowCheckResult, type ValidatedDiagramSpecLoadResult } from "@diagrampilot/core";
2
+ import { type CreateSvgRendererProvenanceOptions, type SvgRendererProvenance } from "@diagrampilot/render-svg";
3
+ import type { CommandPlan } from "./types.js";
4
+ export type { CommandPlan, CommandWriteIntent } from "./types.js";
5
+ export interface CommandPlanningDependencies {
6
+ checkDiagramPilotRepoWorkflow(options: RepoWorkflowCheckOptions): Promise<RepoWorkflowCheckResult>;
7
+ loadValidatedDiagramSpec(path: string): ValidatedDiagramSpecLoadResult;
8
+ exportDiagramSpecToMermaid(spec: DiagramSpec): string;
9
+ exportDiagramSpecToD2(spec: DiagramSpec): string;
10
+ readSourceContent(path: string): string | Uint8Array;
11
+ renderDiagramSpecToSvg(spec: DiagramSpec, options: {
12
+ provenance?: SvgRendererProvenance;
13
+ }): Promise<string>;
14
+ createSvgRendererProvenance(options: CreateSvgRendererProvenanceOptions): SvgRendererProvenance;
15
+ getDiagramPilotVersion(): string;
16
+ }
17
+ export declare function planCommand(args: readonly string[], dependencies?: CommandPlanningDependencies): Promise<CommandPlan>;
18
+ //# sourceMappingURL=command-planning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-planning.d.ts","sourceRoot":"","sources":["../src/command-planning.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACpC,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAEL,KAAK,kCAAkC,EAIvC,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAgBlC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElE,MAAM,WAAW,2BAA2B;IAC1C,6BAA6B,CAC3B,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACpC,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,8BAA8B,CAAC;IACvE,0BAA0B,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IACtD,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IACjD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IACrD,sBAAsB,CACpB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE;QAAE,UAAU,CAAC,EAAE,qBAAqB,CAAA;KAAE,GAC9C,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,2BAA2B,CACzB,OAAO,EAAE,kCAAkC,GAC1C,qBAAqB,CAAC;IACzB,sBAAsB,IAAI,MAAM,CAAC;CAClC;AAyRD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,YAAY,GAAE,2BAAgE,GAC7E,OAAO,CAAC,WAAW,CAAC,CA+CtB"}
@@ -0,0 +1,274 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { checkDiagramPilotRepoWorkflow, createRepairableDiagnosticReport, getDiagramPilotVersion, loadValidatedDiagramSpec, } from "@diagrampilot/core";
3
+ import { exportDiagramSpecToD2 } from "@diagrampilot/export-d2";
4
+ import { exportDiagramSpecToMermaid } from "@diagrampilot/export-mermaid";
5
+ import { createSvgRendererProvenance, renderDiagramSpecToSvg, SVG_RENDERER_NAME, SVG_RENDERER_VERSION, } from "@diagrampilot/render-svg";
6
+ import { parseCheckArgs, parseExportArgs, parseRenderArgs, parseValidateArgs, } from "./argument-parsing.js";
7
+ import { checkUsageText, exportUsageText, formatCheckTextReport, helpText, jsonTextLine, textLine, } from "./cli-output.js";
8
+ const defaultCommandPlanningDependencies = {
9
+ checkDiagramPilotRepoWorkflow,
10
+ loadValidatedDiagramSpec,
11
+ exportDiagramSpecToMermaid,
12
+ exportDiagramSpecToD2,
13
+ readSourceContent: (sourcePath) => readFileSync(sourcePath),
14
+ renderDiagramSpecToSvg,
15
+ createSvgRendererProvenance,
16
+ getDiagramPilotVersion,
17
+ };
18
+ function planValidate(args, dependencies) {
19
+ const argsResult = parseValidateArgs(args);
20
+ if (!argsResult.ok) {
21
+ return {
22
+ exitCode: 1,
23
+ stdout: "",
24
+ stderr: [
25
+ argsResult.message,
26
+ "Usage: diagrampilot validate <path> [--json]",
27
+ "",
28
+ ].join("\n"),
29
+ writes: [],
30
+ };
31
+ }
32
+ const { json, sourcePath } = argsResult.options;
33
+ const result = dependencies.loadValidatedDiagramSpec(sourcePath);
34
+ if (!result.ok) {
35
+ const report = createRepairableDiagnosticReport(result.failure);
36
+ if (json) {
37
+ return {
38
+ exitCode: 1,
39
+ stdout: jsonTextLine({
40
+ file: report.file,
41
+ ok: false,
42
+ errors: report.errors,
43
+ }),
44
+ stderr: "",
45
+ writes: [],
46
+ };
47
+ }
48
+ return {
49
+ exitCode: 1,
50
+ stdout: "",
51
+ stderr: textLine(report.text),
52
+ writes: [],
53
+ };
54
+ }
55
+ if (json) {
56
+ return {
57
+ exitCode: 0,
58
+ stdout: jsonTextLine({
59
+ file: result.source.path,
60
+ ok: true,
61
+ errors: [],
62
+ }),
63
+ stderr: "",
64
+ writes: [],
65
+ };
66
+ }
67
+ return {
68
+ exitCode: 0,
69
+ stdout: textLine(`Valid ${result.source.path}`),
70
+ stderr: "",
71
+ writes: [],
72
+ };
73
+ }
74
+ function planExport(args, dependencies) {
75
+ const argsResult = parseExportArgs(args);
76
+ if (!argsResult.ok) {
77
+ return {
78
+ exitCode: 1,
79
+ stdout: "",
80
+ stderr: [argsResult.message, exportUsageText(), ""].join("\n"),
81
+ writes: [],
82
+ };
83
+ }
84
+ const result = dependencies.loadValidatedDiagramSpec(argsResult.options.sourcePath);
85
+ if (!result.ok) {
86
+ const report = createRepairableDiagnosticReport(result.failure);
87
+ return {
88
+ exitCode: 1,
89
+ stdout: "",
90
+ stderr: textLine(report.text),
91
+ writes: [],
92
+ };
93
+ }
94
+ const exportedText = argsResult.options.format === "mermaid"
95
+ ? dependencies.exportDiagramSpecToMermaid(result.spec)
96
+ : dependencies.exportDiagramSpecToD2(result.spec);
97
+ if (argsResult.options.outPath !== undefined) {
98
+ return {
99
+ exitCode: 0,
100
+ stdout: "",
101
+ stderr: "",
102
+ writes: [
103
+ {
104
+ path: argsResult.options.outPath,
105
+ content: exportedText,
106
+ },
107
+ ],
108
+ };
109
+ }
110
+ return {
111
+ exitCode: 0,
112
+ stdout: exportedText,
113
+ stderr: "",
114
+ writes: [],
115
+ };
116
+ }
117
+ async function planRender(args, dependencies) {
118
+ const argsResult = parseRenderArgs(args);
119
+ if (!argsResult.ok) {
120
+ return {
121
+ exitCode: 1,
122
+ stdout: "",
123
+ stderr: [
124
+ argsResult.message,
125
+ "Usage: diagrampilot render <path> --out <path>",
126
+ "",
127
+ ].join("\n"),
128
+ writes: [],
129
+ };
130
+ }
131
+ const result = dependencies.loadValidatedDiagramSpec(argsResult.options.sourcePath);
132
+ if (!result.ok) {
133
+ const report = createRepairableDiagnosticReport(result.failure);
134
+ return {
135
+ exitCode: 1,
136
+ stdout: "",
137
+ stderr: textLine(report.text),
138
+ writes: [],
139
+ };
140
+ }
141
+ try {
142
+ const renderedSvg = await dependencies.renderDiagramSpecToSvg(result.spec, {
143
+ provenance: dependencies.createSvgRendererProvenance({
144
+ sourcePath: result.source.path,
145
+ sourceContent: dependencies.readSourceContent(result.source.path),
146
+ }),
147
+ });
148
+ return {
149
+ exitCode: 0,
150
+ stdout: "",
151
+ stderr: "",
152
+ writes: [
153
+ {
154
+ path: argsResult.options.outPath,
155
+ content: renderedSvg,
156
+ },
157
+ ],
158
+ };
159
+ }
160
+ catch (error) {
161
+ const message = error instanceof Error ? error.message : "Unable to render SVG.";
162
+ return {
163
+ exitCode: 1,
164
+ stdout: "",
165
+ stderr: textLine(`Unable to render ${result.source.path}: ${message}`),
166
+ writes: [],
167
+ };
168
+ }
169
+ }
170
+ async function planCheck(args, dependencies) {
171
+ const argsResult = parseCheckArgs(args);
172
+ if (!argsResult.ok) {
173
+ return {
174
+ exitCode: 1,
175
+ stdout: "",
176
+ stderr: [argsResult.message, checkUsageText(), ""].join("\n"),
177
+ writes: [],
178
+ };
179
+ }
180
+ const checkResult = await dependencies.checkDiagramPilotRepoWorkflow({
181
+ scopePath: argsResult.options.scopePath,
182
+ diagramPilotVersion: dependencies.getDiagramPilotVersion(),
183
+ renderer: {
184
+ name: SVG_RENDERER_NAME,
185
+ version: SVG_RENDERER_VERSION,
186
+ },
187
+ });
188
+ if (!checkResult.ok) {
189
+ return {
190
+ exitCode: 1,
191
+ stdout: "",
192
+ stderr: textLine(checkResult.failure.message),
193
+ writes: [],
194
+ };
195
+ }
196
+ if (checkResult.sources.length === 0) {
197
+ if (argsResult.options.json) {
198
+ return {
199
+ exitCode: 0,
200
+ stdout: jsonTextLine(checkResult),
201
+ stderr: "",
202
+ writes: [],
203
+ };
204
+ }
205
+ return {
206
+ exitCode: 0,
207
+ stdout: textLine(`No DiagramPilot Source Files found in ${checkResult.scope.path}.`),
208
+ stderr: "",
209
+ writes: [],
210
+ };
211
+ }
212
+ const sourceResults = checkResult.sources;
213
+ const issueCount = checkResult.summary.issueCount;
214
+ if (argsResult.options.json) {
215
+ return {
216
+ exitCode: issueCount === 0 ? 0 : 1,
217
+ stdout: jsonTextLine({
218
+ ...checkResult,
219
+ ok: issueCount === 0,
220
+ }),
221
+ stderr: "",
222
+ writes: [],
223
+ };
224
+ }
225
+ const checkTextReport = textLine(formatCheckTextReport(sourceResults));
226
+ return {
227
+ exitCode: issueCount === 0 ? 0 : 1,
228
+ stdout: issueCount === 0 ? checkTextReport : "",
229
+ stderr: issueCount === 0 ? "" : checkTextReport,
230
+ writes: [],
231
+ };
232
+ }
233
+ export async function planCommand(args, dependencies = defaultCommandPlanningDependencies) {
234
+ const [firstArg] = args;
235
+ if (firstArg === "--version" || firstArg === "-v") {
236
+ return {
237
+ exitCode: 0,
238
+ stdout: textLine(`diagrampilot ${dependencies.getDiagramPilotVersion()}`),
239
+ stderr: "",
240
+ writes: [],
241
+ };
242
+ }
243
+ if (firstArg === undefined || firstArg === "--help" || firstArg === "-h") {
244
+ return {
245
+ exitCode: 0,
246
+ stdout: textLine(helpText(dependencies.getDiagramPilotVersion())),
247
+ stderr: "",
248
+ writes: [],
249
+ };
250
+ }
251
+ if (firstArg === "validate") {
252
+ return planValidate(args.slice(1), dependencies);
253
+ }
254
+ if (firstArg === "export") {
255
+ return planExport(args.slice(1), dependencies);
256
+ }
257
+ if (firstArg === "render") {
258
+ return await planRender(args.slice(1), dependencies);
259
+ }
260
+ if (firstArg === "check") {
261
+ return await planCheck(args.slice(1), dependencies);
262
+ }
263
+ return {
264
+ exitCode: 1,
265
+ stdout: "",
266
+ stderr: [
267
+ `Unknown command or option: ${firstArg}`,
268
+ "Run `diagrampilot --help` for usage.",
269
+ "",
270
+ ].join("\n"),
271
+ writes: [],
272
+ };
273
+ }
274
+ //# sourceMappingURL=command-planning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-planning.js","sourceRoot":"","sources":["../src/command-planning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliStreams, CommandPlan } from "./types.js";
2
+ export declare function executeCommandPlan(plan: CommandPlan, streams: CliStreams): number;
3
+ //# sourceMappingURL=execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,UAAU,GAClB,MAAM,CAeR"}
@@ -0,0 +1,16 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ export function executeCommandPlan(plan, streams) {
4
+ if (plan.stdout !== "") {
5
+ streams.stdout.write(plan.stdout);
6
+ }
7
+ if (plan.stderr !== "") {
8
+ streams.stderr.write(plan.stderr);
9
+ }
10
+ for (const write of plan.writes) {
11
+ mkdirSync(path.dirname(write.path), { recursive: true });
12
+ writeFileSync(write.path, write.content, "utf8");
13
+ }
14
+ return plan.exitCode;
15
+ }
16
+ //# sourceMappingURL=execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.js","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,UAAU,kBAAkB,CAChC,IAAiB,EACjB,OAAmB;IAEnB,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import type { CliStreams } from "./types.js";
3
+ export { planCommand } from "./command-planning.js";
4
+ export type { CommandPlan, CommandPlanningDependencies, CommandWriteIntent, } from "./command-planning.js";
5
+ export type { CliStreams, Writable } from "./types.js";
6
+ export declare function run(args: readonly string[], streams: CliStreams): Promise<number>;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,YAAY,EACV,WAAW,EACX,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvD,wBAAsB,GAAG,CACvB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,MAAM,CAAC,CAQjB"}
package/dist/index.js ADDED
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env node
2
+ import { realpathSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { planCommand } from "./command-planning.js";
6
+ import { executeCommandPlan } from "./execution.js";
7
+ import { runInit } from "./init-command.js";
8
+ export { planCommand } from "./command-planning.js";
9
+ export async function run(args, streams) {
10
+ const [firstArg] = args;
11
+ if (firstArg === "init") {
12
+ return runInit(streams);
13
+ }
14
+ return executeCommandPlan(await planCommand(args), streams);
15
+ }
16
+ function realpathIfPresent(filePath) {
17
+ try {
18
+ return realpathSync(filePath);
19
+ }
20
+ catch {
21
+ return path.resolve(filePath);
22
+ }
23
+ }
24
+ function isDirectEntryPoint() {
25
+ const entryPath = process.argv[1];
26
+ if (entryPath === undefined) {
27
+ return false;
28
+ }
29
+ return realpathIfPresent(entryPath) === fileURLToPath(import.meta.url);
30
+ }
31
+ if (isDirectEntryPoint()) {
32
+ process.exitCode = await run(process.argv.slice(2), {
33
+ stdout: process.stdout,
34
+ stderr: process.stderr,
35
+ });
36
+ }
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAQpD,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,IAAuB,EACvB,OAAmB;IAEnB,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAExB,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,kBAAkB,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAElC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,iBAAiB,CAAC,SAAS,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzE,CAAC;AAED,IAAI,kBAAkB,EAAE,EAAE,CAAC;IACzB,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAClD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliStreams } from "./types.js";
2
+ export declare function runInit(streams: CliStreams): number;
3
+ //# sourceMappingURL=init-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-command.d.ts","sourceRoot":"","sources":["../src/init-command.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAmG7C,wBAAgB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CA0BnD"}
@@ -0,0 +1,113 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
2
+ import path from "node:path";
3
+ import { writeLine } from "./cli-output.js";
4
+ const supportFiles = [
5
+ {
6
+ path: "llms.txt",
7
+ lines: [
8
+ "# DiagramPilot",
9
+ "",
10
+ "DiagramPilot is a local-first, repo-native diagram compiler for AI coding agents.",
11
+ "",
12
+ "Use DiagramSpec as the source of truth in `*.dp.yaml` or `*.dp.json` files.",
13
+ "Generated SVG, Mermaid, D2, DOT, and PNG files are Derived Artifacts.",
14
+ "",
15
+ "Start with the public agent docs:",
16
+ "",
17
+ "- https://diagrampilot.com/llms.txt",
18
+ "- https://diagrampilot.com/docs/agents/quickstart.md",
19
+ "- https://diagrampilot.com/docs/agents/spec.md",
20
+ "- https://diagrampilot.com/docs/agents/error-repair.md",
21
+ "",
22
+ "Minimal commands:",
23
+ "",
24
+ "```bash",
25
+ "diagrampilot check",
26
+ "diagrampilot validate docs/architecture.dp.yaml",
27
+ "diagrampilot render docs/architecture.dp.yaml --out docs/architecture.svg",
28
+ "```",
29
+ "",
30
+ "`diagrampilot check` is the read-only repo review/CI command.",
31
+ "`diagrampilot validate <source>` is the explicit source repair command.",
32
+ "`diagrampilot render <source> --out <artifact.svg>` refreshes the explicit artifact.",
33
+ "",
34
+ ],
35
+ },
36
+ {
37
+ path: "docs/diagrampilot.md",
38
+ lines: [
39
+ "# DiagramPilot",
40
+ "",
41
+ "DiagramSpec is the source of truth for repository diagrams.",
42
+ "",
43
+ "Author DiagramPilot Source Files as `*.dp.yaml` or `*.dp.json`.",
44
+ "Prefer YAML for human- and agent-authored diagrams.",
45
+ "",
46
+ "Run the read-only repo review/CI command first:",
47
+ "",
48
+ "```bash",
49
+ "diagrampilot check",
50
+ "```",
51
+ "",
52
+ "Use validate for explicit source repair:",
53
+ "",
54
+ "```bash",
55
+ "diagrampilot validate docs/architecture.dp.yaml",
56
+ "```",
57
+ "",
58
+ "Refresh the explicit SVG artifact only with render and `--out`:",
59
+ "",
60
+ "```bash",
61
+ "diagrampilot render docs/architecture.dp.yaml --out docs/architecture.svg",
62
+ "```",
63
+ "",
64
+ "Public docs: https://diagrampilot.com/llms.txt",
65
+ "",
66
+ ],
67
+ },
68
+ ];
69
+ const managedSectionStart = "<!-- diagrampilot:init:start -->";
70
+ const managedSectionEnd = "<!-- diagrampilot:init:end -->";
71
+ function managedSection(lines) {
72
+ return [managedSectionStart, ...lines, managedSectionEnd, ""].join("\n");
73
+ }
74
+ function appendManagedSection(existingContent, section) {
75
+ const existingWithTrailingNewline = existingContent.endsWith("\n")
76
+ ? existingContent
77
+ : `${existingContent}\n`;
78
+ const separator = existingWithTrailingNewline.endsWith("\n\n") ? "" : "\n";
79
+ return `${existingWithTrailingNewline}${separator}${section}`;
80
+ }
81
+ function replaceManagedSection(existingContent, section) {
82
+ const startIndex = existingContent.indexOf(managedSectionStart);
83
+ const endIndex = existingContent.indexOf(managedSectionEnd, startIndex);
84
+ if (startIndex === -1 || endIndex === -1) {
85
+ return appendManagedSection(existingContent, section);
86
+ }
87
+ const contentAfterEnd = existingContent
88
+ .slice(endIndex + managedSectionEnd.length)
89
+ .replace(/^\r?\n/, "");
90
+ return `${existingContent.slice(0, startIndex)}${section}${contentAfterEnd}`;
91
+ }
92
+ export function runInit(streams) {
93
+ for (const supportFile of supportFiles) {
94
+ const filePath = path.resolve(process.cwd(), supportFile.path);
95
+ const section = managedSection(supportFile.lines);
96
+ mkdirSync(path.dirname(filePath), { recursive: true });
97
+ if (!existsSync(filePath)) {
98
+ writeFileSync(filePath, section, "utf8");
99
+ writeLine(streams.stdout, `Created ${supportFile.path}`);
100
+ continue;
101
+ }
102
+ const existingContent = readFileSync(filePath, "utf8");
103
+ const nextContent = replaceManagedSection(existingContent, section);
104
+ if (nextContent === existingContent) {
105
+ writeLine(streams.stdout, `Unchanged ${supportFile.path}`);
106
+ continue;
107
+ }
108
+ writeFileSync(filePath, nextContent, "utf8");
109
+ writeLine(streams.stdout, `Updated ${supportFile.path}`);
110
+ }
111
+ return 0;
112
+ }
113
+ //# sourceMappingURL=init-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-command.js","sourceRoot":"","sources":["../src/init-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type Writable = Pick<NodeJS.WritableStream, "write">;
2
+ export interface CliStreams {
3
+ stdout: Writable;
4
+ stderr: Writable;
5
+ }
6
+ export interface CommandWriteIntent {
7
+ path: string;
8
+ content: string;
9
+ }
10
+ export interface CommandPlan {
11
+ exitCode: number;
12
+ stdout: string;
13
+ stderr: string;
14
+ writes: CommandWriteIntent[];
15
+ }
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "diagrampilot",
3
+ "version": "0.1.5",
4
+ "description": "DiagramPilot command line interface.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/StiensWout/DiagramPilot.git",
10
+ "directory": "packages/cli"
11
+ },
12
+ "homepage": "https://diagrampilot.com",
13
+ "bugs": {
14
+ "url": "https://github.com/StiensWout/DiagramPilot/issues"
15
+ },
16
+ "keywords": [
17
+ "diagrampilot",
18
+ "diagramspec",
19
+ "diagram",
20
+ "architecture",
21
+ "cli"
22
+ ],
23
+ "bin": {
24
+ "diagrampilot": "dist/index.js"
25
+ },
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "default": "./dist/index.js"
32
+ }
33
+ },
34
+ "files": [
35
+ "dist/**/*.d.ts",
36
+ "dist/**/*.d.ts.map",
37
+ "dist/**/*.js",
38
+ "dist/**/*.js.map",
39
+ "LICENSE"
40
+ ],
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "scripts": {
45
+ "build": "tsc -b && node scripts/make-bin-executable.mjs"
46
+ },
47
+ "dependencies": {
48
+ "@diagrampilot/core": "0.1.5",
49
+ "@diagrampilot/export-d2": "0.1.5",
50
+ "@diagrampilot/export-mermaid": "0.1.5",
51
+ "@diagrampilot/render-svg": "0.1.5"
52
+ }
53
+ }