@millstone/synapse-cli 0.1.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 (103) hide show
  1. package/README.md +135 -0
  2. package/bin/synapse.js +3 -0
  3. package/dist/commands/eject.d.ts +19 -0
  4. package/dist/commands/eject.d.ts.map +1 -0
  5. package/dist/commands/eject.js +146 -0
  6. package/dist/commands/eject.js.map +1 -0
  7. package/dist/commands/fetch-reference.d.ts +19 -0
  8. package/dist/commands/fetch-reference.d.ts.map +1 -0
  9. package/dist/commands/fetch-reference.js +93 -0
  10. package/dist/commands/fetch-reference.js.map +1 -0
  11. package/dist/commands/format.d.ts +26 -0
  12. package/dist/commands/format.d.ts.map +1 -0
  13. package/dist/commands/format.js +126 -0
  14. package/dist/commands/format.js.map +1 -0
  15. package/dist/commands/generate-pdf.d.ts +19 -0
  16. package/dist/commands/generate-pdf.d.ts.map +1 -0
  17. package/dist/commands/generate-pdf.js +140 -0
  18. package/dist/commands/generate-pdf.js.map +1 -0
  19. package/dist/commands/index.d.ts +17 -0
  20. package/dist/commands/index.d.ts.map +1 -0
  21. package/dist/commands/index.js +26 -0
  22. package/dist/commands/index.js.map +1 -0
  23. package/dist/commands/init.d.ts +58 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +234 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/migrate.d.ts +29 -0
  28. package/dist/commands/migrate.d.ts.map +1 -0
  29. package/dist/commands/migrate.js +297 -0
  30. package/dist/commands/migrate.js.map +1 -0
  31. package/dist/commands/scaffold.d.ts +24 -0
  32. package/dist/commands/scaffold.d.ts.map +1 -0
  33. package/dist/commands/scaffold.js +244 -0
  34. package/dist/commands/scaffold.js.map +1 -0
  35. package/dist/commands/update.d.ts +25 -0
  36. package/dist/commands/update.d.ts.map +1 -0
  37. package/dist/commands/update.js +253 -0
  38. package/dist/commands/update.js.map +1 -0
  39. package/dist/commands/validate.d.ts +37 -0
  40. package/dist/commands/validate.d.ts.map +1 -0
  41. package/dist/commands/validate.js +526 -0
  42. package/dist/commands/validate.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +277 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/lib/bodyRules.d.ts +70 -0
  48. package/dist/lib/bodyRules.d.ts.map +1 -0
  49. package/dist/lib/bodyRules.js +711 -0
  50. package/dist/lib/bodyRules.js.map +1 -0
  51. package/dist/lib/config.d.ts +49 -0
  52. package/dist/lib/config.d.ts.map +1 -0
  53. package/dist/lib/config.js +91 -0
  54. package/dist/lib/config.js.map +1 -0
  55. package/dist/lib/git.d.ts +99 -0
  56. package/dist/lib/git.d.ts.map +1 -0
  57. package/dist/lib/git.js +266 -0
  58. package/dist/lib/git.js.map +1 -0
  59. package/dist/lib/graph.d.ts +6 -0
  60. package/dist/lib/graph.d.ts.map +1 -0
  61. package/dist/lib/graph.js +6 -0
  62. package/dist/lib/graph.js.map +1 -0
  63. package/dist/lib/homepage.d.ts +10 -0
  64. package/dist/lib/homepage.d.ts.map +1 -0
  65. package/dist/lib/homepage.js +172 -0
  66. package/dist/lib/homepage.js.map +1 -0
  67. package/dist/lib/markdown.d.ts +107 -0
  68. package/dist/lib/markdown.d.ts.map +1 -0
  69. package/dist/lib/markdown.js +318 -0
  70. package/dist/lib/markdown.js.map +1 -0
  71. package/dist/lib/mode-detection.d.ts +10 -0
  72. package/dist/lib/mode-detection.d.ts.map +1 -0
  73. package/dist/lib/mode-detection.js +29 -0
  74. package/dist/lib/mode-detection.js.map +1 -0
  75. package/dist/lib/naming.d.ts +47 -0
  76. package/dist/lib/naming.d.ts.map +1 -0
  77. package/dist/lib/naming.js +403 -0
  78. package/dist/lib/naming.js.map +1 -0
  79. package/dist/lib/schemas.d.ts +38 -0
  80. package/dist/lib/schemas.d.ts.map +1 -0
  81. package/dist/lib/schemas.js +248 -0
  82. package/dist/lib/schemas.js.map +1 -0
  83. package/dist/lib/templateLint.d.ts +21 -0
  84. package/dist/lib/templateLint.d.ts.map +1 -0
  85. package/dist/lib/templateLint.js +243 -0
  86. package/dist/lib/templateLint.js.map +1 -0
  87. package/dist/lib/templates.d.ts +53 -0
  88. package/dist/lib/templates.d.ts.map +1 -0
  89. package/dist/lib/templates.js +128 -0
  90. package/dist/lib/templates.js.map +1 -0
  91. package/dist/lib/tracking.d.ts +52 -0
  92. package/dist/lib/tracking.d.ts.map +1 -0
  93. package/dist/lib/tracking.js +135 -0
  94. package/dist/lib/tracking.js.map +1 -0
  95. package/dist/lib/types.generated.d.ts +54 -0
  96. package/dist/lib/types.generated.d.ts.map +1 -0
  97. package/dist/lib/types.generated.js +144 -0
  98. package/dist/lib/types.generated.js.map +1 -0
  99. package/dist/lib/validate-plugins.d.ts +22 -0
  100. package/dist/lib/validate-plugins.d.ts.map +1 -0
  101. package/dist/lib/validate-plugins.js +851 -0
  102. package/dist/lib/validate-plugins.js.map +1 -0
  103. package/package.json +85 -0
