@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.
- package/README.md +135 -0
- package/bin/synapse.js +3 -0
- package/dist/commands/eject.d.ts +19 -0
- package/dist/commands/eject.d.ts.map +1 -0
- package/dist/commands/eject.js +146 -0
- package/dist/commands/eject.js.map +1 -0
- package/dist/commands/fetch-reference.d.ts +19 -0
- package/dist/commands/fetch-reference.d.ts.map +1 -0
- package/dist/commands/fetch-reference.js +93 -0
- package/dist/commands/fetch-reference.js.map +1 -0
- package/dist/commands/format.d.ts +26 -0
- package/dist/commands/format.d.ts.map +1 -0
- package/dist/commands/format.js +126 -0
- package/dist/commands/format.js.map +1 -0
- package/dist/commands/generate-pdf.d.ts +19 -0
- package/dist/commands/generate-pdf.d.ts.map +1 -0
- package/dist/commands/generate-pdf.js +140 -0
- package/dist/commands/generate-pdf.js.map +1 -0
- package/dist/commands/index.d.ts +17 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +26 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +58 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +234 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/migrate.d.ts +29 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +297 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/scaffold.d.ts +24 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +244 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/update.d.ts +25 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +253 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +37 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +526 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +277 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/bodyRules.d.ts +70 -0
- package/dist/lib/bodyRules.d.ts.map +1 -0
- package/dist/lib/bodyRules.js +711 -0
- package/dist/lib/bodyRules.js.map +1 -0
- package/dist/lib/config.d.ts +49 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +91 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/git.d.ts +99 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +266 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/graph.d.ts +6 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +6 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/homepage.d.ts +10 -0
- package/dist/lib/homepage.d.ts.map +1 -0
- package/dist/lib/homepage.js +172 -0
- package/dist/lib/homepage.js.map +1 -0
- package/dist/lib/markdown.d.ts +107 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/markdown.js +318 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/mode-detection.d.ts +10 -0
- package/dist/lib/mode-detection.d.ts.map +1 -0
- package/dist/lib/mode-detection.js +29 -0
- package/dist/lib/mode-detection.js.map +1 -0
- package/dist/lib/naming.d.ts +47 -0
- package/dist/lib/naming.d.ts.map +1 -0
- package/dist/lib/naming.js +403 -0
- package/dist/lib/naming.js.map +1 -0
- package/dist/lib/schemas.d.ts +38 -0
- package/dist/lib/schemas.d.ts.map +1 -0
- package/dist/lib/schemas.js +248 -0
- package/dist/lib/schemas.js.map +1 -0
- package/dist/lib/templateLint.d.ts +21 -0
- package/dist/lib/templateLint.d.ts.map +1 -0
- package/dist/lib/templateLint.js +243 -0
- package/dist/lib/templateLint.js.map +1 -0
- package/dist/lib/templates.d.ts +53 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +128 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/tracking.d.ts +52 -0
- package/dist/lib/tracking.d.ts.map +1 -0
- package/dist/lib/tracking.js +135 -0
- package/dist/lib/tracking.js.map +1 -0
- package/dist/lib/types.generated.d.ts +54 -0
- package/dist/lib/types.generated.d.ts.map +1 -0
- package/dist/lib/types.generated.js +144 -0
- package/dist/lib/types.generated.js.map +1 -0
- package/dist/lib/validate-plugins.d.ts +22 -0
- package/dist/lib/validate-plugins.d.ts.map +1 -0
- package/dist/lib/validate-plugins.js +851 -0
- package/dist/lib/validate-plugins.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import fsExtra from 'fs-extra';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as yaml from 'js-yaml';
|
|
4
|
+
import { marked } from 'marked';
|
|
5
|
+
import { chromium } from 'playwright-chromium';
|
|
6
|
+
import { registerDefaultHelpers } from '../lib/templates.js';
|
|
7
|
+
import { loadSchema, validateFrontmatter } from '../lib/schemas.js';
|
|
8
|
+
import { isDocType } from '../lib/types.generated.js';
|
|
9
|
+
const fs = fsExtra;
|
|
10
|
+
let chalk;
|
|
11
|
+
async function getChalk() {
|
|
12
|
+
if (!chalk) {
|
|
13
|
+
try {
|
|
14
|
+
chalk = (await import('chalk')).default;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
chalk = {
|
|
18
|
+
green: (str) => str,
|
|
19
|
+
red: (str) => str,
|
|
20
|
+
yellow: (str) => str,
|
|
21
|
+
blue: (str) => str,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return chalk;
|
|
26
|
+
}
|
|
27
|
+
export async function generatePdf(options) {
|
|
28
|
+
const c = await getChalk();
|
|
29
|
+
registerDefaultHelpers();
|
|
30
|
+
// Load markdown file with frontmatter
|
|
31
|
+
console.log(c.blue(`š Loading data from ${options.input}`));
|
|
32
|
+
const fileContent = await fs.readFile(options.input, 'utf-8');
|
|
33
|
+
// Parse frontmatter and body
|
|
34
|
+
const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/;
|
|
35
|
+
const match = fileContent.match(frontmatterRegex);
|
|
36
|
+
if (!match) {
|
|
37
|
+
throw new Error('Invalid markdown file: missing frontmatter');
|
|
38
|
+
}
|
|
39
|
+
const frontmatterYaml = match[1];
|
|
40
|
+
const markdownBody = match[2].trim();
|
|
41
|
+
const data = yaml.load(frontmatterYaml);
|
|
42
|
+
// Validate data against schema
|
|
43
|
+
if (options.validate !== false) {
|
|
44
|
+
const docType = data.type;
|
|
45
|
+
if (!docType) {
|
|
46
|
+
throw new Error('Document type not specified in frontmatter');
|
|
47
|
+
}
|
|
48
|
+
if (!isDocType(docType)) {
|
|
49
|
+
throw new Error(`Invalid document type: ${docType}`);
|
|
50
|
+
}
|
|
51
|
+
console.log(c.blue(`ā Validating against ${docType} schema`));
|
|
52
|
+
const schema = await loadSchema(docType);
|
|
53
|
+
const validation = validateFrontmatter(data, schema);
|
|
54
|
+
if (!validation.valid) {
|
|
55
|
+
console.log(c.yellow('ā ļø Validation warnings:'));
|
|
56
|
+
validation.errors?.forEach(error => {
|
|
57
|
+
console.log(c.yellow(` - ${error.path}: ${error.message}`));
|
|
58
|
+
});
|
|
59
|
+
throw new Error('Schema validation failed');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Convert markdown to HTML
|
|
63
|
+
console.log(c.blue('š Converting markdown to HTML'));
|
|
64
|
+
const htmlContent = await marked(markdownBody);
|
|
65
|
+
// Wrap in letterhead
|
|
66
|
+
const letterheadPath = path.resolve(process.cwd(), 'tools/pdf/letterhead.html');
|
|
67
|
+
const letterheadCssPath = path.resolve(process.cwd(), 'tools/pdf/letterhead.css');
|
|
68
|
+
const letterheadTemplate = await fs.readFile(letterheadPath, 'utf-8');
|
|
69
|
+
// Read CSS and inline it
|
|
70
|
+
const css = await fs.readFile(letterheadCssPath, 'utf-8');
|
|
71
|
+
// Convert logo to base64 data URL if provided
|
|
72
|
+
let logoDataUrl = '';
|
|
73
|
+
if (options.logo && await fs.pathExists(options.logo)) {
|
|
74
|
+
const logoBuffer = await fs.readFile(options.logo);
|
|
75
|
+
const logoExt = path.extname(options.logo).slice(1);
|
|
76
|
+
const mimeType = logoExt === 'png' ? 'image/png' : logoExt === 'jpg' || logoExt === 'jpeg' ? 'image/jpeg' : 'image/png';
|
|
77
|
+
logoDataUrl = `data:${mimeType};base64,${logoBuffer.toString('base64')}`;
|
|
78
|
+
}
|
|
79
|
+
const letterheadData = {
|
|
80
|
+
title: data.title || 'Document',
|
|
81
|
+
logo: logoDataUrl,
|
|
82
|
+
company: options.company || '',
|
|
83
|
+
date: new Date().toISOString().split('T')[0],
|
|
84
|
+
body: htmlContent,
|
|
85
|
+
};
|
|
86
|
+
// Render letterhead with Handlebars
|
|
87
|
+
const Handlebars = (await import('handlebars')).default;
|
|
88
|
+
const letterheadCompiled = Handlebars.compile(letterheadTemplate);
|
|
89
|
+
let finalHtml = letterheadCompiled(letterheadData);
|
|
90
|
+
// Inline the CSS
|
|
91
|
+
finalHtml = finalHtml.replace('<link rel="stylesheet" href="letterhead.css" />', `<style>${css}</style>`);
|
|
92
|
+
// Generate PDF with Playwright
|
|
93
|
+
console.log(c.blue('šØļø Generating PDF with Playwright'));
|
|
94
|
+
const browser = await chromium.launch();
|
|
95
|
+
const page = await browser.newPage();
|
|
96
|
+
await page.setContent(finalHtml, { waitUntil: 'networkidle' });
|
|
97
|
+
// Ensure output directory exists
|
|
98
|
+
await fs.ensureDir(path.dirname(options.output));
|
|
99
|
+
await page.pdf({
|
|
100
|
+
path: options.output,
|
|
101
|
+
format: 'Letter',
|
|
102
|
+
margin: {
|
|
103
|
+
top: '0.5in',
|
|
104
|
+
right: '0.75in',
|
|
105
|
+
bottom: '0.5in',
|
|
106
|
+
left: '0.75in',
|
|
107
|
+
},
|
|
108
|
+
printBackground: true,
|
|
109
|
+
});
|
|
110
|
+
await browser.close();
|
|
111
|
+
console.log(c.green(`ā
PDF generated: ${options.output}`));
|
|
112
|
+
}
|
|
113
|
+
export async function generatePdfCommand(args) {
|
|
114
|
+
const c = await getChalk();
|
|
115
|
+
if (!args.input) {
|
|
116
|
+
console.error(c.red('Error: --input is required'));
|
|
117
|
+
console.log('Usage: synapse generate-pdf --input <markdown-file> --output <pdf-file>');
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
if (!args.output) {
|
|
121
|
+
console.error(c.red('Error: --output is required'));
|
|
122
|
+
console.log('Usage: synapse generate-pdf --input <markdown-file> --output <pdf-file>');
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
await generatePdf({
|
|
127
|
+
input: args.input,
|
|
128
|
+
output: args.output,
|
|
129
|
+
logo: args.logo,
|
|
130
|
+
company: args.company,
|
|
131
|
+
url: args.url,
|
|
132
|
+
validate: !args['no-validate'],
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
console.error(c.red('Error:'), error instanceof Error ? error.message : error);
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=generate-pdf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-pdf.js","sourceRoot":"","sources":["../../src/commands/generate-pdf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface IndexOptions {
|
|
2
|
+
contentDir?: string;
|
|
3
|
+
output?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Generate the index.md homepage
|
|
7
|
+
*/
|
|
8
|
+
export declare function index(options?: IndexOptions): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* CLI command handler for index generation
|
|
11
|
+
*/
|
|
12
|
+
export declare function indexCommand(args: {
|
|
13
|
+
dir?: string;
|
|
14
|
+
output?: string;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAGA,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAcrE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { generateHomepage } from '../lib/homepage.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generate the index.md homepage
|
|
5
|
+
*/
|
|
6
|
+
export async function index(options = {}) {
|
|
7
|
+
const { contentDir = path.resolve(process.cwd(), 'content'), output } = options;
|
|
8
|
+
const outputPath = output
|
|
9
|
+
? path.resolve(process.cwd(), output)
|
|
10
|
+
: path.join(contentDir, 'index.md');
|
|
11
|
+
await generateHomepage({
|
|
12
|
+
contentDir,
|
|
13
|
+
outputPath
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* CLI command handler for index generation
|
|
18
|
+
*/
|
|
19
|
+
export async function indexCommand(args) {
|
|
20
|
+
const options = {
|
|
21
|
+
contentDir: args.dir,
|
|
22
|
+
output: args.output
|
|
23
|
+
};
|
|
24
|
+
await index(options);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAOtD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,UAAwB,EAAE;IACpD,MAAM,EACJ,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,EACnD,MAAM,EACP,GAAG,OAAO,CAAC;IAEZ,MAAM,UAAU,GAAG,MAAM;QACvB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC;QACrC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAEtC,MAAM,gBAAgB,CAAC;QACrB,UAAU;QACV,UAAU;KACX,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAGlC;IACC,MAAM,OAAO,GAAiB;QAC5B,UAAU,EAAE,IAAI,CAAC,GAAG;QACpB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;IAEF,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export interface InitOptions {
|
|
2
|
+
siteName?: string;
|
|
3
|
+
displayName?: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
primaryColor?: string;
|
|
6
|
+
upstreamRemote?: string;
|
|
7
|
+
upstreamUrl?: string;
|
|
8
|
+
force?: boolean;
|
|
9
|
+
interactive?: boolean;
|
|
10
|
+
cwd?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface SynapseConfig {
|
|
13
|
+
branding: {
|
|
14
|
+
siteName: string;
|
|
15
|
+
displayName: string;
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
logo?: string;
|
|
18
|
+
theme?: {
|
|
19
|
+
lightMode?: {
|
|
20
|
+
primary: string;
|
|
21
|
+
};
|
|
22
|
+
darkMode?: {
|
|
23
|
+
primary: string;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
folders?: {
|
|
28
|
+
[docType: string]: string;
|
|
29
|
+
};
|
|
30
|
+
decap?: {
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
backend: 'github' | 'gitlab' | 'bitbucket';
|
|
33
|
+
repo: string;
|
|
34
|
+
oauthProxy?: string;
|
|
35
|
+
};
|
|
36
|
+
schemas?: {
|
|
37
|
+
customDir: string;
|
|
38
|
+
loadBase: boolean;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Initialize a forked repository with configuration
|
|
43
|
+
*/
|
|
44
|
+
export declare function init(options?: InitOptions): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* CLI command handler for init
|
|
47
|
+
*/
|
|
48
|
+
export declare function initCommand(args: {
|
|
49
|
+
siteName?: string;
|
|
50
|
+
displayName?: string;
|
|
51
|
+
baseUrl?: string;
|
|
52
|
+
primaryColor?: string;
|
|
53
|
+
upstreamRemote?: string;
|
|
54
|
+
upstreamUrl?: string;
|
|
55
|
+
force?: boolean;
|
|
56
|
+
yes?: boolean;
|
|
57
|
+
}): Promise<void>;
|
|
58
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE;YACN,SAAS,CAAC,EAAE;gBAAE,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC;YAChC,QAAQ,CAAC,EAAE;gBAAE,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC;SAChC,CAAC;KACH,CAAC;IACF,OAAO,CAAC,EAAE;QACR,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;KAC3B,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;QAC3C,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAyDD;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6JnE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhB"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import fsExtra from 'fs-extra';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as readline from 'readline/promises';
|
|
4
|
+
import { checkGitRepo, hasRemote, getCurrentVersion } from '../lib/git.js';
|
|
5
|
+
import { trackingExists, createTracking } from '../lib/tracking.js';
|
|
6
|
+
import { detectInstallMode } from '../lib/mode-detection.js';
|
|
7
|
+
const fs = fsExtra;
|
|
8
|
+
let chalk;
|
|
9
|
+
async function getChalk() {
|
|
10
|
+
if (!chalk) {
|
|
11
|
+
try {
|
|
12
|
+
chalk = (await import('chalk')).default;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
chalk = {
|
|
16
|
+
green: (str) => str,
|
|
17
|
+
red: (str) => str,
|
|
18
|
+
yellow: (str) => str,
|
|
19
|
+
blue: (str) => str,
|
|
20
|
+
gray: (str) => str,
|
|
21
|
+
bold: (str) => str,
|
|
22
|
+
cyan: (str) => str,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return chalk;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Prompt user for input with optional default
|
|
30
|
+
*/
|
|
31
|
+
async function prompt(rl, question, defaultValue) {
|
|
32
|
+
const suffix = defaultValue ? ` (${defaultValue})` : '';
|
|
33
|
+
const answer = await rl.question(`${question}${suffix}: `);
|
|
34
|
+
return answer.trim() || defaultValue || '';
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Prompt user for confirmation (y/n)
|
|
38
|
+
*/
|
|
39
|
+
async function confirm(rl, question, defaultYes = true) {
|
|
40
|
+
const suffix = defaultYes ? ' (Y/n)' : ' (y/N)';
|
|
41
|
+
const answer = await rl.question(`${question}${suffix}: `);
|
|
42
|
+
const normalized = answer.trim().toLowerCase();
|
|
43
|
+
if (normalized === '') {
|
|
44
|
+
return defaultYes;
|
|
45
|
+
}
|
|
46
|
+
return normalized === 'y' || normalized === 'yes';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create custom directories for user extensions
|
|
50
|
+
*/
|
|
51
|
+
async function createCustomDirectories(rootDir) {
|
|
52
|
+
const customDirs = [
|
|
53
|
+
'.claude/commands/custom',
|
|
54
|
+
'.claude/skills/custom',
|
|
55
|
+
'.claude/agents/custom',
|
|
56
|
+
'schemas/frontmatter/custom',
|
|
57
|
+
'schemas/body-grammars/custom',
|
|
58
|
+
// Plugin marketplace custom directories
|
|
59
|
+
'plugins/docs/skills/custom',
|
|
60
|
+
'plugins/docs/agents/custom',
|
|
61
|
+
'plugins/javascript-frontend/agents/custom',
|
|
62
|
+
'plugins/php-backend/agents/custom',
|
|
63
|
+
'plugins/golang-backend/agents/custom',
|
|
64
|
+
'plugins/devops/agents/custom',
|
|
65
|
+
];
|
|
66
|
+
for (const dir of customDirs) {
|
|
67
|
+
const dirPath = path.join(rootDir, dir);
|
|
68
|
+
await fs.ensureDir(dirPath);
|
|
69
|
+
// Add .gitkeep file
|
|
70
|
+
const gitkeepPath = path.join(dirPath, '.gitkeep');
|
|
71
|
+
if (!(await fs.pathExists(gitkeepPath))) {
|
|
72
|
+
await fs.writeFile(gitkeepPath, '', 'utf-8');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Initialize a forked repository with configuration
|
|
78
|
+
*/
|
|
79
|
+
export async function init(options = {}) {
|
|
80
|
+
const c = await getChalk();
|
|
81
|
+
const rootDir = options.cwd ?? process.cwd();
|
|
82
|
+
console.log(c.bold('\nš Synapse Fork Initialization\n'));
|
|
83
|
+
// Show deprecation warning in npm mode
|
|
84
|
+
const mode = detectInstallMode(rootDir);
|
|
85
|
+
if (mode === 'npm') {
|
|
86
|
+
console.log(c.yellow('DEPRECATED: "synapse init" is for fork-based installations.'));
|
|
87
|
+
console.log(c.yellow('Use `npx @synapse/cli scaffold` instead for npm-based projects.\n'));
|
|
88
|
+
}
|
|
89
|
+
// Check if we're in a git repository
|
|
90
|
+
if (!checkGitRepo(rootDir)) {
|
|
91
|
+
throw new Error('Not a git repository. Run "git init" first.');
|
|
92
|
+
}
|
|
93
|
+
// Check if already initialized
|
|
94
|
+
if (await trackingExists(rootDir)) {
|
|
95
|
+
if (!options.force) {
|
|
96
|
+
throw new Error('Already initialized (.synapse-upstream exists).\n' +
|
|
97
|
+
'Use --force to reinitialize.');
|
|
98
|
+
}
|
|
99
|
+
console.log(c.yellow('ā ļø Reinitializing (--force specified)\n'));
|
|
100
|
+
}
|
|
101
|
+
let siteName = options.siteName;
|
|
102
|
+
let displayName = options.displayName;
|
|
103
|
+
let baseUrl = options.baseUrl;
|
|
104
|
+
let primaryColor = options.primaryColor;
|
|
105
|
+
let upstreamRemote = options.upstreamRemote || 'upstream';
|
|
106
|
+
let upstreamUrl = options.upstreamUrl || 'git@github.com:millstonehq/synapse.git';
|
|
107
|
+
// Interactive prompts if not all options provided
|
|
108
|
+
if (options.interactive !== false && (!siteName || !displayName || !baseUrl)) {
|
|
109
|
+
const rl = readline.createInterface({
|
|
110
|
+
input: process.stdin,
|
|
111
|
+
output: process.stdout,
|
|
112
|
+
});
|
|
113
|
+
try {
|
|
114
|
+
console.log(c.gray('Configure your fork:\n'));
|
|
115
|
+
if (!siteName) {
|
|
116
|
+
siteName = await prompt(rl, 'Site name', 'My Documentation');
|
|
117
|
+
}
|
|
118
|
+
if (!displayName) {
|
|
119
|
+
displayName = await prompt(rl, 'Display name', siteName);
|
|
120
|
+
}
|
|
121
|
+
if (!baseUrl) {
|
|
122
|
+
baseUrl = await prompt(rl, 'Base URL', 'https://docs.example.com');
|
|
123
|
+
}
|
|
124
|
+
if (!primaryColor) {
|
|
125
|
+
const wantColor = await confirm(rl, 'Customize primary color?', false);
|
|
126
|
+
if (wantColor) {
|
|
127
|
+
primaryColor = await prompt(rl, 'Primary color (hex)', '#0066cc');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
console.log(); // blank line
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
rl.close();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Use defaults if still not set
|
|
137
|
+
siteName = siteName || 'My Documentation';
|
|
138
|
+
displayName = displayName || siteName;
|
|
139
|
+
baseUrl = baseUrl || 'https://docs.example.com';
|
|
140
|
+
// Create synapse.config.json
|
|
141
|
+
console.log(c.blue('š Creating synapse.config.json...'));
|
|
142
|
+
const config = {
|
|
143
|
+
branding: {
|
|
144
|
+
siteName,
|
|
145
|
+
displayName,
|
|
146
|
+
baseUrl,
|
|
147
|
+
},
|
|
148
|
+
schemas: {
|
|
149
|
+
customDir: 'schemas/custom',
|
|
150
|
+
loadBase: true,
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
if (primaryColor) {
|
|
154
|
+
config.branding.theme = {
|
|
155
|
+
lightMode: { primary: primaryColor },
|
|
156
|
+
darkMode: { primary: primaryColor },
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const configPath = path.join(rootDir, 'synapse.config.json');
|
|
160
|
+
await fs.writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
161
|
+
console.log(c.green(' ā Created synapse.config.json'));
|
|
162
|
+
// Create custom directories
|
|
163
|
+
console.log(c.blue('\nš Creating custom directories...'));
|
|
164
|
+
await createCustomDirectories(rootDir);
|
|
165
|
+
console.log(c.green(' ā Created custom directories (schemas, .claude, plugins) with .gitkeep files'));
|
|
166
|
+
// Check for upstream remote
|
|
167
|
+
console.log(c.blue('\nš Configuring upstream remote...'));
|
|
168
|
+
if (!hasRemote(upstreamRemote, rootDir)) {
|
|
169
|
+
console.log(c.yellow(` ! Remote "${upstreamRemote}" not found`));
|
|
170
|
+
console.log(c.gray(` Adding remote: ${upstreamRemote} -> ${upstreamUrl}`));
|
|
171
|
+
try {
|
|
172
|
+
const { addRemote } = await import('../lib/git.js');
|
|
173
|
+
addRemote(upstreamRemote, upstreamUrl, rootDir);
|
|
174
|
+
console.log(c.green(` ā Added remote "${upstreamRemote}"`));
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.log(c.red(` ā Failed to add remote: ${error}`));
|
|
178
|
+
console.log(c.yellow(` You can add it manually: git remote add ${upstreamRemote} ${upstreamUrl}`));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log(c.green(` ā Remote "${upstreamRemote}" exists`));
|
|
183
|
+
}
|
|
184
|
+
// Create tracking file
|
|
185
|
+
console.log(c.blue('\nš Creating tracking file...'));
|
|
186
|
+
// Delete existing tracking file if force flag is set
|
|
187
|
+
if (options.force) {
|
|
188
|
+
const trackingPath = path.join(rootDir, '.synapse-upstream');
|
|
189
|
+
if (await fs.pathExists(trackingPath)) {
|
|
190
|
+
await fs.remove(trackingPath);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const version = getCurrentVersion(rootDir);
|
|
194
|
+
await createTracking(upstreamUrl, version, rootDir);
|
|
195
|
+
console.log(c.green(' ā Created .synapse-upstream'));
|
|
196
|
+
// Summary
|
|
197
|
+
console.log(c.bold('\nā
Initialization complete!\n'));
|
|
198
|
+
console.log(c.gray('Configuration:'));
|
|
199
|
+
console.log(c.gray(` Site: ${siteName}`));
|
|
200
|
+
console.log(c.gray(` Display: ${displayName}`));
|
|
201
|
+
console.log(c.gray(` URL: ${baseUrl}`));
|
|
202
|
+
console.log(c.gray(` Upstream: ${upstreamRemote} (${upstreamUrl})`));
|
|
203
|
+
console.log(c.gray(` Version: ${version}`));
|
|
204
|
+
console.log(c.gray('\nNext steps:'));
|
|
205
|
+
console.log(c.gray(' 1. Edit synapse.config.json to customize branding'));
|
|
206
|
+
console.log(c.gray(' 2. Add custom schemas to schemas/frontmatter/custom/'));
|
|
207
|
+
console.log(c.gray(' 3. Add custom Claude commands to .claude/commands/custom/'));
|
|
208
|
+
console.log(c.gray(' 4. Extend plugins with custom skills/agents in plugins/*/custom/'));
|
|
209
|
+
console.log(c.gray(' 5. Run "synapse update" to sync with upstream changes'));
|
|
210
|
+
console.log();
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* CLI command handler for init
|
|
214
|
+
*/
|
|
215
|
+
export async function initCommand(args) {
|
|
216
|
+
const c = await getChalk();
|
|
217
|
+
try {
|
|
218
|
+
await init({
|
|
219
|
+
siteName: args.siteName,
|
|
220
|
+
displayName: args.displayName,
|
|
221
|
+
baseUrl: args.baseUrl,
|
|
222
|
+
primaryColor: args.primaryColor,
|
|
223
|
+
upstreamRemote: args.upstreamRemote,
|
|
224
|
+
upstreamUrl: args.upstreamUrl,
|
|
225
|
+
force: args.force,
|
|
226
|
+
interactive: !args.yes,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
console.error(c.red('\nError:'), error instanceof Error ? error.message : error);
|
|
231
|
+
process.exit(1);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface MigrateOptions {
|
|
2
|
+
dryRun?: boolean;
|
|
3
|
+
yes?: boolean;
|
|
4
|
+
cwd?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface MigrationPlan {
|
|
7
|
+
isForkMode: boolean;
|
|
8
|
+
hasCustomSchemas: boolean;
|
|
9
|
+
hasCustomPlugins: boolean;
|
|
10
|
+
hasSynapseConfig: boolean;
|
|
11
|
+
customSchemas: string[];
|
|
12
|
+
customPlugins: string[];
|
|
13
|
+
forkFiles: string[];
|
|
14
|
+
contentDirs: string[];
|
|
15
|
+
actions: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Detect the current state of the repository for migration planning
|
|
19
|
+
*/
|
|
20
|
+
export declare function detectMigrationState(cwd: string): Promise<MigrationPlan>;
|
|
21
|
+
/**
|
|
22
|
+
* Execute the migration from fork mode to npm mode
|
|
23
|
+
*/
|
|
24
|
+
export declare function migrate(options?: MigrateOptions): Promise<MigrationPlan>;
|
|
25
|
+
/**
|
|
26
|
+
* CLI command handler for migrate
|
|
27
|
+
*/
|
|
28
|
+
export declare function migrateCommand(args: Record<string, any>): Promise<void>;
|
|
29
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAaD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAuF9E;AAkDD;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAsIlF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAY7E"}
|