package/dist/index.js ADDED
@@ -0,0 +1,277 @@
1
+ #!/usr/bin/env node
2
+ import { validateCommand } from "./commands/validate.js";
3
+ import { formatCommand } from "./commands/format.js";
4
+ import { indexCommand } from "./commands/index.js";
5
+ import { scaffoldCommand } from "./commands/scaffold.js";
6
+ import { generatePdfCommand } from "./commands/generate-pdf.js";
7
+ import { initCommand } from "./commands/init.js";
8
+ import { updateCommand } from "./commands/update.js";
9
+ import { ejectCommand } from "./commands/eject.js";
10
+ import { fetchReferenceCommand } from "./commands/fetch-reference.js";
11
+ import { migrateCommand } from "./commands/migrate.js";
12
+ import { DOC_TYPES } from "./lib/types.generated.js";
13
+ import { detectInstallMode } from "./lib/mode-detection.js";
14
+ // Parse command line arguments
15
+ const [, , command, ...args] = process.argv;
16
+ // Simple argument parser
17
+ function parseArgs(args) {
18
+ const parsed = {};
19
+ let i = 0;
20
+ // Helper to convert kebab-case to camelCase
21
+ const toCamelCase = (str) => {
22
+ return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
23
+ };
24
+ while (i < args.length) {
25
+ const arg = args[i];
26
+ if (arg.startsWith("--")) {
27
+ const key = arg.slice(2);
28
+ // Handle --no-* flags
29
+ if (key.startsWith("no-")) {
30
+ const actualKey = toCamelCase(key.slice(3));
31
+ parsed[actualKey] = false;
32
+ i++;
33
+ }
34
+ else {
35
+ const nextArg = args[i + 1];
36
+ const camelKey = toCamelCase(key);
37
+ // Check if this is a boolean flag or has a value
38
+ if (!nextArg || nextArg.startsWith("--")) {
39
+ parsed[camelKey] = true;
40
+ i++;
41
+ }
42
+ else {
43
+ parsed[camelKey] = nextArg;
44
+ i += 2;
45
+ }
46
+ }
47
+ }
48
+ else if (arg.startsWith("-")) {
49
+ // Short flags
50
+ const key = arg.slice(1);
51
+ parsed[key] = true;
52
+ i++;
53
+ }
54
+ else {
55
+ // Positional arguments
56
+ if (!parsed._) {
57
+ parsed._ = [];
58
+ }
59
+ parsed._.push(arg);
60
+ i++;
61
+ }
62
+ }
63
+ return parsed;
64
+ }
65
+ // Show help message
66
+ function showHelp() {
67
+ const availableTypes = DOC_TYPES.join(", ");
68
+ const mode = detectInstallMode();
69
+ const isNpm = mode === 'npm';
70
+ console.log(`
71
+ Synapse Documentation Framework CLI${isNpm ? ' (npm mode)' : mode === 'fork' ? ' (fork mode)' : ''}
72
+
73
+ Usage:
74
+ synapse <command> [options]
75
+
76
+ Commands:
77
+ validate Validate documentation files against schemas
78
+ format Format documentation files according to body grammar rules
79
+ index Generate the homepage index.md with navigation
80
+ scaffold Create a new document from a template
81
+ generate-pdf Generate a PDF from YAML data and template
82
+ fetch-reference Fetch and convert external URL to markdown${isNpm ? `
83
+ init Initialize forked repository configuration [deprecated in npm mode]
84
+ update Merge upstream changes from the framework [deprecated in npm mode]
85
+ eject Mark repository as independent from upstream [deprecated in npm mode]` : `
86
+ init Initialize forked repository configuration
87
+ update Merge upstream changes from the framework
88
+ eject Mark repository as independent from upstream`}
89
+ migrate Migrate from fork mode to npm dependency mode
90
+
91
+ Options:
92
+ --help Show this help message
93
+
94
+ Validate Command:
95
+ synapse validate [options]
96
+
97
+ Options:
98
+ --dir <path> Content directory to validate (default: content/)
99
+ --schema <path> Schema directory (default: content/schemas/)
100
+ --pattern <glob> Glob pattern to match files (default: **/*.md)
101
+ --format <format> Output format: pretty, json, compact (default: pretty)
102
+ --strict Enable strict mode for naming validation (default: true)
103
+ --no-strict Disable strict mode for naming validation
104
+
105
+ Format Command:
106
+ synapse format [options]
107
+
108
+ Options:
109
+ --dir <path> Content directory to format (default: content/)
110
+ --write Write changes to files (default: dry-run)
111
+ --pattern <glob> Glob pattern to match files (default: **/*.md)
112
+ --verbose Show all files, including unchanged
113
+
114
+ Index Command:
115
+ synapse index [options]
116
+
117
+ Options:
118
+ --dir <path> Content directory (default: content/)
119
+ --output <path> Output file path (default: content/index.md)
120
+
121
+ Scaffold Command:
122
+ synapse scaffold [options]
123
+
124
+ Options:
125
+ --type <type> Document type (required: ${availableTypes})
126
+ --template <type> Alias for --type (backward compatible)
127
+ --title <title> Document title (required)
128
+ --owner <owner> Document owner (optional)
129
+ --id <id> Custom document ID (default: auto-generated)
130
+ --target-dir <path> Output directory (default: content/{type folder})
131
+ --force Overwrite existing files
132
+
133
+ Generate PDF Command:
134
+ synapse generate-pdf [options]
135
+
136
+ Options:
137
+ --input <path> Input YAML data file (required)
138
+ --output <path> Output PDF file path (required)
139
+ --logo <path> Logo image path (optional)
140
+ --company <name> Company name for letterhead (optional)
141
+ --url <url> Company URL for letterhead (optional)
142
+ --no-validate Skip schema validation
143
+
144
+ Fetch Reference Command:
145
+ synapse fetch-reference <url>
146
+
147
+ Fetch external documentation and convert to markdown using Mozilla
148
+ Readability + Turndown. Outputs JSON with markdown content, title,
149
+ byline, and excerpt.
150
+
151
+ Init Command:
152
+ synapse init [options]
153
+
154
+ Options:
155
+ --site-name <name> Site name (default: prompted)
156
+ --display-name <name> Display name (default: site name)
157
+ --base-url <url> Base URL (default: prompted)
158
+ --primary-color <hex> Primary theme color (optional)
159
+ --upstream-remote <name> Git remote name (default: upstream)
160
+ --upstream-url <url> Upstream repository URL
161
+ --force Reinitialize if already initialized
162
+ --yes Skip interactive prompts
163
+
164
+ Update Command:
165
+ synapse update [options]
166
+
167
+ Options:
168
+ --continue Continue merge after manual conflict resolution
169
+ --accept-upstream Accept all upstream changes for conflicts
170
+ --accept-ours Keep all local changes for conflicts
171
+ --abort Abort in-progress merge
172
+ --remote <name> Git remote name (default: upstream)
173
+ --branch <name> Remote branch (default: main)
174
+
175
+ Eject Command:
176
+ synapse eject [options]
177
+
178
+ Options:
179
+ --remove-remote Remove upstream git remote
180
+ --remote <name> Git remote name (default: upstream)
181
+ --yes Skip confirmation prompt
182
+
183
+ Migrate Command:
184
+ synapse migrate [options]
185
+
186
+ Options:
187
+ --dry-run Show migration plan without making changes
188
+ --yes Skip confirmation prompts
189
+
190
+ Examples:
191
+ synapse validate
192
+ synapse validate --no-strict
193
+ synapse validate --pattern "70_Architecture/**/*.md"
194
+ synapse validate --pattern "**/ADRs/*.md" --format compact
195
+ synapse validate --format json > validation-results.json
196
+ synapse format
197
+ synapse format --write
198
+ synapse format --pattern "100_Products/**/*.md" --write
199
+ synapse index
200
+ synapse index --output site/content/index.md
201
+ synapse scaffold --type adr --title "Use React for Frontend"
202
+ synapse scaffold --type policy --title "Security Policy" --owner "Security Team"
203
+ synapse scaffold --type sop --title "Deployment Procedure" --id "SOP-042"
204
+ synapse generate-pdf --input data.yaml --output document.pdf --logo tools/pdf/logo.png --company "Your Company"
205
+ synapse init
206
+ synapse init --site-name "My Docs" --base-url "https://docs.example.com" --yes
207
+ synapse update
208
+ synapse update --accept-upstream
209
+ synapse update --continue
210
+ synapse eject
211
+ synapse migrate --dry-run
212
+ synapse migrate --yes
213
+ `);
214
+ }
215
+ // Main CLI handler
216
+ async function main() {
217
+ if (!command ||
218
+ command === "--help" ||
219
+ command === "-h" ||
220
+ command === "help") {
221
+ showHelp();
222
+ process.exit(0);
223
+ }
224
+ const parsedArgs = parseArgs(args);
225
+ try {
226
+ switch (command) {
227
+ case "validate":
228
+ await validateCommand(parsedArgs);
229
+ break;
230
+ case "format":
231
+ await formatCommand(parsedArgs);
232
+ break;
233
+ case "index":
234
+ await indexCommand(parsedArgs);
235
+ break;
236
+ case "scaffold":
237
+ await scaffoldCommand(parsedArgs);
238
+ break;
239
+ case "generate-pdf":
240
+ await generatePdfCommand(parsedArgs);
241
+ break;
242
+ case "init":
243
+ await initCommand(parsedArgs);
244
+ break;
245
+ case "update":
246
+ await updateCommand(parsedArgs);
247
+ break;
248
+ case "eject":
249
+ await ejectCommand(parsedArgs);
250
+ break;
251
+ case "migrate":
252
+ await migrateCommand(parsedArgs);
253
+ break;
254
+ case "fetch-reference":
255
+ // First positional arg is the URL
256
+ await fetchReferenceCommand({
257
+ url: parsedArgs._?.[0],
258
+ ...parsedArgs,
259
+ });
260
+ break;
261
+ default:
262
+ console.error(`Unknown command: ${command}`);
263
+ console.log('Run "synapse --help" for usage information');
264
+ process.exit(1);
265
+ }
266
+ }
267
+ catch (error) {
268
+ console.error("Error:", error);
269
+ process.exit(1);
270
+ }
271
+ }
272
+ // Run the CLI
273
+ main().catch((error) => {
274
+ console.error("Fatal error:", error);
275
+ process.exit(1);
276
+ });
277
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Body validation rules for Synapse document types
3
+ * Implements AST-based validation of Markdown body structure
4
+ */
5
+ import { DocType } from './types.generated.js';
6
+ export interface ValidationIssue {
7
+ notePath: string;
8
+ type: 'error';
9
+ code: string;
10
+ message: string;
11
+ sectionId?: string;
12
+ line?: number;
13
+ column?: number;
14
+ }
15
+ export interface SectionRule {
16
+ id: string;
17
+ title: string;
18
+ alternativeTitles?: string[];
19
+ required: boolean;
20
+ order: number;
21
+ shape: SectionShape;
22
+ }
23
+ export type SectionShape = {
24
+ type: 'paragraphs';
25
+ } | {
26
+ type: 'list';
27
+ ordered?: boolean;
28
+ maxDepth?: number;
29
+ minItems?: number;
30
+ } | {
31
+ type: 'flow';
32
+ allowedNodes: string[];
33
+ } | {
34
+ type: 'table';
35
+ requiredHeaders?: string[];
36
+ minRows?: number;
37
+ } | {
38
+ type: 'milestoneList';
39
+ requireH3: boolean;
40
+ requiredSubsections: string[];
41
+ requiredFields?: string[];
42
+ };
43
+ export interface BodyRules {
44
+ documentTypes: Record<string, {
45
+ displayName: string;
46
+ sections: SectionRule[];
47
+ }>;
48
+ }
49
+ /**
50
+ * Loads body rules from the body-grammars directory
51
+ */
52
+ export declare function loadBodyRules(root?: string): Promise<BodyRules>;
53
+ /**
54
+ * Formats a document body according to grammar rules
55
+ * - Inserts missing required sections in canonical order
56
+ * - Normalizes section titles to match grammar
57
+ * - Normalizes heading levels (H2 for sections)
58
+ * - Normalizes list markers
59
+ * - Preserves existing content
60
+ * @param body - The original markdown body
61
+ * @param rules - Body grammar rules
62
+ * @param type - Document type
63
+ * @returns Formatted markdown body
64
+ */
65
+ export declare function formatBody(body: string, rules: BodyRules, type: DocType): string;
66
+ /**
67
+ * Validates markdown body against rules for a given document type
68
+ */
69
+ export declare function validateBody(body: string, rules: BodyRules, type: DocType, notePath: string): ValidationIssue[];
70
+ //# sourceMappingURL=bodyRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bodyRules.d.ts","sourceRoot":"","sources":["../../src/lib/bodyRules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,OAAO,EAAa,MAAM,sBAAsB,CAAC;AAQ1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEN,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,CACnB,MAAM,EACN;QACE,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;KACzB,CACF,CAAC;CACH;AAMD;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAgDrE;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,OAAO,GACZ,MAAM,CAyER;AA2ID;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,GACf,eAAe,EAAE,CA8EnB"}